22#define DMA_BUF_ALIGNMENT 128
24#define DMA_BUF_ALIGNMENT 16
27#define SBUS_IRQ_XFER (30)
28#define SBUS_IRQ_EXEC (31)
31#define SIF2_CMD_SET_XFER_PARAMS (0)
34#define SIF2_XFER_RECV (0)
35#define SIF2_XFER_SEND (1)
37static u32 _sif2_req_type = 0;
38static u32 _sif2_req_addr = 0;
39static u32 _sif2_req_size = 0;
41static int __sif2_cmd_inited = 0;
48int SIF2_set_cmd_handler(
int cid, SIF2_CmdHandlerFunc func,
void *param)
50 if ((cid < 0) || (cid >= SIF2_MAX_CMD_HANDLERS)) {
55 if (_sif2_cmd_handlers[cid].func) {
59 _sif2_cmd_handlers[cid].func = func;
60 _sif2_cmd_handlers[cid].param = param;
65int SIF2_rem_cmd_handler(
int cid)
67 if ((cid < 0) || (cid >= SIF2_MAX_CMD_HANDLERS)) {
71 _sif2_cmd_handlers[cid].func = NULL;
72 _sif2_cmd_handlers[cid].param = NULL;
78void _sif2_irq_xfer(
void)
80 if (_sif2_req_type == SIF2_XFER_RECV) {
82 SIF2_set_dma(_sif2_req_addr, _sif2_req_size, PS2_DMA_TO_MEM);
83 }
else if (_sif2_req_type == SIF2_XFER_SEND) {
85 SIF2_set_dma(_sif2_req_addr, _sif2_req_size, PS2_DMA_FROM_MEM);
89void _sif2_irq_exec(
void)
97 SIF2_set_dma(((u32)&_sif2_dma_cmd_buf),
sizeof(_sif2_dma_cmd_buf), PS2_DMA_TO_MEM);
103 pkt = (
SIF2_CmdPkt *)(((u32)&_sif2_dma_cmd_buf) | 0x20000000);
110 if (_sif2_cmd_handlers[cid].func) {
111 _sif2_cmd_handlers[cid].func(pkt, _sif2_cmd_handlers[cid].param);
119void WriteBackDCache(
void *, u32);
121void SIF2_send_cmd(u32 cid,
void *extra,
int extra_size)
131 if ((
unsigned int)extra_size <= (
sizeof(_sif2_dma_cmd_buf) -
sizeof(
SIF2_CmdPkt))) {
132 memcpy((u32 *)(((u32)&_sif2_dma_cmd_buf) +
sizeof(
SIF2_CmdPkt)), extra, extra_size);
133 cmd->size += extra_size;
135 cmd->extra = (u32)extra;
136 cmd->extra_size = extra_size;
141 WriteBackDCache(_sif2_dma_cmd_buf,
sizeof(_sif2_dma_cmd_buf));
145 SIF2_set_dma((u32)cmd,
sizeof(_sif2_dma_cmd_buf), PS2_DMA_FROM_MEM);
148 SBUS_interrupt_remote(SBUS_IRQ_EXEC);
155 WriteBackDCache((
void *)cmd->extra, cmd->extra_size);
159 SIF2_set_dma((u32)cmd->extra, cmd->extra_size, PS2_DMA_FROM_MEM);
166void _sif2_cmd_set_req_params(
SIF2_CmdPkt *cmd,
void *param)
168 u32 *p = &((u32 *)cmd)[4];
172 _sif2_req_type = p[0];
173 _sif2_req_addr = p[1];
174 _sif2_req_size = p[2];
177int SIF2_init_cmd(
void)
179 if (__sif2_cmd_inited) {
190 SBUS_set_irq_handler(SBUS_IRQ_XFER, (SBUS_IrqHandlerFunc)_sif2_irq_xfer, NULL);
191 SBUS_set_irq_handler(SBUS_IRQ_EXEC, (SBUS_IrqHandlerFunc)_sif2_irq_exec, NULL);
193 SIF2_set_cmd_handler(SIF2_CMD_SET_XFER_PARAMS, &_sif2_cmd_set_req_params, NULL);
195 __sif2_cmd_inited = 1;