All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Boyd <sboyd@codeaurora.org>
To: David Brown <davidb@codeaurora.org>, Kumar Gala <galak@codeaurora.org>
Cc: linux-arm-msm@vger.kernel.org,
	Vikram Mulukutla <markivx@codeaurora.org>,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	Lina Iyer <lina.iyer@linaro.org>
Subject: [PATCH 3/8] msm: scm: Flush the command buffer only instead of the entire cache
Date: Mon,  4 Aug 2014 18:31:45 -0700	[thread overview]
Message-ID: <1407202310-3359-4-git-send-email-sboyd@codeaurora.org> (raw)
In-Reply-To: <1407202310-3359-1-git-send-email-sboyd@codeaurora.org>

From: Vikram Mulukutla <markivx@codeaurora.org>

scm_call flushes the entire cache before calling into the
secure world. This is both a performance penalty as well
as insufficient on SMP systems where the CPUs possess a
write-back L1 cache. Flush only the command and response
buffers instead, moving the responsibility of flushing any
other cached buffer (being passed to the secure world) to
callers.

Signed-off-by: Vikram Mulukutla <markivx@codeaurora.org>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 arch/arm/mach-qcom/scm.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/arch/arm/mach-qcom/scm.c b/arch/arm/mach-qcom/scm.c
index c08786ebf116..ec37b037e69c 100644
--- a/arch/arm/mach-qcom/scm.c
+++ b/arch/arm/mach-qcom/scm.c
@@ -196,12 +196,12 @@ static int __scm_call(const struct scm_command *cmd)
 	u32 cmd_addr = virt_to_phys(cmd);
 
 	/*
-	 * Flush the entire cache here so callers don't have to remember
-	 * to flush the cache when passing physical addresses to the secure
-	 * side in the buffer.
+	 * Flush the command buffer so that the secure world sees
+	 * the correct data.
 	 */
-	flush_cache_all();
-	outer_flush_all();
+	__cpuc_flush_dcache_area((void *)cmd, cmd->len);
+	outer_flush_range(cmd_addr, cmd_addr + cmd->len);
+
 	ret = smc(cmd_addr);
 	if (ret < 0)
 		ret = scm_remap_error(ret);
@@ -238,6 +238,13 @@ static void scm_inv_range(unsigned long start, unsigned long end)
  * @resp_len: length of the response buffer
  *
  * Sends a command to the SCM and waits for the command to finish processing.
+ *
+ * A note on cache maintenance:
+ * Note that any buffers that are expected to be accessed by the secure world
+ * must be flushed before invoking scm_call and invalidated in the cache
+ * immediately after scm_call returns. Cache maintenance on the command and
+ * response buffers is taken care of by scm_call; however, callers are
+ * responsible for any other cached buffers passed over to the secure world.
  */
 int scm_call(u32 svc_id, u32 cmd_id, const void *cmd_buf, size_t cmd_len,
 		void *resp_buf, size_t resp_len)
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation

WARNING: multiple messages have this Message-ID (diff)
From: Stephen Boyd <sboyd@codeaurora.org>
To: David Brown <davidb@codeaurora.org>, Kumar Gala <galak@codeaurora.org>
Cc: Vikram Mulukutla <markivx@codeaurora.org>,
	linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	Lina Iyer <lina.iyer@linaro.org>
Subject: [PATCH 3/8] msm: scm: Flush the command buffer only instead of the entire cache
Date: Mon,  4 Aug 2014 18:31:45 -0700	[thread overview]
Message-ID: <1407202310-3359-4-git-send-email-sboyd@codeaurora.org> (raw)
In-Reply-To: <1407202310-3359-1-git-send-email-sboyd@codeaurora.org>

From: Vikram Mulukutla <markivx@codeaurora.org>

scm_call flushes the entire cache before calling into the
secure world. This is both a performance penalty as well
as insufficient on SMP systems where the CPUs possess a
write-back L1 cache. Flush only the command and response
buffers instead, moving the responsibility of flushing any
other cached buffer (being passed to the secure world) to
callers.

