ARM: Move L2 cache initialization to much later in the sequence

This commit is contained in:
Gregory Nutt 2014-07-27 10:03:33 -06:00
parent ad4fdc06e2
commit 100bba42be
8 changed files with 47 additions and 38 deletions

View File

@ -125,6 +125,10 @@ config ARCH_HAVE_IRQPRIO
bool bool
default n default n
config ARCH_L2CACHE
bool
default n
config CUSTOM_STACK config CUSTOM_STACK
bool bool
default n default n

View File

@ -23,20 +23,11 @@ if ARMV7A_HAVE_L2CC
menu "L2 Cache Configuration" menu "L2 Cache Configuration"
config ARMV7A_L2CC
bool
default n
---help---
Set by the configuration tool if the architecture specific L2CC is
enabled. This is an architecture-independent setting to inform
firmware that an L2 cache is present and that standard L2 cache
operations are supported.
config ARMV7A_L2CC_PL310 config ARMV7A_L2CC_PL310
bool "ARMv7-A L2CC P310 Support" bool "ARMv7-A L2CC P310 Support"
default n default n
depends on ARMV7A_HAVE_L2CC_PL310 && EXPERIMENTAL depends on ARMV7A_HAVE_L2CC_PL310 && EXPERIMENTAL
select ARMV7A_L2CC select ARCH_L2CACHE
---help--- ---help---
Enable the 2 Cache Controller (L2CC) is based on the L2CC-PL310 ARM Enable the 2 Cache Controller (L2CC) is based on the L2CC-PL310 ARM
multi-way cache macrocell, version r3p2. The addition of an on-chip multi-way cache macrocell, version r3p2. The addition of an on-chip
@ -44,6 +35,7 @@ config ARMV7A_L2CC_PL310
method of improving the system performance when significant memory method of improving the system performance when significant memory
traffic is generated by the processor. traffic is generated by the processor.
if ARCH_L2CACHE
if ARMV7A_L2CC_PL310 if ARMV7A_L2CC_PL310
config PL310_LOCKDOWN_BY_MASTER config PL310_LOCKDOWN_BY_MASTER
@ -63,7 +55,7 @@ endif # ARMV7A_L2CC_PL310
choice choice
prompt "L2 Cache Associativity" prompt "L2 Cache Associativity"
default ARMV7A_ASSOCIATIVITY_8WAY default ARMV7A_ASSOCIATIVITY_8WAY
depends on ARMV7A_L2CC depends on ARCH_L2CACHE
---help--- ---help---
This choice specifies the associativity of L2 cache in terms of the This choice specifies the associativity of L2 cache in terms of the
number of ways. This value could be obtained by querying cache number of ways. This value could be obtained by querying cache
@ -82,7 +74,7 @@ endchoice # L2 Cache Associativity
choice choice
prompt "L2 Cache Way Size" prompt "L2 Cache Way Size"
default ARMV7A_WAYSIZE_16KB default ARMV7A_WAYSIZE_16KB
depends on ARMV7A_L2CC depends on ARCH_L2CACHE
---help--- ---help---
This choice specifies size of each way. This value can be obtained This choice specifies size of each way. This value can be obtained
by querying cache configuration registers. However, by defining a by querying cache configuration registers. However, by defining a
@ -108,8 +100,9 @@ config ARMV7A_WAYSIZE_512KB
bool "512 KiB" bool "512 KiB"
endchoice # L2 Cache Associativity endchoice # L2 Cache Associativity
endif # ARCH_L2CACHE
endmenu # L2 Cache Configuration endmenu # L2 Cache Configuration
endif # endif # ARMV7A_HAVE_L2CC
choice choice
prompt "Toolchain Selection" prompt "Toolchain Selection"

View File

