void sdmmc_ipc(volatile ipc_request *req) { int ret; switch (req->req) { case IPC_SDMMC_ACK: ret = sdmmc_ack_card(); ipc_post(req->code, req->tag, 1, ret); break; case IPC_SDMMC_READ: ret = sdmmc_read(req->args[0], req->args[1], (void *)req->args[2]); dc_flushrange((void *)req->args[2], req->args[1]*SDMMC_DEFAULT_BLOCKLEN); ipc_post(req->code, req->tag, 1, ret); break; case IPC_SDMMC_WRITE: dc_invalidaterange((void *)req->args[2], req->args[1]*SDMMC_DEFAULT_BLOCKLEN); ret = sdmmc_write(req->args[0], req->args[1], (void *)req->args[2]); ipc_post(req->code, req->tag, 1, ret); break; case IPC_SDMMC_STATE: ipc_post(req->code, req->tag, 1, sdmmc_check_card()); break; case IPC_SDMMC_SIZE: ipc_post(req->code, req->tag, 1, sdmmc_get_sectors()); break; } }
void powerpc_ipc(volatile ipc_request *req) { switch (req->req) { case IPC_PPC_BOOT: if (req->args[0]) { // Enqueued from ARM side, do not invalidate mem nor ipc_post powerpc_boot_mem((u8 *) req->args[1], req->args[2]); } else { dc_invalidaterange((void *) req->args[1], req->args[2]); int res = powerpc_boot_mem((u8 *) req->args[1], req->args[2]); if (res) ipc_post(req->code, req->tag, 1, res); } break; case IPC_PPC_BOOT_FILE: if (req->args[0]) { // Enqueued from ARM side, do not invalidate mem nor ipc_post powerpc_boot_file((char *) req->args[1]); } else { dc_invalidaterange((void *) req->args[1], strnlen((char *) req->args[1], 256)); int res = powerpc_boot_file((char *) req->args[1]); if (res) ipc_post(req->code, req->tag, 1, res); } break; default: gecko_printf("IPC: unknown SLOW PPC request %04X\n", req->req); } }