Commit daf93dd5 authored by Russell King's avatar Russell King Committed by Russell King

[ARM] fix VIPT/VIVT macro optimisations, add comments

cacheflush.h was doing:

... VIVT only stuff
... VIPT only stuff
... VIVT or VIPT stuff

which is clearly bogus - we would only ever use the "VIVT or VIPT" case
when both VIVT and VIPT are not selected.  Fix this.

Add comments to each case, including noting the impossibility of
correctly detecting the cache type of ARM926 and ARMv6 cores from
the cache type register in the "VIVT or VIPT" case.
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 6cab4860
...@@ -459,15 +459,19 @@ static inline void flush_ioremap_region(unsigned long phys, void __iomem *virt, ...@@ -459,15 +459,19 @@ static inline void flush_ioremap_region(unsigned long phys, void __iomem *virt,
#define __cacheid_vivt_asid_tagged_instr(val) (__cacheid_type_v7(val) ? ((val & (3 << 14)) == (1 << 14)) : 0) #define __cacheid_vivt_asid_tagged_instr(val) (__cacheid_type_v7(val) ? ((val & (3 << 14)) == (1 << 14)) : 0)
#if defined(CONFIG_CPU_CACHE_VIVT) && !defined(CONFIG_CPU_CACHE_VIPT) #if defined(CONFIG_CPU_CACHE_VIVT) && !defined(CONFIG_CPU_CACHE_VIPT)
/*
* VIVT caches only
*/
#define cache_is_vivt() 1 #define cache_is_vivt() 1
#define cache_is_vipt() 0 #define cache_is_vipt() 0
#define cache_is_vipt_nonaliasing() 0 #define cache_is_vipt_nonaliasing() 0
#define cache_is_vipt_aliasing() 0 #define cache_is_vipt_aliasing() 0
#define icache_is_vivt_asid_tagged() 0 #define icache_is_vivt_asid_tagged() 0
#elif defined(CONFIG_CPU_CACHE_VIPT) #elif !defined(CONFIG_CPU_CACHE_VIVT) && defined(CONFIG_CPU_CACHE_VIPT)
/*
* VIPT caches only
*/
#define cache_is_vivt() 0 #define cache_is_vivt() 0
#define cache_is_vipt() 1 #define cache_is_vipt() 1
#define cache_is_vipt_nonaliasing() \ #define cache_is_vipt_nonaliasing() \
...@@ -489,7 +493,12 @@ static inline void flush_ioremap_region(unsigned long phys, void __iomem *virt, ...@@ -489,7 +493,12 @@ static inline void flush_ioremap_region(unsigned long phys, void __iomem *virt,
}) })
#else #else
/*
* VIVT or VIPT caches. Note that this is unreliable since ARM926
* and V6 CPUs satisfy the "(val & (15 << 25)) == (14 << 25)" test.
* There's no way to tell from the CacheType register what type (!)
* the cache is.
*/
#define cache_is_vivt() \ #define cache_is_vivt() \
({ \ ({ \
unsigned int __val = read_cpuid(CPUID_CACHETYPE); \ unsigned int __val = read_cpuid(CPUID_CACHETYPE); \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment