Thread (10 messages) 10 messages, 3 authors, 2024-01-23

Re: [PATCH] powerpc/6xx: set High BAT Enable flag on G2 cores

From: Matthias Schiffer <hidden>
Date: 2023-12-22 08:48:33
Also in: lkml

On Thu, 2023-12-21 at 13:57 +0000, Christophe Leroy wrote:

Le 21/12/2023 à 13:45, Matthias Schiffer a écrit :
quoted
MMU_FTR_USE_HIGH_BATS is set for G2-based cores (G2_LE, e300cX), but the
high BATs need to be enabled in HID2 to work. Add register definitions
and introduce a G2 variant of __setup_cpu_603.
Well spotted.

I have a mpc8321, hence e300c2. I never had the problem you had.

But ... looks like U-boot configuration has CONFIG_HID2_HBE so that's 
set by U-boot indeed, that's the reason why I never had that problem.
I'll extend the commit message to mention that U-Boot setting in v2.

quoted
This fixes boot on CPUs like the MPC5200B with STRICT_KERNEL_RWX enabled.

Fixes: e4d6654ebe6e ("powerpc/mm/32s: rework mmu_mapin_ram()")
Signed-off-by: Matthias Schiffer <redacted>
---
  arch/powerpc/include/asm/cpu_setup.h      |  1 +
  arch/powerpc/include/asm/reg.h            |  2 ++
  arch/powerpc/kernel/cpu_setup_6xx.S       | 25 ++++++++++++++++++++++-
  arch/powerpc/kernel/cpu_specs_book3s_32.h | 10 ++++-----
  4 files changed, 32 insertions(+), 6 deletions(-)


I have only tested this on the MPC5200B (G2_LE), but according to the
e300 manual, e300cX cores should behave the same.

The Fixes tag is the best I could come up with - I believe that the
underlying issue of setting USE_HIGH_BATS without actually enabling them
is as old as Linux's PowerPC implementation, but the specific code
causing the boot failure was added in the mentioned commit.
Agreed, before that only BATs 0 to 3 were used anyway.
There was also BAT 4 used by platforms/embedded6xx/wii.c  , but that's 
probably not a G2 ?
quoted
Another issue I found in the code is that
arch/powerpc/platforms/52xx/lite5200_sleep.S uses the SPRN_HID2 definition
which does not refer to HID2 on the 5200... but that will be for someone
else to fix, if there is still anyone left using that platform.
Maybe file an issue for it at https://github.com/linuxppc/issues/issues 
if you don't plan to fix it ?

By the way, it looks like the SPRN_HID2 definition we have is very 
specific to the IBM 750.
IBM 750GX even - googling for IBM 750 came up with several other cores that either don't have HID2,
or have it at a different SPR.

MPC 750 has SPRN_HID2 as 1011 == 0x3f3 like others.
quoted
diff --git a/arch/powerpc/include/asm/cpu_setup.h b/arch/powerpc/include/asm/cpu_setup.h
index 30e2fe3895024..68d804e74d221 100644
--- a/arch/powerpc/include/asm/cpu_setup.h
+++ b/arch/powerpc/include/asm/cpu_setup.h
@@ -35,6 +35,7 @@ void __setup_cpu_750fx(unsigned long offset, struct cpu_spec *spec);
  void __setup_cpu_7400(unsigned long offset, struct cpu_spec *spec);
  void __setup_cpu_7410(unsigned long offset, struct cpu_spec *spec);
  void __setup_cpu_745x(unsigned long offset, struct cpu_spec *spec);
+void __setup_cpu_g2(unsigned long offset, struct cpu_spec *spec);

  void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec *spec);
  void __setup_cpu_ppc970MP(unsigned long offset, struct cpu_spec *spec);
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index 4ae4ab9090a2d..f5641fcd1da85 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -617,6 +617,8 @@
  #endif
  #define SPRN_HID2      0x3F8           /* Hardware Implementation Register 2 */
Should that HID2 be renamed to SPRN_HID2_750 to avoid confusion ?
Makes sense (should the suffix be "750GX"?). I can also add a FIXME comment to lite5200_sleep.S as
part of the rename.

quoted
  #define SPRN_HID2_GEKKO        0x398           /* Gekko HID2 Register */
+#define SPRN_HID2_G2   0x3F3           /* G2 HID2 Register */
+#define  HID2_HBE_G2   (1<<18)         /* High BAT Enable (G2) */
  #define SPRN_IABR      0x3F2   /* Instruction Address Breakpoint Register */
  #define SPRN_IABR2     0x3FA           /* 83xx */
  #define SPRN_IBCR      0x135           /* 83xx Insn Breakpoint Control Reg */
