diff --git a/arch/arm/src/armv7-a/cp15_cacheops.c b/arch/arm/src/armv7-a/cp15_cacheops.c index d7bf4a4e5e..562cab4723 100644 --- a/arch/arm/src/armv7-a/cp15_cacheops.c +++ b/arch/arm/src/armv7-a/cp15_cacheops.c @@ -52,9 +52,7 @@ static inline uint32_t cp15_cache_get_info(uint32_t *sets, uint32_t *ways, csselr = CP15_GET(CSSELR); - csselr = (csselr & ~0x01) | (icache & 0x01); - - CP15_SET(CSSELR, csselr); + CP15_SET(CSSELR, (csselr & ~0x01) | (icache & 0x01)); ccsidr = CP15_GET(CCSIDR); @@ -68,6 +66,8 @@ static inline uint32_t cp15_cache_get_info(uint32_t *sets, uint32_t *ways, *ways = ((ccsidr >> 3) & 0x3ff) + 1; } + CP15_SET(CSSELR, csselr); /* restore csselr */ + return (1 << ((ccsidr & 0x7) + 2)) * 4; } diff --git a/arch/arm/src/armv7-m/arm_cache.c b/arch/arm/src/armv7-m/arm_cache.c index 88bc5ac2b5..f326316f1d 100644 --- a/arch/arm/src/armv7-m/arm_cache.c +++ b/arch/arm/src/armv7-m/arm_cache.c @@ -129,17 +129,20 @@ static size_t up_get_cache_linesize(bool icache) if (icache) { - csselr = (csselr & ~NVIC_CSSELR_IND) | NVIC_CSSELR_IND_ICACHE; + putreg32((csselr & ~NVIC_CSSELR_IND) | + NVIC_CSSELR_IND_ICACHE, NVIC_CSSELR); } else { - csselr = (csselr & ~NVIC_CSSELR_IND) | NVIC_CSSELR_IND_DCACHE; + putreg32((csselr & ~NVIC_CSSELR_IND) | + NVIC_CSSELR_IND_DCACHE, NVIC_CSSELR); } - putreg32(csselr, NVIC_CSSELR); ccsidr = getreg32(NVIC_CCSIDR); sshift = CCSIDR_LSSHIFT(ccsidr) + 4; /* log2(cache-line-size-in-bytes) */ + putreg32(csselr, NVIC_CSSELR); /* restore csselr */ + return 1 << sshift; } @@ -170,11 +173,13 @@ static size_t up_get_cache_size(bool icache) if (icache) { - csselr = (csselr & ~NVIC_CSSELR_IND) | NVIC_CSSELR_IND_ICACHE; + putreg32((csselr & ~NVIC_CSSELR_IND) | + NVIC_CSSELR_IND_ICACHE, NVIC_CSSELR); } else { - csselr = (csselr & ~NVIC_CSSELR_IND) | NVIC_CSSELR_IND_DCACHE; + putreg32((csselr & ~NVIC_CSSELR_IND) | + NVIC_CSSELR_IND_DCACHE, NVIC_CSSELR); } ccsidr = getreg32(NVIC_CCSIDR); @@ -183,6 +188,8 @@ static size_t up_get_cache_size(bool icache) sshift = CCSIDR_LSSHIFT(ccsidr) + 4; /* log2(cache-line-size-in-bytes) */ line = 1 << sshift; + putreg32(csselr, NVIC_CSSELR); /* restore csselr */ + return sets * ways * line; } #endif diff --git a/arch/arm/src/armv7-r/cp15_cacheops.c b/arch/arm/src/armv7-r/cp15_cacheops.c index 74da551a81..94f4aa3d3a 100644 --- a/arch/arm/src/armv7-r/cp15_cacheops.c +++ b/arch/arm/src/armv7-r/cp15_cacheops.c @@ -52,9 +52,7 @@ static inline uint32_t cp15_cache_get_info(uint32_t *sets, uint32_t *ways, csselr = CP15_GET(CSSELR); - csselr = (csselr & ~0x01) | (icache & 0x01); - - CP15_SET(CSSELR, csselr); + CP15_SET(CSSELR, (csselr & ~0x01) | (icache & 0x01)); ccsidr = CP15_GET(CCSIDR); @@ -68,6 +66,8 @@ static inline uint32_t cp15_cache_get_info(uint32_t *sets, uint32_t *ways, *ways = ((ccsidr >> 3) & 0x3ff) + 1; } + CP15_SET(CSSELR, csselr); /* restore csselr */ + return (1 << ((ccsidr & 0x7) + 2)) * 4; } diff --git a/arch/arm/src/armv8-m/arm_cache.c b/arch/arm/src/armv8-m/arm_cache.c index 35aa14d992..e7a7e504ed 100644 --- a/arch/arm/src/armv8-m/arm_cache.c +++ b/arch/arm/src/armv8-m/arm_cache.c @@ -129,17 +129,20 @@ static size_t up_get_cache_linesize(bool icache) if (icache) { - csselr = (csselr & ~NVIC_CSSELR_IND) | NVIC_CSSELR_IND_ICACHE; + putreg32((csselr & ~NVIC_CSSELR_IND) | + NVIC_CSSELR_IND_ICACHE, NVIC_CSSELR); } else { - csselr = (csselr & ~NVIC_CSSELR_IND) | NVIC_CSSELR_IND_DCACHE; + putreg32((csselr & ~NVIC_CSSELR_IND) | + NVIC_CSSELR_IND_DCACHE, NVIC_CSSELR); } - putreg32(csselr, NVIC_CSSELR); ccsidr = getreg32(NVIC_CCSIDR); sshift = CCSIDR_LSSHIFT(ccsidr) + 4; /* log2(cache-line-size-in-bytes) */ + putreg32(csselr, NVIC_CSSELR); /* restore csselr */ + return 1 << sshift; } @@ -170,11 +173,13 @@ static size_t up_get_cache_size(bool icache) if (icache) { - csselr = (csselr & ~NVIC_CSSELR_IND) | NVIC_CSSELR_IND_ICACHE; + putreg32((csselr & ~NVIC_CSSELR_IND) | + NVIC_CSSELR_IND_ICACHE, NVIC_CSSELR); } else { - csselr = (csselr & ~NVIC_CSSELR_IND) | NVIC_CSSELR_IND_DCACHE; + putreg32((csselr & ~NVIC_CSSELR_IND) | + NVIC_CSSELR_IND_DCACHE, NVIC_CSSELR); } ccsidr = getreg32(NVIC_CCSIDR); @@ -183,6 +188,8 @@ static size_t up_get_cache_size(bool icache) sshift = CCSIDR_LSSHIFT(ccsidr) + 4; /* log2(cache-line-size-in-bytes) */ line = 1 << sshift; + putreg32(csselr, NVIC_CSSELR); /* restore csselr */ + return sets * ways * line; } #endif