Skip to content
Snippets Groups Projects
Commit de63ac27 authored by R Sricharan's avatar R Sricharan Committed by Albert ARIBAUD
Browse files

ARM: mmu: Set domain permissions to client access


 The 'XN' execute never bit is set in the pagetables. This will
 prevent speculative prefetches to non executable regions. But the
 domain permissions are set as master in the DACR register.
 So the pagetable attribute for 'XN' is not effective. Change the
 permissions to client.

 This fixes lot of speculative prefetch aborts seen on OMAP5
 secure devices.

Signed-off-by: default avatarR Sricharan <r.sricharan@ti.com>
Tested-by: default avatarVincent Stehle <v-stehle@ti.com>
Cc: Vincent Stehle <v-stehle@ti.com>
Cc: Tom Rini <trini@ti.com>
Cc: Albert ARIBAUD <albert.u.boot@aribaud.net>
parent 96fdbec2
No related branches found
No related tags found
No related merge requests found
...@@ -340,6 +340,9 @@ void mmu_page_table_flush(unsigned long start, unsigned long stop) ...@@ -340,6 +340,9 @@ void mmu_page_table_flush(unsigned long start, unsigned long stop)
{ {
} }
void arm_init_domains(void)
{
}
#endif /* #ifndef CONFIG_SYS_DCACHE_OFF */ #endif /* #ifndef CONFIG_SYS_DCACHE_OFF */
#ifndef CONFIG_SYS_ICACHE_OFF #ifndef CONFIG_SYS_ICACHE_OFF
......
...@@ -34,6 +34,12 @@ ...@@ -34,6 +34,12 @@
#include <asm/emif.h> #include <asm/emif.h>
#include <asm/omap_common.h> #include <asm/omap_common.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <asm/cache.h>
#include <asm/system.h>
#define ARMV7_DCACHE_WRITEBACK 0xe
#define ARMV7_DOMAIN_CLIENT 1
#define ARMV7_DOMAIN_MASK (0x3 << 0)
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
...@@ -269,4 +275,33 @@ void enable_caches(void) ...@@ -269,4 +275,33 @@ void enable_caches(void)
/* Enable D-cache. I-cache is already enabled in start.S */ /* Enable D-cache. I-cache is already enabled in start.S */
dcache_enable(); dcache_enable();
} }
void dram_bank_mmu_setup(int bank)
{
bd_t *bd = gd->bd;
int i;
u32 start = bd->bi_dram[bank].start >> 20;
u32 size = bd->bi_dram[bank].size >> 20;
u32 end = start + size;
debug("%s: bank: %d\n", __func__, bank);
for (i = start; i < end; i++)
set_section_dcache(i, ARMV7_DCACHE_WRITEBACK);
}
void arm_init_domains(void)
{
u32 reg;
reg = get_dacr();
/*
* Set DOMAIN to client access so that all permissions
* set in pagetables are validated by the mmu.
*/
reg &= ~ARMV7_DOMAIN_MASK;
reg |= ARMV7_DOMAIN_CLIENT;
set_dacr(reg);
}
#endif #endif
...@@ -81,6 +81,20 @@ static inline void set_cr(unsigned int val) ...@@ -81,6 +81,20 @@ static inline void set_cr(unsigned int val)
isb(); isb();
} }
static inline unsigned int get_dacr(void)
{
unsigned int val;
asm("mrc p15, 0, %0, c3, c0, 0 @ get DACR" : "=r" (val) : : "cc");
return val;
}
static inline void set_dacr(unsigned int val)
{
asm volatile("mcr p15, 0, %0, c3, c0, 0 @ set DACR"
: : "r" (val) : "cc");
isb();
}
/* options available for data cache on each page */ /* options available for data cache on each page */
enum dcache_option { enum dcache_option {
DCACHE_OFF = 0x12, DCACHE_OFF = 0x12,
......
...@@ -36,6 +36,10 @@ void __arm_init_before_mmu(void) ...@@ -36,6 +36,10 @@ void __arm_init_before_mmu(void)
void arm_init_before_mmu(void) void arm_init_before_mmu(void)
__attribute__((weak, alias("__arm_init_before_mmu"))); __attribute__((weak, alias("__arm_init_before_mmu")));
__weak void arm_init_domains(void)
{
}
static void cp_delay (void) static void cp_delay (void)
{ {
volatile int i; volatile int i;
...@@ -117,6 +121,9 @@ static inline void mmu_setup(void) ...@@ -117,6 +121,9 @@ static inline void mmu_setup(void)
/* Set the access control to all-supervisor */ /* Set the access control to all-supervisor */
asm volatile("mcr p15, 0, %0, c3, c0, 0" asm volatile("mcr p15, 0, %0, c3, c0, 0"
: : "r" (~0)); : : "r" (~0));
arm_init_domains();
/* and enable the mmu */ /* and enable the mmu */
reg = get_cr(); /* get control reg. */ reg = get_cr(); /* get control reg. */
cp_delay(); cp_delay();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment