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
2 changed files with 18 additions and 3 deletions
|
@ -502,4 +502,21 @@ static inline void set_kernel_text_ro(void) { }
|
||||||
void flush_uprobe_xol_access(struct page *page, unsigned long uaddr,
|
void flush_uprobe_xol_access(struct page *page, unsigned long uaddr,
|
||||||
void *kaddr, unsigned long len);
|
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
|
#endif
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/qcom_scm.h>
|
#include <linux/qcom_scm.h>
|
||||||
|
|
||||||
#include <asm/outercache.h>
|
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
#include "qcom_scm.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
|
* Flush the command buffer so that the secure world sees
|
||||||
* the correct data.
|
* the correct data.
|
||||||
*/
|
*/
|
||||||
__cpuc_flush_dcache_area((void *)cmd, cmd->len);
|
secure_flush_area(cmd, cmd->len);
|
||||||
outer_flush_range(cmd_addr, cmd_addr + cmd->len);
|
|
||||||
|
|
||||||
ret = smc(cmd_addr);
|
ret = smc(cmd_addr);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
|
Loading…
Add table
Reference in a new issue