int ps2sif_freeiopheap(uint32_t busaddr) { struct sbr_ioph_free_arg arg; int result; int err; arg.addr = busaddr; err = sbios_rpc(SBR_IOPH_FREE, &arg, &result); if (err < 0) { return -1; } return result; }
/** Allocate bus address. Returns 0 on error. */ uint32_t ps2sif_allociopheap(int size) { struct sbr_ioph_alloc_arg arg; int result; int err; arg.size = size; err = sbios_rpc(SBR_IOPH_ALLOC, &arg, &result); if (err < 0) { return 0; } return result; }
int ps2sif_freeiopheap(void *addr) { struct sbr_ioph_free_arg arg; int result; int err; arg.addr = addr; down(&iopheap_sem); err = sbios_rpc(SBR_IOPH_FREE, &arg, &result); up(&iopheap_sem); if (err < 0) return -1; return result; }
void *ps2sif_allociopheap(int size) { struct sbr_ioph_alloc_arg arg; int result; int err; arg.size = size; down(&iopheap_sem); err = sbios_rpc(SBR_IOPH_ALLOC, &arg, &result); up(&iopheap_sem); if (err < 0) return NULL; return (void *)result; }
int __init ps2sif_initiopheap(void) { int i; int result; int err; while (1) { down(&iopheap_sem); err = sbios_rpc(SBR_IOPH_INIT, NULL, &result); up(&iopheap_sem); if (err < 0) return -1; if (result == 0) break; i = 0x100000; while (i--) ; } return 0; }
static void driver_init(void) { int rv; int result; rv = sbios(SB_SIFINIT, NULL); if (rv < 0) { error("SB_SIFINIT failed rv = %d\n", rv); return; } rv = sbios(SB_SIFINITCMD, NULL); if (rv < 0) { error("SB_SIFINITCMD failed rv = %d\n", rv); return; } rv = sbios(SB_SIFINITRPC, NULL); if (rv < 0) { error("SB_SIFINITRPC failed rv = %d\n", rv); return; } for (;;) { debug("Call SBR_IOPH_INIT\n"); rv = sbios_rpc(SBR_IOPH_INIT, NULL, &result); debug("rv = %d\n", rv); if (rv < 0) { error("SBR_IOPH_INIT failed rv = %d\n", rv); return; } debug("result = %d\n", result); if (result == 0) { /* Success */ break; } } debug("SBIOS drivers successfully initialized.\n"); }