diff options
| author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2007-12-20 23:39:26 -0500 |
|---|---|---|
| committer | Josh Boyer <jwboyer@linux.vnet.ibm.com> | 2007-12-23 14:13:03 -0500 |
| commit | 9dae8afdf212d39bc7c25f1b1ca9b10f10f6beaa (patch) | |
| tree | 12721945adf3a3fc01ba292e1756af4826a7eed3 /arch/powerpc/kernel | |
| parent | 69c0785112921a43739495a68f459fde88a9bbd8 (diff) | |
[POWERPC] 4xx: Add early udbg support for 40x processors
This adds some basic real mode based early udbg support for 40x
in order to debug things more easily
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
Diffstat (limited to 'arch/powerpc/kernel')
| -rw-r--r-- | arch/powerpc/kernel/misc_32.S | 39 | ||||
| -rw-r--r-- | arch/powerpc/kernel/udbg.c | 3 | ||||
| -rw-r--r-- | arch/powerpc/kernel/udbg_16550.c | 33 |
3 files changed, 75 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index ea1137851a4a..be09f0d2d90b 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
| @@ -206,6 +206,45 @@ _GLOBAL(_nmask_and_or_msr) | |||
| 206 | isync | 206 | isync |
| 207 | blr /* Done */ | 207 | blr /* Done */ |
| 208 | 208 | ||
| 209 | #ifdef CONFIG_40x | ||
| 210 | |||
| 211 | /* | ||
| 212 | * Do an IO access in real mode | ||
| 213 | */ | ||
| 214 | _GLOBAL(real_readb) | ||
| 215 | mfmsr r7 | ||
| 216 | ori r0,r7,MSR_DR | ||
| 217 | xori r0,r0,MSR_DR | ||
| 218 | sync | ||
| 219 | mtmsr r0 | ||
| 220 | sync | ||
| 221 | isync | ||
| 222 | lbz r3,0(r3) | ||
| 223 | sync | ||
| 224 | mtmsr r7 | ||
| 225 | sync | ||
| 226 | isync | ||
| 227 | blr | ||
| 228 | |||
| 229 | /* | ||
| 230 | * Do an IO access in real mode | ||
| 231 | */ | ||
| 232 | _GLOBAL(real_writeb) | ||
| 233 | mfmsr r7 | ||
| 234 | ori r0,r7,MSR_DR | ||
| 235 | xori r0,r0,MSR_DR | ||
| 236 | sync | ||
| 237 | mtmsr r0 | ||
| 238 | sync | ||
| 239 | isync | ||
| 240 | stb r3,0(r4) | ||
| 241 | sync | ||
| 242 | mtmsr r7 | ||
| 243 | sync | ||
| 244 | isync | ||
| 245 | blr | ||
| 246 | |||
| 247 | #endif /* CONFIG_40x */ | ||
| 209 | 248 | ||
| 210 | /* | 249 | /* |
| 211 | * Flush MMU TLB | 250 | * Flush MMU TLB |
diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c index eba148f2a31c..7aad6203e411 100644 --- a/arch/powerpc/kernel/udbg.c +++ b/arch/powerpc/kernel/udbg.c | |||
| @@ -54,6 +54,9 @@ void __init udbg_early_init(void) | |||
| 54 | #elif defined(CONFIG_PPC_EARLY_DEBUG_44x) | 54 | #elif defined(CONFIG_PPC_EARLY_DEBUG_44x) |
| 55 | /* PPC44x debug */ | 55 | /* PPC44x debug */ |
| 56 | udbg_init_44x_as1(); | 56 | udbg_init_44x_as1(); |
| 57 | #elif defined(CONFIG_PPC_EARLY_DEBUG_40x) | ||
| 58 | /* PPC40x debug */ | ||
| 59 | udbg_init_40x_realmode(); | ||
| 57 | #elif defined(CONFIG_PPC_EARLY_DEBUG_CPM) | 60 | #elif defined(CONFIG_PPC_EARLY_DEBUG_CPM) |
| 58 | udbg_init_cpm(); | 61 | udbg_init_cpm(); |
| 59 | #endif | 62 | #endif |
diff --git a/arch/powerpc/kernel/udbg_16550.c b/arch/powerpc/kernel/udbg_16550.c index df740eae77b8..cb01ebc59387 100644 --- a/arch/powerpc/kernel/udbg_16550.c +++ b/arch/powerpc/kernel/udbg_16550.c | |||
| @@ -225,3 +225,36 @@ void __init udbg_init_44x_as1(void) | |||
| 225 | udbg_getc = udbg_44x_as1_getc; | 225 | udbg_getc = udbg_44x_as1_getc; |
| 226 | } | 226 | } |
| 227 | #endif /* CONFIG_PPC_EARLY_DEBUG_44x */ | 227 | #endif /* CONFIG_PPC_EARLY_DEBUG_44x */ |
| 228 | |||
| 229 | #ifdef CONFIG_PPC_EARLY_DEBUG_40x | ||
| 230 | static void udbg_40x_real_putc(char c) | ||
| 231 | { | ||
| 232 | if (udbg_comport) { | ||
| 233 | while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0) | ||
| 234 | /* wait for idle */; | ||
| 235 | real_writeb(c, &udbg_comport->thr); eieio(); | ||
| 236 | if (c == '\n') | ||
| 237 | udbg_40x_real_putc('\r'); | ||
| 238 | } | ||
| 239 | } | ||
| 240 | |||
| 241 | static int udbg_40x_real_getc(void) | ||
| 242 | { | ||
| 243 | if (udbg_comport) { | ||
| 244 | while ((real_readb(&udbg_comport->lsr) & LSR_DR) == 0) | ||
| 245 | ; /* wait for char */ | ||
| 246 | return real_readb(&udbg_comport->rbr); | ||
| 247 | } | ||
| 248 | return -1; | ||
| 249 | } | ||
| 250 | |||
| 251 | void __init udbg_init_40x_realmode(void) | ||
| 252 | { | ||
| 253 | udbg_comport = (struct NS16550 __iomem *) | ||
| 254 | CONFIG_PPC_EARLY_DEBUG_40x_PHYSADDR; | ||
| 255 | |||
| 256 | udbg_putc = udbg_40x_real_putc; | ||
| 257 | udbg_getc = udbg_40x_real_getc; | ||
| 258 | udbg_getc_poll = NULL; | ||
| 259 | } | ||
| 260 | #endif /* CONFIG_PPC_EARLY_DEBUG_40x */ | ||
