]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ARC: cache detection code bitrot
authorVineet Gupta <vgupta@synopsys.com>
Sat, 15 Jun 2013 04:51:51 +0000 (10:21 +0530)
committerVineet Gupta <vgupta@synopsys.com>
Sat, 22 Jun 2013 08:16:43 +0000 (13:46 +0530)
* Number of (i|d)cache ways can be retrieved from BCRs and hence no need
  to cross check with with built-in constants
* Use of IS_ENABLED() to check for a Kconfig option
* is_not_cache_aligned() not used anymore

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/include/asm/arcregs.h
arch/arc/include/asm/cache.h
arch/arc/include/asm/cacheflush.h
arch/arc/mm/cache_arc700.c

index 20002c46e3bc4bd4bde553bbbc134c1867f7890a..6addeec34a7c74d3fe9c1f998bff7243defa59a3 100644 (file)
@@ -287,7 +287,7 @@ struct cpuinfo_arc_mmu {
 };
 
 struct cpuinfo_arc_cache {
-       unsigned int has_aliasing, sz, line_len, assoc, ver;
+       unsigned int sz, line_len, assoc, ver;
 };
 
 struct cpuinfo_arc_ccm {
index 44eb07eb92e56eea3bea428b233982b4fdce2bfe..5802849a6caefa802b2a1d8cc6d26e845444767e 100644 (file)
 
 #define L1_CACHE_BYTES         (1 << L1_CACHE_SHIFT)
 
-#define ARC_ICACHE_WAYS        2
-#define ARC_DCACHE_WAYS        4
-
-/* Helpers */
+/* For a rare case where customers have differently config I/D */
 #define ARC_ICACHE_LINE_LEN    L1_CACHE_BYTES
 #define ARC_DCACHE_LINE_LEN    L1_CACHE_BYTES
 
 #define ICACHE_LINE_MASK       (~(ARC_ICACHE_LINE_LEN - 1))
 #define DCACHE_LINE_MASK       (~(ARC_DCACHE_LINE_LEN - 1))
 
-#if ARC_ICACHE_LINE_LEN != ARC_DCACHE_LINE_LEN
-#error "Need to fix some code as I/D cache lines not same"
-#else
-#define is_not_cache_aligned(p)        ((unsigned long)p & (~DCACHE_LINE_MASK))
-#endif
-
 /*
  * ARC700 doesn't cache any access in top 256M.
  * Ideal for wiring memory mapped peripherals as we don't need to do
index ef62682e8d9567670fc435be9bc5ddfddb5fa06b..185dfd03dcdb815b73f80b7af0829e676cf62132 100644 (file)
@@ -86,11 +86,7 @@ void flush_anon_page(struct vm_area_struct *vma,
  */
 static inline int cache_is_vipt_aliasing(void)
 {
-#ifdef CONFIG_ARC_CACHE_VIPT_ALIASING
-       return 1;
-#else
-       return 0;
-#endif
+       return IS_ENABLED(CONFIG_ARC_CACHE_VIPT_ALIASING);
 }
 
 #define CACHE_COLOR(addr)      (((unsigned long)(addr) >> (PAGE_SHIFT)) & 1)
index e9c7a66817ca80d3dc89fe9147a6664351ced33d..0a56682e0c9456ce6d6f253afce3a78318a5ed4d 100644 (file)
@@ -144,8 +144,8 @@ void __cpuinit read_decode_cache_bcr(void)
        p_ic = &cpuinfo_arc700[cpu].icache;
        READ_BCR(ARC_REG_IC_BCR, ibcr);
 
-       if (ibcr.config == 0x3)
-               p_ic->assoc = 2;
+       BUG_ON(ibcr.config != 3);
+       p_ic->assoc = 2;                /* Fixed to 2w set assoc */
        p_ic->line_len = 8 << ibcr.line_len;
        p_ic->sz = 0x200 << ibcr.sz;
        p_ic->ver = ibcr.ver;
@@ -153,8 +153,8 @@ void __cpuinit read_decode_cache_bcr(void)
        p_dc = &cpuinfo_arc700[cpu].dcache;
        READ_BCR(ARC_REG_DC_BCR, dbcr);
 
-       if (dbcr.config == 0x2)
-               p_dc->assoc = 4;
+       BUG_ON(dbcr.config != 2);
+       p_dc->assoc = 4;                /* Fixed to 4w set assoc */
        p_dc->line_len = 16 << dbcr.line_len;
        p_dc->sz = 0x200 << dbcr.sz;
        p_dc->ver = dbcr.ver;
@@ -182,20 +182,11 @@ void __cpuinit arc_cache_init(void)
 
 #ifdef CONFIG_ARC_HAS_ICACHE
        /* 1. Confirm some of I-cache params which Linux assumes */
-       if ((ic->assoc != ARC_ICACHE_WAYS) ||
-           (ic->line_len != ARC_ICACHE_LINE_LEN)) {
+       if (ic->line_len != ARC_ICACHE_LINE_LEN)
                panic("Cache H/W doesn't match kernel Config");
-       }
-#if (CONFIG_ARC_MMU_VER > 2)
-       if (ic->ver != 3) {
-               if (running_on_hw)
-                       panic("Cache ver doesn't match MMU ver\n");
 
-               /* For ISS - suggest the toggles to use */
-               pr_err("Use -prop=icache_version=3,-prop=dcache_version=3\n");
-
-       }
-#endif
+       if (ic->ver != CONFIG_ARC_MMU_VER)
+               panic("Cache ver doesn't match MMU ver\n");
 #endif
 
        /* Enable/disable I-Cache */
@@ -214,14 +205,12 @@ chk_dc:
                return;
 
 #ifdef CONFIG_ARC_HAS_DCACHE
-       if ((dc->assoc != ARC_DCACHE_WAYS) ||
-           (dc->line_len != ARC_DCACHE_LINE_LEN)) {
+       if (dc->line_len != ARC_DCACHE_LINE_LEN)
                panic("Cache H/W doesn't match kernel Config");
-       }
-
-       dcache_does_alias = (dc->sz / ARC_DCACHE_WAYS) > PAGE_SIZE;
 
        /* check for D-Cache aliasing */
+       dcache_does_alias = (dc->sz / dc->assoc) > PAGE_SIZE;
+
        if (dcache_does_alias && !cache_is_vipt_aliasing())
                panic("Enable CONFIG_ARC_CACHE_VIPT_ALIASING\n");
        else if (!dcache_does_alias && cache_is_vipt_aliasing())