mips: MAAR: Add XPA mode support
When XPA mode is enabled the normally 32-bits MAAR pair registers are extended to be of 64-bits width as in pure 64-bits MIPS architecture. In this case the MAAR registers can enable the speculative loads/stores for addresses of up to 39-bits width. But in this case the process of the MAAR initialization changes a bit. The upper 32-bits of the registers are supposed to be accessed by mean of the dedicated instructions mfhc0/mthc0 and there is a CP0.MAAR.VH bit which should be set together with CP0.MAAR.VL as indication of the boundary validity. All of these peculiarities were taken into account in this commit so the speculative loads/stores would work when XPA mode is enabled. Co-developed-by: Alexey Malahov <Alexey.Malahov@baikalelectronics.ru> Signed-off-by: Alexey Malahov <Alexey.Malahov@baikalelectronics.ru> Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru> Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Cc: Paul Burton <paulburton@kernel.org> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Rob Herring <robh+dt@kernel.org> Cc: linux-pm@vger.kernel.org Cc: devicetree@vger.kernel.org Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
This commit is contained in:

committed by
Thomas Bogendoerfer

parent
bd6e38983b
commit
9ee195fd1b
@@ -358,17 +358,23 @@ void maar_init(void)
|
||||
write_c0_maari(i);
|
||||
back_to_back_c0_hazard();
|
||||
upper = read_c0_maar();
|
||||
#ifdef CONFIG_XPA
|
||||
upper |= (phys_addr_t)readx_c0_maar() << MIPS_MAARX_ADDR_SHIFT;
|
||||
#endif
|
||||
|
||||
write_c0_maari(i + 1);
|
||||
back_to_back_c0_hazard();
|
||||
lower = read_c0_maar();
|
||||
#ifdef CONFIG_XPA
|
||||
lower |= (phys_addr_t)readx_c0_maar() << MIPS_MAARX_ADDR_SHIFT;
|
||||
#endif
|
||||
|
||||
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_VL)) {
|
||||
if ((attr & MIPS_MAAR_V) != MIPS_MAAR_V) {
|
||||
pr_cont("disabled\n");
|
||||
continue;
|
||||
}
|
||||
|
Reference in New Issue
Block a user