aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel
diff options
context:
space:
mode:
authorMichael Ellerman <michael@ellerman.id.au>2006-01-10 19:54:09 -0500
committerPaul Mackerras <paulus@samba.org>2006-01-10 22:48:26 -0500
commit296167ae1799815b9ed2d135a847436502f2ee91 (patch)
tree5e9496d0a60e10a021c12117ec6bc8d513f39463 /arch/powerpc/kernel
parentbf6a7112bda99aadd6675526423a96be6b356a3d (diff)
[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>
Diffstat (limited to 'arch/powerpc/kernel')
-rw-r--r--arch/powerpc/kernel/rtas.c12
-rw-r--r--arch/powerpc/kernel/setup_64.c38
-rw-r--r--arch/powerpc/kernel/udbg.c25
-rw-r--r--arch/powerpc/kernel/udbg_16550.c2
4 files changed, 37 insertions, 40 deletions
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
index ae2e2a31a705..68bcd2824bc6 100644
--- a/arch/powerpc/kernel/rtas.c
+++ b/arch/powerpc/kernel/rtas.c
@@ -29,6 +29,7 @@
29#include <asm/delay.h> 29#include <asm/delay.h>
30#include <asm/uaccess.h> 30#include <asm/uaccess.h>
31#include <asm/lmb.h> 31#include <asm/lmb.h>
32#include <asm/udbg.h>
32 33
33struct rtas_t rtas = { 34struct rtas_t rtas = {
34 .lock = SPIN_LOCK_UNLOCKED 35 .lock = SPIN_LOCK_UNLOCKED
@@ -52,7 +53,7 @@ EXPORT_SYMBOL(rtas_flash_term_hook);
52 * are designed only for very early low-level debugging, which 53 * are designed only for very early low-level debugging, which
53 * is why the token is hard-coded to 10. 54 * is why the token is hard-coded to 10.
54 */ 55 */
55void call_rtas_display_status(unsigned char c) 56static void call_rtas_display_status(char c)
56{ 57{
57 struct rtas_args *args = &rtas.args; 58 struct rtas_args *args = &rtas.args;
58 unsigned long s; 59 unsigned long s;
@@ -65,14 +66,14 @@ void call_rtas_display_status(unsigned char c)
65 args->nargs = 1; 66 args->nargs = 1;
66 args->nret = 1; 67 args->nret = 1;
67 args->rets = (rtas_arg_t *)&(args->args[1]); 68 args->rets = (rtas_arg_t *)&(args->args[1]);
68 args->args[0] = (int)c; 69 args->args[0] = (unsigned char)c;
69 70
70 enter_rtas(__pa(args)); 71 enter_rtas(__pa(args));
71 72
72 spin_unlock_irqrestore(&rtas.lock, s); 73 spin_unlock_irqrestore(&rtas.lock, s);
73} 74}
74 75
75void call_rtas_display_status_delay(unsigned char c) 76static void call_rtas_display_status_delay(char c)
76{ 77{
77 static int pending_newline = 0; /* did last write end with unprinted newline? */ 78 static int pending_newline = 0; /* did last write end with unprinted newline? */
78 static int width = 16; 79 static int width = 16;
@@ -96,6 +97,11 @@ void call_rtas_display_status_delay(unsigned char c)
96 } 97 }
97} 98}
98 99
100void __init udbg_init_rtas(void)
101{
102 udbg_putc = call_rtas_display_status_delay;
103}
104
99void rtas_progress(char *s, unsigned short hex) 105void rtas_progress(char *s, unsigned short hex)
100{ 106{
101 struct device_node *root; 107 struct device_node *root;
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index 177d8249078d..0420418f317a 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -70,37 +70,6 @@
70#define DBG(fmt...) 70#define DBG(fmt...)
71#endif 71#endif
72 72
73/*
74 * Here are some early debugging facilities. You can enable one
75 * but your kernel will not boot on anything else if you do so
76 */
77
78/* For use on LPAR machines that support an HVC console on vterm 0 */
79extern void udbg_init_debug_lpar(void);
80
81/* This one is for use on Apple G5 machines */
82extern void udbg_init_pmac_realmode(void);
83
84/* That's RTAS panel debug */
85extern void call_rtas_display_status_delay(unsigned char c);
86
87/* Here's maple real mode debug */
88extern void udbg_init_maple_realmode(void);
89
90/* For iSeries - hit Ctrl-x Ctrl-x to see the output */
91extern void udbg_init_iseries(void);
92
93#define EARLY_DEBUG_INIT() do {} while(0)
94
95#if 0
96#define EARLY_DEBUG_INIT() udbg_init_debug_lpar()
97#define EARLY_DEBUG_INIT() udbg_init_iseries()
98#define EARLY_DEBUG_INIT() udbg_init_maple_realmode()
99#define EARLY_DEBUG_INIT() udbg_init_pmac_realmode()
100#define EARLY_DEBUG_INIT() \
101 do { udbg_putc = call_rtas_display_status_delay; } while(0)
102#endif
103
104int have_of = 1; 73int have_of = 1;
105int boot_cpuid = 0; 74int boot_cpuid = 0;
106int boot_cpuid_phys = 0; 75int boot_cpuid_phys = 0;
@@ -241,11 +210,8 @@ void __init early_setup(unsigned long dt_ptr)
241 struct paca_struct *lpaca = get_paca(); 210 struct paca_struct *lpaca = get_paca();
242 static struct machdep_calls **mach; 211 static struct machdep_calls **mach;
243 212
244 /* 213 /* Enable early debugging if any specified (see udbg.h) */
245 * Enable early debugging if any specified (see top of 214 udbg_early_init();
246 * this file)
247 */
248 EARLY_DEBUG_INIT();
249 215
250 DBG(" -> early_setup()\n"); 216 DBG(" -> early_setup()\n");
251 217
diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c
index 558c1ceb2b93..3774e80094f5 100644
--- a/arch/powerpc/kernel/udbg.c
+++ b/arch/powerpc/kernel/udbg.c
@@ -15,11 +15,36 @@
15#include <linux/sched.h> 15#include <linux/sched.h>
16#include <linux/console.h> 16#include <linux/console.h>
17#include <asm/processor.h> 17#include <asm/processor.h>
18#include <asm/udbg.h>
18 19
19void (*udbg_putc)(char c); 20void (*udbg_putc)(char c);
20int (*udbg_getc)(void); 21int (*udbg_getc)(void);
21int (*udbg_getc_poll)(void); 22int (*udbg_getc_poll)(void);
22 23
24/*
25 * Early debugging facilities. You can enable _one_ of these via .config,
26 * if you do so your kernel _will not boot_ on anything else. Be careful.
27 */
28void __init udbg_early_init(void)
29{
30#if defined(CONFIG_PPC_EARLY_DEBUG_LPAR)
31 /* For LPAR machines that have an HVC console on vterm 0 */
32 udbg_init_debug_lpar();
33#elif defined(CONFIG_PPC_EARLY_DEBUG_G5)
34 /* For use on Apple G5 machines */
35 udbg_init_pmac_realmode();
36#elif defined(CONFIG_PPC_EARLY_DEBUG_RTAS)
37 /* RTAS panel debug */
38 udbg_init_rtas();
39#elif defined(CONFIG_PPC_EARLY_DEBUG_MAPLE)
40 /* Maple real mode debug */
41 udbg_init_maple_realmode();
42#elif defined(CONFIG_PPC_EARLY_DEBUG_ISERIES)
43 /* For iSeries - hit Ctrl-x Ctrl-x to see the output */
44 udbg_init_iseries();
45#endif
46}
47
23/* udbg library, used by xmon et al */ 48/* udbg library, used by xmon et al */
24void udbg_puts(const char *s) 49void udbg_puts(const char *s)
25{ 50{
diff --git a/arch/powerpc/kernel/udbg_16550.c b/arch/powerpc/kernel/udbg_16550.c
index 7541bf44d2da..2da65a9c93f6 100644
--- a/arch/powerpc/kernel/udbg_16550.c
+++ b/arch/powerpc/kernel/udbg_16550.c
@@ -155,7 +155,7 @@ void udbg_maple_real_putc(unsigned char c)
155 } 155 }
156} 156}
157 157
158void udbg_init_maple_realmode(void) 158void __init udbg_init_maple_realmode(void)
159{ 159{
160 udbg_comport = (volatile struct NS16550 __iomem *)0xf40003f8; 160 udbg_comport = (volatile struct NS16550 __iomem *)0xf40003f8;
161 161