Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d9b55a03 authored by David Gibson's avatar David Gibson Committed by Paul Mackerras
Browse files

[POWERPC] Early serial debug support for PPC44x



This adds support for early serial debugging via the built in
port on IBM/AMCC PowerPC 44x CPUs.  It uses a bolted TLB entry in
address space 1 for the UART's mapping, allowing robust debugging both
before and after the initialization of the MMU.

Signed-off-by: default avatarDavid Gibson <dwg@au1.ibm.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent f6dfc805
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -139,10 +139,6 @@ config BOOTX_TEXT
	  Say Y here to see progress messages from the boot firmware in text
	  mode. Requires either BootX or Open Firmware.

config SERIAL_TEXT_DEBUG
	bool "Support for early boot texts over serial port"
	depends on 4xx

config PPC_EARLY_DEBUG
	bool "Early debugging (dangerous)"

@@ -207,6 +203,24 @@ config PPC_EARLY_DEBUG_BEAT
	help
	  Select this to enable early debugging for Celleb with Beat.

config PPC_EARLY_DEBUG_44x
	bool "Early serial debugging for IBM/AMCC 44x CPUs"
	depends on 44x
	select PPC_UDBG_16550
	help
	  Select this to enable early debugging for IBM 44x chips via the
	  inbuilt serial port.

endchoice

config PPC_EARLY_DEBUG_44x_PHYSLOW
	hex "Low 32 bits of early debug UART physical address"
	depends PPC_EARLY_DEBUG_44x
	default "0x40000200"

config PPC_EARLY_DEBUG_44x_PHYSHIGH
	hex "EPRN of early debug UART physical address"
	depends PPC_EARLY_DEBUG_44x
	default "0x1"

endmenu
+13 −21
Original line number Diff line number Diff line
@@ -172,36 +172,28 @@ skpinv: addi r4,r4,1 /* Increment */
	isync

4:
#ifdef CONFIG_SERIAL_TEXT_DEBUG
	/*
	 * Add temporary UART mapping for early debug.
	 * We can map UART registers wherever we want as long as they don't
	 * interfere with other system mappings (e.g. with pinned entries).
	 * For an example of how we handle this - see ocotea.h.       --ebs
	 */
#ifdef CONFIG_PPC_EARLY_DEBUG_44x
	/* Add UART mapping for early debug. */

 	/* pageid fields */
	lis	r3,UART0_IO_BASE@h
	ori	r3,r3,PPC44x_TLB_VALID | PPC44x_TLB_4K
	lis	r3,PPC44x_EARLY_DEBUG_VIRTADDR@h
	ori	r3,r3,PPC44x_TLB_VALID|PPC44x_TLB_TS|PPC44x_TLB_64K

	/* xlat fields */
	lis	r4,UART0_PHYS_IO_BASE@h		/* RPN depends on SoC */
#ifndef CONFIG_440EP
	ori	r4,r4,0x0001		/* ERPN is 1 for second 4GB page */
#endif
	lis	r4,CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW@h
	ori	r4,r4,CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH

	/* attrib fields */
	li	r5,0
	ori	r5,r5,(PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_I | PPC44x_TLB_G)
	li	r5,(PPC44x_TLB_SW|PPC44x_TLB_SR|PPC44x_TLB_I|PPC44x_TLB_G)
        li      r0,62                    /* TLB slot 0 */

        li      r0,0                    /* TLB slot 0 */

	tlbwe	r3,r0,PPC44x_TLB_PAGEID	/* Load the pageid fields */
	tlbwe	r4,r0,PPC44x_TLB_XLAT	/* Load the translation fields */
	tlbwe	r5,r0,PPC44x_TLB_ATTRIB	/* Load the attrib/access fields */
	tlbwe	r3,r0,PPC44x_TLB_PAGEID
	tlbwe	r4,r0,PPC44x_TLB_XLAT
	tlbwe	r5,r0,PPC44x_TLB_ATTRIB

	/* Force context change */
	isync
#endif /* CONFIG_SERIAL_TEXT_DEBUG */
#endif /* CONFIG_PPC_EARLY_DEBUG_44x */

	/* Establish the interrupt vector offsets */
	SET_IVOR(0,  CriticalInput);
+0 −1
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@
#include <asm/ppc-pci.h>
#include <asm/atomic.h>


/*
 * The list of OF IDs below is used for matching bus types in the
 * system whose devices are to be exposed as of_platform_devices.
+3 −0
Original line number Diff line number Diff line
@@ -51,6 +51,9 @@ void __init udbg_early_init(void)
	udbg_init_pas_realmode();
#elif defined(CONFIG_BOOTX_TEXT)
	udbg_init_btext();
#elif defined(CONFIG_PPC_EARLY_DEBUG_44x)
	/* PPC44x debug */
	udbg_init_44x_as1();
#endif
}

+23 −0
Original line number Diff line number Diff line
@@ -191,3 +191,26 @@ void udbg_init_pas_realmode(void)
	udbg_getc_poll = NULL;
}
#endif /* CONFIG_PPC_MAPLE */

#ifdef CONFIG_PPC_EARLY_DEBUG_44x
#include <platforms/44x/44x.h>

static void udbg_44x_as1_putc(char c)
{
	if (udbg_comport) {
		while ((as1_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
			/* wait for idle */;
		as1_writeb(c, &udbg_comport->thr); eieio();
		if (c == '\n')
			udbg_44x_as1_putc('\r');
	}
}

void __init udbg_init_44x_as1(void)
{
	udbg_comport =
		(volatile struct NS16550 __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR;

	udbg_putc = udbg_44x_as1_putc;
}
#endif /* CONFIG_PPC_EARLY_DEBUG_44x */
Loading