Skip to content

Commit

Permalink
powerpc: Add support for early debugging via Serial 16550 console
Browse files Browse the repository at this point in the history
Currently powerpc early debugging contains lot of platform specific
options, but does not support standard UART / serial 16550 console.

Later legacy_serial.c code supports registering UART as early debug console
from device tree but it is not early during booting, but rather later after
machine description code finishes.

So for real early debugging via UART is current code unsuitable.

Add support for new early debugging option CONFIG_PPC_EARLY_DEBUG_16550
which enable Serial 16550 console on address defined by new option
CONFIG_PPC_EARLY_DEBUG_16550_PHYSADDR and by stride by option
CONFIG_PPC_EARLY_DEBUG_16550_STRIDE.

With this change it is possible to debug powerpc machine descriptor code.
For example this early debugging code can print on serial console also
"No suitable machine description found" error which is done before
legacy_serial.c code.

Signed-off-by: Pali Rohár <pali@kernel.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220822231501.16827-1-pali@kernel.org
  • Loading branch information
Pali Rohár authored and Michael Ellerman committed Sep 28, 2022
1 parent bd7dc90 commit b19448f
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 0 deletions.
15 changes: 15 additions & 0 deletions arch/powerpc/Kconfig.debug
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,12 @@ config PPC_EARLY_DEBUG_MEMCONS
This console provides input and output buffers stored within the
kernel BSS and should be safe to select on any system. A debugger
can then be used to read kernel output or send input to the console.

config PPC_EARLY_DEBUG_16550
bool "Serial 16550"
depends on PPC_UDBG_16550
help
Select this to enable early debugging via Serial 16550 console
endchoice

config PPC_MEMCONS_OUTPUT_SIZE
Expand Down Expand Up @@ -354,6 +360,15 @@ config PPC_EARLY_DEBUG_CPM_ADDR
platform probing is done, all platforms selected must
share the same address.

config PPC_EARLY_DEBUG_16550_PHYSADDR
hex "Early debug Serial 16550 physical address"
depends on PPC_EARLY_DEBUG_16550

config PPC_EARLY_DEBUG_16550_STRIDE
int "Early debug Serial 16550 stride"
depends on PPC_EARLY_DEBUG_16550
default 1

config FAIL_IOMMU
bool "Fault-injection capability for IOMMU"
depends on FAULT_INJECTION
Expand Down
1 change: 1 addition & 0 deletions arch/powerpc/include/asm/udbg.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ extern void __init udbg_init_ehv_bc(void);
extern void __init udbg_init_ps3gelic(void);
extern void __init udbg_init_debug_opal_raw(void);
extern void __init udbg_init_debug_opal_hvsi(void);
extern void __init udbg_init_debug_16550(void);

#endif /* __KERNEL__ */
#endif /* _ASM_POWERPC_UDBG_H */
2 changes: 2 additions & 0 deletions arch/powerpc/kernel/udbg.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ void __init udbg_early_init(void)
udbg_init_debug_opal_raw();
#elif defined(CONFIG_PPC_EARLY_DEBUG_OPAL_HVSI)
udbg_init_debug_opal_hvsi();
#elif defined(CONFIG_PPC_EARLY_DEBUG_16550)
udbg_init_debug_16550();
#endif

#ifdef CONFIG_PPC_EARLY_DEBUG
Expand Down
33 changes: 33 additions & 0 deletions arch/powerpc/kernel/udbg_16550.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <asm/udbg.h>
#include <asm/io.h>
#include <asm/reg_a2.h>
#include <asm/early_ioremap.h>

extern u8 real_readb(volatile u8 __iomem *addr);
extern void real_writeb(u8 data, volatile u8 __iomem *addr);
Expand Down Expand Up @@ -296,3 +297,35 @@ void __init udbg_init_40x_realmode(void)
}

#endif /* CONFIG_PPC_EARLY_DEBUG_40x */

#ifdef CONFIG_PPC_EARLY_DEBUG_16550

static void __iomem *udbg_uart_early_addr;

void __init udbg_init_debug_16550(void)
{
udbg_uart_early_addr = early_ioremap(CONFIG_PPC_EARLY_DEBUG_16550_PHYSADDR, 0x1000);
udbg_uart_init_mmio(udbg_uart_early_addr, CONFIG_PPC_EARLY_DEBUG_16550_STRIDE);
}

static int __init udbg_init_debug_16550_ioremap(void)
{
void __iomem *addr;

if (!udbg_uart_early_addr)
return 0;

addr = ioremap(CONFIG_PPC_EARLY_DEBUG_16550_PHYSADDR, 0x1000);
if (WARN_ON(!addr))
return -ENOMEM;

udbg_uart_init_mmio(addr, CONFIG_PPC_EARLY_DEBUG_16550_STRIDE);
early_iounmap(udbg_uart_early_addr, 0x1000);
udbg_uart_early_addr = NULL;

return 0;
}

early_initcall(udbg_init_debug_16550_ioremap);

#endif /* CONFIG_PPC_EARLY_DEBUG_16550 */

0 comments on commit b19448f

Please sign in to comment.