| From 1e78f723d6a52966bfe3804209dbf404fdc9d3bb Mon Sep 17 00:00:00 2001 |
| From: Christophe Leroy <christophe.leroy@csgroup.eu> |
| Date: Fri, 4 Dec 2020 10:11:34 +0000 |
| Subject: powerpc/8xx: Fix early debug when SMC1 is relocated |
| |
| From: Christophe Leroy <christophe.leroy@csgroup.eu> |
| |
| commit 1e78f723d6a52966bfe3804209dbf404fdc9d3bb upstream. |
| |
| When SMC1 is relocated and early debug is selected, the |
| board hangs is ppc_md.setup_arch(). This is because ones |
| the microcode has been loaded and SMC1 relocated, early |
| debug writes in the weed. |
| |
| To allow smooth continuation, the SMC1 parameter RAM set up |
| by the bootloader have to be copied into the new location. |
| |
| Fixes: 43db76f41824 ("powerpc/8xx: Add microcode patch to move SMC parameter RAM.") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/b2f71f39eca543f1e4ec06596f09a8b12235c701.1607076683.git.christophe.leroy@csgroup.eu |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/include/asm/cpm1.h | 1 + |
| arch/powerpc/platforms/8xx/micropatch.c | 11 +++++++++++ |
| 2 files changed, 12 insertions(+) |
| |
| --- a/arch/powerpc/include/asm/cpm1.h |
| +++ b/arch/powerpc/include/asm/cpm1.h |
| @@ -68,6 +68,7 @@ extern void cpm_reset(void); |
| #define PROFF_SPI ((uint)0x0180) |
| #define PROFF_SCC3 ((uint)0x0200) |
| #define PROFF_SMC1 ((uint)0x0280) |
| +#define PROFF_DSP1 ((uint)0x02c0) |
| #define PROFF_SCC4 ((uint)0x0300) |
| #define PROFF_SMC2 ((uint)0x0380) |
| |
| --- a/arch/powerpc/platforms/8xx/micropatch.c |
| +++ b/arch/powerpc/platforms/8xx/micropatch.c |
| @@ -360,6 +360,17 @@ void __init cpm_load_patch(cpm8xx_t *cp) |
| if (IS_ENABLED(CONFIG_SMC_UCODE_PATCH)) { |
| smc_uart_t *smp; |
| |
| + if (IS_ENABLED(CONFIG_PPC_EARLY_DEBUG_CPM)) { |
| + int i; |
| + |
| + for (i = 0; i < sizeof(*smp); i += 4) { |
| + u32 __iomem *src = (u32 __iomem *)&cp->cp_dparam[PROFF_SMC1 + i]; |
| + u32 __iomem *dst = (u32 __iomem *)&cp->cp_dparam[PROFF_DSP1 + i]; |
| + |
| + out_be32(dst, in_be32(src)); |
| + } |
| + } |
| + |
| smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC1]; |
| out_be16(&smp->smc_rpbase, 0x1ec0); |
| smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC2]; |