Messages in this thread | | | Date | Thu, 3 Aug 2023 14:46:00 +0530 | Subject | Re: [PATCH V2] firmware: qcom_scm: use the SCM_CONVENTION based on ARM / ARM64 | From | Kathiravan T <> |
| |
On 7/14/2023 7:28 PM, Kathiravan T wrote: > > On 6/20/2023 11:43 AM, Kathiravan T wrote: >> >> On 6/7/2023 10:23 AM, Kathiravan T wrote: >>> During SCM probe, to identify the SCM convention, scm call is made with >>> SMC_CONVENTION_ARM_64 followed by SMC_CONVENTION_ARM_32. Based on the >>> result what convention to be used is decided. >>> >>> IPQ chipsets starting from IPQ807x, supports both 32bit and 64bit >>> kernel >>> variants, however TZ firmware runs in 64bit mode. When running on 32bit >>> kernel, scm call is made with SMC_CONVENTION_ARM_64 is causing the >>> system crash, due to the difference in the register sets between ARM >>> and >>> AARCH64, which is accessed by the TZ. >>> >>> To avoid this, use SMC_CONVENTION_ARM_64 only on ARM64 builds. >> >> >> Gentle Reminder... > > > Bjorn, > > Can you share your thoughts on this patch? > > > Thanks, Kathiravan T.
Gentle Reminder...
> > >> >> >>> >>> Cc: stable@vger.kernel.org >>> Fixes: 9a434cee773a ("firmware: qcom_scm: Dynamically support SMCCC >>> and legacy conventions") >>> Signed-off-by: Kathiravan T <quic_kathirav@quicinc.com> >>> --- >>> Changes in V2: >>> - Added the Fixes tag and cc'd stable mailing list >>> >>> drivers/firmware/qcom_scm.c | 2 ++ >>> 1 file changed, 2 insertions(+) >>> >>> diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c >>> index fde33acd46b7..db6754db48a0 100644 >>> --- a/drivers/firmware/qcom_scm.c >>> +++ b/drivers/firmware/qcom_scm.c >>> @@ -171,6 +171,7 @@ static enum qcom_scm_convention >>> __get_convention(void) >>> if (likely(qcom_scm_convention != SMC_CONVENTION_UNKNOWN)) >>> return qcom_scm_convention; >>> +#if IS_ENABLED(CONFIG_ARM64) >>> /* >>> * Device isn't required as there is only one argument - no >>> device >>> * needed to dma_map_single to secure world >>> @@ -191,6 +192,7 @@ static enum qcom_scm_convention >>> __get_convention(void) >>> forced = true; >>> goto found; >>> } >>> +#endif >>> probed_convention = SMC_CONVENTION_ARM_32; >>> ret = __scm_smc_call(NULL, &desc, probed_convention, &res, true);
| |