[PATCH] powerpc: Make early debugging configurable via Kconfig
This patch adds Kconfig entries to control the early debugging options, currently in setup_64.c. Doing this via Kconfig rather than #defines means you can have one source tree, which is buildable for multiple platforms - and you can enable the correct early debug option for each platform via .config. I made udbg_early_init() a static inline because otherwise GCC is to daft to optimise it away when debugging is off. Now that we have udbg_init_rtas() we can make call_rtas_display_status* static. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
committed by
Paul Mackerras
parent
bf6a7112bd
commit
296167ae17
@@ -115,4 +115,46 @@ config PPC_OCP
|
|||||||
depends on IBM_OCP || XILINX_OCP
|
depends on IBM_OCP || XILINX_OCP
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
choice
|
||||||
|
prompt "Early debugging (dangerous)"
|
||||||
|
bool
|
||||||
|
optional
|
||||||
|
help
|
||||||
|
Enable early debugging. Careful, if you enable debugging for the
|
||||||
|
wrong type of machine your kernel _will not boot_.
|
||||||
|
|
||||||
|
config PPC_EARLY_DEBUG_LPAR
|
||||||
|
bool "LPAR HV Console"
|
||||||
|
depends on PPC_PSERIES
|
||||||
|
help
|
||||||
|
Select this to enable early debugging for a machine with a HVC
|
||||||
|
console on vterm 0.
|
||||||
|
|
||||||
|
config PPC_EARLY_DEBUG_G5
|
||||||
|
bool "Apple G5"
|
||||||
|
depends on PPC_PMAC64
|
||||||
|
help
|
||||||
|
Select this to enable early debugging for Apple G5 machines.
|
||||||
|
|
||||||
|
config PPC_EARLY_DEBUG_RTAS
|
||||||
|
bool "RTAS Panel"
|
||||||
|
depends on PPC_RTAS
|
||||||
|
help
|
||||||
|
Select this to enable early debugging via the RTAS panel.
|
||||||
|
|
||||||
|
config PPC_EARLY_DEBUG_MAPLE
|
||||||
|
bool "Maple real mode"
|
||||||
|
depends on PPC_MAPLE
|
||||||
|
help
|
||||||
|
Select this to enable early debugging for Maple.
|
||||||
|
|
||||||
|
config PPC_EARLY_DEBUG_ISERIES
|
||||||
|
bool "iSeries HV Console"
|
||||||
|
depends on PPC_ISERIES
|
||||||
|
help
|
||||||
|
Select this to enable early debugging for legacy iSeries. You need
|
||||||
|
to hit "Ctrl-x Ctrl-x" to see the messages on the console.
|
||||||
|
|
||||||
|
endchoice
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
@@ -29,6 +29,7 @@
|
|||||||
#include <asm/delay.h>
|
#include <asm/delay.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/lmb.h>
|
#include <asm/lmb.h>
|
||||||
|
#include <asm/udbg.h>
|
||||||
|
|
||||||
struct rtas_t rtas = {
|
struct rtas_t rtas = {
|
||||||
.lock = SPIN_LOCK_UNLOCKED
|
.lock = SPIN_LOCK_UNLOCKED
|
||||||
@@ -52,7 +53,7 @@ EXPORT_SYMBOL(rtas_flash_term_hook);
|
|||||||
* are designed only for very early low-level debugging, which
|
* are designed only for very early low-level debugging, which
|
||||||
* is why the token is hard-coded to 10.
|
* is why the token is hard-coded to 10.
|
||||||
*/
|
*/
|
||||||
void call_rtas_display_status(unsigned char c)
|
static void call_rtas_display_status(char c)
|
||||||
{
|
{
|
||||||
struct rtas_args *args = &rtas.args;
|
struct rtas_args *args = &rtas.args;
|
||||||
unsigned long s;
|
unsigned long s;
|
||||||
@@ -65,14 +66,14 @@ void call_rtas_display_status(unsigned char c)
|
|||||||
args->nargs = 1;
|
args->nargs = 1;
|
||||||
args->nret = 1;
|
args->nret = 1;
|
||||||
args->rets = (rtas_arg_t *)&(args->args[1]);
|
args->rets = (rtas_arg_t *)&(args->args[1]);
|
||||||
args->args[0] = (int)c;
|
args->args[0] = (unsigned char)c;
|
||||||
|
|
||||||
enter_rtas(__pa(args));
|
enter_rtas(__pa(args));
|
||||||
|
|
||||||
spin_unlock_irqrestore(&rtas.lock, s);
|
spin_unlock_irqrestore(&rtas.lock, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
void call_rtas_display_status_delay(unsigned char c)
|
static void call_rtas_display_status_delay(char c)
|
||||||
{
|
{
|
||||||
static int pending_newline = 0; /* did last write end with unprinted newline? */
|
static int pending_newline = 0; /* did last write end with unprinted newline? */
|
||||||
static int width = 16;
|
static int width = 16;
|
||||||
@@ -96,6 +97,11 @@ void call_rtas_display_status_delay(unsigned char c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init udbg_init_rtas(void)
|
||||||
|
{
|
||||||
|
udbg_putc = call_rtas_display_status_delay;
|
||||||
|
}
|
||||||
|
|
||||||
void rtas_progress(char *s, unsigned short hex)
|
void rtas_progress(char *s, unsigned short hex)
|
||||||
{
|
{
|
||||||
struct device_node *root;
|
struct device_node *root;
|
||||||
|
@@ -70,37 +70,6 @@
|
|||||||
#define DBG(fmt...)
|
#define DBG(fmt...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Here are some early debugging facilities. You can enable one
|
|
||||||
* but your kernel will not boot on anything else if you do so
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* For use on LPAR machines that support an HVC console on vterm 0 */
|
|
||||||
extern void udbg_init_debug_lpar(void);
|
|
||||||
|
|
||||||
/* This one is for use on Apple G5 machines */
|
|
||||||
extern void udbg_init_pmac_realmode(void);
|
|
||||||
|
|
||||||
/* That's RTAS panel debug */
|
|
||||||
extern void call_rtas_display_status_delay(unsigned char c);
|
|
||||||
|
|
||||||
/* Here's maple real mode debug */
|
|
||||||
extern void udbg_init_maple_realmode(void);
|
|
||||||
|
|
||||||
/* For iSeries - hit Ctrl-x Ctrl-x to see the output */
|
|
||||||
extern void udbg_init_iseries(void);
|
|
||||||
|
|
||||||
#define EARLY_DEBUG_INIT() do {} while(0)
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define EARLY_DEBUG_INIT() udbg_init_debug_lpar()
|
|
||||||
#define EARLY_DEBUG_INIT() udbg_init_iseries()
|
|
||||||
#define EARLY_DEBUG_INIT() udbg_init_maple_realmode()
|
|
||||||
#define EARLY_DEBUG_INIT() udbg_init_pmac_realmode()
|
|
||||||
#define EARLY_DEBUG_INIT() \
|
|
||||||
do { udbg_putc = call_rtas_display_status_delay; } while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int have_of = 1;
|
int have_of = 1;
|
||||||
int boot_cpuid = 0;
|
int boot_cpuid = 0;
|
||||||
int boot_cpuid_phys = 0;
|
int boot_cpuid_phys = 0;
|
||||||
@@ -241,11 +210,8 @@ void __init early_setup(unsigned long dt_ptr)
|
|||||||
struct paca_struct *lpaca = get_paca();
|
struct paca_struct *lpaca = get_paca();
|
||||||
static struct machdep_calls **mach;
|
static struct machdep_calls **mach;
|
||||||
|
|
||||||
/*
|
/* Enable early debugging if any specified (see udbg.h) */
|
||||||
* Enable early debugging if any specified (see top of
|
udbg_early_init();
|
||||||
* this file)
|
|
||||||
*/
|
|
||||||
EARLY_DEBUG_INIT();
|
|
||||||
|
|
||||||
DBG(" -> early_setup()\n");
|
DBG(" -> early_setup()\n");
|
||||||
|
|
||||||
|
@@ -15,11 +15,36 @@
|
|||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
#include <asm/udbg.h>
|
||||||
|
|
||||||
void (*udbg_putc)(char c);
|
void (*udbg_putc)(char c);
|
||||||
int (*udbg_getc)(void);
|
int (*udbg_getc)(void);
|
||||||
int (*udbg_getc_poll)(void);
|
int (*udbg_getc_poll)(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Early debugging facilities. You can enable _one_ of these via .config,
|
||||||
|
* if you do so your kernel _will not boot_ on anything else. Be careful.
|
||||||
|
*/
|
||||||
|
void __init udbg_early_init(void)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_PPC_EARLY_DEBUG_LPAR)
|
||||||
|
/* For LPAR machines that have an HVC console on vterm 0 */
|
||||||
|
udbg_init_debug_lpar();
|
||||||
|
#elif defined(CONFIG_PPC_EARLY_DEBUG_G5)
|
||||||
|
/* For use on Apple G5 machines */
|
||||||
|
udbg_init_pmac_realmode();
|
||||||
|
#elif defined(CONFIG_PPC_EARLY_DEBUG_RTAS)
|
||||||
|
/* RTAS panel debug */
|
||||||
|
udbg_init_rtas();
|
||||||
|
#elif defined(CONFIG_PPC_EARLY_DEBUG_MAPLE)
|
||||||
|
/* Maple real mode debug */
|
||||||
|
udbg_init_maple_realmode();
|
||||||
|
#elif defined(CONFIG_PPC_EARLY_DEBUG_ISERIES)
|
||||||
|
/* For iSeries - hit Ctrl-x Ctrl-x to see the output */
|
||||||
|
udbg_init_iseries();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* udbg library, used by xmon et al */
|
/* udbg library, used by xmon et al */
|
||||||
void udbg_puts(const char *s)
|
void udbg_puts(const char *s)
|
||||||
{
|
{
|
||||||
|
@@ -155,7 +155,7 @@ void udbg_maple_real_putc(unsigned char c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void udbg_init_maple_realmode(void)
|
void __init udbg_init_maple_realmode(void)
|
||||||
{
|
{
|
||||||
udbg_comport = (volatile struct NS16550 __iomem *)0xf40003f8;
|
udbg_comport = (volatile struct NS16550 __iomem *)0xf40003f8;
|
||||||
|
|
||||||
|
@@ -153,7 +153,7 @@ static void udbg_real_scc_putc(char c)
|
|||||||
udbg_real_scc_putc('\r');
|
udbg_real_scc_putc('\r');
|
||||||
}
|
}
|
||||||
|
|
||||||
void udbg_init_pmac_realmode(void)
|
void __init udbg_init_pmac_realmode(void)
|
||||||
{
|
{
|
||||||
sccc = (volatile u8 __iomem *)0x80013020ul;
|
sccc = (volatile u8 __iomem *)0x80013020ul;
|
||||||
sccd = (volatile u8 __iomem *)0x80013030ul;
|
sccd = (volatile u8 __iomem *)0x80013030ul;
|
||||||
|
@@ -161,7 +161,6 @@ extern struct rtas_t rtas;
|
|||||||
extern void enter_rtas(unsigned long);
|
extern void enter_rtas(unsigned long);
|
||||||
extern int rtas_token(const char *service);
|
extern int rtas_token(const char *service);
|
||||||
extern int rtas_call(int token, int, int, int *, ...);
|
extern int rtas_call(int token, int, int, int *, ...);
|
||||||
extern void call_rtas_display_status(unsigned char);
|
|
||||||
extern void rtas_restart(char *cmd);
|
extern void rtas_restart(char *cmd);
|
||||||
extern void rtas_power_off(void);
|
extern void rtas_power_off(void);
|
||||||
extern void rtas_halt(void);
|
extern void rtas_halt(void);
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* c 2001 PPC 64 Team, IBM Corp
|
* (c) 2001, 2006 IBM Corporation.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@@ -36,5 +36,12 @@ extern void udbg_scc_init(int force_scc);
|
|||||||
extern int udbg_adb_init(int force_btext);
|
extern int udbg_adb_init(int force_btext);
|
||||||
extern void udbg_adb_init_early(void);
|
extern void udbg_adb_init_early(void);
|
||||||
|
|
||||||
|
extern void __init udbg_early_init(void);
|
||||||
|
extern void __init udbg_init_debug_lpar(void);
|
||||||
|
extern void __init udbg_init_pmac_realmode(void);
|
||||||
|
extern void __init udbg_init_maple_realmode(void);
|
||||||
|
extern void __init udbg_init_iseries(void);
|
||||||
|
extern void __init udbg_init_rtas(void);
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* _ASM_POWERPC_UDBG_H */
|
#endif /* _ASM_POWERPC_UDBG_H */
|
||||||
|
Reference in New Issue
Block a user