metag: cachepart: take into account small cache bits
authorJames Hogan <james.hogan@imgtec.com>
Fri, 8 Mar 2013 15:27:49 +0000 (15:27 +0000)
committerJames Hogan <james.hogan@imgtec.com>
Fri, 15 Mar 2013 13:21:18 +0000 (13:21 +0000)
The CORE_CONFIG2 register has bits to indicate that the data or code
cache is small, i.e. that the size described in the field should be
divided by 64. Take this into account in get_icache_size() and
get_dcache_size().

Signed-off-by: James Hogan <james.hogan@imgtec.com>
arch/metag/kernel/cachepart.c

index 3a589dfb966b870d9d420d266bcba310c00fe987..c737edb5b2d52a772034cb929307631e4e56760a 100644 (file)
 unsigned int get_dcache_size(void)
 {
        unsigned int config2 = metag_in32(METAC_CORE_CONFIG2);
-       return 0x1000 << ((config2 & METAC_CORECFG2_DCSZ_BITS)
-                               >> METAC_CORECFG2_DCSZ_S);
+       unsigned int sz = 0x1000 << ((config2 & METAC_CORECFG2_DCSZ_BITS)
+                                    >> METAC_CORECFG2_DCSZ_S);
+       if (config2 & METAC_CORECFG2_DCSMALL_BIT)
+               sz >>= 6;
+       return sz;
 }
 
 unsigned int get_icache_size(void)
 {
        unsigned int config2 = metag_in32(METAC_CORE_CONFIG2);
-       return 0x1000 << ((config2 & METAC_CORE_C2ICSZ_BITS)
-                               >> METAC_CORE_C2ICSZ_S);
+       unsigned int sz = 0x1000 << ((config2 & METAC_CORE_C2ICSZ_BITS)
+                                    >> METAC_CORE_C2ICSZ_S);
+       if (config2 & METAC_CORECFG2_ICSMALL_BIT)
+               sz >>= 6;
+       return sz;
 }
 
 unsigned int get_global_dcache_size(void)