Message ID | b0d982e223314ed82ab959f5d4ad2c4c00bedb99.1657549153.git.christophe.leroy@csgroup.eu (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | [v1,1/5] powerpc/32: Do not allow selection of e5500 or e6500 CPUs on PPC32 | expand |
On Mon, Jul 11, 2022 at 4:19 PM Christophe Leroy <christophe.leroy@csgroup.eu> wrote: > @@ -183,6 +183,18 @@ config 405_CPU > bool "40x family" > depends on 40x > > +config 440_CPU > + bool "440 (44x family)" > + depends on 44x > + > +config 464_CPU > + bool "464 (44x family)" > + depends on 44x > + > +config 476_CPU > + bool "476 (47x family)" > + depends on PPC_47x Is there any value in building for -mcpu=440 or -mcpu=464 when targeting a 476? Maybe add another !PPC_47x dependency for the first two. Ideally we would also enforce that 440/464 based boards cannot be selected together with 476, though I guess that is a separate issue. Is there a practical difference between 440 and 464 when building kernels? gcc seems to treat them the same way, so maybe one option for both is enough here. Arnd
Oops, I wanted to include Pali and Segher when I sent the series, I prepared a script including them but used the wrong script at the end. Le 11/07/2022 à 17:05, Arnd Bergmann a écrit : > On Mon, Jul 11, 2022 at 4:19 PM Christophe Leroy > <christophe.leroy@csgroup.eu> wrote: >> @@ -183,6 +183,18 @@ config 405_CPU >> bool "40x family" >> depends on 40x >> >> +config 440_CPU >> + bool "440 (44x family)" >> + depends on 44x >> + >> +config 464_CPU >> + bool "464 (44x family)" >> + depends on 44x >> + >> +config 476_CPU >> + bool "476 (47x family)" >> + depends on PPC_47x > > Is there any value in building for -mcpu=440 or -mcpu=464 when targeting a 476? No idea, maybe not. > Maybe add another !PPC_47x dependency for the first two. Ideally we would also > enforce that 440/464 based boards cannot be selected together with 476, though > I guess that is a separate issue. Yes can do that. By the way, 440/464 boards get excluded from kernel/cputable.c when 47x is selected > > Is there a practical difference between 440 and 464 when building kernels? > gcc seems to treat them the same way, so maybe one option for both is enough > here. > I don't know. Christophe
On Mon, Jul 11, 2022 at 05:05:04PM +0200, Arnd Bergmann wrote: > Is there any value in building for -mcpu=440 or -mcpu=464 when targeting a 476? The original 440 had a very short pipeline. Later IBM 4xx have a longer pipeline. Getting this right (with -mtune=, or just with -mcpu=) is important for performance. So, no? > Maybe add another !PPC_47x dependency for the first two. Ideally we would also > enforce that 440/464 based boards cannot be selected together with 476, though > I guess that is a separate issue. > > Is there a practical difference between 440 and 464 when building kernels? > gcc seems to treat them the same way, so maybe one option for both is enough > here. -mcpu= is used as the default for -mtune=, so that is always a consideration. PPC464 is treated the same as PPC440 in binutils as well, so I don't think there is any issue there. Segher
diff --git a/arch/powerpc/include/asm/barrier.h b/arch/powerpc/include/asm/barrier.h index f0e687236484..ef2d8b15eaab 100644 --- a/arch/powerpc/include/asm/barrier.h +++ b/arch/powerpc/include/asm/barrier.h @@ -42,6 +42,8 @@ /* The sub-arch has lwsync */ #if defined(CONFIG_PPC64) || defined(CONFIG_PPC_E500MC) # define SMPWMB LWSYNC +#elif defined(CONFIG_BOOKE) +# define SMPWMB mbar #else # define SMPWMB eieio #endif diff --git a/arch/powerpc/include/asm/nohash/pgtable.h b/arch/powerpc/include/asm/nohash/pgtable.h index ac75f4ab0dba..b499da6c1a99 100644 --- a/arch/powerpc/include/asm/nohash/pgtable.h +++ b/arch/powerpc/include/asm/nohash/pgtable.h @@ -193,7 +193,7 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr, if (IS_ENABLED(CONFIG_PPC32) && IS_ENABLED(CONFIG_PTE_64BIT) && !percpu) { __asm__ __volatile__("\ stw%X0 %2,%0\n\ - eieio\n\ + mbar\n\ stw%X1 %L2,%1" : "=m" (*ptep), "=m" (*((unsigned char *)ptep+4)) : "r" (pte) : "memory"); diff --git a/arch/powerpc/include/asm/synch.h b/arch/powerpc/include/asm/synch.h index 1d67bc8d7bc6..7130176d8cb8 100644 --- a/arch/powerpc/include/asm/synch.h +++ b/arch/powerpc/include/asm/synch.h @@ -14,7 +14,10 @@ extern void do_lwsync_fixups(unsigned long value, void *fixup_start, static inline void eieio(void) { - __asm__ __volatile__ ("eieio" : : : "memory"); + if (IS_ENABLED(CONFIG_BOOKE)) + __asm__ __volatile__ ("mbar" : : : "memory"); + else + __asm__ __volatile__ ("eieio" : : : "memory"); } static inline void isync(void) diff --git a/arch/powerpc/mm/nohash/tlb_low.S b/arch/powerpc/mm/nohash/tlb_low.S index dd39074de9af..d62b613a0d5d 100644 --- a/arch/powerpc/mm/nohash/tlb_low.S +++ b/arch/powerpc/mm/nohash/tlb_low.S @@ -186,7 +186,7 @@ _GLOBAL(_tlbivax_bcast) isync PPC_TLBIVAX(0, R3) isync - eieio + mbar tlbsync BEGIN_FTR_SECTION b 1f @@ -355,7 +355,7 @@ _GLOBAL(_tlbivax_bcast) rlwimi r4,r6,MAS6_SIND_SHIFT,MAS6_SIND 1: mtspr SPRN_MAS6,r4 /* assume AS=0 for now */ PPC_TLBIVAX(0,R3) - eieio + mbar tlbsync sync wrtee r10 diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index e14000557ebd..3cc8452b8660 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype @@ -137,7 +137,7 @@ config GENERIC_CPU config POWERPC_CPU bool "Generic 32 bits powerpc" - depends on PPC32 && !PPC_8xx && !PPC_85xx && !40x + depends on PPC_BOOK3S_32 config CELL_CPU bool "Cell Broadband Engine" @@ -183,6 +183,18 @@ config 405_CPU bool "40x family" depends on 40x +config 440_CPU + bool "440 (44x family)" + depends on 44x + +config 464_CPU + bool "464 (44x family)" + depends on 44x + +config 476_CPU + bool "476 (47x family)" + depends on PPC_47x + config 860_CPU bool "8xx family" depends on PPC_8xx @@ -228,6 +240,9 @@ config TARGET_CPU default "power8" if POWER8_CPU default "power9" if POWER9_CPU default "405" if 405_CPU + default "440" if 440_CPU + default "464" if 464_CPU + default "476" if 476_CPU default "860" if 860_CPU default "e300c2" if E300C2_CPU default "e300c3" if E300C3_CPU diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c index 1bfc9afa8a1a..4647c6074f3b 100644 --- a/arch/powerpc/sysdev/fsl_rio.c +++ b/arch/powerpc/sysdev/fsl_rio.c @@ -69,10 +69,10 @@ static DEFINE_SPINLOCK(fsl_rio_config_lock); -#define __fsl_read_rio_config(x, addr, err, op) \ +#define ___fsl_read_rio_config(x, addr, err, op, barrier) \ __asm__ __volatile__( \ "1: "op" %1,0(%2)\n" \ - " eieio\n" \ + " "barrier"\n" \ "2:\n" \ ".section .fixup,\"ax\"\n" \ "3: li %1,-1\n" \ @@ -83,6 +83,14 @@ static DEFINE_SPINLOCK(fsl_rio_config_lock); : "=r" (err), "=r" (x) \ : "b" (addr), "i" (-EFAULT), "0" (err)) +#ifdef CONFIG_BOOKE +#define __fsl_read_rio_config(x, addr, err, op) \ + ___fsl_read_rio_config(x, addr, err, op, "mbar") +#else +#define __fsl_read_rio_config(x, addr, err, op) \ + ___fsl_read_rio_config(x, addr, err, op, "eieio") +#endif + void __iomem *rio_regs_win; void __iomem *rmu_regs_win; resource_size_t rio_law_start;
Building ppc40x_defconfig leads to following error CC arch/powerpc/kernel/idle.o {standard input}: Assembler messages: {standard input}:67: Error: unrecognized opcode: `wrteei' {standard input}:78: Error: unrecognized opcode: `wrteei' Add -mcpu=440 by default and alternatively 464 and 476. Once that's done, -mcpu=powerpc is only for book3s/32 now. But then comes CC arch/powerpc/kernel/io.o {standard input}: Assembler messages: {standard input}:198: Error: unrecognized opcode: `eieio' {standard input}:230: Error: unrecognized opcode: `eieio' {standard input}:245: Error: unrecognized opcode: `eieio' {standard input}:254: Error: unrecognized opcode: `eieio' {standard input}:273: Error: unrecognized opcode: `eieio' {standard input}:396: Error: unrecognized opcode: `eieio' {standard input}:404: Error: unrecognized opcode: `eieio' {standard input}:423: Error: unrecognized opcode: `eieio' {standard input}:512: Error: unrecognized opcode: `eieio' {standard input}:520: Error: unrecognized opcode: `eieio' {standard input}:539: Error: unrecognized opcode: `eieio' {standard input}:628: Error: unrecognized opcode: `eieio' {standard input}:636: Error: unrecognized opcode: `eieio' {standard input}:655: Error: unrecognized opcode: `eieio' Fix it by replacing eieio by mbar on booke. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> --- arch/powerpc/include/asm/barrier.h | 2 ++ arch/powerpc/include/asm/nohash/pgtable.h | 2 +- arch/powerpc/include/asm/synch.h | 5 ++++- arch/powerpc/mm/nohash/tlb_low.S | 4 ++-- arch/powerpc/platforms/Kconfig.cputype | 17 ++++++++++++++++- arch/powerpc/sysdev/fsl_rio.c | 12 ++++++++++-- 6 files changed, 35 insertions(+), 7 deletions(-)