Signed-off-by: Vikram Mulukutla <markivx@codeaurora.org>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 arch/arm/mach-qcom/scm.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/arch/arm/mach-qcom/scm.c b/arch/arm/mach-qcom/scm.c
index c08786ebf116..ec37b037e69c 100644
--- a/arch/arm/mach-qcom/scm.c
+++ b/arch/arm/mach-qcom/scm.c
@@ -196,12 +196,12 @@ static int __scm_call(const struct scm_command *cmd)
 	u32 cmd_addr = virt_to_phys(cmd);
 
 	/*
-	 * Flush the entire cache here so callers don't have to remember
-	 * to flush the cache when passing physical addresses to the secure
-	 * side in the buffer.
+	 * Flush the command buffer so that the secure world sees
+	 * the correct data.
 	 */
-	flush_cache_all();
-	outer_flush_all();
+	__cpuc_flush_dcache_area((void *)cmd, cmd->len);
+	outer_flush_range(cmd_addr, cmd_addr + cmd->len);
+
 	ret = smc(cmd_addr);
 	if (ret < 0)
 		ret = scm_remap_error(ret);
@@ -238,6 +238,13 @@ static void scm_inv_range(unsigned long start, unsigned long end)
  * @resp_len: length of the response buffer
  *
  * Sends a command to the SCM and waits for the command to finish processing.
+ *
+ * A note on cache maintenance:
+ * Note that any buffers that are expected to be accessed by the secure world
+ * must be flushed before invoking scm_call and invalidated in the cache
+ * immediately after scm_call returns. Cache maintenance on the command and
+ * response buffers is taken care of by scm_call; however, callers are
+ * responsible for any other cached buffers passed over to the secure world.
  */
 int scm_call(u32 svc_id, u32 cmd_id, const void *cmd_buf, size_t cmd_len,
 		void *resp_buf, size_t resp_len)
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation


WARNING: multiple messages have this Message-ID (diff)
From: sboyd@codeaurora.org (Stephen Boyd)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 3/8] msm: scm: Flush the command buffer only instead of the entire cache
Date: Mon,  4 Aug 2014 18:31:45 -0700	[thread overview]
Message-ID: <1407202310-3359-4-git-send-email-sboyd@codeaurora.org> (raw)
In-Reply-To: <1407202310-3359-1-git-send-email-sboyd@codeaurora.org>

From: Vikram Mulukutla <markivx@codeaurora.org>

scm_call flushes the entire cache before calling into the
secure world. This is both a performance penalty as well
as insufficient on SMP systems where the CPUs possess a
write-back L1 cache. Flush only the command and response
buffers instead, moving the responsibility of flushing any
other cached buffer (being passed to the secure world) to
callers.

Signed-off-by: Vikram Mulukutla <markivx@codeaurora.org>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 arch/arm/mach-qcom/scm.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/arch/arm/mach-qcom/scm.c b/arch/arm/mach-qcom/scm.c
index c08786ebf116..ec37b037e69c 100644
--- a/arch/arm/mach-qcom/scm.c
+++ b/arch/arm/mach-qcom/scm.c
@@ -196,12 +196,12 @@ static int __scm_call(const struct scm_command *cmd)
 	u32 cmd_addr = virt_to_phys(cmd);
 
 	/*
-	 * Flush the entire cache here so callers don't have to remember
-	 * to flush the cache when passing physical addresses to the secure
-	 * side in the buffer.
+	 * Flush the command buffer so that the secure world sees
+	 * the correct data.
 	 */
-	flush_cache_all();
-	outer_flush_all();
+	__cpuc_flush_dcache_area((void *)cmd, cmd->len);
+	outer_flush_range(cmd_addr, cmd_addr + cmd->len);
+
 	ret = smc(cmd_addr);
 	if (ret < 0)
 		ret = scm_remap_error(ret);
