[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1578431066-19600-9-git-send-email-eberman@codeaurora.org>
Date: Tue, 7 Jan 2020 13:04:17 -0800
From: Elliot Berman <eberman@...eaurora.org>
To: Bjorn Andersson <bjorn.andersson@...aro.org>, agross@...nel.org,
swboyd@...omium.org, Stephan Gerhold <stephan@...hold.net>
Cc: Elliot Berman <eberman@...eaurora.org>,
saiprakash.ranjan@...eaurora.org, tsoni@...eaurora.org,
sidgup@...eaurora.org, psodagud@...eaurora.org,
Brian Masney <masneyb@...tation.org>,
linux-arm-msm@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: [PATCH v5 08/17] firmware: qcom_scm-64: Improve SMC convention detection
Improve the calling convention detection to use
__qcom_scm_is_call_available() and not blindly assume 32-bit mode if
the checks fails. BUG() if neither 32-bit or 64-bit mode works.
Change-Id: I66beec550d05afde6c680d256183e8ad207d7268
Tested-by: Brian Masney <masneyb@...tation.org> # arm32
Tested-by: Stephan Gerhold <stephan@...hold.net>
Signed-off-by: Elliot Berman <eberman@...eaurora.org>
---
drivers/firmware/qcom_scm-64.c | 41 +++++++++++++++++++++++++++--------------
1 file changed, 27 insertions(+), 14 deletions(-)
diff --git a/drivers/firmware/qcom_scm-64.c b/drivers/firmware/qcom_scm-64.c
index 3ae171a..6bc7f69 100644
--- a/drivers/firmware/qcom_scm-64.c
+++ b/drivers/firmware/qcom_scm-64.c
@@ -336,21 +336,34 @@ int __qcom_scm_ocmem_unlock(struct device *dev, uint32_t id, uint32_t offset,
void __qcom_scm_init(void)
{
- u64 cmd;
- struct arm_smccc_res res;
- u32 fnid = SCM_SMC_FNID(QCOM_SCM_SVC_INFO, QCOM_SCM_INFO_IS_CALL_AVAIL);
-
- /* First try a SMC64 call */
- cmd = ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, ARM_SMCCC_SMC_64,
- ARM_SMCCC_OWNER_SIP, fnid);
-
- arm_smccc_smc(cmd, QCOM_SCM_ARGS(1), cmd & (~BIT(ARM_SMCCC_TYPE_SHIFT)),
- 0, 0, 0, 0, 0, &res);
+ struct qcom_scm_desc desc = {
+ .svc = QCOM_SCM_SVC_INFO,
+ .cmd = QCOM_SCM_INFO_IS_CALL_AVAIL,
+ .args[0] = SCM_SMC_FNID(QCOM_SCM_SVC_INFO,
+ QCOM_SCM_INFO_IS_CALL_AVAIL) |
+ (ARM_SMCCC_OWNER_SIP << ARM_SMCCC_OWNER_SHIFT),
+ .arginfo = QCOM_SCM_ARGS(1),
+ .owner = ARM_SMCCC_OWNER_SIP,
+ };
+ struct qcom_scm_res res;
+ int ret;
- if (!res.a0 && res.a1)
- qcom_smccc_convention = ARM_SMCCC_SMC_64;
- else
- qcom_smccc_convention = ARM_SMCCC_SMC_32;
+ qcom_smccc_convention = ARM_SMCCC_SMC_64;
+ // Device isn't required as there is only one argument - no device
+ // needed to dma_map_single to secure world
+ ret = qcom_scm_call_atomic(NULL, &desc, &res);
+ if (!ret && res.result[0] == 1)
+ goto out;
+
+ qcom_smccc_convention = ARM_SMCCC_SMC_32;
+ ret = qcom_scm_call_atomic(NULL, &desc, &res);
+ if (!ret && res.result[0] == 1)
+ goto out;
+
+ qcom_smccc_convention = -1;
+ BUG();
+out:
+ pr_info("QCOM SCM SMC Convention: %lld\n", qcom_smccc_convention);
}
bool __qcom_scm_pas_supported(struct device *dev, u32 peripheral)
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
Powered by blists - more mailing lists