From 553ba1a68277d89b2d0f038d982d4635bba0622a Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Fri, 6 Nov 2015 12:10:15 -0600 Subject: [PATCH] SAMV7 QSPI: When QSPI is enabled, make the QSPI memory strongly ordered --- arch/arm/src/armv7-m/cache.h | 2 ++ arch/arm/src/samv7/chip/samv71_memorymap.h | 4 +++ arch/arm/src/samv7/sam_mpuinit.c | 30 ++++++++++++++++++---- arch/arm/src/samv7/sam_start.c | 1 + 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/arch/arm/src/armv7-m/cache.h b/arch/arm/src/armv7-m/cache.h index 7dd1059f799..d6b40b30a11 100644 --- a/arch/arm/src/armv7-m/cache.h +++ b/arch/arm/src/armv7-m/cache.h @@ -76,9 +76,11 @@ #define arm_isb(n) __asm__ __volatile__ ("isb " #n : : : "memory") #define arm_dsb(n) __asm__ __volatile__ ("dsb " #n : : : "memory") +#define arm_dmb(n) __asm__ __volatile__ ("dmb " #n : : : "memory") #define ARM_DSB() arm_dsb(15) #define ARM_ISB() arm_isb(15) +#define ARM_DMB() arm_dmb(15) /**************************************************************************** * Inline Functions diff --git a/arch/arm/src/samv7/chip/samv71_memorymap.h b/arch/arm/src/samv7/chip/samv71_memorymap.h index 917bfd0b5ec..b7d55f1031d 100644 --- a/arch/arm/src/samv7/chip/samv71_memorymap.h +++ b/arch/arm/src/samv7/chip/samv71_memorymap.h @@ -159,6 +159,10 @@ # define SAM_EXTCS3_BASE 0x63000000 /* 0x63000000-0x6fffffff: EBI Chip select 3 */ #define SAM_SDRAMCS_BASE 0x70000000 /* 0x70000000-0x7fffffff: SDRAM chip select */ +/* QSPI memory region */ + +#define SAM_QSPIMEM_SIZE 0x20000000 /* 0x80000000-0x9fffffff: QSPI memory */ + /* System memory region */ #define SAM_PRIVPERIPH_BASE 0xe0000000 /* 0xe0000000-0xe00fffff: Private peripheral bus */ diff --git a/arch/arm/src/samv7/sam_mpuinit.c b/arch/arm/src/samv7/sam_mpuinit.c index 842012be4d8..b2f730f40e8 100644 --- a/arch/arm/src/samv7/sam_mpuinit.c +++ b/arch/arm/src/samv7/sam_mpuinit.c @@ -44,6 +44,9 @@ #include #include "mpu.h" +#include "cache.h" +#include "chip/sam_memorymap.h" + #include "sam_mpuinit.h" #ifdef CONFIG_ARMV7M_MPU @@ -84,23 +87,40 @@ void sam_mpu_initialize(void) { #ifdef CONFIG_BUILD_PROTECTED - uintptr_t datastart = MIN(USERSPACE->us_datastart, USERSPACE->us_bssstart); - uintptr_t dataend = MAX(USERSPACE->us_dataend, USERSPACE->us_bssend); - - DEBUGASSERT(USERSPACE->us_textend >= USERSPACE->us_textstart && - dataend >= datastart); + uintptr_t datastart; + uintptr_t dataend; #endif /* Show MPU information */ mpu_showtype(); +#ifdef CONFIG_ARMV7M_DCACHE + /* Memory barrier */ + + ARM_DMB(); + +#ifdef CONFIG_SAMV7_QSPI + /* Make QSPI memory region strongly ordered */ + + mpu_priv_stronglyordered(SAM_QSPIMEM_BASE, SAM_QSPIMEM_SIZE); + +#endif +#endif + #ifdef CONFIG_BUILD_PROTECTED /* Configure user flash and SRAM space */ + DEBUGASSERT(USERSPACE->us_textend >= USERSPACE->us_textstart); + mpu_user_flash(USERSPACE->us_textstart, USERSPACE->us_textend - USERSPACE->us_textstart); + datastart = MIN(USERSPACE->us_datastart, USERSPACE->us_bssstart); + dataend = MAX(USERSPACE->us_dataend, USERSPACE->us_bssend); + + DEBUGASSERT(dataend >= datastart); + mpu_user_intsram(datastart, dataend - datastart); #endif diff --git a/arch/arm/src/samv7/sam_start.c b/arch/arm/src/samv7/sam_start.c index bd45aea63b9..985e24e181d 100644 --- a/arch/arm/src/samv7/sam_start.c +++ b/arch/arm/src/samv7/sam_start.c @@ -55,6 +55,7 @@ #endif #include "sam_clockconfig.h" +#include "sam_mpuinit.h" #include "sam_userspace.h" #include "sam_start.h"