powerpc/32: define helpers to get L1 cache sizes.
authorChristophe Leroy <christophe.leroy@c-s.fr>
Tue, 14 May 2019 09:05:15 +0000 (09:05 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 4 Jul 2019 16:06:37 +0000 (02:06 +1000)
This patch defines C helpers to retrieve the size of
cache blocks and uses them in the cacheflush functions.

Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/cache.h
arch/powerpc/include/asm/cacheflush.h

index df8e4c4..e84d162 100644 (file)
@@ -33,7 +33,8 @@
 
 #define IFETCH_ALIGN_BYTES     (1 << IFETCH_ALIGN_SHIFT)
 
-#if defined(__powerpc64__) && !defined(__ASSEMBLY__)
+#if !defined(__ASSEMBLY__)
+#ifdef CONFIG_PPC64
 
 struct ppc_cache_info {
        u32 size;
@@ -53,7 +54,18 @@ struct ppc64_caches {
 };
 
 extern struct ppc64_caches ppc64_caches;
-#endif /* __powerpc64__ && ! __ASSEMBLY__ */
+#else
+static inline u32 l1_cache_shift(void)
+{
+       return L1_CACHE_SHIFT;
+}
+
+static inline u32 l1_cache_bytes(void)
+{
+       return L1_CACHE_BYTES;
+}
+#endif
+#endif /* ! __ASSEMBLY__ */
 
 #if defined(__ASSEMBLY__)
 /*
index 69b6c3d..217f183 100644 (file)
@@ -67,11 +67,13 @@ static inline void __flush_dcache_icache_phys(unsigned long physaddr)
  */
 static inline void flush_dcache_range(unsigned long start, unsigned long stop)
 {
-       void *addr = (void *)(start & ~(L1_CACHE_BYTES - 1));
-       unsigned long size = stop - (unsigned long)addr + (L1_CACHE_BYTES - 1);
+       unsigned long shift = l1_cache_shift();
+       unsigned long bytes = l1_cache_bytes();
+       void *addr = (void *)(start & ~(bytes - 1));
+       unsigned long size = stop - (unsigned long)addr + (bytes - 1);
        unsigned long i;
 
-       for (i = 0; i < size >> L1_CACHE_SHIFT; i++, addr += L1_CACHE_BYTES)
+       for (i = 0; i < size >> shift; i++, addr += bytes)
                dcbf(addr);
        mb();   /* sync */
 }
@@ -83,11 +85,13 @@ static inline void flush_dcache_range(unsigned long start, unsigned long stop)
  */
 static inline void clean_dcache_range(unsigned long start, unsigned long stop)
 {
-       void *addr = (void *)(start & ~(L1_CACHE_BYTES - 1));
-       unsigned long size = stop - (unsigned long)addr + (L1_CACHE_BYTES - 1);
+       unsigned long shift = l1_cache_shift();
+       unsigned long bytes = l1_cache_bytes();
+       void *addr = (void *)(start & ~(bytes - 1));
+       unsigned long size = stop - (unsigned long)addr + (bytes - 1);
        unsigned long i;
 
-       for (i = 0; i < size >> L1_CACHE_SHIFT; i++, addr += L1_CACHE_BYTES)
+       for (i = 0; i < size >> shift; i++, addr += bytes)
                dcbst(addr);
        mb();   /* sync */
 }
@@ -100,11 +104,13 @@ static inline void clean_dcache_range(unsigned long start, unsigned long stop)
 static inline void invalidate_dcache_range(unsigned long start,
                                           unsigned long stop)
 {
-       void *addr = (void *)(start & ~(L1_CACHE_BYTES - 1));
-       unsigned long size = stop - (unsigned long)addr + (L1_CACHE_BYTES - 1);
+       unsigned long shift = l1_cache_shift();
+       unsigned long bytes = l1_cache_bytes();
+       void *addr = (void *)(start & ~(bytes - 1));
+       unsigned long size = stop - (unsigned long)addr + (bytes - 1);
        unsigned long i;
 
-       for (i = 0; i < size >> L1_CACHE_SHIFT; i++, addr += L1_CACHE_BYTES)
+       for (i = 0; i < size >> shift; i++, addr += bytes)
                dcbi(addr);
        mb();   /* sync */
 }