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