]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - arch/arm64/kernel/cacheinfo.c
arm64: cacheinfo: add support to override cache levels via device tree
[mirror_ubuntu-bionic-kernel.git] / arch / arm64 / kernel / cacheinfo.c
index 9617301f76b56e6ba4410fe1895c50a96a81ec4f..3f2250fc391b414f362f2487db0a35a19b89a528 100644 (file)
@@ -84,7 +84,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf,
 
 static int __init_cache_level(unsigned int cpu)
 {
-       unsigned int ctype, level, leaves;
+       unsigned int ctype, level, leaves, of_level;
        struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
 
        for (level = 1, leaves = 0; level <= MAX_CACHE_LEVEL; level++) {
@@ -97,6 +97,17 @@ static int __init_cache_level(unsigned int cpu)
                leaves += (ctype == CACHE_TYPE_SEPARATE) ? 2 : 1;
        }
 
+       of_level = of_find_last_cache_level(cpu);
+       if (level < of_level) {
+               /*
+                * some external caches not specified in CLIDR_EL1
+                * the information may be available in the device tree
+                * only unified external caches are considered here
+                */
+               leaves += (of_level - level);
+               level = of_level;
+       }
+
        this_cpu_ci->num_levels = level;
        this_cpu_ci->num_leaves = leaves;
        return 0;