diff --git a/arch/powerpc/kernel/cpu_setup_6xx.S b/arch/powerpc/kernel/cpu_setup_6xx.S
index f29ce3dd6140f..c67d32e04df9c 100644
--- a/arch/powerpc/kernel/cpu_setup_6xx.S
+++ b/arch/powerpc/kernel/cpu_setup_6xx.S
@@ -81,6 +81,20 @@ _GLOBAL(__setup_cpu_745x)
         bl      setup_745x_specifics
         mtlr    r5
         blr
+_GLOBAL(__setup_cpu_g2)
+       mflr    r5
+BEGIN_MMU_FTR_SECTION
+       li      r10,0
+       mtspr   SPRN_SPRG_603_LRU,r10           /* init SW LRU tracking */
+END_MMU_FTR_SECTION_IFSET(MMU_FTR_NEED_DTLB_SW_LRU)
MMU_FTR_NEED_DTLB_SW_LRU is dedicated to e300 core. You should also 
remove it from __setup_cpu_603
Will do, thanks.
quoted
+
+BEGIN_FTR_SECTION
+       bl      __init_fpu_registers
+END_FTR_SECTION_IFCLR(CPU_FTR_FPU_UNAVAILABLE)
+       bl      setup_common_caches
+       bl      setup_g2_hid2
+       mtlr    r5
+       blr

  /* Enable caches for 603's, 604, 750 & 7400 */
  SYM_FUNC_START_LOCAL(setup_common_caches)
@@ -115,6 +129,16 @@ SYM_FUNC_START_LOCAL(setup_604_hid0)
         blr
  SYM_FUNC_END(setup_604_hid0)

+/* Enable high BATs for G2 (G2_LE, e300cX) */
+SYM_FUNC_START_LOCAL(setup_g2_hid2)
+       mfspr   r11,SPRN_HID2_G2
+       oris    r11,r11,HID2_HBE_G2@h
+       mtspr   SPRN_HID2_G2,r11
+       sync
+       isync
+       blr
+SYM_FUNC_END(setup_g2_hid2)
+
  /* 7400 <= rev 2.7 and 7410 rev = 1.0 suffer from some
   * erratas we work around here.
   * Moto MPC710CE.pdf describes them, those are errata
@@ -495,4 +519,3 @@ _GLOBAL(__restore_cpu_setup)
         mtcr    r7
         blr
  _ASM_NOKPROBE_SYMBOL(__restore_cpu_setup)
-
diff --git a/arch/powerpc/kernel/cpu_specs_book3s_32.h b/arch/powerpc/kernel/cpu_specs_book3s_32.h
index 3714634d194a1..83f054fcf837c 100644
--- a/arch/powerpc/kernel/cpu_specs_book3s_32.h
+++ b/arch/powerpc/kernel/cpu_specs_book3s_32.h
@@ -69,7 +69,7 @@ static struct cpu_spec cpu_specs[] __initdata = {
                 .mmu_features           = MMU_FTR_USE_HIGH_BATS,
                 .icache_bsize           = 32,
                 .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_603,
+               .cpu_setup              = __setup_cpu_g2,
                 .machine_check          = machine_check_generic,
                 .platform               = "ppc603",
         },
@@ -83,7 +83,7 @@ static struct cpu_spec cpu_specs[] __initdata = {
                 .mmu_features           = MMU_FTR_USE_HIGH_BATS,
                 .icache_bsize           = 32,
                 .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_603,
+               .cpu_setup              = __setup_cpu_g2,
                 .machine_check          = machine_check_83xx,
                 .platform               = "ppc603",
         },
@@ -96,7 +96,7 @@ static struct cpu_spec cpu_specs[] __initdata = {
                 .mmu_features           = MMU_FTR_USE_HIGH_BATS | MMU_FTR_NEED_DTLB_SW_LRU,
                 .icache_bsize           = 32,
                 .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_603,
+               .cpu_setup              = __setup_cpu_g2,
                 .machine_check          = machine_check_83xx,
                 .platform               = "ppc603",
         },
@@ -109,7 +109,7 @@ static struct cpu_spec cpu_specs[] __initdata = {
                 .mmu_features           = MMU_FTR_USE_HIGH_BATS | MMU_FTR_NEED_DTLB_SW_LRU,
                 .icache_bsize           = 32,
                 .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_603,
+               .cpu_setup              = __setup_cpu_g2,
                 .machine_check          = machine_check_83xx,
                 .num_pmcs               = 4,
                 .platform               = "ppc603",
@@ -123,7 +123,7 @@ static struct cpu_spec cpu_specs[] __initdata = {
                 .mmu_features           = MMU_FTR_USE_HIGH_BATS | MMU_FTR_NEED_DTLB_SW_LRU,
                 .icache_bsize           = 32,
                 .dcache_bsize           = 32,
-               .cpu_setup              = __setup_cpu_603,
+               .cpu_setup              = __setup_cpu_g2,
                 .machine_check          = machine_check_83xx,
                 .num_pmcs               = 4,
                 .platform               = "ppc603",
--
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
https://www.tq-group.com/
-- 
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
https://www.tq-group.com/
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help