Skip to content

Commit

Permalink
[PATCH] powerpc: Make early debugging configurable via Kconfig
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Michael Ellerman authored and Paul Mackerras committed Jan 11, 2006
1 parent bf6a711 commit 296167a
Show file tree
Hide file tree
Showing 8 changed files with 88 additions and 43 deletions.
42 changes: 42 additions & 0 deletions arch/powerpc/Kconfig.debug
Original file line number Diff line number Diff line change
Expand Up @@ -115,4 +115,46 @@ config PPC_OCP
depends on IBM_OCP || XILINX_OCP
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
12 changes: 9 additions & 3 deletions arch/powerpc/kernel/rtas.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <asm/delay.h>
#include <asm/uaccess.h>
#include <asm/lmb.h>
#include <asm/udbg.h>

struct rtas_t rtas = {
.lock = SPIN_LOCK_UNLOCKED
Expand All @@ -52,7 +53,7 @@ EXPORT_SYMBOL(rtas_flash_term_hook);
* are designed only for very early low-level debugging, which
* 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;
unsigned long s;
Expand All @@ -65,14 +66,14 @@ void call_rtas_display_status(unsigned char c)
args->nargs = 1;
args->nret = 1;
args->rets = (rtas_arg_t *)&(args->args[1]);
args->args[0] = (int)c;
args->args[0] = (unsigned char)c;

enter_rtas(__pa(args));

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 width = 16;
Expand All @@ -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)
{
struct device_node *root;
Expand Down
38 changes: 2 additions & 36 deletions arch/powerpc/kernel/setup_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,37 +70,6 @@
#define DBG(fmt...)
#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 boot_cpuid = 0;
int boot_cpuid_phys = 0;
Expand Down Expand Up @@ -241,11 +210,8 @@ void __init early_setup(unsigned long dt_ptr)
struct paca_struct *lpaca = get_paca();
static struct machdep_calls **mach;

/*
* Enable early debugging if any specified (see top of
* this file)
*/
EARLY_DEBUG_INIT();
/* Enable early debugging if any specified (see udbg.h) */
udbg_early_init();

DBG(" -> early_setup()\n");

Expand Down
25 changes: 25 additions & 0 deletions arch/powerpc/kernel/udbg.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,36 @@
#include <linux/sched.h>
#include <linux/console.h>
#include <asm/processor.h>
#include <asm/udbg.h>

void (*udbg_putc)(char c);
int (*udbg_getc)(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 */
void udbg_puts(const char *s)
{
Expand Down
2 changes: 1 addition & 1 deletion arch/powerpc/kernel/udbg_16550.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion arch/powerpc/platforms/powermac/udbg_scc.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ static void udbg_real_scc_putc(char c)
udbg_real_scc_putc('\r');
}

void udbg_init_pmac_realmode(void)
void __init udbg_init_pmac_realmode(void)
{
sccc = (volatile u8 __iomem *)0x80013020ul;
sccd = (volatile u8 __iomem *)0x80013030ul;
Expand Down
1 change: 0 additions & 1 deletion include/asm-powerpc/rtas.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,6 @@ extern struct rtas_t rtas;
extern void enter_rtas(unsigned long);
extern int rtas_token(const char *service);
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_power_off(void);
extern void rtas_halt(void);
Expand Down
9 changes: 8 additions & 1 deletion include/asm-powerpc/udbg.h
Original file line number Diff line number Diff line change
@@ -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
* modify it under the terms of the GNU General Public License
Expand Down Expand Up @@ -36,5 +36,12 @@ extern void udbg_scc_init(int force_scc);
extern int udbg_adb_init(int force_btext);
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 /* _ASM_POWERPC_UDBG_H */

0 comments on commit 296167a

Please sign in to comment.