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
53extern int _iop_reboot_count;
55extern unsigned int _SifSendCmd(
int cid,
int mode,
void *pkt,
int pktsize,
void *src,
56 void *dest,
int size);
57extern int _SifCmdIntHandler(
int channel);
60unsigned 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
107unsigned 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
116unsigned 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
125int _SifCmdIntHandler(
int channel)
131 int size, pktquads, id, i = 0;
139 if (!(size = header->
psize))
142 pktquads = (size + 30) >> 4;
157 id = header->
cid & ~SIF_CMD_ID_SYSTEM;
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);
186static int sif0_id = -1;
194static void change_addr(
void *packet,
void *harg)
197 struct ca_pkt *pkt = (
struct ca_pkt *)packet;
209static void set_sreg(
void *packet,
void *harg)
212 struct sr_pkt *pkt = (
struct sr_pkt *)packet;
214 cmd_data->sregs[pkt->sreg] = pkt->val;
217void 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);
294void 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
319void sceSifAddCmdHandler(
int cid, SifCmdHandler_t handler,
void *harg)
321 u32
id = cid & ~SIF_CMD_ID_SYSTEM;
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
337void sceSifRemoveCmdHandler(
int cid)
339 u32
id = cid & ~SIF_CMD_ID_SYSTEM;
342 _sif_cmd_data.sys_cmd_handlers[id].handler = NULL;
344 _sif_cmd_data.usr_cmd_handlers[id].handler = NULL;
348#ifdef F_sceSifGetSreg
349unsigned int sceSifGetSreg(
int sreg)
351 return _sif_cmd_data.sregs[sreg];
355#ifdef F_sceSifSetSreg
356void sceSifSetSreg(
int sreg,
unsigned int value)
358 _sif_cmd_data.sregs[sreg] = value;
#define SIF_CMD_ID_SYSTEM
u32 count
start sector of fragmented bd/file