@ -172,10 +172,10 @@
/* Bit 25: Cache Replacement Policy /* Bit 25: Cache Replacement Policy
* *
* Default: 0=Pseudo-random replacement using lfsr * Default: 1=Round robin replacement policy
*/ */
#define L2CC_ACR_CRPOL_CONFIG (0) /* 0=Pseudo-random replacement */ #define L2CC_ACR_CRPOL_CONFIG L2CC_ACR_CRPOL /* 1=Round robin replacement policy */
/* Bit 26: Non-Secure Lockdown Enable /* Bit 26: Non-Secure Lockdown Enable
* *
@ -293,7 +293,7 @@ static void pl310_flush_all(void)
****************************************************************************/ ****************************************************************************/
/*************************************************************************** /***************************************************************************
* Name: l2cc_initialize * Name: up_l2ccinitialize
* *
* Description: * Description:
* One time configuration of the L2 cache. The L2 cache will be enabled * One time configuration of the L2 cache. The L2 cache will be enabled
@ -304,11 +304,11 @@ static void pl310_flush_all(void)
* settings. * settings.
* *
* Returned Value: * Returned Value:
* Always returns OK. * None
* *
***************************************************************************/ ***************************************************************************/
int l2cc_initialize(void) void up_l2ccinitialize(void)
{ {
uint32_t regval; uint32_t regval;
int i; int i;
@ -326,10 +326,13 @@ int l2cc_initialize(void)
* cache configuration. * cache configuration.
*/ */
#if defined(CONFIG_ARMV7A_ASSOCIATIVITY_8WAY) #if defined(CONFIG_ARMV7A_ASSOCIATIVITY_8WAY)
DEBUGASSERT((getreg32(L2CC_ACR) & L2CC_ACR_ASS) == 0); DEBUGASSERT((getreg32(L2CC_ACR) & L2CC_ACR_ASS) == 0);
#elif defined(CONFIG_ARMV7A_ASSOCIATIVITY_8WAY) #elif defined(CONFIG_ARMV7A_ASSOCIATIVITY_16WAY)
DEBUGASSERT((getreg32(L2CC_ACR) & L2CC_ACR_ASS) == 1); DEBUGASSERT((getreg32(L2CC_ACR) & L2CC_ACR_ASS) == 1);
#else
# error No associativity selected
#endif #endif
#if defined(CONFIG_ARMV7A_WAYSIZE_16KB) #if defined(CONFIG_ARMV7A_WAYSIZE_16KB)
@ -344,6 +347,8 @@ int l2cc_initialize(void)
DEBUGASSERT((getreg32(L2CC_ACR) & L2CC_ACR_WAYSIZE_MASK) == L2CC_ACR_WAYSIZE_256KB); DEBUGASSERT((getreg32(L2CC_ACR) & L2CC_ACR_WAYSIZE_MASK) == L2CC_ACR_WAYSIZE_256KB);
#elif defined(CONFIG_ARMV7A_WAYSIZE_512KB) #elif defined(CONFIG_ARMV7A_WAYSIZE_512KB)
DEBUGASSERT((getreg32(L2CC_ACR) & L2CC_ACR_WAYSIZE_MASK) == L2CC_ACR_WAYSIZE_512KB); DEBUGASSERT((getreg32(L2CC_ACR) & L2CC_ACR_WAYSIZE_MASK) == L2CC_ACR_WAYSIZE_512KB);
#else
# error No way size selected
#endif #endif
/* L2 configuration can only be changed if the cache is disabled, /* L2 configuration can only be changed if the cache is disabled,
@ -389,8 +394,8 @@ int l2cc_initialize(void)
for (i = 0; i < PL310_NLOCKREGS; i++) for (i = 0; i < PL310_NLOCKREGS; i++)
{ {
putreg32(0, L2CC_DLKR_OFFSET(i)); putreg32(0, L2CC_DLKR(i));
putreg32(0, L2CC_ILKR_OFFSET(i)); putreg32(0, L2CC_ILKR(i));
} }
/* Configure the cache properties */ /* Configure the cache properties */
@ -408,8 +413,6 @@ int l2cc_initialize(void)
lldbg("(%d ways) * (%d bytes/way) = %d bytes\n", lldbg("(%d ways) * (%d bytes/way) = %d bytes\n",
PL310_NWAYS, PL310_WAYSIZE, PL310_CACHE_SIZE); PL310_NWAYS, PL310_WAYSIZE, PL310_CACHE_SIZE);
return OK;
} }
/*************************************************************************** /***************************************************************************

View File

@ -102,7 +102,7 @@ static inline void arch_invalidate_dcache(uintptr_t start, uintptr_t end)
static inline void arch_invalidate_dcache_all(void) static inline void arch_invalidate_dcache_all(void)
{ {
#ifdef CONFIG_ARMV7A_L2CC #ifdef CONFIG_ARCH_L2CACHE
irqstate_t flags = irqsave(); irqstate_t flags = irqsave();
cp15_invalidate_dcache_all(); cp15_invalidate_dcache_all();
l2cc_invalidate_all(); l2cc_invalidate_all();

View File

@ -43,7 +43,7 @@
#include <nuttx/config.h> #include <nuttx/config.h>
#ifdef CONFIG_ARMV7A_L2CC #ifdef CONFIG_ARCH_L2CACHE
/**************************************************************************** /****************************************************************************
* Pre-processor Definitions * Pre-processor Definitions
@ -67,7 +67,7 @@ extern "C"
****************************************************************************/ ****************************************************************************/
/*************************************************************************** /***************************************************************************
* Name: l2cc_initialize * Name: up_l2ccinitialize
* *
* Description: * Description:
* One time configuration of the L2 cache. The L2 cache will be enabled * One time configuration of the L2 cache. The L2 cache will be enabled
@ -78,11 +78,13 @@ extern "C"
* settings. * settings.
* *
* Returned Value: * Returned Value:
* Always returns OK. * None
* *
***************************************************************************/ ***************************************************************************/
int l2cc_initialize(void); #if 0 /* Prototyped in up_internal.h */
void up_l2ccinitialize(void);
#endif
/*************************************************************************** /***************************************************************************
* Name: l2cc_enable * Name: l2cc_enable
@ -238,12 +240,11 @@ void l2cc_flush(uint32_t startaddr, uint32_t endaddr);
#endif #endif
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#else /* CONFIG_ARMV7A_L2CC */ #else /* CONFIG_ARCH_L2CACHE */
/* Provide simple definitions to concentrate the inline conditional /* Provide simple definitions to concentrate the inline conditional
* compilation in one place. * compilation in one place.
*/ */
# define l2cc_initialize() (0)
# define l2cc_enable() # define l2cc_enable()
# define l2cc_disable() # define l2cc_disable()
# define l2cc_sync() # define l2cc_sync()
@ -254,5 +255,5 @@ void l2cc_flush(uint32_t startaddr, uint32_t endaddr);
# define l2cc_flush_all() # define l2cc_flush_all()
# define l2cc_flush(s,e) # define l2cc_flush(s,e)
#endif /* CONFIG_ARMV7A_L2CC */ #endif /* CONFIG_ARCH_L2CACHE */
#endif /* __ARCH_ARM_SRC_ARMV7_A_L2CC_H */ #endif /* __ARCH_ARM_SRC_ARMV7_A_L2CC_H */

