MIPS: print MAAR configuration during boot
authorPaul Burton <paul.burton@imgtec.com>
Fri, 25 Sep 2015 15:59:37 +0000 (08:59 -0700)
committerRalf Baechle <ralf@linux-mips.org>
Sun, 27 Sep 2015 12:14:47 +0000 (14:14 +0200)
Verifying that the MAAR configuration is as expected is useful when
debugging the performance of a system. Print out the memory regions
configured via MAAR along with their attributes.

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org
Cc: Steven J. Hill <Steven.Hill@imgtec.com>
Cc: David Hildenbrand <dahi@linux.vnet.ibm.com>
Cc: linux-kernel@vger.kernel.org
Cc: Peter Zijlstra (Intel) <peterz@infradead.org>
Patchwork: https://patchwork.linux-mips.org/patch/11238/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/mm/init.c

index 074ac545902663b69e1319ad2f8efe18de77637c..023c164b9eb69f9b579cb71baae3a2d2646268ef 100644 (file)
@@ -291,6 +291,7 @@ unsigned __weak platform_maar_init(unsigned num_pairs)
 static void maar_init(void)
 {
        unsigned num_maars, used, i;
+       phys_addr_t lower, upper, attr;
 
        if (!cpu_has_maar)
                return;
@@ -313,6 +314,34 @@ static void maar_init(void)
                write_c0_maar(0);
                back_to_back_c0_hazard();
        }
+
+       pr_info("MAAR configuration:\n");
+       for (i = 0; i < num_maars; i += 2) {
+               write_c0_maari(i);
+               back_to_back_c0_hazard();
+               upper = read_c0_maar();
+
+               write_c0_maari(i + 1);
+               back_to_back_c0_hazard();
+               lower = read_c0_maar();
+
+               attr = lower & upper;
+               lower = (lower & MIPS_MAAR_ADDR) << 4;
+               upper = ((upper & MIPS_MAAR_ADDR) << 4) | 0xffff;
+
+               pr_info("  [%d]: ", i / 2);
+               if (!(attr & MIPS_MAAR_V)) {
+                       pr_cont("disabled\n");
+                       continue;
+               }
+
+               pr_cont("%pa-%pa", &lower, &upper);
+
+               if (attr & MIPS_MAAR_S)
+                       pr_cont(" speculate");
+
+               pr_cont("\n");
+       }
 }
 
 #ifndef CONFIG_NEED_MULTIPLE_NODES