From: Andy Gross <agross@codeaurora.org>
To: Stephen Boyd <sboyd@codeaurora.org>
Cc: Kumar Gala <galak@codeaurora.org>,
linux-arm-msm@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, arm@kernel.org,
Lina Iyer <lina.iyer@linaro.org>
Subject: Re: [PATCH v5 2/2] firmware: qcom: scm: Add support for ARM64 SoCs
Date: Wed, 5 Aug 2015 22:30:17 -0500 [thread overview]
Message-ID: <20150806033017.GB11996@qualcomm.com> (raw)
In-Reply-To: <55C2B7FC.5090402@codeaurora.org>
On Wed, Aug 05, 2015 at 06:27:24PM -0700, Stephen Boyd wrote:
> On 04/28/2015 12:23 PM, Kumar Gala wrote:
> >+
> >+int __qcom_scm_call_armv8_64(u64 x0, u64 x1, u64 x2, u64 x3, u64 x4, u64 x5,
> >+ u64 *ret1, u64 *ret2, u64 *ret3)
> >+{
> >+ register u64 r0 asm("r0") = x0;
> >+ register u64 r1 asm("r1") = x1;
> >+ register u64 r2 asm("r2") = x2;
> >+ register u64 r3 asm("r3") = x3;
> >+ register u64 r4 asm("r4") = x4;
> >+ register u64 r5 asm("r5") = x5;
>
> This should set x6 to 0.
>
> register u32 r6 asm("r6") = 0;
>
> for example.
>
> >+
> >+ do {
> >+ asm volatile(
> >+ __asmeq("%0", "x0")
> >+ __asmeq("%1", "x1")
> >+ __asmeq("%2", "x2")
> >+ __asmeq("%3", "x3")
> >+ __asmeq("%4", "x0")
> >+ __asmeq("%5", "x1")
> >+ __asmeq("%6", "x2")
> >+ __asmeq("%7", "x3")
> >+ __asmeq("%8", "x4")
> >+ __asmeq("%9", "x5")
>
> And then the asmeq thing here for x6.
>
> >+#ifdef REQUIRES_SEC
> >+ ".arch_extension sec\n"
> >+#endif
> >+ "smc #0\n"
> >+ : "=r" (r0), "=r" (r1), "=r" (r2), "=r" (r3)
> >+ : "r" (r0), "r" (r1), "r" (r2), "r" (r3), "r" (r4),
> >+ "r" (r5)
>
> And add x6 as an input here.
>
> >+ : "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13",
>
> and remove x6 as a clobber.
>
> >+ "x14", "x15", "x16", "x17");
> >+ } while (r0 == QCOM_SCM_INTERRUPTED);
> >+
> >+ if (ret1)
> >+ *ret1 = r1;
> >+ if (ret2)
> >+ *ret2 = r2;
> >+ if (ret3)
> >+ *ret3 = r3;
> >+
> >+ return r0;
> >+}
> >+
> >+int __qcom_scm_call_armv8_32(u32 w0, u32 w1, u32 w2, u32 w3, u32 w4, u32 w5,
> >+ u64 *ret1, u64 *ret2, u64 *ret3)
> >+{
> >+ register u32 r0 asm("r0") = w0;
> >+ register u32 r1 asm("r1") = w1;
> >+ register u32 r2 asm("r2") = w2;
> >+ register u32 r3 asm("r3") = w3;
> >+ register u32 r4 asm("r4") = w4;
> >+ register u32 r5 asm("r5") = w5;
>
> This needs to set r6 to 0 as well
>
> register u32 r6 asm("r6") = 0;
>
> for example.
>
> >+
> >+ do {
> >+ asm volatile(
> >+ __asmeq("%0", "x0")
> >+ __asmeq("%1", "x1")
> >+ __asmeq("%2", "x2")
> >+ __asmeq("%3", "x3")
> >+ __asmeq("%4", "x0")
> >+ __asmeq("%5", "x1")
> >+ __asmeq("%6", "x2")
> >+ __asmeq("%7", "x3")
> >+ __asmeq("%8", "x4")
> >+ __asmeq("%9", "x5")
>
> And then another asmeq thing here for x6.
>
> >+#ifdef REQUIRES_SEC
> >+ ".arch_extension sec\n"
> >+#endif
> >+ "smc #0\n"
> >+ : "=r" (r0), "=r" (r1), "=r" (r2), "=r" (r3)
> >+ : "r" (r0), "r" (r1), "r" (r2), "r" (r3), "r" (r4),
> >+ "r" (r5)
>
> And then add r6 here as an input
>
> >+ : "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13",
>
> And remove r6 from the clobber.
>
> >+ "x14", "x15", "x16", "x17");
> >+
> >+ } while (r0 == QCOM_SCM_INTERRUPTED);
> >+
> >+ if (ret1)
> >+ *ret1 = r1;
> >+ if (ret2)
> >+ *ret2 = r2;
> >+ if (ret3)
> >+ *ret3 = r3;
> >+
> >+ return r0;
> >+}
> >+
> >
>
> Here's a totally untested patch for that.
>
> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
> ----8<-----
>
> diff --git a/drivers/firmware/qcom_scm-64.c b/drivers/firmware/qcom_scm-64.c
> index a95fd9b5d576..8f7e65ff524c 100644
> --- a/drivers/firmware/qcom_scm-64.c
> +++ b/drivers/firmware/qcom_scm-64.c
> @@ -114,6 +114,7 @@ int __qcom_scm_call_armv8_64(u64 x0, u64 x1, u64 x2, u64 x3, u64 x4, u64 x5,
> register u64 r3 asm("r3") = x3;
> register u64 r4 asm("r4") = x4;
> register u64 r5 asm("r5") = x5;
> + register u64 r6 asm("r5") = 0;
> do {
> asm volatile(
> @@ -127,14 +128,15 @@ int __qcom_scm_call_armv8_64(u64 x0, u64 x1, u64 x2, u64 x3, u64 x4, u64 x5,
> __asmeq("%7", "x3")
> __asmeq("%8", "x4")
> __asmeq("%9", "x5")
> + __asmeq("%10", "x6")
> #ifdef REQUIRES_SEC
> ".arch_extension sec\n"
> #endif
> "smc #0\n"
> : "=r" (r0), "=r" (r1), "=r" (r2), "=r" (r3)
> : "r" (r0), "r" (r1), "r" (r2), "r" (r3), "r" (r4),
> - "r" (r5)
> - : "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13",
> + "r" (r5), "r" (r6)
> + : "x7", "x8", "x9", "x10", "x11", "x12", "x13",
> "x14", "x15", "x16", "x17");
> } while (r0 == QCOM_SCM_INTERRUPTED);
> @@ -157,6 +159,7 @@ int __qcom_scm_call_armv8_32(u32 w0, u32 w1, u32 w2, u32 w3, u32 w4, u32 w5,
> register u32 r3 asm("r3") = w3;
> register u32 r4 asm("r4") = w4;
> register u32 r5 asm("r5") = w5;
> + register u32 r6 asm("r6") = 0;
> do {
> asm volatile(
> @@ -170,14 +173,15 @@ int __qcom_scm_call_armv8_32(u32 w0, u32 w1, u32 w2, u32 w3, u32 w4, u32 w5,
> __asmeq("%7", "x3")
> __asmeq("%8", "x4")
> __asmeq("%9", "x5")
> + __asmeq("%10", "x6")
> #ifdef REQUIRES_SEC
> ".arch_extension sec\n"
> #endif
> "smc #0\n"
> : "=r" (r0), "=r" (r1), "=r" (r2), "=r" (r3)
> : "r" (r0), "r" (r1), "r" (r2), "r" (r3), "r" (r4),
> - "r" (r5)
> - : "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13",
> + "r" (r5), "r" (r6)
> + : "x7", "x8", "x9", "x10", "x11", "x12", "x13",
> "x14", "x15", "x16", "x17");
> } while (r0 == QCOM_SCM_INTERRUPTED);
>
> --
Stephen, I'll incorporate this in the next version. Thanks!
--
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
prev parent reply other threads:[~2015-08-06 3:30 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-28 19:23 [PATCH v5 1/2] firmware: qcom: scm: Split out 32-bit specific SCM code Kumar Gala
2015-04-28 19:23 ` [PATCH v5 2/2] firmware: qcom: scm: Add support for ARM64 SoCs Kumar Gala
2015-04-29 15:42 ` Mark Rutland
2015-04-29 16:18 ` Kumar Gala
2015-04-29 16:38 ` Mark Rutland
2015-04-29 17:25 ` Kumar Gala
2015-08-06 1:27 ` Stephen Boyd
2015-08-06 3:30 ` Andy Gross [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150806033017.GB11996@qualcomm.com \
--to=agross@codeaurora.org \
--cc=arm@kernel.org \
--cc=galak@codeaurora.org \
--cc=lina.iyer@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=sboyd@codeaurora.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox