powerpc: Add support for early debugging via Serial 16550 console
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
This commit is contained in:
Родитель
bd7dc90e52
Коммит
b19448fe84
|
@ -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
|
||||
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
|
Загрузка…
Ссылка в новой задаче