@@ -238,6 +238,13 @@ static void scm_inv_range(unsigned long start, unsigned long end)
  * @resp_len: length of the response buffer
  *
  * Sends a command to the SCM and waits for the command to finish processing.
+ *
+ * A note on cache maintenance:
+ * Note that any buffers that are expected to be accessed by the secure world
+ * must be flushed before invoking scm_call and invalidated in the cache
+ * immediately after scm_call returns. Cache maintenance on the command and
+ * response buffers is taken care of by scm_call; however, callers are
+ * responsible for any other cached buffers passed over to the secure world.
  */
 int scm_call(u32 svc_id, u32 cmd_id, const void *cmd_buf, size_t cmd_len,
 		void *resp_buf, size_t resp_len)
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation

  parent reply	other threads:[~2014-08-05  1:31 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-05  1:31 [PATCH 0/8] qcom SCM updates Stephen Boyd
2014-08-05  1:31 ` Stephen Boyd
2014-08-05  1:31 ` [PATCH 1/8] msm: scm: Fix incorrect cache invalidation Stephen Boyd
2014-08-05  1:31   ` Stephen Boyd
2014-08-05  1:31 ` [PATCH 2/8] msm: scm: Get cacheline size from CTR Stephen Boyd
2014-08-05  1:31   ` Stephen Boyd
2014-08-05  1:31   ` Stephen Boyd
2014-08-05  1:31 ` Stephen Boyd [this message]
2014-08-05  1:31   ` [PATCH 3/8] msm: scm: Flush the command buffer only instead of the entire cache Stephen Boyd
2014-08-05  1:31   ` Stephen Boyd
2014-08-05  1:31 ` [PATCH 4/8] msm: scm: Add atomic SCM APIs Stephen Boyd
2014-08-05  1:31   ` Stephen Boyd
2014-08-05  1:31 ` [PATCH 5/8] msm: scm: Add API to query for service/command availability Stephen Boyd
2014-08-05  1:31   ` Stephen Boyd
2014-08-05  1:31   ` Stephen Boyd
2014-08-05  1:31 ` [PATCH 6/8] msm: scm: Add a feat version query API Stephen Boyd
2014-08-05  1:31   ` Stephen Boyd
2014-08-05  1:31 ` [PATCH 7/8] msm: scm: Add logging of actual return code from scm call Stephen Boyd
2014-08-05  1:31   ` Stephen Boyd
2014-08-05  1:31 ` [PATCH 8/8] msm: scm: Move the scm driver to drivers/soc/qcom Stephen Boyd
2014-08-05  1:31   ` Stephen Boyd
2014-08-05  4:07   ` Lina Iyer
2014-08-05  4:07     ` Lina Iyer
2014-08-05 20:12     ` Bjorn Andersson
2014-08-05 20:12       ` Bjorn Andersson
2014-08-05 20:12       ` Bjorn Andersson
2014-08-05 20:17       ` Lina Iyer
2014-08-05 20:17         ` Lina Iyer
2014-08-05 20:17         ` Lina Iyer
2015-01-22  1:13   ` Olof Johansson
2015-01-22  1:13     ` Olof Johansson
2015-01-22  1:13     ` Olof Johansson
2015-01-22  1:53     ` Bjorn Andersson
2015-01-22  1:53       ` Bjorn Andersson
2015-01-22  1:53       ` Bjorn Andersson
2015-01-22 16:49       ` Kumar Gala
2015-01-22 16:49         ` Kumar Gala
2015-01-22 16:49         ` Kumar Gala
2015-01-23  1:19     ` Rob Clark
2015-01-23  1:19       ` Rob Clark
2015-01-23  1:19       ` Rob Clark
2014-09-17 22:08 ` [PATCH 0/8] qcom SCM updates Kumar Gala
2014-09-17 22:08   ` Kumar Gala

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=1407202310-3359-4-git-send-email-sboyd@codeaurora.org \
    --to=sboyd@codeaurora.org \
    --cc=davidb@codeaurora.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=markivx@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.