23 #define CMD_PACKET_MAX 128
24 #define CMD_PACKET_DATA_MAX 112
25 #define SYS_CMD_HANDLER_MAX 32
28 #define DMAC_COMM_STAT 0x1000e010
29 #define DMAC_SIF0_CHCR 0x1000c000
30 #define CHCR_STR 0x100
31 #define STAT_SIF0 0x20
53 extern int _iop_reboot_count;
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];
186 static int sif0_id = -1;
194 static void change_addr(
void *packet,
void *harg)
197 struct ca_pkt *pkt = (
struct ca_pkt *)packet;
209 static void set_sreg(
void *packet,
void *harg)
212 struct sr_pkt *pkt = (
struct sr_pkt *)packet;
214 cmd_data->sregs[pkt->sreg] = pkt->val;
217 void sceSifInitCmd(
void)
219 static struct ca_pkt packet __attribute((
aligned(64)));
221 static int _rb_count = 0;
222 if (_rb_count != _iop_reboot_count) {
223 _rb_count = _iop_reboot_count;
225 DisableDmac(DMAC_SIF0);
226 RemoveDmacHandler(DMAC_SIF0, sif0_id);
237 _sif_cmd_data.unused = UNCACHED_SEG(sif_unused);
238 _sif_cmd_data.sys_cmd_handlers = sys_cmd_handlers;
239 _sif_cmd_data.nr_sys_handlers = SYS_CMD_HANDLER_MAX;
240 _sif_cmd_data.usr_cmd_handlers = NULL;
241 _sif_cmd_data.nr_usr_handlers = 0;
242 _sif_cmd_data.sregs = sregs;
244 for (i = 0; i < SYS_CMD_HANDLER_MAX; i++) {
245 _sif_cmd_data.sys_cmd_handlers[i].handler = NULL;
246 _sif_cmd_data.sys_cmd_handlers[i].harg = NULL;
249 for (i = 0; i < 32; i++)
250 _sif_cmd_data.sregs[i] = 0;
252 _sif_cmd_data.sys_cmd_handlers[0].handler = change_addr;
253 _sif_cmd_data.sys_cmd_handlers[0].harg = &_sif_cmd_data;
254 _sif_cmd_data.sys_cmd_handlers[1].handler = set_sreg;
255 _sif_cmd_data.sys_cmd_handlers[1].harg = &_sif_cmd_data;
260 if (_lw(DMAC_COMM_STAT) & STAT_SIF0)
261 _sw(STAT_SIF0, DMAC_COMM_STAT);
264 if (!(_lw(DMAC_SIF0_CHCR) & CHCR_STR))
267 sif0_id = AddDmacHandler(DMAC_SIF0, &_SifCmdIntHandler, 0);
268 EnableDmac(DMAC_SIF0);
272 _sif_cmd_data.
iopbuf = (
void *)sceSifGetReg(SIF_SYSREG_SUBADDR);
273 if (_sif_cmd_data.
iopbuf) {
276 packet.buf = _sif_cmd_data.
pktbuf;
277 sceSifSendCmd(SIF_CMD_CHANGE_SADDR, &packet,
sizeof packet, NULL, NULL, 0);
284 sceSifSetReg(SIF_SYSREG_SUBADDR, (u32)_sif_cmd_data.
iopbuf);
287 sceSifSetReg(SIF_SYSREG_MAINADDR, (u32)&_sif_cmd_data);
288 packet.header.opt = 0;
289 packet.buf = _sif_cmd_data.
pktbuf;
290 sceSifSendCmd(SIF_CMD_INIT_CMD, &packet,
sizeof packet, NULL, NULL, 0);
294 void sceSifExitCmd(
void)
296 DisableDmac(DMAC_SIF0);
297 RemoveDmacHandler(DMAC_SIF0, sif0_id);
302 #ifdef F_sceSifSetCmdBuffer
305 _sif_cmd_data.usr_cmd_handlers = db;
306 _sif_cmd_data.nr_usr_handlers = size;
310 #ifdef F_sceSifSetSysCmdBuffer
313 _sif_cmd_data.sys_cmd_handlers = db;
314 _sif_cmd_data.nr_sys_handlers = size;
318 #ifdef F_sceSifAddCmdHandler
319 void sceSifAddCmdHandler(
int cid, SifCmdHandler_t handler,
void *harg)
325 _sif_cmd_data.sys_cmd_handlers[id].handler = handler;
326 _sif_cmd_data.sys_cmd_handlers[id].harg = harg;
330 _sif_cmd_data.usr_cmd_handlers[id].handler = handler;
331 _sif_cmd_data.usr_cmd_handlers[id].harg = harg;
336 #ifdef F_sceSifRemoveCmdHandler
337 void sceSifRemoveCmdHandler(
int cid)
342 _sif_cmd_data.sys_cmd_handlers[id].handler = NULL;
344 _sif_cmd_data.usr_cmd_handlers[id].handler = NULL;
348 #ifdef F_sceSifGetSreg
349 unsigned int sceSifGetSreg(
int sreg)
351 return _sif_cmd_data.sregs[sreg];
355 #ifdef F_sceSifSetSreg
356 void sceSifSetSreg(
int sreg,
unsigned int value)
358 _sif_cmd_data.sregs[sreg] = value;