diff options
| author | Amit Blay <ablay@codeaurora.org> | 2018-04-15 17:07:20 +0300 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2018-04-15 07:14:14 -0700 |
| commit | e51ceb3c2e89dca69969e0cd4ca25675ea90112e (patch) | |
| tree | 18014c2f02ca02009205db1016f3e7a901cb66f1 | |
| parent | fb048ed53e4a060f5c8b41f36f86cd1be05aa43c (diff) | |
soc: qcom: scm: Support single HAB id for QCPE
All guest VMs use the same HAB id for communication
with QCPE.
Change-Id: I01ed16376730276f13a734b82d387b1d30d14434
Signed-off-by: Amit Blay <ablay@codeaurora.org>
| -rw-r--r-- | drivers/soc/qcom/scm_qcpe.c | 98 |
1 files changed, 34 insertions, 64 deletions
diff --git a/drivers/soc/qcom/scm_qcpe.c b/drivers/soc/qcom/scm_qcpe.c index dfa00f56476a..a788c8c3673e 100644 --- a/drivers/soc/qcom/scm_qcpe.c +++ b/drivers/soc/qcom/scm_qcpe.c @@ -195,32 +195,13 @@ static int scm_remap_error(int err) return -EINVAL; } -static int get_hab_vmid(u32 *mm_ip_id) -{ - int result, i; - struct device_node *hab_node = NULL; - int tmp = -1; - - /* parse device tree*/ - pr_info("parsing hab node in device tree...\n"); - hab_node = of_find_compatible_node(NULL, NULL, "qcom,hab"); - if (hab_node) { - /* read local vmid of this VM, like 0 for host, 1 for AGL GVM */ - result = of_property_read_u32(hab_node, "vmid", &tmp); - if (!result) { - pr_info("local vmid = %d\n", tmp); - *mm_ip_id = MM_QCPE_START + tmp; - return 0; - } - pr_err("failed to read local vmid, result = %d\n", result); - } else { - pr_err("no hab device tree node\n"); - } +#define MAX_SCM_ARGS 10 - pr_info("assuming default vmid = 2\n"); - *mm_ip_id = MM_QCPE_VM2; - return 0; -} +struct qcpe_msg_s { + uint64_t fn_id; + uint64_t arginfo; + uint64_t args[MAX_SCM_ARGS]; +}; static int scm_call_qcpe(u32 fn_id, struct scm_desc *desc) { @@ -228,16 +209,7 @@ static int scm_call_qcpe(u32 fn_id, struct scm_desc *desc) static u32 handle; u32 ret; u32 size_bytes; - - struct smc_params_s { - uint64_t x0; - uint64_t x1; - uint64_t x2; - uint64_t x3; - uint64_t x4; - uint64_t x5; - uint64_t sid; - } smc_params; + struct qcpe_msg_s msg; pr_info("scm_call_qcpe: IN: 0x%x, 0x%x, 0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx", fn_id, desc->arginfo, desc->args[0], desc->args[1], @@ -245,15 +217,7 @@ static int scm_call_qcpe(u32 fn_id, struct scm_desc *desc) desc->args[5], desc->args[6]); if (!opened) { - u32 mm_ip_id; - - ret = get_hab_vmid(&mm_ip_id); - if (ret) { - pr_err("scm_call_qcpe: get_hab_vmid failed with ret = %d", - ret); - return ret; - } - ret = habmm_socket_open(&handle, mm_ip_id, 0, 0); + ret = habmm_socket_open(&handle, MM_QCPE_VM1, 0, 0); if (ret) { pr_err("scm_call_qcpe: habmm_socket_open failed with ret = %d", ret); @@ -262,39 +226,45 @@ static int scm_call_qcpe(u32 fn_id, struct scm_desc *desc) opened = true; } - smc_params.x0 = fn_id | 0x40000000; /* SMC64_MASK */ - smc_params.x1 = desc->arginfo; - smc_params.x2 = desc->args[0]; - smc_params.x3 = desc->args[1]; - smc_params.x4 = desc->args[2]; - smc_params.x5 = desc->x5; - smc_params.sid = 0; + msg.fn_id = fn_id | 0x40000000; /* SMC64_MASK */ + msg.arginfo = desc->arginfo; + msg.args[0] = desc->args[0]; + msg.args[1] = desc->args[1]; + msg.args[2] = desc->args[2]; + msg.args[3] = desc->x5; + msg.args[4] = 0; - ret = habmm_socket_send(handle, &smc_params, sizeof(smc_params), 0); - if (ret) + ret = habmm_socket_send(handle, &msg, sizeof(msg), 0); + if (ret) { + pr_err("scm_call_qcpe: habmm_socket_send failed with ret = %d", + ret); return ret; + } - size_bytes = sizeof(smc_params); - memset(&smc_params, 0x0, sizeof(smc_params)); + size_bytes = sizeof(msg); + memset(&msg, 0x0, sizeof(msg)); - ret = habmm_socket_recv(handle, &smc_params, &size_bytes, 0, 0); - if (ret) + ret = habmm_socket_recv(handle, &msg, &size_bytes, 0, 0); + if (ret) { + pr_err("scm_call_qcpe: habmm_socket_recv failed with ret = %d", + ret); return ret; + } - if (size_bytes != sizeof(smc_params)) { + if (size_bytes != sizeof(msg)) { pr_err("scm_call_qcpe: expected size: %lu, actual=%u\n", - sizeof(smc_params), size_bytes); + sizeof(msg), size_bytes); return SCM_ERROR; } - desc->ret[0] = smc_params.x1; - desc->ret[1] = smc_params.x2; - desc->ret[2] = smc_params.x3; + desc->ret[0] = msg.args[1]; + desc->ret[1] = msg.args[2]; + desc->ret[2] = msg.args[3]; pr_info("scm_call_qcpe: OUT: 0x%llx, 0x%llx, 0x%llx, 0x%llx", - smc_params.x0, desc->ret[0], desc->ret[1], desc->ret[2]); + msg.args[0], msg.args[1], msg.args[2], msg.args[3]); - return smc_params.x0; + return msg.args[0]; } static u32 smc(u32 cmd_addr) |
