aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--arch/powerpc/Kconfig.debug42
-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
-rw-r--r--arch/powerpc/platforms/powermac/udbg_scc.c2
-rw-r--r--include/asm-powerpc/rtas.h1
-rw-r--r--include/asm-powerpc/udbg.h9
8 files changed, 88 insertions, 43 deletions
diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug
index 30a30bf559ea..9254806f7032 100644
--- a/arch/powerpc/Kconfig.debug
+++ b/arch/powerpc/Kconfig.debug
@@ -115,4 +115,46 @@ config PPC_OCP
115 depends on IBM_OCP || XILINX_OCP 115 depends on IBM_OCP || XILINX_OCP
116 default y 116 default y
117 117
118choice
119 prompt "Early debugging (dangerous)"
120 bool
121 optional
122 help
123 Enable early debugging. Careful, if you enable debugging for the
124 wrong type of machine your kernel _will not boot_.
125
126config PPC_EARLY_DEBUG_LPAR
127 bool "LPAR HV Console"
128 depends on PPC_PSERIES
129 help
130 Select this to enable early debugging for a machine with a HVC
131 console on vterm 0.
132
133config PPC_EARLY_DEBUG_G5
134 bool "Apple G5"
135 depends on PPC_PMAC64
136 help
137 Select this to enable early debugging for Apple G5 machines.
138
139config PPC_EARLY_DEBUG_RTAS
140 bool "RTAS Panel"
141 depends on PPC_RTAS
142 help
143 Select this to enable early debugging via the RTAS panel.
144
145config PPC_EARLY_DEBUG_MAPLE
146 bool "Maple real mode"
147 depends on PPC_MAPLE
148 help
149 Select this to enable early debugging for Maple.
150
151config PPC_EARLY_DEBUG_ISERIES
152 bool "iSeries HV Console"
153 depends on PPC_ISERIES
154 help
155 Select this to enable early debugging for legacy iSeries. You need
156 to hit "Ctrl-x Ctrl-x" to see the messages on the console.
157
158endchoice
159
118endmenu 160endmenu
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
diff --git a/arch/powerpc/platforms/powermac/udbg_scc.c b/arch/powerpc/platforms/powermac/udbg_scc.c
index e87d53acfb61..c4352a8db644 100644
--- a/arch/powerpc/platforms/powermac/udbg_scc.c
+++ b/arch/powerpc/platforms/powermac/udbg_scc.c
@@ -153,7 +153,7 @@ static void udbg_real_scc_putc(char c)
153 udbg_real_scc_putc('\r'); 153 udbg_real_scc_putc('\r');
154} 154}
155 155
156void udbg_init_pmac_realmode(void) 156void __init udbg_init_pmac_realmode(void)
157{ 157{
158 sccc = (volatile u8 __iomem *)0x80013020ul; 158 sccc = (volatile u8 __iomem *)0x80013020ul;
159 sccd = (volatile u8 __iomem *)0x80013030ul; 159 sccd = (volatile u8 __iomem *)0x80013030ul;
diff --git a/include/asm-powerpc/rtas.h b/include/asm-powerpc/rtas.h
index 3428889e27b7..f43c6835e62a 100644
--- a/include/asm-powerpc/rtas.h
+++ b/include/asm-powerpc/rtas.h
@@ -161,7 +161,6 @@ extern struct rtas_t rtas;
161extern void enter_rtas(unsigned long); 161extern void enter_rtas(unsigned long);
162extern int rtas_token(const char *service); 162extern int rtas_token(const char *service);
163extern int rtas_call(int token, int, int, int *, ...); 163extern int rtas_call(int token, int, int, int *, ...);
164extern void call_rtas_display_status(unsigned char);
165extern void rtas_restart(char *cmd); 164extern void rtas_restart(char *cmd);
166extern void rtas_power_off(void); 165extern void rtas_power_off(void);
167extern void rtas_halt(void); 166extern void rtas_halt(void);
diff --git a/include/asm-powerpc/udbg.h b/include/asm-powerpc/udbg.h
index 479f2d8ff74a..5c4236c342bb 100644
--- a/include/asm-powerpc/udbg.h
+++ b/include/asm-powerpc/udbg.h
@@ -1,5 +1,5 @@
1/* 1/*
2 * c 2001 PPC 64 Team, IBM Corp 2 * (c) 2001, 2006 IBM Corporation.
3 * 3 *
4 * This program is free software; you can redistribute it and/or 4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License 5 * modify it under the terms of the GNU General Public License
@@ -36,5 +36,12 @@ extern void udbg_scc_init(int force_scc);
36extern int udbg_adb_init(int force_btext); 36extern int udbg_adb_init(int force_btext);
37extern void udbg_adb_init_early(void); 37extern void udbg_adb_init_early(void);
38 38
39extern void __init udbg_early_init(void);
40extern void __init udbg_init_debug_lpar(void);
41extern void __init udbg_init_pmac_realmode(void);
42extern void __init udbg_init_maple_realmode(void);
43extern void __init udbg_init_iseries(void);
44extern void __init udbg_init_rtas(void);
45
39#endif /* __KERNEL__ */ 46#endif /* __KERNEL__ */
40#endif /* _ASM_POWERPC_UDBG_H */ 47#endif /* _ASM_POWERPC_UDBG_H */