24 #define CMD_PACKET_MAX 128
25 #define CMD_PACKET_DATA_MAX 112
26 #define SYS_CMD_HANDLER_MAX 32
29 #define DMAC_COMM_STAT 0x1000e010
30 #define DMAC_SIF0_CHCR 0x1000c000
31 #define CHCR_STR 0x100
32 #define STAT_SIF0 0x20
54 extern struct cmd_data _sif_cmd_data;
55 extern unsigned int _SifSendCmd(
int cid,
int mode,
void *pkt,
int pktsize,
void *src,
56 void *dest,
int size);
57 extern int _SifCmdIntHandler(
int channel);
60 unsigned int _SifSendCmd(
int cid,
int mode,
void *pkt,
int pktsize,
void *src,
69 if (pktsize > CMD_PACKET_DATA_MAX)
74 header->
psize = pktsize;
82 sceSifWriteBackDCache(src, size);
84 dmat[
count].src = src;
85 dmat[
count].dest = dest;
86 dmat[
count].size = size;
91 dmat[
count].src = pkt;
93 dmat[
count].size = pktsize;
94 dmat[
count].attr = SIF_DMA_ERT | SIF_DMA_INT_O;
97 sceSifWriteBackDCache(pkt, pktsize);
100 return isceSifSetDma(dmat,
count);
102 return sceSifSetDma(dmat,
count);
106 #ifdef F_sceSifSendCmd
107 unsigned int sceSifSendCmd(
int cid,
void *packet,
int packet_size,
void *src_extra,
108 void *dest_extra,
int size_extra)
110 return _SifSendCmd(cid, 0, packet, packet_size,
111 src_extra, dest_extra, size_extra);
115 #ifdef F_isceSifSendCmd
116 unsigned int isceSifSendCmd(
int cid,
void *packet,
int packet_size,
void *src_extra,
117 void *dest_extra,
int size_extra)
120 src_extra, dest_extra, size_extra);
124 #ifdef F__SifCmdIntHandler
125 int _SifCmdIntHandler(
int channel)
131 int size, pktquads, id, i = 0;
139 if (!(size = header->
psize))
142 pktquads = (size + 30) >> 4;
160 if ((u32)
id <
cmd_data->nr_sys_handlers)
161 if (
cmd_data->sys_cmd_handlers[
id].handler)
162 cmd_data->sys_cmd_handlers[id].handler(packet,
cmd_data->sys_cmd_handlers[
id].harg);
164 if ((u32)
id <
cmd_data->nr_usr_handlers)
165 if (
cmd_data->usr_cmd_handlers[
id].handler)
166 cmd_data->usr_cmd_handlers[id].handler(packet,
cmd_data->usr_cmd_handlers[
id].harg);
175 #ifdef F_sif_cmd_main
182 static int sregs[32];
185 static int sif0_id = -1;
193 static void change_addr(
void *packet,
void *harg)
196 struct ca_pkt *pkt = (
struct ca_pkt *)packet;
208 static void set_sreg(
void *packet,
void *harg)
211 struct sr_pkt *pkt = (
struct sr_pkt *)packet;
213 cmd_data->sregs[pkt->sreg] = pkt->val;
216 void sceSifInitCmd(
void)
218 static struct ca_pkt packet __attribute((
aligned(64)));
229 _sif_cmd_data.unused = UNCACHED_SEG(sif_unused);
230 _sif_cmd_data.sys_cmd_handlers = sys_cmd_handlers;
231 _sif_cmd_data.nr_sys_handlers = SYS_CMD_HANDLER_MAX;
232 _sif_cmd_data.usr_cmd_handlers = NULL;
233 _sif_cmd_data.nr_usr_handlers = 0;
234 _sif_cmd_data.sregs = sregs;
236 for (i = 0; i < SYS_CMD_HANDLER_MAX; i++) {
237 _sif_cmd_data.sys_cmd_handlers[i].handler = NULL;
238 _sif_cmd_data.sys_cmd_handlers[i].harg = NULL;
241 for (i = 0; i < 32; i++)
242 _sif_cmd_data.sregs[i] = 0;
244 _sif_cmd_data.sys_cmd_handlers[0].handler = change_addr;
245 _sif_cmd_data.sys_cmd_handlers[0].harg = &_sif_cmd_data;
246 _sif_cmd_data.sys_cmd_handlers[1].handler = set_sreg;
247 _sif_cmd_data.sys_cmd_handlers[1].harg = &_sif_cmd_data;
252 if (_lw(DMAC_COMM_STAT) & STAT_SIF0)
253 _sw(STAT_SIF0, DMAC_COMM_STAT);
256 if (!(_lw(DMAC_SIF0_CHCR) & CHCR_STR))
259 sif0_id = AddDmacHandler(DMAC_SIF0, &_SifCmdIntHandler, 0);
260 EnableDmac(DMAC_SIF0);
263 _sif_cmd_data.
iopbuf = (
void *)sceSifGetReg(SIF_SYSREG_SUBADDR);
264 if (_sif_cmd_data.
iopbuf) {
267 packet.buf = _sif_cmd_data.
pktbuf;
268 sceSifSendCmd(SIF_CMD_CHANGE_SADDR, &packet,
sizeof packet, NULL, NULL, 0);
275 sceSifSetReg(SIF_SYSREG_SUBADDR, (u32)_sif_cmd_data.
iopbuf);
278 sceSifSetReg(SIF_SYSREG_MAINADDR, (u32)&_sif_cmd_data);
279 packet.header.opt = 0;
280 packet.buf = _sif_cmd_data.
pktbuf;
281 sceSifSendCmd(SIF_CMD_INIT_CMD, &packet,
sizeof packet, NULL, NULL, 0);
285 void sceSifExitCmd(
void)
288 DisableDmac(DMAC_SIF0);
289 RemoveDmacHandler(DMAC_SIF0, sif0_id);
295 #ifdef F_sceSifSetCmdBuffer
298 _sif_cmd_data.usr_cmd_handlers = db;
299 _sif_cmd_data.nr_usr_handlers = size;
303 #ifdef F_sceSifSetSysCmdBuffer
306 _sif_cmd_data.sys_cmd_handlers = db;
307 _sif_cmd_data.nr_sys_handlers = size;
311 #ifdef F_sceSifAddCmdHandler
312 void sceSifAddCmdHandler(
int cid, SifCmdHandler_t handler,
void *harg)
318 _sif_cmd_data.sys_cmd_handlers[id].handler = handler;
319 _sif_cmd_data.sys_cmd_handlers[id].harg = harg;
323 _sif_cmd_data.usr_cmd_handlers[id].handler = handler;
324 _sif_cmd_data.usr_cmd_handlers[id].harg = harg;
329 #ifdef F_sceSifRemoveCmdHandler
330 void sceSifRemoveCmdHandler(
int cid)
335 _sif_cmd_data.sys_cmd_handlers[id].handler = NULL;
337 _sif_cmd_data.usr_cmd_handlers[id].handler = NULL;
341 #ifdef F_sceSifGetSreg
342 unsigned int sceSifGetSreg(
int sreg)
344 return _sif_cmd_data.sregs[sreg];
348 #ifdef F_sceSifSetSreg
349 void sceSifSetSreg(
int sreg,
unsigned int value)
351 _sif_cmd_data.sregs[sreg] = value;