diff options
author | Michael Ellerman <michael@ellerman.id.au> | 2006-01-10 19:54:09 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2006-01-10 22:48:26 -0500 |
commit | 296167ae1799815b9ed2d135a847436502f2ee91 (patch) | |
tree | 5e9496d0a60e10a021c12117ec6bc8d513f39463 | |
parent | bf6a7112bda99aadd6675526423a96be6b356a3d (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.debug | 42 | ||||
-rw-r--r-- | arch/powerpc/kernel/rtas.c | 12 | ||||
-rw-r--r-- | arch/powerpc/kernel/setup_64.c | 38 | ||||
-rw-r--r-- | arch/powerpc/kernel/udbg.c | 25 | ||||
-rw-r--r-- | arch/powerpc/kernel/udbg_16550.c | 2 | ||||
-rw-r--r-- | arch/powerpc/platforms/powermac/udbg_scc.c | 2 | ||||
-rw-r--r-- | include/asm-powerpc/rtas.h | 1 | ||||
-rw-r--r-- | include/asm-powerpc/udbg.h | 9 |
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 | ||
118 | choice | ||
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 | |||
126 | config 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 | |||
133 | config 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 | |||
139 | config 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 | |||
145 | config 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 | |||
151 | config 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 | |||
158 | endchoice | ||
159 | |||
118 | endmenu | 160 | endmenu |
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 | ||
33 | struct rtas_t rtas = { | 34 | struct 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 | */ |
55 | void call_rtas_display_status(unsigned char c) | 56 | static 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 | ||
75 | void call_rtas_display_status_delay(unsigned char c) | 76 | static 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 | ||
100 | void __init udbg_init_rtas(void) | ||
101 | { | ||
102 | udbg_putc = call_rtas_display_status_delay; | ||
103 | } | ||
104 | |||
99 | void rtas_progress(char *s, unsigned short hex) | 105 | void 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 */ | ||
79 | extern void udbg_init_debug_lpar(void); | ||
80 | |||
81 | /* This one is for use on Apple G5 machines */ | ||
82 | extern void udbg_init_pmac_realmode(void); | ||
83 | |||
84 | /* That's RTAS panel debug */ | ||
85 | extern void call_rtas_display_status_delay(unsigned char c); | ||
86 | |||
87 | /* Here's maple real mode debug */ | ||
88 | extern void udbg_init_maple_realmode(void); | ||
89 | |||
90 | /* For iSeries - hit Ctrl-x Ctrl-x to see the output */ | ||
91 | extern 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 | |||
104 | int have_of = 1; | 73 | int have_of = 1; |
105 | int boot_cpuid = 0; | 74 | int boot_cpuid = 0; |
106 | int boot_cpuid_phys = 0; | 75 | int 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 | ||
19 | void (*udbg_putc)(char c); | 20 | void (*udbg_putc)(char c); |
20 | int (*udbg_getc)(void); | 21 | int (*udbg_getc)(void); |
21 | int (*udbg_getc_poll)(void); | 22 | int (*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 | */ | ||
28 | void __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 */ |
24 | void udbg_puts(const char *s) | 49 | void 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 | ||
158 | void udbg_init_maple_realmode(void) | 158 | void __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 | ||
156 | void udbg_init_pmac_realmode(void) | 156 | void __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; | |||
161 | extern void enter_rtas(unsigned long); | 161 | extern void enter_rtas(unsigned long); |
162 | extern int rtas_token(const char *service); | 162 | extern int rtas_token(const char *service); |
163 | extern int rtas_call(int token, int, int, int *, ...); | 163 | extern int rtas_call(int token, int, int, int *, ...); |
164 | extern void call_rtas_display_status(unsigned char); | ||
165 | extern void rtas_restart(char *cmd); | 164 | extern void rtas_restart(char *cmd); |
166 | extern void rtas_power_off(void); | 165 | extern void rtas_power_off(void); |
167 | extern void rtas_halt(void); | 166 | extern 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); | |||
36 | extern int udbg_adb_init(int force_btext); | 36 | extern int udbg_adb_init(int force_btext); |
37 | extern void udbg_adb_init_early(void); | 37 | extern void udbg_adb_init_early(void); |
38 | 38 | ||
39 | extern void __init udbg_early_init(void); | ||
40 | extern void __init udbg_init_debug_lpar(void); | ||
41 | extern void __init udbg_init_pmac_realmode(void); | ||
42 | extern void __init udbg_init_maple_realmode(void); | ||
43 | extern void __init udbg_init_iseries(void); | ||
44 | extern 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 */ |