LoongArch: Fix shared cache size calculation
authorHuacai Chen <chenhuacai@loongson.cn>
Wed, 13 Jul 2022 10:00:41 +0000 (18:00 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Fri, 29 Jul 2022 10:22:33 +0000 (18:22 +0800)
Current calculation of shared cache size is from the node (die) scope,
but we hope 'lscpu' to show the shared cache size of the whole package
for multi-die chips (e.g., Loongson-3C5000L, which contains 4 dies in
one package). So fix it by multiplying nodes_per_package.

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kernel/cacheinfo.c

index b38f548..4662b06 100644 (file)
@@ -4,8 +4,9 @@
  *
  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  */
-#include <asm/cpu-info.h>
 #include <linux/cacheinfo.h>
+#include <asm/bootinfo.h>
+#include <asm/cpu-info.h>
 
 /* Populates leaf and increments to next leaf */
 #define populate_cache(cache, leaf, c_level, c_type)           \
@@ -17,6 +18,8 @@ do {                                                          \
        leaf->ways_of_associativity = c->cache.ways;            \
        leaf->size = c->cache.linesz * c->cache.sets *          \
                c->cache.ways;                                  \
+       if (leaf->level > 2)                                    \
+               leaf->size *= nodes_per_package;                \
        leaf++;                                                 \
 } while (0)
 
@@ -95,11 +98,15 @@ static void cache_cpumap_setup(unsigned int cpu)
 
 int populate_cache_leaves(unsigned int cpu)
 {
-       int level = 1;
+       int level = 1, nodes_per_package = 1;
        struct cpuinfo_loongarch *c = &current_cpu_data;
        struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
        struct cacheinfo *this_leaf = this_cpu_ci->info_list;
 
+       if (loongson_sysconf.nr_nodes > 1)
+               nodes_per_package = loongson_sysconf.cores_per_package
+                                       / loongson_sysconf.cores_per_node;
+
        if (c->icache.waysize) {
                populate_cache(dcache, this_leaf, level, CACHE_TYPE_DATA);
                populate_cache(icache, this_leaf, level++, CACHE_TYPE_INST);