#ifndef DMA_H
#define DMA_H
#include "ps2.h"
#include "ee_regs.h"

void dmaReset(int enable);

#define DMA_WAIT(REG) \
	while (GET_REG32(REG) & (1<<8))

/*
 * Common Registers
 */

#define MAKE_D_CTRL(DMAE,RELE,MFD,STS,STD,RCYC) \
	(BIT32(DMAE, 0) | \
	 BIT32(RELE, 1) | \
	 BIT32(MFD,  2) | \
	 BIT32(STS,  4) | \
	 BIT32(STD,  6) | \
	 BIT32(RCYC, 8))

#define MAKE_D_STAT(CIS0,CIS1,CIS2,CIS3,CIS4,CIS5,CIS6,CIS7,CIS8,CIS9,\
                    SIS,MEIS,BEIS,\
                    CIM0,CIM1,CIM2,CIM3,CIM4,CIM5,CIM6,CIM7,CIM8,CIM9,\
                    SIM,MEIM) \
	(BIT32(CIS0, 0) | \
	 BIT32(CIS1, 1) | \
	 BIT32(CIS2, 2) | \
	 BIT32(CIS3, 3) | \
	 BIT32(CIS4, 4) | \
	 BIT32(CIS5, 5) | \
	 BIT32(CIS6, 6) | \
	 BIT32(CIS7, 7) | \
	 BIT32(CIS8, 8) | \
	 BIT32(CIS9, 9) | \
	 BIT32(SIS,  13) | \
	 BIT32(MEIS, 14) | \
	 BIT32(BEIS, 15) | \
	 BIT32(CIM0, 16) | \
	 BIT32(CIM1, 17) | \
	 BIT32(CIM2, 18) | \
	 BIT32(CIM3, 19) | \
	 BIT32(CIM4, 20) | \
	 BIT32(CIM5, 21) | \
	 BIT32(CIM6, 21) | \
	 BIT32(CIM7, 22) | \
	 BIT32(CIM8, 23) | \
	 BIT32(CIM9, 24) | \
	 BIT32(SIM,  29) | \
	 BIT32(MEIM, 30))

#define MAKE_D_PCR(CPC0,CPC1,CPC2,CPC3,CPC4,CPC5,CPC6,CPC7,CPC8,CPC9,\
                   CDE0,CDE1,CDE2,CDE3,CDE4,CDE5,CDE6,CDE7,CDE8,CDE9, PCE) \
	(BIT32(CPC0, 0) | \
	 BIT32(CPC1, 1) | \
	 BIT32(CPC2, 2) | \
	 BIT32(CPC3, 3) | \
	 BIT32(CPC4, 4) | \
	 BIT32(CPC5, 5) | \
	 BIT32(CPC6, 6) | \
	 BIT32(CPC7, 7) | \
	 BIT32(CPC8, 8) | \
	 BIT32(CPC9, 9) | \
	 BIT32(CDE0, 16) | \
	 BIT32(CDE1, 17) | \
	 BIT32(CDE2, 18) | \
	 BIT32(CDE3, 19) | \
	 BIT32(CDE4, 20) | \
	 BIT32(CDE5, 21) | \
	 BIT32(CDE6, 22) | \
	 BIT32(CDE7, 23) | \
	 BIT32(CDE8, 24) | \
	 BIT32(CDE9, 25) | \
	 BIT32(PCE,  31))

#define MAKE_D_SQWC(SQWC,TQWC) \
	(BIT32(SQWC, 0) | \
	 BIT32(TQWC, 16))

#define MAKE_D_RBSR(RMSK) \
	(BIT32(RMSK, 4))

#define MAKE_D_RBOR(ADDR) \
	(BIT32(ADDR, 0))

#define MAKE_D_STADR(ADDR) \
	(BIT32(ADDR, 0))

#define MAKE_D_ENABLER(CPND) \
	(BIT32(CPND, 16))

#define MAKE_D_ENABLEW(CPND) \
	(BIT32(CPND, 16))

/*
 * Channel Registers
 */

#define MAKE_DN_CHCR(DIR,MOD,ASP,TTE,TIE,STR) \
	(BIT32(DIR, 0) | \
	 BIT32(MOD, 2) | \
	 BIT32(ASP, 4) | \
	 BIT32(TTE, 6) | \
	 BIT32(TIE, 7) | \
	 BIT32(STR, 8))

#define MAKE_DN_MADR(ADDR,SPR) \
	(BIT32(ADDR, 0) | \
	 BIT32(SPR,  31))

#define MAKE_DN_TADR(ADDR,SPR) \
	(BIT32(ADDR, 0) | \
	 BIT32(SPR,  31))

#define MAKE_DN_ASR(ADDR,SPR) \
	(BIT32(ADDR, 0) | \
	 BIT32(SPR,  31))

#define MAKE_DN_ASR(ADDR,SPR) \
	(BIT32(ADDR, 0) | \
	 BIT32(SPR,  31))

#define MAKE_DN_SADR(ADDR) \
	(BIT32(ADDR, 0))

#define MAKE_DN_QWC(QWC) \
	(BIT32(QWC, 0))

#endif