View File

@ -246,5 +246,9 @@ void up_initialize(void)
/* Initialize USB -- device and/or host */ /* Initialize USB -- device and/or host */
up_usbinitialize(); up_usbinitialize();
/* Initialize the L2 cache if present and selected */
up_l2ccinitialize();
board_led_on(LED_IRQSENABLED); board_led_on(LED_IRQSENABLED);
} }

View File

@ -449,6 +449,14 @@ void lowconsole_init(void);
void weak_function up_dmainitialize(void); void weak_function up_dmainitialize(void);
#endif #endif
/* Cache control ************************************************************/
#ifdef CONFIG_ARCH_L2CACHE
void up_l2ccinitialize(void);
#else
# define up_l2ccinitialize()
#endif
/* Memory management ********************************************************/ /* Memory management ********************************************************/
#if CONFIG_MM_REGIONS > 1 #if CONFIG_MM_REGIONS > 1
@ -475,10 +483,10 @@ void board_led_off(int led);
/* Networking ***************************************************************/ /* Networking ***************************************************************/
/* Defined in board/up_network.c for board-specific ethernet implementations, /* Defined in board/up_network.c for board-specific Ethernet implementations,
* or chip/xyx_ethernet.c for chip-specific ethernet implementations, or * or chip/xyx_ethernet.c for chip-specific Ethernet implementations, or
* common/up_etherstub.c for a cornercase where the network is enabled yet * common/up_etherstub.c for a cornercase where the network is enabled yet
* there is no ethernet driver to be initialized. * there is no Ethernet driver to be initialized.
*/ */
#ifdef CONFIG_NET #ifdef CONFIG_NET

View File

@ -703,10 +703,6 @@ void up_boot(void)
#endif /* CONFIG_ARCH_ROMPGTABLE */ #endif /* CONFIG_ARCH_ROMPGTABLE */
/* Enable the L2 cache */
DEBUGVERIFY(l2cc_initialize());
#ifdef CONFIG_ARCH_RAMFUNCS #ifdef CONFIG_ARCH_RAMFUNCS
/* Copy any necessary code sections from FLASH to RAM. The correct /* Copy any necessary code sections from FLASH to RAM. The correct
* destination in SRAM is given by _sramfuncs and _eramfuncs. The * destination in SRAM is given by _sramfuncs and _eramfuncs. The