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
47 SifCmdSysHandlerData_t *sys_cmd_handlers;
49 SifCmdHandlerData_t *usr_cmd_handlers;
55extern unsigned int _SifSendCmd(
int cid,
int mode,
void *pkt,
int pktsize,
void *src,
56 void *dest,
int size);
57extern int _SifCmdIntHandler(
int channel);
59unsigned int _SifSendCmd(
int cid,
int mode,
void *pkt,
int pktsize,
void *src,
62 SifDmaTransfer_t dmat[2];
68 if (pktsize > CMD_PACKET_DATA_MAX)
73 header->
psize = pktsize;
81 sceSifWriteBackDCache(src, size);
83 dmat[
count].src = src;
84 dmat[
count].dest = dest;
85 dmat[
count].size = size;
90 dmat[
count].src = pkt;
91 dmat[
count].dest = _sif_cmd_data.iopbuf;
92 dmat[
count].size = pktsize;
93 dmat[
count].attr = SIF_DMA_ERT | SIF_DMA_INT_O;
96 sceSifWriteBackDCache(pkt, pktsize);
99 return isceSifSetDma(dmat,
count);
101 return sceSifSetDma(dmat,
count);
104unsigned int sceSifSendCmd(
int cid,
void *packet,
int packet_size,
void *src_extra,
105 void *dest_extra,
int size_extra)
107 return _SifSendCmd(cid, 0, packet, packet_size,
108 src_extra, dest_extra, size_extra);
111unsigned int isceSifSendCmd(
int cid,
void *packet,
int packet_size,
void *src_extra,
112 void *dest_extra,
int size_extra)
115 src_extra, dest_extra, size_extra);
118int _SifCmdIntHandler(
int channel)
124 int size, pktquads, id, i = 0;
132 if (!(size = header->
psize))
135 pktquads = (size + 30) >> 4;
153 if ((u32)id < cmd_data->nr_sys_handlers)
154 if (
cmd_data->sys_cmd_handlers[
id].handler)
155 cmd_data->sys_cmd_handlers[id].handler(packet,
cmd_data->sys_cmd_handlers[
id].harg);
157 if ((u32)id < cmd_data->nr_usr_handlers)
158 if (
cmd_data->usr_cmd_handlers[
id].handler)
159 cmd_data->usr_cmd_handlers[id].handler(packet,
cmd_data->usr_cmd_handlers[
id].harg);
172static SifCmdSysHandlerData_t sys_cmd_handlers[SYS_CMD_HANDLER_MAX];
184static void change_addr(
void *packet,
void *harg)
199static void set_sreg(
void *packet,
void *harg)
204 cmd_data->sregs[pkt->sreg] = pkt->val;
207void sceSifInitCmd(
void)
209 static struct ca_pkt packet __attribute((aligned(64)));
211 if (HasIopRebootedSinceLastCall())
219 _sif_cmd_data.pktbuf = UNCACHED_SEG(
pktbuf);
220 _sif_cmd_data.unused = UNCACHED_SEG(sif_unused);
221 _sif_cmd_data.sys_cmd_handlers = sys_cmd_handlers;
222 _sif_cmd_data.nr_sys_handlers = SYS_CMD_HANDLER_MAX;
223 _sif_cmd_data.usr_cmd_handlers = NULL;
224 _sif_cmd_data.nr_usr_handlers = 0;
225 _sif_cmd_data.sregs = sregs;
227 for (i = 0; i < SYS_CMD_HANDLER_MAX; i++) {
228 _sif_cmd_data.sys_cmd_handlers[i].handler = NULL;
229 _sif_cmd_data.sys_cmd_handlers[i].harg = NULL;
232 for (i = 0; i < 32; i++)
233 _sif_cmd_data.sregs[i] = 0;
235 _sif_cmd_data.sys_cmd_handlers[0].handler = change_addr;
236 _sif_cmd_data.sys_cmd_handlers[0].harg = &_sif_cmd_data;
237 _sif_cmd_data.sys_cmd_handlers[1].handler = set_sreg;
238 _sif_cmd_data.sys_cmd_handlers[1].harg = &_sif_cmd_data;
243 if (_lw(DMAC_COMM_STAT) & STAT_SIF0)
244 _sw(STAT_SIF0, DMAC_COMM_STAT);
247 if (!(_lw(DMAC_SIF0_CHCR) & CHCR_STR))
250 sif0_id = AddDmacHandler(DMAC_SIF0, &_SifCmdIntHandler, 0);
251 EnableDmac(DMAC_SIF0);
254 _sif_cmd_data.iopbuf = (
void *)sceSifGetReg(SIF_SYSREG_SUBADDR);
255 if (_sif_cmd_data.iopbuf) {
258 packet.buf = _sif_cmd_data.pktbuf;
259 sceSifSendCmd(SIF_CMD_CHANGE_SADDR, &packet,
sizeof packet, NULL, NULL, 0);
266 sceSifSetReg(SIF_SYSREG_SUBADDR, (u32)_sif_cmd_data.iopbuf);
269 sceSifSetReg(SIF_SYSREG_MAINADDR, (u32)&_sif_cmd_data);
270 packet.header.opt = 0;
271 packet.buf = _sif_cmd_data.pktbuf;
272 sceSifSendCmd(SIF_CMD_INIT_CMD, &packet,
sizeof packet, NULL, NULL, 0);
276void sceSifExitCmd(
void)
279 DisableDmac(DMAC_SIF0);
280 RemoveDmacHandler(DMAC_SIF0, sif0_id);
285void sceSifSetCmdBuffer(SifCmdHandlerData_t *db,
int size)
287 _sif_cmd_data.usr_cmd_handlers = db;
288 _sif_cmd_data.nr_usr_handlers = size;
291void sceSifSetSysCmdBuffer(SifCmdSysHandlerData_t *db,
int size)
293 _sif_cmd_data.sys_cmd_handlers = db;
294 _sif_cmd_data.nr_sys_handlers = size;
297void sceSifAddCmdHandler(
int cid, SifCmdHandler_t handler,
void *harg)
303 _sif_cmd_data.sys_cmd_handlers[id].handler = handler;
304 _sif_cmd_data.sys_cmd_handlers[id].harg = harg;
308 _sif_cmd_data.usr_cmd_handlers[id].handler = handler;
309 _sif_cmd_data.usr_cmd_handlers[id].harg = harg;
313void sceSifRemoveCmdHandler(
int cid)
318 _sif_cmd_data.sys_cmd_handlers[id].handler = NULL;
320 _sif_cmd_data.usr_cmd_handlers[id].handler = NULL;
323unsigned int sceSifGetSreg(
int sreg)
325 return _sif_cmd_data.sregs[sreg];
328void sceSifSetSreg(
int sreg,
unsigned int value)
330 _sif_cmd_data.sregs[sreg] = value;
struct t_SifCmdHeader SifCmdHeader_t
#define SIF_CMD_ID_SYSTEM
u32 count
start sector of fragmented bd/file