mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-19 06:47:48 +00:00
firmware: qcom_scm-32: replace open-coded call to __cpuc_flush_dcache_area()
Rathe rthan directly accessing architecture internal functions, provide an "method"-centric wrapper for qcom_scm-32 to do what's necessary to ensure that the secure monitor can see the data. This is called "secure_flush_area" and ensures that the specified memory area is coherent across the secure boundary. Acked-by: Andy Gross <agross@codeaurora.org> Reviewed-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
21caf3a765
commit
efaa6e266b
@ -502,4 +502,21 @@ static inline void set_kernel_text_ro(void) { }
|
||||
void flush_uprobe_xol_access(struct page *page, unsigned long uaddr,
|
||||
void *kaddr, unsigned long len);
|
||||
|
||||
/**
|
||||
* secure_flush_area - ensure coherency across the secure boundary
|
||||
* @addr: virtual address
|
||||
* @size: size of region
|
||||
*
|
||||
* Ensure that the specified area of memory is coherent across the secure
|
||||
* boundary from the non-secure side. This is used when calling secure
|
||||
* firmware where the secure firmware does not ensure coherency.
|
||||
*/
|
||||
static inline void secure_flush_area(const void *addr, size_t size)
|
||||
{
|
||||
phys_addr_t phys = __pa(addr);
|
||||
|
||||
__cpuc_flush_dcache_area((void *)addr, size);
|
||||
outer_flush_range(phys, phys + size);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include <linux/err.h>
|
||||
#include <linux/qcom_scm.h>
|
||||
|
||||
#include <asm/outercache.h>
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
#include "qcom_scm.h"
|
||||
@ -219,8 +218,7 @@ static int __qcom_scm_call(const struct qcom_scm_command *cmd)
|
||||
* Flush the command buffer so that the secure world sees
|
||||
* the correct data.
|
||||
*/
|
||||
__cpuc_flush_dcache_area((void *)cmd, cmd->len);
|
||||
outer_flush_range(cmd_addr, cmd_addr + cmd->len);
|
||||
secure_flush_area(cmd, cmd->len);
|
||||
|
||||
ret = smc(cmd_addr);
|
||||
if (ret < 0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user