lkml.org 
[lkml]   [2020]   [Dec]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] powerpc/8xx: Fix early debug when SMC1 is relocated
    Date
    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.

    Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    Fixes: 43db76f41824 ("powerpc/8xx: Add microcode patch to move SMC parameter RAM.")
    Cc: stable@vger.kernel.org
    ---
    arch/powerpc/include/asm/cpm1.h | 1 +
    arch/powerpc/platforms/8xx/micropatch.c | 11 +++++++++++
    2 files changed, 12 insertions(+)

    diff --git a/arch/powerpc/include/asm/cpm1.h b/arch/powerpc/include/asm/cpm1.h
    index a116fe931789..3bdd74739cb8 100644
    --- 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)

    diff --git a/arch/powerpc/platforms/8xx/micropatch.c b/arch/powerpc/platforms/8xx/micropatch.c
    index aed4bc75f352..aef179fcbd4f 100644
    --- 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];
    --
    2.25.0
    \
     
     \ /
      Last update: 2020-12-04 11:13    [W:5.701 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site