]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
arm64: cache: Identify VPIPT I-caches
authorWill Deacon <will.deacon@arm.com>
Fri, 10 Mar 2017 20:32:24 +0000 (20:32 +0000)
committerCatalin Marinas <catalin.marinas@arm.com>
Mon, 20 Mar 2017 16:17:02 +0000 (16:17 +0000)
Add support for detecting VPIPT I-caches, as introduced by ARMv8.2.

Acked-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/include/asm/cache.h
arch/arm64/kernel/cpuinfo.c

index 7acb5263429926486782f8d028e6840d9fa3e68c..ea9bb4e0e9bbd002e8dec644bcb03dbb25f55f72 100644 (file)
@@ -25,6 +25,7 @@
 
 #define CTR_L1IP(ctr)          (((ctr) >> CTR_L1IP_SHIFT) & CTR_L1IP_MASK)
 
+#define ICACHE_POLICY_VPIPT    0
 #define ICACHE_POLICY_VIPT     2
 #define ICACHE_POLICY_PIPT     3
 
@@ -45,6 +46,7 @@
 #include <linux/bitops.h>
 
 #define ICACHEF_ALIASING       0
+#define ICACHEF_VPIPT          1
 extern unsigned long __icache_flags;
 
 /*
@@ -56,6 +58,11 @@ static inline int icache_is_aliasing(void)
        return test_bit(ICACHEF_ALIASING, &__icache_flags);
 }
 
+static inline int icache_is_vpipt(void)
+{
+       return test_bit(ICACHEF_VPIPT, &__icache_flags);
+}
+
 static inline u32 cache_type_cwg(void)
 {
        return (read_cpuid_cachetype() >> CTR_CWG_SHIFT) & CTR_CWG_MASK;
index 260b54f415b83d59de06ff3a5f301356d8021d4c..7d27f4b4881e40a493763689ef7ef630b1dd97e5 100644 (file)
@@ -46,6 +46,7 @@ static char *icache_policy_str[] = {
        [0 ... ICACHE_POLICY_PIPT]      = "RESERVED/UNKNOWN",
        [ICACHE_POLICY_VIPT]            = "VIPT",
        [ICACHE_POLICY_PIPT]            = "PIPT",
+       [ICACHE_POLICY_VPIPT]           = "VPIPT",
 };
 
 unsigned long __icache_flags;
@@ -291,6 +292,9 @@ static void cpuinfo_detect_icache_policy(struct cpuinfo_arm64 *info)
        switch (l1ip) {
        case ICACHE_POLICY_PIPT:
                break;
+       case ICACHE_POLICY_VPIPT:
+               set_bit(ICACHEF_VPIPT, &__icache_flags);
+               break;
        default:
                /* Fallthrough */
        case ICACHE_POLICY_VIPT: