diff options
author | Olof Johansson <olof@lixom.net> | 2007-02-04 17:36:49 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-02-06 22:03:22 -0500 |
commit | 39c870d5b503fa684198baf90bab2daa35ef0151 (patch) | |
tree | 0afdc842f7714cf47892512bb93ae5453bb6c34d | |
parent | a1fdf6940a2a3d3c7475755eba5881403473252d (diff) |
[POWERPC] pasemi: UART udbg support
Early debug output for PA Semi UART. Uses the 2.05 CI real mode ops.
Signed-off-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r-- | arch/powerpc/Kconfig.debug | 7 | ||||
-rw-r--r-- | arch/powerpc/kernel/misc_64.S | 40 | ||||
-rw-r--r-- | arch/powerpc/kernel/udbg.c | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/udbg_16550.c | 24 | ||||
-rw-r--r-- | include/asm-powerpc/udbg.h | 1 |
5 files changed, 74 insertions, 0 deletions
diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 2bbeb1b19950..d39d13327e6d 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug | |||
@@ -185,6 +185,13 @@ config PPC_EARLY_DEBUG_ISERIES | |||
185 | Select this to enable early debugging for legacy iSeries. You need | 185 | Select this to enable early debugging for legacy iSeries. You need |
186 | to hit "Ctrl-x Ctrl-x" to see the messages on the console. | 186 | to hit "Ctrl-x Ctrl-x" to see the messages on the console. |
187 | 187 | ||
188 | config PPC_EARLY_DEBUG_PAS_REALMODE | ||
189 | bool "PA Semi real mode" | ||
190 | depends on PPC_PASEMI | ||
191 | help | ||
192 | Select this to enable early debugging for PA Semi. | ||
193 | Output will be on UART0. | ||
194 | |||
188 | config PPC_EARLY_DEBUG_BEAT | 195 | config PPC_EARLY_DEBUG_BEAT |
189 | bool "Beat HV Console" | 196 | bool "Beat HV Console" |
190 | depends on PPC_CELLEB | 197 | depends on PPC_CELLEB |
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index 21fd2c662a99..519861da0423 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
@@ -311,6 +311,46 @@ _GLOBAL(real_writeb) | |||
311 | blr | 311 | blr |
312 | #endif /* defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) */ | 312 | #endif /* defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) */ |
313 | 313 | ||
314 | #ifdef CONFIG_PPC_PASEMI | ||
315 | |||
316 | /* No support in all binutils for these yet, so use defines */ | ||
317 | #define LBZCIX(RT,RA,RB) .long (0x7c0006aa|(RT<<21)|(RA<<16)|(RB << 11)) | ||
318 | #define STBCIX(RS,RA,RB) .long (0x7c0007aa|(RS<<21)|(RA<<16)|(RB << 11)) | ||
319 | |||
320 | |||
321 | _GLOBAL(real_205_readb) | ||
322 | mfmsr r7 | ||
323 | ori r0,r7,MSR_DR | ||
324 | xori r0,r0,MSR_DR | ||
325 | sync | ||
326 | mtmsrd r0 | ||
327 | sync | ||
328 | isync | ||
329 | LBZCIX(r3,0,r3) | ||
330 | isync | ||
331 | mtmsrd r7 | ||
332 | sync | ||
333 | isync | ||
334 | blr | ||
335 | |||
336 | _GLOBAL(real_205_writeb) | ||
337 | mfmsr r7 | ||
338 | ori r0,r7,MSR_DR | ||
339 | xori r0,r0,MSR_DR | ||
340 | sync | ||
341 | mtmsrd r0 | ||
342 | sync | ||
343 | isync | ||
344 | STBCIX(r3,0,r4) | ||
345 | isync | ||
346 | mtmsrd r7 | ||
347 | sync | ||
348 | isync | ||
349 | blr | ||
350 | |||
351 | #endif /* CONFIG_PPC_PASEMI */ | ||
352 | |||
353 | |||
314 | #ifdef CONFIG_CPU_FREQ_PMAC64 | 354 | #ifdef CONFIG_CPU_FREQ_PMAC64 |
315 | /* | 355 | /* |
316 | * SCOM access functions for 970 (FX only for now) | 356 | * SCOM access functions for 970 (FX only for now) |
diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c index e225a761dc2a..8f5afdbad0d5 100644 --- a/arch/powerpc/kernel/udbg.c +++ b/arch/powerpc/kernel/udbg.c | |||
@@ -47,6 +47,8 @@ void __init udbg_early_init(void) | |||
47 | udbg_init_iseries(); | 47 | udbg_init_iseries(); |
48 | #elif defined(CONFIG_PPC_EARLY_DEBUG_BEAT) | 48 | #elif defined(CONFIG_PPC_EARLY_DEBUG_BEAT) |
49 | udbg_init_debug_beat(); | 49 | udbg_init_debug_beat(); |
50 | #elif defined(CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE) | ||
51 | udbg_init_pas_realmode(); | ||
50 | #endif | 52 | #endif |
51 | } | 53 | } |
52 | 54 | ||
diff --git a/arch/powerpc/kernel/udbg_16550.c b/arch/powerpc/kernel/udbg_16550.c index 2d17f2b8eda7..e738f93b42fe 100644 --- a/arch/powerpc/kernel/udbg_16550.c +++ b/arch/powerpc/kernel/udbg_16550.c | |||
@@ -14,6 +14,8 @@ | |||
14 | 14 | ||
15 | extern u8 real_readb(volatile u8 __iomem *addr); | 15 | extern u8 real_readb(volatile u8 __iomem *addr); |
16 | extern void real_writeb(u8 data, volatile u8 __iomem *addr); | 16 | extern void real_writeb(u8 data, volatile u8 __iomem *addr); |
17 | extern u8 real_205_readb(volatile u8 __iomem *addr); | ||
18 | extern void real_205_writeb(u8 data, volatile u8 __iomem *addr); | ||
17 | 19 | ||
18 | struct NS16550 { | 20 | struct NS16550 { |
19 | /* this struct must be packed */ | 21 | /* this struct must be packed */ |
@@ -167,3 +169,25 @@ void __init udbg_init_maple_realmode(void) | |||
167 | udbg_getc_poll = NULL; | 169 | udbg_getc_poll = NULL; |
168 | } | 170 | } |
169 | #endif /* CONFIG_PPC_MAPLE */ | 171 | #endif /* CONFIG_PPC_MAPLE */ |
172 | |||
173 | #ifdef CONFIG_PPC_PASEMI | ||
174 | void udbg_pas_real_putc(char c) | ||
175 | { | ||
176 | if (udbg_comport) { | ||
177 | while ((real_205_readb(&udbg_comport->lsr) & LSR_THRE) == 0) | ||
178 | /* wait for idle */; | ||
179 | real_205_writeb(c, &udbg_comport->thr); eieio(); | ||
180 | if (c == '\n') | ||
181 | udbg_pas_real_putc('\r'); | ||
182 | } | ||
183 | } | ||
184 | |||
185 | void udbg_init_pas_realmode(void) | ||
186 | { | ||
187 | udbg_comport = (volatile struct NS16550 __iomem *)0xfcff03f8; | ||
188 | |||
189 | udbg_putc = udbg_pas_real_putc; | ||
190 | udbg_getc = NULL; | ||
191 | udbg_getc_poll = NULL; | ||
192 | } | ||
193 | #endif /* CONFIG_PPC_MAPLE */ | ||
diff --git a/include/asm-powerpc/udbg.h b/include/asm-powerpc/udbg.h index ce67e6cfc7ec..4cbc313aa02a 100644 --- a/include/asm-powerpc/udbg.h +++ b/include/asm-powerpc/udbg.h | |||
@@ -41,6 +41,7 @@ extern void __init udbg_early_init(void); | |||
41 | extern void __init udbg_init_debug_lpar(void); | 41 | extern void __init udbg_init_debug_lpar(void); |
42 | extern void __init udbg_init_pmac_realmode(void); | 42 | extern void __init udbg_init_pmac_realmode(void); |
43 | extern void __init udbg_init_maple_realmode(void); | 43 | extern void __init udbg_init_maple_realmode(void); |
44 | extern void __init udbg_init_pas_realmode(void); | ||
44 | extern void __init udbg_init_iseries(void); | 45 | extern void __init udbg_init_iseries(void); |
45 | extern void __init udbg_init_rtas_panel(void); | 46 | extern void __init udbg_init_rtas_panel(void); |
46 | extern void __init udbg_init_rtas_console(void); | 47 | extern void __init udbg_init_rtas_console(void); |