[PATCH 12/14] powerpc: 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 <[EMAIL PROTECTED]> --- arch/powerpc/Kconfig.debug | 12 ++ arch/powerpc/kernel/misc_32.S | 39 + arch/powerpc/kernel/udbg.c |3 ++ arch/powerpc/kernel/udbg_16550.c | 33 +++ arch/powerpc/platforms/Kconfig.cputype |1 include/asm-powerpc/udbg.h |1 6 files changed, 89 insertions(+) Index: linux-work/arch/powerpc/Kconfig.debug === --- linux-work.orig/arch/powerpc/Kconfig.debug 2007-11-21 12:44:03.0 +1100 +++ linux-work/arch/powerpc/Kconfig.debug 2007-11-21 12:47:58.0 +1100 @@ -220,6 +220,13 @@ config PPC_EARLY_DEBUG_44x Select this to enable early debugging for IBM 44x chips via the inbuilt serial port. +config PPC_EARLY_DEBUG_40x + bool "Early serial debugging for IBM/AMCC 40x CPUs" + depends on 40x + help + Select this to enable early debugging for IBM 40x chips via the + inbuilt serial port. + config PPC_EARLY_DEBUG_CPM bool "Early serial debugging for Freescale CPM-based serial ports" depends on SERIAL_CPM @@ -241,6 +248,11 @@ config PPC_EARLY_DEBUG_44x_PHYSHIGH depends on PPC_EARLY_DEBUG_44x default "0x1" +config PPC_EARLY_DEBUG_40x_PHYSADDR + hex "Early debug UART physical address" + depends on PPC_EARLY_DEBUG_40x + default "0xef600300" + config PPC_EARLY_DEBUG_CPM_ADDR hex "CPM UART early debug transmit descriptor address" depends on PPC_EARLY_DEBUG_CPM Index: linux-work/arch/powerpc/kernel/misc_32.S === --- linux-work.orig/arch/powerpc/kernel/misc_32.S 2007-11-21 12:40:26.0 +1100 +++ linux-work/arch/powerpc/kernel/misc_32.S2007-11-21 12:41:43.0 +1100 @@ -206,6 +206,45 @@ _GLOBAL(_nmask_and_or_msr) isync blr /* Done */ +#ifdef CONFIG_40x + +/* + * Do an IO access in real mode + */ +_GLOBAL(real_readb) + mfmsr r7 + ori r0,r7,MSR_DR + xorir0,r0,MSR_DR + sync + mtmsr r0 + sync + isync + lbz r3,0(r3) + sync + mtmsr r7 + sync + isync + blr + + /* + * Do an IO access in real mode + */ +_GLOBAL(real_writeb) + mfmsr r7 + ori r0,r7,MSR_DR + xorir0,r0,MSR_DR + sync + mtmsr r0 + sync + isync + stb r3,0(r4) + sync + mtmsr r7 + sync + isync + blr + +#endif /* CONFIG_40x */ /* * Flush MMU TLB Index: linux-work/arch/powerpc/kernel/udbg.c === --- linux-work.orig/arch/powerpc/kernel/udbg.c 2007-11-21 12:38:11.0 +1100 +++ linux-work/arch/powerpc/kernel/udbg.c 2007-11-21 12:44:50.0 +1100 @@ -54,6 +54,9 @@ void __init udbg_early_init(void) #elif defined(CONFIG_PPC_EARLY_DEBUG_44x) /* PPC44x debug */ udbg_init_44x_as1(); +#elif defined(CONFIG_PPC_EARLY_DEBUG_40x) + /* PPC40x debug */ + udbg_init_40x_realmode(); #elif defined(CONFIG_PPC_EARLY_DEBUG_CPM) udbg_init_cpm(); #endif Index: linux-work/arch/powerpc/kernel/udbg_16550.c === --- linux-work.orig/arch/powerpc/kernel/udbg_16550.c2007-11-21 12:42:24.0 +1100 +++ linux-work/arch/powerpc/kernel/udbg_16550.c 2007-11-21 12:50:40.0 +1100 @@ -225,3 +225,36 @@ void __init udbg_init_44x_as1(void) udbg_getc = udbg_44x_as1_getc; } #endif /* CONFIG_PPC_EARLY_DEBUG_44x */ + +#ifdef CONFIG_PPC_EARLY_DEBUG_40x +static void udbg_40x_real_putc(char c) +{ + if (udbg_comport) { + while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0) + /* wait for idle */; + real_writeb(c, &udbg_comport->thr); eieio(); + if (c == '\n') + udbg_40x_real_putc('\r'); + } +} + +static int udbg_40x_real_getc(void) +{ + if (udbg_comport) { + while ((real_readb(&udbg_comport->lsr) & LSR_DR) == 0) + ; /* wait for char */ + return real_readb(&udbg_comport->rbr); + } + return -1; +} + +void __init udbg_init_40x_realmode(void) +{ + udbg_comport = (volatile struct NS16550 __iomem *) + CONFIG_PPC_EARLY_DEBUG_40x_PHYSADDR; + + udbg_putc = udbg_40x_real_putc; + udbg_getc = udbg_40x_real_getc; + udbg_getc_poll = NULL; +} +#endif /* CONFIG_PPC_EARLY_DEBUG_40x */ Index: linux-work/include/asm-powerpc/udbg.h === --- linux-work.ori
[RFC/PATCH 12/14] powerpc: 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 <[EMAIL PROTECTED]> --- arch/powerpc/Kconfig.debug | 12 ++ arch/powerpc/kernel/misc_32.S | 39 + arch/powerpc/kernel/udbg.c |3 ++ arch/powerpc/kernel/udbg_16550.c | 33 +++ arch/powerpc/platforms/Kconfig.cputype |1 include/asm-powerpc/udbg.h |1 6 files changed, 89 insertions(+) Index: linux-work/arch/powerpc/Kconfig.debug === --- linux-work.orig/arch/powerpc/Kconfig.debug 2007-11-21 12:44:03.0 +1100 +++ linux-work/arch/powerpc/Kconfig.debug 2007-11-21 12:47:58.0 +1100 @@ -220,6 +220,13 @@ config PPC_EARLY_DEBUG_44x Select this to enable early debugging for IBM 44x chips via the inbuilt serial port. +config PPC_EARLY_DEBUG_40x + bool "Early serial debugging for IBM/AMCC 40x CPUs" + depends on 40x + help + Select this to enable early debugging for IBM 40x chips via the + inbuilt serial port. + config PPC_EARLY_DEBUG_CPM bool "Early serial debugging for Freescale CPM-based serial ports" depends on SERIAL_CPM @@ -241,6 +248,11 @@ config PPC_EARLY_DEBUG_44x_PHYSHIGH depends on PPC_EARLY_DEBUG_44x default "0x1" +config PPC_EARLY_DEBUG_40x_PHYSADDR + hex "Early debug UART physical address" + depends on PPC_EARLY_DEBUG_40x + default "0xef600300" + config PPC_EARLY_DEBUG_CPM_ADDR hex "CPM UART early debug transmit descriptor address" depends on PPC_EARLY_DEBUG_CPM Index: linux-work/arch/powerpc/kernel/misc_32.S === --- linux-work.orig/arch/powerpc/kernel/misc_32.S 2007-11-21 12:40:26.0 +1100 +++ linux-work/arch/powerpc/kernel/misc_32.S2007-11-21 12:41:43.0 +1100 @@ -206,6 +206,45 @@ _GLOBAL(_nmask_and_or_msr) isync blr /* Done */ +#ifdef CONFIG_40x + +/* + * Do an IO access in real mode + */ +_GLOBAL(real_readb) + mfmsr r7 + ori r0,r7,MSR_DR + xorir0,r0,MSR_DR + sync + mtmsr r0 + sync + isync + lbz r3,0(r3) + sync + mtmsr r7 + sync + isync + blr + + /* + * Do an IO access in real mode + */ +_GLOBAL(real_writeb) + mfmsr r7 + ori r0,r7,MSR_DR + xorir0,r0,MSR_DR + sync + mtmsr r0 + sync + isync + stb r3,0(r4) + sync + mtmsr r7 + sync + isync + blr + +#endif /* CONFIG_40x */ /* * Flush MMU TLB Index: linux-work/arch/powerpc/kernel/udbg.c === --- linux-work.orig/arch/powerpc/kernel/udbg.c 2007-11-21 12:38:11.0 +1100 +++ linux-work/arch/powerpc/kernel/udbg.c 2007-11-21 12:44:50.0 +1100 @@ -54,6 +54,9 @@ void __init udbg_early_init(void) #elif defined(CONFIG_PPC_EARLY_DEBUG_44x) /* PPC44x debug */ udbg_init_44x_as1(); +#elif defined(CONFIG_PPC_EARLY_DEBUG_40x) + /* PPC40x debug */ + udbg_init_40x_realmode(); #elif defined(CONFIG_PPC_EARLY_DEBUG_CPM) udbg_init_cpm(); #endif Index: linux-work/arch/powerpc/kernel/udbg_16550.c === --- linux-work.orig/arch/powerpc/kernel/udbg_16550.c2007-11-21 12:42:24.0 +1100 +++ linux-work/arch/powerpc/kernel/udbg_16550.c 2007-11-21 12:50:40.0 +1100 @@ -225,3 +225,36 @@ void __init udbg_init_44x_as1(void) udbg_getc = udbg_44x_as1_getc; } #endif /* CONFIG_PPC_EARLY_DEBUG_44x */ + +#ifdef CONFIG_PPC_EARLY_DEBUG_40x +static void udbg_40x_real_putc(char c) +{ + if (udbg_comport) { + while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0) + /* wait for idle */; + real_writeb(c, &udbg_comport->thr); eieio(); + if (c == '\n') + udbg_40x_real_putc('\r'); + } +} + +static int udbg_40x_real_getc(void) +{ + if (udbg_comport) { + while ((real_readb(&udbg_comport->lsr) & LSR_DR) == 0) + ; /* wait for char */ + return real_readb(&udbg_comport->rbr); + } + return -1; +} + +void __init udbg_init_40x_realmode(void) +{ + udbg_comport = (volatile struct NS16550 __iomem *) + CONFIG_PPC_EARLY_DEBUG_40x_PHYSADDR; + + udbg_putc = udbg_40x_real_putc; + udbg_getc = udbg_40x_real_getc; + udbg_getc_poll = NULL; +} +#endif /* CONFIG_PPC_EARLY_DEBUG_40x */ Index: linux-work/include/asm-powerpc/udbg.h === --- linux-work.ori
Re: [PATCH 12/14] powerpc: Add early udbg support for 40x processors
On 11/20/07, Benjamin Herrenschmidt <[EMAIL PROTECTED]> wrote: > This adds some basic real mode based early udbg support for 40x > in order to debug things more easily > > Signed-off-by: Benjamin Herrenschmidt <[EMAIL PROTECTED]> > --- > --- linux-work.orig/arch/powerpc/platforms/Kconfig.cputype 2007-11-21 > 12:50:16.0 +1100 > +++ linux-work/arch/powerpc/platforms/Kconfig.cputype 2007-11-21 > 12:50:18.0 +1100 > @@ -43,6 +43,7 @@ config 40x > bool "AMCC 40x" > select PPC_DCR_NATIVE > select WANT_DEVICE_TREE > + select PPC_UDBG_16550 Unfortunately, this isn't always true. The Xilinx Virtex parts us config 40x, but not all FPGA bitstreams have a 16550 serial port. Sometimes it's a uartlite instead. Cheers, g. -- Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. [EMAIL PROTECTED] (403) 399-0195 ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
Re: [PATCH 12/14] powerpc: Add early udbg support for 40x processors
On Wed, 2007-11-21 at 16:47 -0700, Grant Likely wrote: > On 11/20/07, Benjamin Herrenschmidt <[EMAIL PROTECTED]> wrote: > > This adds some basic real mode based early udbg support for 40x > > in order to debug things more easily > > > > Signed-off-by: Benjamin Herrenschmidt <[EMAIL PROTECTED]> > > --- > > --- linux-work.orig/arch/powerpc/platforms/Kconfig.cputype 2007-11-21 > > 12:50:16.0 +1100 > > +++ linux-work/arch/powerpc/platforms/Kconfig.cputype 2007-11-21 > > 12:50:18.0 +1100 > > @@ -43,6 +43,7 @@ config 40x > > bool "AMCC 40x" > > select PPC_DCR_NATIVE > > select WANT_DEVICE_TREE > > + select PPC_UDBG_16550 > > Unfortunately, this isn't always true. The Xilinx Virtex parts us > config 40x, but not all FPGA bitstreams have a 16550 serial port. > Sometimes it's a uartlite instead. What does uartlite looks like ? Ben. ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
Re: [PATCH 12/14] powerpc: Add early udbg support for 40x processors
On 11/21/07, Benjamin Herrenschmidt <[EMAIL PROTECTED]> wrote: > > On Wed, 2007-11-21 at 16:47 -0700, Grant Likely wrote: > > On 11/20/07, Benjamin Herrenschmidt <[EMAIL PROTECTED]> wrote: > > > This adds some basic real mode based early udbg support for 40x > > > in order to debug things more easily > > > > > > Signed-off-by: Benjamin Herrenschmidt <[EMAIL PROTECTED]> > > > --- > > > --- linux-work.orig/arch/powerpc/platforms/Kconfig.cputype > > > 2007-11-21 12:50:16.0 +1100 > > > +++ linux-work/arch/powerpc/platforms/Kconfig.cputype 2007-11-21 > > > 12:50:18.0 +1100 > > > @@ -43,6 +43,7 @@ config 40x > > > bool "AMCC 40x" > > > select PPC_DCR_NATIVE > > > select WANT_DEVICE_TREE > > > + select PPC_UDBG_16550 > > > > Unfortunately, this isn't always true. The Xilinx Virtex parts us > > config 40x, but not all FPGA bitstreams have a 16550 serial port. > > Sometimes it's a uartlite instead. > > What does uartlite looks like ? fixed speed 4 registers: rx, tx, status & control rx & tx are... well... rx and tx registers status has a number of bits reporting fifos full/empty etc. control has three bits; reset tx, reset rx and interrupt enable. See the top of drivers/serial/uartlite.c Very simple stuff; but definitely not 16550. g. -- Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. [EMAIL PROTECTED] (403) 399-0195 ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
Re: [PATCH 12/14] powerpc: Add early udbg support for 40x processors
> fixed speed > 4 registers: rx, tx, status & control > > rx & tx are... well... rx and tx registers > status has a number of bits reporting fifos full/empty etc. > control has three bits; reset tx, reset rx and interrupt enable. > > See the top of drivers/serial/uartlite.c > > Very simple stuff; but definitely not 16550. Yuck, they could have made it look like 16550 at least... Oh well, that's allright, select'ing it wont break anything anyway. Ultimately, we can if we want have a list of all support 40x (and 4xx) variants and select what we want in a given kernel build. Those variants would themselves select the individual bits they care about... Ben. ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
Re: [RFC/PATCH 12/14] powerpc: Add early udbg support for 40x processors
On Wed, Nov 21, 2007 at 05:16:30PM +1100, Benjamin Herrenschmidt wrote: > This adds some basic real mode based early udbg support for 40x > in order to debug things more easily Shouldn't we be able to share code with the Maple realmode udbg()? -- David Gibson| I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
Re: [RFC/PATCH 12/14] powerpc: Add early udbg support for 40x processors
On Thu, 2007-11-22 at 09:58 +1100, David Gibson wrote: > On Wed, Nov 21, 2007 at 05:16:30PM +1100, Benjamin Herrenschmidt wrote: > > This adds some basic real mode based early udbg support for 40x > > in order to debug things more easily > > Shouldn't we be able to share code with the Maple realmode udbg()? Do you really care ? Ben. ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
Re: [RFC/PATCH 12/14] powerpc: Add early udbg support for 40x processors
On Thu, Nov 22, 2007 at 11:00:15AM +1100, Benjamin Herrenschmidt wrote: > > On Thu, 2007-11-22 at 09:58 +1100, David Gibson wrote: > > On Wed, Nov 21, 2007 at 05:16:30PM +1100, Benjamin Herrenschmidt wrote: > > > This adds some basic real mode based early udbg support for 40x > > > in order to debug things more easily > > > > Shouldn't we be able to share code with the Maple realmode udbg()? > > Do you really care ? Not very much, no. -- David Gibson| I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev