/* * Send RPC_ADSP_RTOS_CMD_GET_INIT_INFO cmd to ARM9 and get * queue offsets and module entries (init info) as part of the event. */ static void msm_get_init_info(void) { int rc; struct rpc_adsp_rtos_app_to_modem_args_t rpc_req; adsp_info.init_info_rpc_client = msm_rpc_connect( RPC_ADSP_RTOS_ATOM_PROG, RPC_ADSP_RTOS_ATOM_VERS, MSM_RPC_UNINTERRUPTIBLE | MSM_RPC_ENABLE_RECEIVE); if (IS_ERR(adsp_info.init_info_rpc_client)) { rc = PTR_ERR(adsp_info.init_info_rpc_client); adsp_info.init_info_rpc_client = 0; pr_err("adsp: could not open rpc client: %d\n", rc); return; } msm_rpc_setup_req(&rpc_req.hdr, RPC_ADSP_RTOS_ATOM_PROG, msm_rpc_get_vers(adsp_info.init_info_rpc_client), RPC_ADSP_RTOS_APP_TO_MODEM_PROC); rpc_req.gotit = cpu_to_be32(1); rpc_req.cmd = cpu_to_be32(RPC_ADSP_RTOS_CMD_GET_INIT_INFO); rpc_req.proc_id = cpu_to_be32(RPC_ADSP_RTOS_PROC_APPS); rpc_req.module = 0; rc = msm_rpc_write(adsp_info.init_info_rpc_client, &rpc_req, sizeof(rpc_req)); if (rc < 0) pr_err("adsp: could not send RPC request: %d\n", rc); }
static long rpcrouter_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { struct msm_rpc_endpoint *ept; struct rpcrouter_ioctl_server_args server_args; int rc = 0; uint32_t n; ept = (struct msm_rpc_endpoint *) filp->private_data; switch (cmd) { case RPC_ROUTER_IOCTL_GET_VERSION: n = RPC_ROUTER_VERSION_V1; rc = put_user(n, (unsigned int *) arg); break; case RPC_ROUTER_IOCTL_GET_MTU: /* the pacmark word reduces the actual payload * possible per message */ n = RPCROUTER_MSGSIZE_MAX - sizeof(uint32_t); rc = put_user(n, (unsigned int *) arg); break; case RPC_ROUTER_IOCTL_REGISTER_SERVER: rc = copy_from_user(&server_args, (void *) arg, sizeof(server_args)); if (rc < 0) break; msm_rpc_register_server(ept, server_args.prog, server_args.vers); break; case RPC_ROUTER_IOCTL_UNREGISTER_SERVER: rc = copy_from_user(&server_args, (void *) arg, sizeof(server_args)); if (rc < 0) break; msm_rpc_unregister_server(ept, server_args.prog, server_args.vers); break; case RPC_ROUTER_IOCTL_GET_MINOR_VERSION: n = MSM_RPC_GET_MINOR(msm_rpc_get_vers(ept)); rc = put_user(n, (unsigned int *)arg); break; default: rc = -EINVAL; break; } return rc; }
static int rpc_adsp_rtos_app_to_modem(uint32_t cmd, uint32_t module, struct msm_adsp_module *adsp_module) { int rc; struct rpc_adsp_rtos_app_to_modem_args_t rpc_req; struct rpc_reply_hdr *rpc_rsp; msm_rpc_setup_req(&rpc_req.hdr, RPC_ADSP_RTOS_ATOM_PROG, msm_rpc_get_vers(adsp_module->rpc_client), RPC_ADSP_RTOS_APP_TO_MODEM_PROC); rpc_req.gotit = cpu_to_be32(1); rpc_req.cmd = cpu_to_be32(cmd); rpc_req.proc_id = cpu_to_be32(RPC_ADSP_RTOS_PROC_APPS); rpc_req.module = cpu_to_be32(module); rc = msm_rpc_write(adsp_module->rpc_client, &rpc_req, sizeof(rpc_req)); if (rc < 0) { pr_err("adsp: could not send RPC request: %d\n", rc); return rc; } rc = msm_rpc_read(adsp_module->rpc_client, (void **)&rpc_rsp, -1, (5*HZ)); if (rc < 0) { pr_err("adsp: error receiving RPC reply: %d (%d)\n", rc, -ERESTARTSYS); return rc; } if (be32_to_cpu(rpc_rsp->reply_stat) != RPCMSG_REPLYSTAT_ACCEPTED) { pr_err("adsp: RPC call was denied!\n"); kfree(rpc_rsp); return -EPERM; } if (be32_to_cpu(rpc_rsp->data.acc_hdr.accept_stat) != RPC_ACCEPTSTAT_SUCCESS) { pr_err("adsp error: RPC call was not successful (%d)\n", be32_to_cpu(rpc_rsp->data.acc_hdr.accept_stat)); kfree(rpc_rsp); return -EINVAL; } kfree(rpc_rsp); return 0; }