diff mbox series

[10/10] microblaze: cache: use fdt cache size info if available

Message ID 20220411162634.69647-10-ovpanait@gmail.com
State Superseded
Delegated to: Michal Simek
Headers show
Series [01/10] microblaze: start.S: remove unused code | expand

Commit Message

Ovidiu Panait April 11, 2022, 4:26 p.m. UTC
If CONFIG_CPU_MICROBLAZE is enabled, the cache size and cache line size are
retrieved from the fdt by the microblaze cpu driver. Adjust cache flush
code to use those values if available.

If a cache flush is requested very early in the boot (for example the
flush_cache_all() call in start.S) or before dm is ready, the default size
of CONFIG_XILINX_MICROBLAZE0_DEFAULT_CACHE_SIZE will be used instead.

Signed-off-by: Ovidiu Panait <ovpanait@gmail.com>
---

 arch/microblaze/cpu/cache.c | 45 +++++++++++++++++++++++++++++++++----
 1 file changed, 41 insertions(+), 4 deletions(-)

Comments

Michal Simek April 22, 2022, 2:19 p.m. UTC | #1
On 4/11/22 18:26, Ovidiu Panait wrote:
> If CONFIG_CPU_MICROBLAZE is enabled, the cache size and cache line size are
> retrieved from the fdt by the microblaze cpu driver. Adjust cache flush
> code to use those values if available.
> 
> If a cache flush is requested very early in the boot (for example the
> flush_cache_all() call in start.S) or before dm is ready, the default size
> of CONFIG_XILINX_MICROBLAZE0_DEFAULT_CACHE_SIZE will be used instead.
> 
> Signed-off-by: Ovidiu Panait <ovpanait@gmail.com>
> ---
> 
>   arch/microblaze/cpu/cache.c | 45 +++++++++++++++++++++++++++++++++----
>   1 file changed, 41 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/microblaze/cpu/cache.c b/arch/microblaze/cpu/cache.c
> index cce33a6eb5..8b7e212a26 100644
> --- a/arch/microblaze/cpu/cache.c
> +++ b/arch/microblaze/cpu/cache.c
> @@ -9,11 +9,21 @@
>   #include <cpu_func.h>
>   #include <asm/asm.h>
>   #include <asm/cache.h>
> +#include <asm/microblaze_cpu.h>
>   
>   static void __invalidate_icache(ulong addr, ulong size)
>   {
>   	if (CONFIG_IS_ENABLED(XILINX_MICROBLAZE0_USE_WIC)) {
> -		for (int i = 0; i < size; i += 4) {
> +		int line_length = 4;
> +
> +		if (CONFIG_IS_ENABLED(CPU_MICROBLAZE)) {
> +			int size = microblaze_cpu_get_cacheline_size(ICACHE);
> +
> +			if (size > 0)
> +				line_length = size;
> +		}
> +
> +		for (int i = 0; i < size; i += line_length) {
>   			asm volatile (
>   				"wic	%0, r0;"
>   				"nop;"
> @@ -26,13 +36,31 @@ static void __invalidate_icache(ulong addr, ulong size)
>   
>   void invalidate_icache_all(void)
>   {
> -	__invalidate_icache(0, CONFIG_XILINX_MICROBLAZE0_DEFAULT_CACHE_SIZE);
> +	int cache_size = CONFIG_XILINX_MICROBLAZE0_DEFAULT_CACHE_SIZE;
> +
> +	if (CONFIG_IS_ENABLED(CPU_MICROBLAZE)) {
> +		int size = microblaze_cpu_get_cache_size(ICACHE);
> +
> +		if (size >= 0)
> +			cache_size = size;
> +	}
> +
> +	__invalidate_icache(0, cache_size);
>   }
>   
>   static void __flush_dcache(ulong addr, ulong size)
>   {
>   	if (CONFIG_IS_ENABLED(XILINX_MICROBLAZE0_USE_WDC)) {
> -		for (int i = 0; i < size; i += 4) {
> +		int line_length = 4;
> +
> +		if (CONFIG_IS_ENABLED(CPU_MICROBLAZE)) {
> +			int size = microblaze_cpu_get_cacheline_size(DCACHE);
> +
> +			if (size > 0)
> +				line_length = size;
> +		}
> +
> +		for (int i = 0; i < size; i += line_length) {
>   			asm volatile (
>   				"wdc.flush	%0, r0;"
>   				"nop;"
> @@ -53,7 +81,16 @@ void flush_dcache_range(unsigned long start, unsigned long end)
>   
>   void flush_dcache_all(void)
>   {
> -	__flush_dcache(0, CONFIG_XILINX_MICROBLAZE0_DEFAULT_CACHE_SIZE);
> +	int cache_size = CONFIG_XILINX_MICROBLAZE0_DEFAULT_CACHE_SIZE;
> +
> +	if (CONFIG_IS_ENABLED(CPU_MICROBLAZE)) {
> +		int size = microblaze_cpu_get_cache_size(DCACHE);
> +
> +		if (size >= 0)
> +			cache_size = size;
> +	}
> +
> +	__flush_dcache(0, cache_size);
>   }
>   
>   int dcache_status(void)

This patch can be dropped because these functions should only work based on data 
from cpuinfo structure that's why you don't need to call special function which 
are only available when driver is enabled.

M
diff mbox series

Patch

diff --git a/arch/microblaze/cpu/cache.c b/arch/microblaze/cpu/cache.c
index cce33a6eb5..8b7e212a26 100644
--- a/arch/microblaze/cpu/cache.c
+++ b/arch/microblaze/cpu/cache.c
@@ -9,11 +9,21 @@ 
 #include <cpu_func.h>
 #include <asm/asm.h>
 #include <asm/cache.h>
+#include <asm/microblaze_cpu.h>
 
 static void __invalidate_icache(ulong addr, ulong size)
 {
 	if (CONFIG_IS_ENABLED(XILINX_MICROBLAZE0_USE_WIC)) {
-		for (int i = 0; i < size; i += 4) {
+		int line_length = 4;
+
+		if (CONFIG_IS_ENABLED(CPU_MICROBLAZE)) {
+			int size = microblaze_cpu_get_cacheline_size(ICACHE);
+
+			if (size > 0)
+				line_length = size;
+		}
+
+		for (int i = 0; i < size; i += line_length) {
 			asm volatile (
 				"wic	%0, r0;"
 				"nop;"
@@ -26,13 +36,31 @@  static void __invalidate_icache(ulong addr, ulong size)
 
 void invalidate_icache_all(void)
 {
-	__invalidate_icache(0, CONFIG_XILINX_MICROBLAZE0_DEFAULT_CACHE_SIZE);
+	int cache_size = CONFIG_XILINX_MICROBLAZE0_DEFAULT_CACHE_SIZE;
+
+	if (CONFIG_IS_ENABLED(CPU_MICROBLAZE)) {
+		int size = microblaze_cpu_get_cache_size(ICACHE);
+
+		if (size >= 0)
+			cache_size = size;
+	}
+
+	__invalidate_icache(0, cache_size);
 }
 
 static void __flush_dcache(ulong addr, ulong size)
 {
 	if (CONFIG_IS_ENABLED(XILINX_MICROBLAZE0_USE_WDC)) {
-		for (int i = 0; i < size; i += 4) {
+		int line_length = 4;
+
+		if (CONFIG_IS_ENABLED(CPU_MICROBLAZE)) {
+			int size = microblaze_cpu_get_cacheline_size(DCACHE);
+
+			if (size > 0)
+				line_length = size;
+		}
+
+		for (int i = 0; i < size; i += line_length) {
 			asm volatile (
 				"wdc.flush	%0, r0;"
 				"nop;"
@@ -53,7 +81,16 @@  void flush_dcache_range(unsigned long start, unsigned long end)
 
 void flush_dcache_all(void)
 {
-	__flush_dcache(0, CONFIG_XILINX_MICROBLAZE0_DEFAULT_CACHE_SIZE);
+	int cache_size = CONFIG_XILINX_MICROBLAZE0_DEFAULT_CACHE_SIZE;
+
+	if (CONFIG_IS_ENABLED(CPU_MICROBLAZE)) {
+		int size = microblaze_cpu_get_cache_size(DCACHE);
+
+		if (size >= 0)
+			cache_size = size;
+	}
+
+	__flush_dcache(0, cache_size);
 }
 
 int dcache_status(void)