[POWERPC] pasemi: UART udbg support
authorOlof Johansson <olof@lixom.net>
Sun, 4 Feb 2007 22:36:49 +0000 (16:36 -0600)
committerPaul Mackerras <paulus@samba.org>
Wed, 7 Feb 2007 03:03:22 +0000 (14:03 +1100)
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>
arch/powerpc/Kconfig.debug
arch/powerpc/kernel/misc_64.S
arch/powerpc/kernel/udbg.c
arch/powerpc/kernel/udbg_16550.c
include/asm-powerpc/udbg.h

index 2bbeb1b199501907159238d2b1b609dc4d244421..d39d13327e6d928aee8370797827c342698446e8 100644 (file)
@@ -185,6 +185,13 @@ config PPC_EARLY_DEBUG_ISERIES
          Select this to enable early debugging for legacy iSeries. You need
          to hit "Ctrl-x Ctrl-x" to see the messages on the console.
 
+config PPC_EARLY_DEBUG_PAS_REALMODE
+       bool "PA Semi real mode"
+       depends on PPC_PASEMI
+       help
+         Select this to enable early debugging for PA Semi.
+         Output will be on UART0.
+
 config PPC_EARLY_DEBUG_BEAT
        bool "Beat HV Console"
        depends on PPC_CELLEB
index 21fd2c662a9913cc9ef8f3d0efe421c4907b8929..519861da04235c2fc3a3ba13c9326f02a5af629f 100644 (file)
@@ -311,6 +311,46 @@ _GLOBAL(real_writeb)
        blr
 #endif /* defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) */
 
+#ifdef CONFIG_PPC_PASEMI
+
+/* No support in all binutils for these yet, so use defines */
+#define LBZCIX(RT,RA,RB)  .long (0x7c0006aa|(RT<<21)|(RA<<16)|(RB << 11))
+#define STBCIX(RS,RA,RB)  .long (0x7c0007aa|(RS<<21)|(RA<<16)|(RB << 11))
+
+
+_GLOBAL(real_205_readb)
+       mfmsr   r7
+       ori     r0,r7,MSR_DR
+       xori    r0,r0,MSR_DR
+       sync
+       mtmsrd  r0
+       sync
+       isync
+       LBZCIX(r3,0,r3)
+       isync
+       mtmsrd  r7
+       sync
+       isync
+       blr
+
+_GLOBAL(real_205_writeb)
+       mfmsr   r7
+       ori     r0,r7,MSR_DR
+       xori    r0,r0,MSR_DR
+       sync
+       mtmsrd  r0
+       sync
+       isync
+       STBCIX(r3,0,r4)
+       isync
+       mtmsrd  r7
+       sync
+       isync
+       blr
+
+#endif /* CONFIG_PPC_PASEMI */
+
+
 #ifdef CONFIG_CPU_FREQ_PMAC64
 /*
  * SCOM access functions for 970 (FX only for now)
index e225a761dc2a8f23f3b7b943010177d461f84530..8f5afdbad0d5cd5b70232a36236816e1b7b0a432 100644 (file)
@@ -47,6 +47,8 @@ void __init udbg_early_init(void)
        udbg_init_iseries();
 #elif defined(CONFIG_PPC_EARLY_DEBUG_BEAT)
        udbg_init_debug_beat();
+#elif defined(CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE)
+       udbg_init_pas_realmode();
 #endif
 }
 
index 2d17f2b8eda73323444208ed4744c0f04104e6e8..e738f93b42fe34e7e7ce745ba3365bb92424520e 100644 (file)
@@ -14,6 +14,8 @@
 
 extern u8 real_readb(volatile u8 __iomem  *addr);
 extern void real_writeb(u8 data, volatile u8 __iomem *addr);
+extern u8 real_205_readb(volatile u8 __iomem  *addr);
+extern void real_205_writeb(u8 data, volatile u8 __iomem *addr);
 
 struct NS16550 {
        /* this struct must be packed */
@@ -167,3 +169,25 @@ void __init udbg_init_maple_realmode(void)
        udbg_getc_poll = NULL;
 }
 #endif /* CONFIG_PPC_MAPLE */
+
+#ifdef CONFIG_PPC_PASEMI
+void udbg_pas_real_putc(char c)
+{
+       if (udbg_comport) {
+               while ((real_205_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
+                       /* wait for idle */;
+               real_205_writeb(c, &udbg_comport->thr); eieio();
+               if (c == '\n')
+                       udbg_pas_real_putc('\r');
+       }
+}
+
+void udbg_init_pas_realmode(void)
+{
+       udbg_comport = (volatile struct NS16550 __iomem *)0xfcff03f8;
+
+       udbg_putc = udbg_pas_real_putc;
+       udbg_getc = NULL;
+       udbg_getc_poll = NULL;
+}
+#endif /* CONFIG_PPC_MAPLE */
index ce67e6cfc7ece9492ac882706effbe4cfafa1768..4cbc313aa02a10dedf3d0ae0503504bba8b37860 100644 (file)
@@ -41,6 +41,7 @@ extern void __init udbg_early_init(void);
 extern void __init udbg_init_debug_lpar(void);
 extern void __init udbg_init_pmac_realmode(void);
 extern void __init udbg_init_maple_realmode(void);
+extern void __init udbg_init_pas_realmode(void);
 extern void __init udbg_init_iseries(void);
 extern void __init udbg_init_rtas_panel(void);
 extern void __init udbg_init_rtas_console(void);