linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [0/15] Ebony support, spin 3
@ 2007-03-05  3:23 David Gibson
  2007-03-05  3:24 ` [PATCH 1/15] powerpc: Allow duplicate lmb_reserve() calls David Gibson
                   ` (16 more replies)
  0 siblings, 17 replies; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:23 UTC (permalink / raw)
  To: linuxppc-dev

Third version of the Ebony support patch series.  Notable changes:
	- Clock speeds, memory size and MAC addresses are now obtained
from the hardware/firmware by the zImage and inserted into the device
tree accordingly.  i.e. these patches should now work on any Ebony,
not just one identical to mine.
	- The kernel can now restart the Ebony.

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 1/15] powerpc: Allow duplicate lmb_reserve() calls
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-05  3:24 ` [PATCH 2/15] Automatically lmb_reserve() initrd David Gibson
                   ` (15 subsequent siblings)
  16 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

At present calling lmb_reserve() (and hence lmb_add_region()) twice
for exactly the same memory region will cause strange behaviour.

This makes life difficult when booting from a flat device tree with
memory reserve map.  Which regions are automatically reserved by the
kernel has changed over time, so it's quite possible a newer kernel
could attempt to auto-reserve a region which is also explicitly listed
in the device tree's reserve map, leading to trouble.

This patch avoids the problem by making lmb_reserve() ignore a call to
reserve a previously reserved region.  It also removes a now redundant
test designed to avoid one specific case of the problem noted above.

At present, this patch deals only with duplicate reservations of an
identical region.  Attempting to reserve two different, but
overlapping regions will still cause problems.  I might post another
patch later dealing with this case, but I'm avoiding it now since it
is substantially more complicated to deal with, less likely to occur
and more likely to indicate a genuine bug elsewhere if it does occur.

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---


 arch/powerpc/kernel/prom.c |    3 ---
 arch/powerpc/mm/lmb.c      |    4 ++++
 2 files changed, 4 insertions(+), 3 deletions(-)

Index: working-2.6/arch/powerpc/mm/lmb.c
===================================================================
--- working-2.6.orig/arch/powerpc/mm/lmb.c	2007-02-06 16:21:02.000000000 +1100
+++ working-2.6/arch/powerpc/mm/lmb.c	2007-02-06 16:22:32.000000000 +1100
@@ -146,6 +146,10 @@ static long __init lmb_add_region(struct
 		unsigned long rgnbase = rgn->region[i].base;
 		unsigned long rgnsize = rgn->region[i].size;
 
+		if ((rgnbase == base) && (rgnsize == size))
+			/* Already have this region, so we're done */
+			return 0;
+
 		adjacent = lmb_addrs_adjacent(base,size,rgnbase,rgnsize);
 		if ( adjacent > 0 ) {
 			rgn->region[i].base -= size;
Index: working-2.6/arch/powerpc/kernel/prom.c
===================================================================
--- working-2.6.orig/arch/powerpc/kernel/prom.c	2007-02-06 16:22:48.000000000 +1100
+++ working-2.6/arch/powerpc/kernel/prom.c	2007-02-06 16:22:57.000000000 +1100
@@ -954,9 +954,6 @@ static void __init early_reserve_mem(voi
 		size = *(reserve_map++);
 		if (size == 0)
 			break;
-		/* skip if the reservation is for the blob */
-		if (base == self_base && size == self_size)
-			continue;
 		DBG("reserving: %llx -> %llx\n", base, size);
 		lmb_reserve(base, size);
 	}

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 2/15] Automatically lmb_reserve() initrd
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
  2007-03-05  3:24 ` [PATCH 1/15] powerpc: Allow duplicate lmb_reserve() calls David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-04-18 11:43   ` Uytterhoeven, Geert
  2007-03-05  3:24 ` [PATCH 3/15] Define FIXED_PORT flag for serial_core David Gibson
                   ` (14 subsequent siblings)
  16 siblings, 1 reply; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

At present, when an initrd is passed to the kernel used flat device
tree properties, the memory the initrd occupies must also be reserved
in the flat tree's reserve map, or the kernel may overwrite it.  That
makes life more complicated than it could be for the bootwrapper.

This patch makes the kernel automatically reserve the initrd's space.
That in turn requires parsing the initrd parameters earlier than they
are currently, in early_init_dt_scan_chosen() instead of
check_for_initrd().

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---

 arch/powerpc/kernel/prom.c         |   23 +++++++++++++++++++++++
 arch/powerpc/kernel/setup-common.c |   22 ++--------------------
 2 files changed, 25 insertions(+), 20 deletions(-)

Index: working-2.6/arch/powerpc/kernel/prom.c
===================================================================
--- working-2.6.orig/arch/powerpc/kernel/prom.c	2007-02-09 15:12:00.000000000 +1100
+++ working-2.6/arch/powerpc/kernel/prom.c	2007-02-09 15:14:27.000000000 +1100
@@ -719,6 +719,7 @@ static int __init early_init_dt_scan_cho
 					    const char *uname, int depth, void *data)
 {
 	unsigned long *lprop;
+	u32 *prop;
 	unsigned long l;
 	char *p;
 
@@ -760,6 +761,22 @@ static int __init early_init_dt_scan_cho
                crashk_res.end = crashk_res.start + *lprop - 1;
 #endif
 
+#ifdef CONFIG_BLK_DEV_INITRD
+	DBG("Looking for initrd properties... ");
+	prop = of_get_flat_dt_prop(node, "linux,initrd-start", &l);
+	if (prop) {
+		initrd_start = (unsigned long)__va(of_read_ulong(prop, l/4));
+		prop = of_get_flat_dt_prop(node, "linux,initrd-end", &l);
+		if (prop) {
+			initrd_end = (unsigned long)__va(of_read_ulong(prop, l/4));
+			initrd_below_start_ok = 1;
+		} else {
+			initrd_start = 0;
+		}
+	}
+	DBG("initrd_start=0x%lx  initrd_end=0x%lx\n", initrd_start, initrd_end);
+#endif /* CONFIG_BLK_DEV_INITRD */
+
 	/* Retreive command line */
  	p = of_get_flat_dt_prop(node, "bootargs", &l);
 	if (p != NULL && l > 0)
@@ -926,6 +943,12 @@ static void __init early_reserve_mem(voi
 	self_size = initial_boot_params->totalsize;
 	lmb_reserve(self_base, self_size);
 
+#ifdef CONFIG_BLK_DEV_INITRD
+	/* then reserve the initrd, if any */
+	if (initrd_start && (initrd_end > initrd_start))
+		lmb_reserve(__pa(initrd_start), initrd_end - initrd_start);
+#endif /* CONFIG_BLK_DEV_INITRD */
+
 #ifdef CONFIG_PPC32
 	/* 
 	 * Handle the case where we might be booting from an old kexec
Index: working-2.6/arch/powerpc/kernel/setup-common.c
===================================================================
--- working-2.6.orig/arch/powerpc/kernel/setup-common.c	2007-01-24 12:01:17.000000000 +1100
+++ working-2.6/arch/powerpc/kernel/setup-common.c	2007-02-09 15:15:15.000000000 +1100
@@ -304,26 +304,8 @@ struct seq_operations cpuinfo_op = {
 void __init check_for_initrd(void)
 {
 #ifdef CONFIG_BLK_DEV_INITRD
-	const unsigned int *prop;
-	int len;
-
-	DBG(" -> check_for_initrd()\n");
-
-	if (of_chosen) {
-		prop = get_property(of_chosen, "linux,initrd-start", &len);
-		if (prop != NULL) {
-			initrd_start = (unsigned long)
-				__va(of_read_ulong(prop, len / 4));
-			prop = get_property(of_chosen,
-					"linux,initrd-end", &len);
-			if (prop != NULL) {
-				initrd_end = (unsigned long)
-					__va(of_read_ulong(prop, len / 4));
-				initrd_below_start_ok = 1;
-			} else
-				initrd_start = 0;
-		}
-	}
+	DBG(" -> check_for_initrd()  initrd_start=0x%lx  initrd_end=0x%lx\n",
+	    initrd_start, initrd_end);
 
 	/* If we were passed an initrd, set the ROOT_DEV properly if the values
 	 * look sensible. If not, clear initrd reference.

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 3/15] Define FIXED_PORT flag for serial_core
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
  2007-03-05  3:24 ` [PATCH 1/15] powerpc: Allow duplicate lmb_reserve() calls David Gibson
  2007-03-05  3:24 ` [PATCH 2/15] Automatically lmb_reserve() initrd David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-05  3:24 ` [PATCH 7/15] zImage: Cleanup and improve prep_kernel() David Gibson
                   ` (13 subsequent siblings)
  16 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

At present, the serial core always allows setserial in userspace to
change the port address, irq and base clock of any serial port.  That
makes sense for legacy ISA ports, but not for (say) embedded ns16550
compatible serial ports at peculiar addresses.  In these cases, the
kernel code configuring the ports must know exactly where they are,
and their clocking arrangements (which can be unusual on embedded
boards).  It doesn't make sense for userspace to change these
settings.

Therefore, this patch defines a UPF_FIXED_PORT flag for the uart_port
structure.  If this flag is set when the serial port is configured,
any attempts to alter the port's type, io address, irq or base clock
with setserial are ignored.

In addition this patch uses the new flag for on-chip serial ports
probed in arch/powerpc/kernel/legacy_serial.c, and for other
hard-wired serial ports probed by drivers/serial/of_serial.c.

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---

 arch/powerpc/kernel/legacy_serial.c |    3 ++-
 drivers/serial/of_serial.c          |    3 ++-
 drivers/serial/serial_core.c        |   22 +++++++++++++---------
 include/linux/serial_core.h         |    1 +
 4 files changed, 18 insertions(+), 11 deletions(-)

Index: working-2.6/drivers/serial/serial_core.c
===================================================================
--- working-2.6.orig/drivers/serial/serial_core.c	2007-02-19 11:05:32.000000000 +1100
+++ working-2.6/drivers/serial/serial_core.c	2007-02-20 11:38:08.000000000 +1100
@@ -672,19 +672,21 @@ static int uart_set_info(struct uart_sta
 	 */
 	mutex_lock(&state->mutex);
 
-	change_irq  = new_serial.irq != port->irq;
+	change_irq  = !(port->flags & UPF_FIXED_PORT)
+		&& new_serial.irq != port->irq;
 
 	/*
 	 * Since changing the 'type' of the port changes its resource
 	 * allocations, we should treat type changes the same as
 	 * IO port changes.
 	 */
-	change_port = new_port != port->iobase ||
-		      (unsigned long)new_serial.iomem_base != port->mapbase ||
-		      new_serial.hub6 != port->hub6 ||
-		      new_serial.io_type != port->iotype ||
-		      new_serial.iomem_reg_shift != port->regshift ||
-		      new_serial.type != port->type;
+	change_port = !(port->flags & UPF_FIXED_PORT)
+		&& (new_port != port->iobase ||
+		    (unsigned long)new_serial.iomem_base != port->mapbase ||
+		    new_serial.hub6 != port->hub6 ||
+		    new_serial.io_type != port->iotype ||
+		    new_serial.iomem_reg_shift != port->regshift ||
+		    new_serial.type != port->type);
 
 	old_flags = port->flags;
 	new_flags = new_serial.flags;
@@ -796,8 +798,10 @@ static int uart_set_info(struct uart_sta
 		}
 	}
 
-	port->irq              = new_serial.irq;
-	port->uartclk          = new_serial.baud_base * 16;
+	if (change_irq)
+		port->irq      = new_serial.irq;
+	if (! (port->flags & UPF_FIXED_PORT))
+		port->uartclk  = new_serial.baud_base * 16;
 	port->flags            = (port->flags & ~UPF_CHANGE_MASK) |
 				 (new_flags & UPF_CHANGE_MASK);
 	port->custom_divisor   = new_serial.custom_divisor;
Index: working-2.6/include/linux/serial_core.h
===================================================================
--- working-2.6.orig/include/linux/serial_core.h	2007-02-19 11:05:32.000000000 +1100
+++ working-2.6/include/linux/serial_core.h	2007-02-20 11:38:08.000000000 +1100
@@ -260,6 +260,7 @@ struct uart_port {
 #define UPF_CONS_FLOW		((__force upf_t) (1 << 23))
 #define UPF_SHARE_IRQ		((__force upf_t) (1 << 24))
 #define UPF_BOOT_AUTOCONF	((__force upf_t) (1 << 28))
+#define UPF_FIXED_PORT		((__force upf_t) (1 << 29))
 #define UPF_DEAD		((__force upf_t) (1 << 30))
 #define UPF_IOREMAP		((__force upf_t) (1 << 31))
 
Index: working-2.6/arch/powerpc/kernel/legacy_serial.c
===================================================================
--- working-2.6.orig/arch/powerpc/kernel/legacy_serial.c	2007-02-15 10:05:18.000000000 +1100
+++ working-2.6/arch/powerpc/kernel/legacy_serial.c	2007-02-20 10:50:16.000000000 +1100
@@ -115,7 +115,8 @@ static int __init add_legacy_soc_port(st
 {
 	u64 addr;
 	const u32 *addrp;
-	upf_t flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
+	upf_t flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ
+		| UPF_FIXED_PORT;
 	struct device_node *tsi = of_get_parent(np);
 
 	/* We only support ports that have a clock frequency properly
Index: working-2.6/drivers/serial/of_serial.c
===================================================================
--- working-2.6.orig/drivers/serial/of_serial.c	2007-02-20 11:38:16.000000000 +1100
+++ working-2.6/drivers/serial/of_serial.c	2007-02-20 11:38:30.000000000 +1100
@@ -48,7 +48,8 @@ static int __devinit of_platform_serial_
 	port->iotype = UPIO_MEM;
 	port->type = type;
 	port->uartclk = *clk;
-	port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP;
+	port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP
+		| UPF_FIXED_PORT;
 	port->dev = &ofdev->dev;
 	port->custom_divisor = *clk / (16 * (*spd));
 

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 4/15] Use resource_size_t for serial port IO addresses
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (5 preceding siblings ...)
  2007-03-05  3:24 ` [PATCH 11/15] zImage wrapper for Ebony David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-05  3:24 ` [PATCH 8/15] zImage: Cleanup and improve zImage entry point David Gibson
                   ` (9 subsequent siblings)
  16 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

At present, various parts of the serial code use unsigned long to
define resource addresses.  This is a problem, because some 32-bit
platforms have physical addresses larger than 32-bits, and have mmio
serial uarts located above the 4GB point.

This patch changes the type of mapbase in both struct uart_port and
struct plat_serial8250_port to resource_size_t, which can be
configured to be 64 bits on such platforms.  The mapbase in
serial_struct can't safely be changed, because that structure is user
visible.

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---

 drivers/serial/8250.c        |    5 +++--
 drivers/serial/8250_early.c  |   16 +++++++++-------
 drivers/serial/serial_core.c |    9 +++++----
 include/linux/serial_8250.h  |    2 +-
 include/linux/serial_core.h  |    2 +-
 5 files changed, 19 insertions(+), 15 deletions(-)

Index: working-2.6/include/linux/serial_core.h
===================================================================
--- working-2.6.orig/include/linux/serial_core.h	2007-02-19 11:07:42.000000000 +1100
+++ working-2.6/include/linux/serial_core.h	2007-02-19 11:07:43.000000000 +1100
@@ -273,7 +273,7 @@ struct uart_port {
 	const struct uart_ops	*ops;
 	unsigned int		custom_divisor;
 	unsigned int		line;			/* port index */
-	unsigned long		mapbase;		/* for ioremap */
+	resource_size_t		mapbase;		/* for ioremap */
 	struct device		*dev;			/* parent device */
 	unsigned char		hub6;			/* this should be in the 8250 driver */
 	unsigned char		unused[3];
Index: working-2.6/drivers/serial/serial_core.c
===================================================================
--- working-2.6.orig/drivers/serial/serial_core.c	2007-02-19 11:07:42.000000000 +1100
+++ working-2.6/drivers/serial/serial_core.c	2007-02-19 11:07:43.000000000 +1100
@@ -633,7 +633,7 @@ static int uart_get_info(struct uart_sta
 	tmp.hub6	    = port->hub6;
 	tmp.io_type         = port->iotype;
 	tmp.iomem_reg_shift = port->regshift;
-	tmp.iomem_base      = (void *)port->mapbase;
+	tmp.iomem_base      = (void *)(unsigned long)port->mapbase;
 
 	if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
 		return -EFAULT;
@@ -1673,10 +1673,11 @@ static int uart_line_info(char *buf, str
 		return 0;
 
 	mmio = port->iotype >= UPIO_MEM;
-	ret = sprintf(buf, "%d: uart:%s %s%08lX irq:%d",
+	ret = sprintf(buf, "%d: uart:%s %s%08llX irq:%d",
 			port->line, uart_type(port),
 			mmio ? "mmio:0x" : "port:",
-			mmio ? port->mapbase : (unsigned long) port->iobase,
+			mmio ? (unsigned long long)port->mapbase
+		             : (unsigned long long) port->iobase,
 			port->irq);
 
 	if (port->type == PORT_UNKNOWN) {
@@ -2069,7 +2070,7 @@ uart_report_port(struct uart_driver *drv
 	case UPIO_AU:
 	case UPIO_TSI:
 		snprintf(address, sizeof(address),
-			 "MMIO 0x%lx", port->mapbase);
+			 "MMIO 0x%llx", (unsigned long long)port->mapbase);
 		break;
 	default:
 		strlcpy(address, "*unknown*", sizeof(address));
Index: working-2.6/drivers/serial/8250_early.c
===================================================================
--- working-2.6.orig/drivers/serial/8250_early.c	2007-02-19 11:07:40.000000000 +1100
+++ working-2.6/drivers/serial/8250_early.c	2007-02-19 11:07:43.000000000 +1100
@@ -145,8 +145,9 @@ static int __init parse_options(struct e
 		port->mapbase = simple_strtoul(options + 5, &options, 0);
 		port->membase = ioremap(port->mapbase, mapsize);
 		if (!port->membase) {
-			printk(KERN_ERR "%s: Couldn't ioremap 0x%lx\n",
-				__FUNCTION__, port->mapbase);
+			printk(KERN_ERR "%s: Couldn't ioremap 0x%llx\n",
+				__FUNCTION__,
+			       (unsigned long long)port->mapbase);
 			return -ENOMEM;
 		}
 		mmio = 1;
@@ -168,9 +169,10 @@ static int __init parse_options(struct e
 			device->baud);
 	}
 
-	printk(KERN_INFO "Early serial console at %s 0x%lx (options '%s')\n",
+	printk(KERN_INFO "Early serial console at %s 0x%llx (options '%s')\n",
 		mmio ? "MMIO" : "I/O port",
-		mmio ? port->mapbase : (unsigned long) port->iobase,
+		mmio ? (unsigned long long) port->mapbase
+	             : (unsigned long long) port->iobase,
 		device->options);
 	return 0;
 }
@@ -236,10 +238,10 @@ static int __init early_uart_console_swi
 	mmio = (port->iotype == UPIO_MEM);
 	line = serial8250_start_console(port, device->options);
 	if (line < 0)
-		printk("No ttyS device at %s 0x%lx for console\n",
+		printk("No ttyS device at %s 0x%llx for console\n",
 			mmio ? "MMIO" : "I/O port",
-			mmio ? port->mapbase :
-			    (unsigned long) port->iobase);
+			mmio ? (unsigned long long) port->mapbase
+		             : (unsigned long long) port->iobase);
 
 	unregister_console(&early_uart_console);
 	if (mmio)
Index: working-2.6/include/linux/serial_8250.h
===================================================================
--- working-2.6.orig/include/linux/serial_8250.h	2007-02-19 11:07:40.000000000 +1100
+++ working-2.6/include/linux/serial_8250.h	2007-02-19 11:07:43.000000000 +1100
@@ -20,7 +20,7 @@
 struct plat_serial8250_port {
 	unsigned long	iobase;		/* io base address */
 	void __iomem	*membase;	/* ioremap cookie or NULL */
-	unsigned long	mapbase;	/* resource base */
+	resource_size_t	mapbase;	/* resource base */
 	unsigned int	irq;		/* interrupt number */
 	unsigned int	uartclk;	/* UART clock rate */
 	unsigned char	regshift;	/* register shift */
Index: working-2.6/drivers/serial/8250.c
===================================================================
--- working-2.6.orig/drivers/serial/8250.c	2007-02-19 11:07:40.000000000 +1100
+++ working-2.6/drivers/serial/8250.c	2007-02-19 11:07:43.000000000 +1100
@@ -2550,8 +2550,9 @@ static int __devinit serial8250_probe(st
 		ret = serial8250_register_port(&port);
 		if (ret < 0) {
 			dev_err(&dev->dev, "unable to register port at index %d "
-				"(IO%lx MEM%lx IRQ%d): %d\n", i,
-				p->iobase, p->mapbase, p->irq, ret);
+				"(IO%lx MEM%llx IRQ%d): %d\n", i,
+				p->iobase, (unsigned long long)p->mapbase,
+				p->irq, ret);
 		}
 	}
 	return 0;

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 5/15] Re-organize Kconfig code for 4xx in arch/powerpc
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (3 preceding siblings ...)
  2007-03-05  3:24 ` [PATCH 7/15] zImage: Cleanup and improve prep_kernel() David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-05  3:24 ` [PATCH 11/15] zImage wrapper for Ebony David Gibson
                   ` (11 subsequent siblings)
  16 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

Now that we always take a device tree in arch/powerpc, there's no good
reason not to allow a single kernel to support multiple embedded 4xx
boards - the correct platform code can be selected based on the device
tree information.

Therefore, this patch re-arranges the 4xx Kconfig code to allow this.
In addition we:
	- use "select" instead of depends to configure the correct
	  config options for specific 4xx CPUs and workarounds, which
	  makes the information about specific boards and CPUs less
	  scattered.
	- Some old, unused (in arch/powerpc) config options are
	  removed: WANT_EARLY_SERIAL, IBM_OCP, etc.

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---

 arch/powerpc/platforms/4xx/Kconfig |  378 ++++++++++++++-----------------------
 1 file changed, 153 insertions(+), 225 deletions(-)

Index: working-2.6/arch/powerpc/platforms/4xx/Kconfig
===================================================================
--- working-2.6.orig/arch/powerpc/platforms/4xx/Kconfig	2007-02-21 11:20:50.000000000 +1100
+++ working-2.6/arch/powerpc/platforms/4xx/Kconfig	2007-02-21 11:25:43.000000000 +1100
@@ -3,278 +3,206 @@ config 4xx
 	depends on 40x || 44x
 	default y
 
-config WANT_EARLY_SERIAL
+config BOOKE
 	bool
-	select SERIAL_8250
-	default n
-
-menu "AMCC 4xx options"
-	depends on 4xx
-
-choice
-	prompt "Machine Type"
-	depends on 40x
-	default WALNUT
-
-config BUBINGA
-	bool "Bubinga"
-	select WANT_EARLY_SERIAL
-	help
-	  This option enables support for the IBM 405EP evaluation board.
-
-config CPCI405
-	bool "CPCI405"
-	help
-	  This option enables support for the CPCI405 board.
-
-config EP405
-	bool "EP405/EP405PC"
-	help
-	  This option enables support for the EP405/EP405PC boards.
-
-config REDWOOD_5
-	bool "Redwood-5"
-	help
-	  This option enables support for the IBM STB04 evaluation board.
-
-config REDWOOD_6
-	bool "Redwood-6"
-	help
-	  This option enables support for the IBM STBx25xx evaluation board.
-
-config SYCAMORE
-	bool "Sycamore"
-	help
-	  This option enables support for the IBM PPC405GPr evaluation board.
-
-config WALNUT
-	bool "Walnut"
-	help
-	  This option enables support for the IBM PPC405GP evaluation board.
-
-config XILINX_ML300
-	bool "Xilinx-ML300"
-	help
-	  This option enables support for the Xilinx ML300 evaluation board.
-
-endchoice
-
-choice
-	prompt "Machine Type"
 	depends on 44x
-	default EBONY
-
-config BAMBOO
-	bool "Bamboo"
-	select WANT_EARLY_SERIAL
-	help
-	  This option enables support for the IBM PPC440EP evaluation board.
-
-config EBONY
-	bool "Ebony"
-	select WANT_EARLY_SERIAL
-	help
-	  This option enables support for the IBM PPC440GP evaluation board.
-
-config LUAN
-	bool "Luan"
-	select WANT_EARLY_SERIAL
-	help
-	  This option enables support for the IBM PPC440SP evaluation board.
-
-config OCOTEA
-	bool "Ocotea"
-	select WANT_EARLY_SERIAL
-	help
-	  This option enables support for the IBM PPC440GX evaluation board.
+	default y
 
-endchoice
+menu "AMCC 40x options"
+	depends on 40x
 
-config EP405PC
-	bool "EP405PC Support"
-	depends on EP405
+#config BUBINGA
+#	bool "Bubinga"
+#	depends on 40x
+#	default n
+#	select 405EP
+#	help
+#	  This option enables support for the IBM 405EP evaluation board.
+
+#config CPCI405
+#	bool "CPCI405"
+#	depends on 40x
+#	default n
+#	select 405GP
+#	help
+#	  This option enables support for the CPCI405 board.
+
+#config EP405
+#	bool "EP405/EP405PC"
+#	depends on 40x
+#	default n
+#	select 405GP
+#	help
+#	  This option enables support for the EP405/EP405PC boards.
+
+#config EP405PC
+#	bool "EP405PC Support"
+#	depends on EP405
+#	default y
+#	help
+#	  This option enables support for the extra features of the EP405PC board.
+
+#config REDWOOD_5
+#	bool "Redwood-5"
+#	depends on 40x
+#	default n
+#	select STB03xxx
+#	help
+#	  This option enables support for the IBM STB04 evaluation board.
+
+#config REDWOOD_6
+#	bool "Redwood-6"
+#	depends on 40x
+#	default n
+#	select STB03xxx
+#	help
+#	  This option enables support for the IBM STBx25xx evaluation board.
+
+#config SYCAMORE
+#	bool "Sycamore"
+#	depends on 40x
+#	default n
+#	select 405GPR
+#	help
+#	  This option enables support for the IBM PPC405GPr evaluation board.
+
+#config WALNUT
+#	bool "Walnut"
+#	depends on 40x
+#	default y
+#	select 405GP
+#	help
+#	  This option enables support for the IBM PPC405GP evaluation board.
+
+#config XILINX_ML300
+#	bool "Xilinx-ML300"
+#	depends on 40x
+#	default y
+#	select VIRTEX_II_PRO
+#	help
+#	  This option enables support for the Xilinx ML300 evaluation board.
 
+endmenu
 
-# It's often necessary to know the specific 4xx processor type.
-# Fortunately, it is impled (so far) from the board type, so we
-# don't need to ask more redundant questions.
+# 40x specific CPU modules, selected based on the board above.
 config NP405H
 	bool
-	depends on ASH
-	default y
+	#depends on ASH
 
-config 440EP
+# OAK doesn't exist but wanted to keep this around for any future 403GCX boards
+config 403GCX
 	bool
-	depends on BAMBOO
-	select PPC_FPU
-	default y
+	#depends on OAK
+	select IBM405_ERR51
 
-config 440GP
+config 405GP
 	bool
-	depends on EBONY
-	default y
+	select IBM405_ERR77
+	select IBM405_ERR51
 
-config 440GX
+config 405EP
 	bool
-	depends on OCOTEA
-	default y
 
-config 440SP
+config 405GPR
 	bool
-	depends on LUAN
-	default y
 
-config 440
+config VIRTEX_II_PRO
 	bool
-	depends on 440GP || 440SP || 440EP
-	default y
+	select IBM405_ERR77
+	select IBM405_ERR51
 
-config 440A
+config STB03xxx
 	bool
-	depends on 440GX
-	default y
+	select IBM405_ERR77
+	select IBM405_ERR51
 
-config IBM440EP_ERR42
-	bool
-	depends on 440EP
-	default y
+# 40x errata/workaround config symbols, selected by the CPU models above
 
 # All 405-based cores up until the 405GPR and 405EP have this errata.
 config IBM405_ERR77
 	bool
-	depends on 40x && !403GCX && !405GPR && !405EP
-	default y
 
 # All 40x-based cores, up until the 405GPR and 405EP have this errata.
 config IBM405_ERR51
 	bool
-	depends on 40x && !405GPR && !405EP
-	default y
 
-config BOOKE
-	bool
+menu "AMCC 44x options"
 	depends on 44x
-	default y
 
-config IBM_OCP
-	bool
-	depends on ASH || BAMBOO || BUBINGA || CPCI405 || EBONY || EP405 || LUAN || OCOTEA || REDWOOD_5 || REDWOOD_6 || SYCAMORE || WALNUT
-	default y
+#config BAMBOO
+#	bool "Bamboo"
+#	depends on 44x
+#	default n
+#	select 440EP
+#	help
+#	  This option enables support for the IBM PPC440EP evaluation board.
 
-config XILINX_OCP
-	bool
-	depends on XILINX_ML300
-	default y
-
-config IBM_EMAC4
-	bool
-	depends on 440GX || 440SP
-	default y
-
-config BIOS_FIXUP
-	bool
-	depends on BUBINGA || EP405 || SYCAMORE || WALNUT
-	default y
-
-# OAK doesn't exist but wanted to keep this around for any future 403GCX boards
-config 403GCX
-	bool
-	depends on OAK
-	default y
-
-config 405EP
-	bool
-	depends on BUBINGA
-	default y
-
-config 405GP
-	bool
-	depends on CPCI405 || EP405 || WALNUT
-	default y
-
-config 405GPR
-	bool
-	depends on SYCAMORE
-	default y
-
-config VIRTEX_II_PRO
-	bool
-	depends on XILINX_ML300
-	default y
-
-config STB03xxx
-	bool
-	depends on REDWOOD_5 || REDWOOD_6
-	default y
-
-config EMBEDDEDBOOT
-	bool
-	depends on EP405 || XILINX_ML300
+config EBONY
+	bool "Ebony"
+	depends on 44x
 	default y
+	select 440GP
+	help
+	  This option enables support for the IBM PPC440GP evaluation board.
 
-config IBM_OPENBIOS
-	bool
-	depends on ASH || BUBINGA || REDWOOD_5 || REDWOOD_6 || SYCAMORE || WALNUT
-	default y
+#config LUAN
+#	bool "Luan"
+#	depends on 44x
+#	default n
+#	select 440SP
+#	help
+#	  This option enables support for the IBM PPC440SP evaluation board.
+
+#config OCOTEA
+#	bool "Ocotea"
+#	depends on 44x
+#	default n
+#	select 440GX
+#	help
+#	  This option enables support for the IBM PPC440GX evaluation board.
 
-config PPC4xx_DMA
-	bool "PPC4xx DMA controller support"
-	depends on 4xx
+endmenu
 
-config PPC4xx_EDMA
+# 44x specific CPU modules, selected based on the board above.
+config 440EP
 	bool
-	depends on !STB03xxx && PPC4xx_DMA
-	default y
+	select PPC_FPU
+	select IBM440EP_ERR42
 
-config PPC_GEN550
+config 440GP
 	bool
-	depends on 4xx
-	default y
-
-choice
-	prompt "TTYS0 device and default console"
-	depends on 40x
-	default UART0_TTYS0
-
-config UART0_TTYS0
-	bool "UART0"
-
-config UART0_TTYS1
-	bool "UART1"
+	select IBM_NEW_EMAC_ZMII
 
-endchoice
-
-config SERIAL_SICC
-	bool "SICC Serial port support"
-	depends on STB03xxx
-
-config UART1_DFLT_CONSOLE
+config 440GX
 	bool
-	depends on SERIAL_SICC && UART0_TTYS1
-	default y
 
-config SERIAL_SICC_CONSOLE
+config 440SP
 	bool
-	depends on SERIAL_SICC && UART0_TTYS1
-	default y
-endmenu
-
 
-menu "IBM 40x options"
-	depends on 40x
-
-config SERIAL_SICC
-	bool "SICC Serial port"
-	depends on STB03xxx
-
-config UART1_DFLT_CONSOLE
+config 440A
 	bool
-	depends on SERIAL_SICC && UART0_TTYS1
+	depends on 440GX
 	default y
 
-config SERIAL_SICC_CONSOLE
+# 44x errata/workaround config symbols, selected by the CPU models above
+config IBM440EP_ERR42
 	bool
-	depends on SERIAL_SICC && UART0_TTYS1
-	default y
 
-endmenu
+#config XILINX_OCP
+#	bool
+#	depends on XILINX_ML300
+#	default y
+
+#config BIOS_FIXUP
+#	bool
+#	depends on BUBINGA || EP405 || SYCAMORE || WALNUT
+#	default y
+
+#config PPC4xx_DMA
+#	bool "PPC4xx DMA controller support"
+#	depends on 4xx
+
+#config PPC4xx_EDMA
+#	bool
+#	depends on !STB03xxx && PPC4xx_DMA
+#	default y

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 6/15] zImage: Add more flexible gunzip convenience functions
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (9 preceding siblings ...)
  2007-03-05  3:24 ` [PATCH 10/15] Add device tree for Ebony David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-16 16:24   ` Geoff Levand
  2007-03-05  3:24 ` [PATCH 13/15] Port 44x MMU definitions to ARCH=powerpc David Gibson
                   ` (5 subsequent siblings)
  16 siblings, 1 reply; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

At present, arch/powerpc/boot/main.c includes a gunzip() function
which is a convenient wrapper around zlib.  However, it doesn't
conveniently allow decompressing part of an image to one location,
then the remainder to a different address.

This patch adds a new set of more flexible convenience wrappers around
zlib, moving them to their own file, gunzip_util.c, in the process.
These wrappers allow decompressing sections of the compressed image to
different locations.  In addition, they transparently handle
uncompressed data, avoiding special case code to handle uncompressed
vmlinux images.

The patch also converts main.c to use the new wrappers, using the new
flexibility to avoid decompressing the vmlinux's ELF header twice as
we did previously.  That in turn means we avoid extending our
allocations for the vmlinux to allow space for the extra copy of the
ELF header.

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---

 arch/powerpc/boot/Makefile      |    3 
 arch/powerpc/boot/gunzip_util.c |  140 ++++++++++++++++++++++++++++++++++++++++
 arch/powerpc/boot/gunzip_util.h |   30 ++++++++
 arch/powerpc/boot/main.c        |  113 +++++---------------------------
 4 files changed, 192 insertions(+), 94 deletions(-)

Index: working-2.6/arch/powerpc/boot/gunzip_util.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ working-2.6/arch/powerpc/boot/gunzip_util.c	2007-02-19 13:52:02.000000000 +1100
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2007 David Gibson, IBM Corporation.
+ * Based on earlier work, Copyright (C) Paul Mackerras 1997.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <stddef.h>
+#include "string.h"
+#include "stdio.h"
+#include "ops.h"
+#include "gunzip_util.h"
+
+struct gunzip_state state;
+
+#define HEAD_CRC	2
+#define EXTRA_FIELD	4
+#define ORIG_NAME	8
+#define COMMENT		0x10
+#define RESERVED	0xe0
+
+void gunzip_start(struct gunzip_state *state, void *src, int srclen)
+{
+	char *hdr = src;
+	int hdrlen = 0;
+
+	memset(state, 0, sizeof(*state));
+
+	/* Check for gzip magic number */
+	if ((hdr[0] == 0x1f) && (hdr[1] == 0x8b)) {
+		/* gzip data, initialize zlib parameters */
+		int r, flags;
+
+		state->s.workspace = state->scratch;
+		if (zlib_inflate_workspacesize() > sizeof(state->scratch)) {
+			printf("insufficient scratch space for gunzip\n\r");
+			exit();
+		}
+
+		/* skip header */
+		hdrlen = 10;
+		flags = hdr[3];
+		if (hdr[2] != Z_DEFLATED || (flags & RESERVED) != 0) {
+			printf("bad gzipped data\n\r");
+			exit();
+		}
+		if ((flags & EXTRA_FIELD) != 0)
+			hdrlen = 12 + hdr[10] + (hdr[11] << 8);
+		if ((flags & ORIG_NAME) != 0)
+			while (hdr[hdrlen++] != 0)
+				;
+		if ((flags & COMMENT) != 0)
+			while (hdr[hdrlen++] != 0)
+				;
+		if ((flags & HEAD_CRC) != 0)
+			hdrlen += 2;
+		if (hdrlen >= srclen) {
+			printf("gunzip_start: ran out of data in header\n\r");
+			exit();
+		}
+
+		r = zlib_inflateInit2(&state->s, -MAX_WBITS);
+		if (r != Z_OK) {
+			printf("inflateInit2 returned %d\n\r", r);
+			exit();
+		}
+	}
+
+	state->s.next_in = src + hdrlen;
+	state->s.avail_in = srclen - hdrlen;
+}
+
+int gunzip_partial(struct gunzip_state *state, void *dst, int dstlen)
+{
+	int len;
+
+	if (state->s.workspace) {
+		/* gunzipping */
+		int r;
+
+		state->s.next_out = dst;
+		state->s.avail_out = dstlen;
+		r = zlib_inflate(&state->s, Z_FULL_FLUSH);
+		if (r != Z_OK && r != Z_STREAM_END) {
+			printf("inflate returned %d msg: %s\n\r", r, state->s.msg);
+			exit();
+		}
+		len = state->s.next_out - (unsigned char *)dst;
+	} else {
+		/* uncompressed image */
+		len = min(state->s.avail_in, (unsigned)dstlen);
+		memcpy(dst, state->s.next_in, len);
+		state->s.next_in += len;
+		state->s.avail_in -= len;
+	}
+	return len;
+}
+
+void gunzip_exactly(struct gunzip_state *state, void *dst, int dstlen)
+{
+	int len;
+
+	len  = gunzip_partial(state, dst, dstlen);
+	if (len < dstlen) {
+		printf("gunzip_block: ran out of data\n\r");
+		exit();
+	}
+}
+
+void gunzip_discard(struct gunzip_state *state, int len)
+{
+	static char discard_buf[128];
+
+	while (len > sizeof(discard_buf)) {
+		gunzip_exactly(state, discard_buf, sizeof(discard_buf));
+		len -= sizeof(discard_buf);
+	}
+
+	if (len > 0)
+		gunzip_exactly(state, discard_buf, len);
+}
+
+int gunzip_finish(struct gunzip_state *state, void *dst, int dstlen)
+{
+	int len;
+
+	if (state->s.workspace) {
+		len = gunzip_partial(state, dst, dstlen);
+		zlib_inflateEnd(&state->s);
+	} else {
+		/* uncompressed image */
+		len = min(state->s.avail_in, (unsigned)dstlen);
+		memcpy(dst, state->s.next_in, len);
+	}
+
+	return len;
+}
Index: working-2.6/arch/powerpc/boot/main.c
===================================================================
--- working-2.6.orig/arch/powerpc/boot/main.c	2007-02-19 13:51:27.000000000 +1100
+++ working-2.6/arch/powerpc/boot/main.c	2007-02-19 14:01:15.000000000 +1100
@@ -14,8 +14,8 @@
 #include "page.h"
 #include "string.h"
 #include "stdio.h"
-#include "zlib.h"
 #include "ops.h"
+#include "gunzip_util.h"
 #include "flatdevtree.h"
 
 extern void flush_cache(void *, unsigned long);
@@ -30,6 +30,8 @@ extern char _initrd_end[];
 extern char _dtb_start[];
 extern char _dtb_end[];
 
+static struct gunzip_state gzstate;
+
 struct addr_range {
 	unsigned long addr;
 	unsigned long size;
@@ -42,71 +44,12 @@ static struct addr_range initrd;
 static unsigned long elfoffset;
 static int is_64bit;
 
-/* scratch space for gunzip; 46912 is from zlib_inflate_workspacesize() */
-static char scratch[46912];
 static char elfheader[256];
 
 typedef void (*kernel_entry_t)(unsigned long, unsigned long, void *);
 
 #undef DEBUG
 
-#define HEAD_CRC	2
-#define EXTRA_FIELD	4
-#define ORIG_NAME	8
-#define COMMENT		0x10
-#define RESERVED	0xe0
-
-static void gunzip(void *dst, int dstlen, unsigned char *src, int *lenp)
-{
-	z_stream s;
-	int r, i, flags;
-
-	/* skip header */
-	i = 10;
-	flags = src[3];
-	if (src[2] != Z_DEFLATED || (flags & RESERVED) != 0) {
-		printf("bad gzipped data\n\r");
-		exit();
-	}
-	if ((flags & EXTRA_FIELD) != 0)
-		i = 12 + src[10] + (src[11] << 8);
-	if ((flags & ORIG_NAME) != 0)
-		while (src[i++] != 0)
-			;
-	if ((flags & COMMENT) != 0)
-		while (src[i++] != 0)
-			;
-	if ((flags & HEAD_CRC) != 0)
-		i += 2;
-	if (i >= *lenp) {
-		printf("gunzip: ran out of data in header\n\r");
-		exit();
-	}
-
-	if (zlib_inflate_workspacesize() > sizeof(scratch)) {
-		printf("gunzip needs more mem\n");
-		exit();
-	}
-	memset(&s, 0, sizeof(s));
-	s.workspace = scratch;
-	r = zlib_inflateInit2(&s, -MAX_WBITS);
-	if (r != Z_OK) {
-		printf("inflateInit2 returned %d\n\r", r);
-		exit();
-	}
-	s.next_in = src + i;
-	s.avail_in = *lenp - i;
-	s.next_out = dst;
-	s.avail_out = dstlen;
-	r = zlib_inflate(&s, Z_FULL_FLUSH);
-	if (r != Z_OK && r != Z_STREAM_END) {
-		printf("inflate returned %d msg: %s\n\r", r, s.msg);
-		exit();
-	}
-	*lenp = s.next_out - (unsigned char *) dst;
-	zlib_inflateEnd(&s);
-}
-
 static int is_elf64(void *hdr)
 {
 	Elf64_Ehdr *elf64 = hdr;
@@ -132,8 +75,8 @@ static int is_elf64(void *hdr)
 		return 0;
 
 	elfoffset = (unsigned long)elf64ph->p_offset;
-	vmlinux.size = (unsigned long)elf64ph->p_filesz + elfoffset;
-	vmlinux.memsize = (unsigned long)elf64ph->p_memsz + elfoffset;
+	vmlinux.size = (unsigned long)elf64ph->p_filesz;
+	vmlinux.memsize = (unsigned long)elf64ph->p_memsz;
 
 	is_64bit = 1;
 	return 1;
@@ -164,8 +107,8 @@ static int is_elf32(void *hdr)
 		return 0;
 
 	elfoffset = elf32ph->p_offset;
-	vmlinux.size = elf32ph->p_filesz + elf32ph->p_offset;
-	vmlinux.memsize = elf32ph->p_memsz + elf32ph->p_offset;
+	vmlinux.size = elf32ph->p_filesz;
+	vmlinux.memsize = elf32ph->p_memsz;
 	return 1;
 }
 
@@ -177,13 +120,8 @@ static void prep_kernel(unsigned long a1
 	vmlinuz.size = (unsigned long)(_vmlinux_end - _vmlinux_start);
 
 	/* gunzip the ELF header of the kernel */
-	if (*(unsigned short *)vmlinuz.addr == 0x1f8b) {
-		len = vmlinuz.size;
-		gunzip(elfheader, sizeof(elfheader),
-				(unsigned char *)vmlinuz.addr, &len);
-	} else
-		memcpy(elfheader, (const void *)vmlinuz.addr,
-		       sizeof(elfheader));
+	gunzip_start(&gzstate, (void *)vmlinuz.addr, vmlinuz.size);
+	gunzip_exactly(&gzstate, elfheader, sizeof(elfheader));
 
 	if (!is_elf64(elfheader) && !is_elf32(elfheader)) {
 		printf("Error: not a valid PPC32 or PPC64 ELF file!\n\r");
@@ -192,10 +130,10 @@ static void prep_kernel(unsigned long a1
 	if (platform_ops.image_hdr)
 		platform_ops.image_hdr(elfheader);
 
-	/* We need to alloc the memsize plus the file offset since gzip
-	 * will expand the header (file offset), then the kernel, then
-	 * possible rubbish we don't care about. But the kernel bss must
-	 * be claimed (it will be zero'd by the kernel itself)
+	/* We need to alloc the memsize: gzip will expand the kernel
+	 * text/data, then possible rubbish we don't care about. But
+	 * the kernel bss must be claimed (it will be zero'd by the
+	 * kernel itself)
 	 */
 	printf("Allocating 0x%lx bytes for kernel ...\n\r", vmlinux.memsize);
 	vmlinux.addr = (unsigned long)malloc(vmlinux.memsize);
@@ -237,24 +175,13 @@ static void prep_kernel(unsigned long a1
 	}
 
 	/* Eventually gunzip the kernel */
-	if (*(unsigned short *)vmlinuz.addr == 0x1f8b) {
-		printf("gunzipping (0x%lx <- 0x%lx:0x%0lx)...",
-		       vmlinux.addr, vmlinuz.addr, vmlinuz.addr+vmlinuz.size);
-		len = vmlinuz.size;
-		gunzip((void *)vmlinux.addr, vmlinux.memsize,
-			(unsigned char *)vmlinuz.addr, &len);
-		printf("done 0x%lx bytes\n\r", len);
-	} else {
-		memmove((void *)vmlinux.addr,(void *)vmlinuz.addr,
-			vmlinuz.size);
-	}
-
-	/* Skip over the ELF header */
-#ifdef DEBUG
-	printf("... skipping 0x%lx bytes of ELF header\n\r",
-			elfoffset);
-#endif
-	vmlinux.addr += elfoffset;
+	printf("gunzipping (0x%lx <- 0x%lx:0x%0lx)...",
+	       vmlinux.addr, vmlinuz.addr, vmlinuz.addr+vmlinuz.size);
+	/* discard up to the actual load data */
+	gunzip_discard(&gzstate, elfoffset - sizeof(elfheader));
+	len = gunzip_finish(&gzstate, (void *)vmlinux.addr,
+			    vmlinux.memsize);
+	printf("done 0x%lx bytes\n\r", len);
 
 	flush_cache((void *)vmlinux.addr, vmlinux.size);
 }
Index: working-2.6/arch/powerpc/boot/Makefile
===================================================================
--- working-2.6.orig/arch/powerpc/boot/Makefile	2007-02-19 13:51:30.000000000 +1100
+++ working-2.6/arch/powerpc/boot/Makefile	2007-02-19 14:00:50.000000000 +1100
@@ -41,7 +41,8 @@ $(addprefix $(obj)/,$(zlib) main.o): $(a
 		$(addprefix $(obj)/,$(zlibheader))
 
 src-wlib := string.S stdio.c main.c flatdevtree.c flatdevtree_misc.c \
-		ns16550.c serial.c simple_alloc.c div64.S util.S $(zlib)
+		ns16550.c serial.c simple_alloc.c div64.S util.S \
+		gunzip_util.c $(zlib)
 src-plat := of.c
 src-boot := crt0.S $(src-wlib) $(src-plat) empty.c
 
Index: working-2.6/arch/powerpc/boot/gunzip_util.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ working-2.6/arch/powerpc/boot/gunzip_util.h	2007-02-19 13:51:52.000000000 +1100
@@ -0,0 +1,30 @@
+/*
+ * Decompression convenience functions
+ *
+ * Copyright 2007 David Gibson, IBM Corporation.
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+#ifndef _PPC_BOOT_GUNZIP_UTIL_H_
+#define _PPC_BOOT_GUNZIP_UTIL_H_
+
+#include "zlib.h"
+
+/* scratch space for gunzip; 46912 is from zlib_inflate_workspacesize() */
+#define GUNZIP_SCRATCH_SIZE	46912
+
+struct gunzip_state {
+	z_stream s;
+	char scratch[46912];
+};
+
+void gunzip_start(struct gunzip_state *state, void *src, int srclen);
+int gunzip_partial(struct gunzip_state *state, void *dst, int dstlen);
+void gunzip_exactly(struct gunzip_state *state, void *dst, int len);
+void gunzip_discard(struct gunzip_state *state, int len);
+int gunzip_finish(struct gunzip_state *state, void *dst, int len);
+
+#endif /* _PPC_BOOT_GUNZIP_UTIL_H_ */
+

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 7/15] zImage: Cleanup and improve prep_kernel()
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (2 preceding siblings ...)
  2007-03-05  3:24 ` [PATCH 3/15] Define FIXED_PORT flag for serial_core David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-05  3:24 ` [PATCH 5/15] Re-organize Kconfig code for 4xx in arch/powerpc David Gibson
                   ` (12 subsequent siblings)
  16 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

This patch rewrites prep_kernel() in the zImage wrapper code to be
clearer and more flexible.  Notable changes:

	- Handling of the initrd image from prep_kernel() has moved
into a new prep_initrd() function.
	- The address of the initrd image is now added as device tree
properties, as the kernel expects.
	- We only copy a packaged initrd image to a new location if it
is in danger of being clobbered when the kernel moves to its final
location, instead of always.
	- By default we decompress the kernel directly to address 0,
instead of requiring it to relocate itself.  Platforms (such as OF)
where doing this could clobber still-live firmware data structures can
override the vmlinux_alloc hook to provide an alternate place to
decompress the kernel.
	- We no longer pass lots of information between functions in
global variables.

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---

 arch/powerpc/boot/main.c |  171 ++++++++++++++++++++++++++++-------------------
 arch/powerpc/boot/of.c   |   12 +++
 arch/powerpc/boot/ops.h  |    1 
 3 files changed, 116 insertions(+), 68 deletions(-)

Index: working-2.6/arch/powerpc/boot/main.c
===================================================================
--- working-2.6.orig/arch/powerpc/boot/main.c	2007-02-19 14:01:15.000000000 +1100
+++ working-2.6/arch/powerpc/boot/main.c	2007-02-19 14:01:38.000000000 +1100
@@ -33,24 +33,21 @@ extern char _dtb_end[];
 static struct gunzip_state gzstate;
 
 struct addr_range {
-	unsigned long addr;
+	void *addr;
 	unsigned long size;
-	unsigned long memsize;
 };
-static struct addr_range vmlinux;
-static struct addr_range vmlinuz;
-static struct addr_range initrd;
-
-static unsigned long elfoffset;
-static int is_64bit;
 
-static char elfheader[256];
+struct elf_info {
+	unsigned long loadsize;
+	unsigned long memsize;
+	unsigned long elfoffset;
+};
 
 typedef void (*kernel_entry_t)(unsigned long, unsigned long, void *);
 
 #undef DEBUG
 
-static int is_elf64(void *hdr)
+static int parse_elf64(void *hdr, struct elf_info *info)
 {
 	Elf64_Ehdr *elf64 = hdr;
 	Elf64_Phdr *elf64ph;
@@ -74,15 +71,14 @@ static int is_elf64(void *hdr)
 	if (i >= (unsigned int)elf64->e_phnum)
 		return 0;
 
-	elfoffset = (unsigned long)elf64ph->p_offset;
-	vmlinux.size = (unsigned long)elf64ph->p_filesz;
-	vmlinux.memsize = (unsigned long)elf64ph->p_memsz;
+	info->loadsize = (unsigned long)elf64ph->p_filesz;
+	info->memsize = (unsigned long)elf64ph->p_memsz;
+	info->elfoffset = (unsigned long)elf64ph->p_offset;
 
-	is_64bit = 1;
 	return 1;
 }
 
-static int is_elf32(void *hdr)
+static int parse_elf32(void *hdr, struct elf_info *info)
 {
 	Elf32_Ehdr *elf32 = hdr;
 	Elf32_Phdr *elf32ph;
@@ -98,7 +94,6 @@ static int is_elf32(void *hdr)
 	      elf32->e_machine         == EM_PPC))
 		return 0;
 
-	elf32 = (Elf32_Ehdr *)elfheader;
 	elf32ph = (Elf32_Phdr *) ((unsigned long)elf32 + elf32->e_phoff);
 	for (i = 0; i < elf32->e_phnum; i++, elf32ph++)
 		if (elf32ph->p_type == PT_LOAD)
@@ -106,24 +101,26 @@ static int is_elf32(void *hdr)
 	if (i >= elf32->e_phnum)
 		return 0;
 
-	elfoffset = elf32ph->p_offset;
-	vmlinux.size = elf32ph->p_filesz;
-	vmlinux.memsize = elf32ph->p_memsz;
+	info->loadsize = elf32ph->p_filesz;
+	info->memsize = elf32ph->p_memsz;
+	info->elfoffset = elf32ph->p_offset;
 	return 1;
 }
 
-static void prep_kernel(unsigned long a1, unsigned long a2)
+static struct addr_range prep_kernel(void)
 {
+	char elfheader[256];
+	void *vmlinuz_addr = _vmlinux_start;
+	unsigned long vmlinuz_size = _vmlinux_end - _vmlinux_start;
+	void *addr = 0;
+	struct elf_info ei;
 	int len;
 
-	vmlinuz.addr = (unsigned long)_vmlinux_start;
-	vmlinuz.size = (unsigned long)(_vmlinux_end - _vmlinux_start);
-
 	/* gunzip the ELF header of the kernel */
-	gunzip_start(&gzstate, (void *)vmlinuz.addr, vmlinuz.size);
+	gunzip_start(&gzstate, vmlinuz_addr, vmlinuz_size);
 	gunzip_exactly(&gzstate, elfheader, sizeof(elfheader));
 
-	if (!is_elf64(elfheader) && !is_elf32(elfheader)) {
+	if (!parse_elf64(elfheader, &ei) && !parse_elf32(elfheader, &ei)) {
 		printf("Error: not a valid PPC32 or PPC64 ELF file!\n\r");
 		exit();
 	}
@@ -135,55 +132,92 @@ static void prep_kernel(unsigned long a1
 	 * the kernel bss must be claimed (it will be zero'd by the
 	 * kernel itself)
 	 */
-	printf("Allocating 0x%lx bytes for kernel ...\n\r", vmlinux.memsize);
-	vmlinux.addr = (unsigned long)malloc(vmlinux.memsize);
-	if (vmlinux.addr == 0) {
-		printf("Can't allocate memory for kernel image !\n\r");
-		exit();
+	printf("Allocating 0x%lx bytes for kernel ...\n\r", ei.memsize);
+
+	if (platform_ops.vmlinux_alloc) {
+		addr = platform_ops.vmlinux_alloc(ei.memsize);
+	} else {
+		if ((unsigned long)_start < ei.memsize) {
+			printf("Insufficient memory for kernel at address 0!"
+			       " (_start=%lx)\n\r", _start);
+			exit();
+		}
 	}
 
+	/* Finally, gunzip the kernel */
+	printf("gunzipping (0x%p <- 0x%p:0x%p)...", addr,
+	       vmlinuz_addr, vmlinuz_addr+vmlinuz_size);
+	/* discard up to the actual load data */
+	gunzip_discard(&gzstate, ei.elfoffset - sizeof(elfheader));
+	len = gunzip_finish(&gzstate, addr, ei.memsize);
+	printf("done 0x%lx bytes\n\r", len);
+
+	flush_cache(addr, ei.loadsize);
+
+	return (struct addr_range){addr, ei.memsize};
+}
+
+static struct addr_range prep_initrd(struct addr_range vmlinux,
+				     unsigned long initrd_addr,
+				     unsigned long initrd_size)
+{
+	void *devp;
+	u32 initrd_start, initrd_end;
+
+	/* If we have an image attached to us, it overrides anything
+	 * supplied by the loader. */
+	if (_initrd_end > _initrd_start) {
+		printf("Attached initrd image at 0x%p-0x%p\n\r",
+		       _initrd_start, _initrd_end);
+		initrd_addr = (unsigned long)_initrd_start;
+		initrd_size = _initrd_end - _initrd_start;
+	} else if (initrd_size > 0) {
+		printf("Using loader supplied ramdisk at 0x%lx-0x%lx\n\r",
+		       initrd_addr, initrd_addr + initrd_size);
+	}
+
+	/* If there's no initrd at all, we're done */
+	if (! initrd_size)
+		return (struct addr_range){0, 0};
+
 	/*
-	 * Now find the initrd
-	 *
-	 * First see if we have an image attached to us.  If so
-	 * allocate memory for it and copy it there.
+	 * If the initrd is too low it will be clobbered when the
+	 * kernel relocates to its final location.  In this case,
+	 * allocate a safer place and move it.
 	 */
-	initrd.size = (unsigned long)(_initrd_end - _initrd_start);
-	initrd.memsize = initrd.size;
-	if (initrd.size > 0) {
+	if (initrd_addr < vmlinux.size) {
+		void *old_addr = (void *)initrd_addr;
+
 		printf("Allocating 0x%lx bytes for initrd ...\n\r",
-		       initrd.size);
-		initrd.addr = (unsigned long)malloc((u32)initrd.size);
-		if (initrd.addr == 0) {
+		       initrd_size);
+		initrd_addr = (unsigned long)malloc(initrd_size);
+		if (! initrd_addr) {
 			printf("Can't allocate memory for initial "
-					"ramdisk !\n\r");
+			       "ramdisk !\n\r");
 			exit();
 		}
-		printf("initial ramdisk moving 0x%lx <- 0x%lx "
-			"(0x%lx bytes)\n\r", initrd.addr,
-			(unsigned long)_initrd_start, initrd.size);
-		memmove((void *)initrd.addr, (void *)_initrd_start,
-			initrd.size);
-		printf("initrd head: 0x%lx\n\r",
-				*((unsigned long *)initrd.addr));
-	} else if (a2 != 0) {
-		/* Otherwise, see if yaboot or another loader gave us an initrd */
-		initrd.addr = a1;
-		initrd.memsize = initrd.size = a2;
-		printf("Using loader supplied initrd at 0x%lx (0x%lx bytes)\n\r",
-		       initrd.addr, initrd.size);
-	}
-
-	/* Eventually gunzip the kernel */
-	printf("gunzipping (0x%lx <- 0x%lx:0x%0lx)...",
-	       vmlinux.addr, vmlinuz.addr, vmlinuz.addr+vmlinuz.size);
-	/* discard up to the actual load data */
-	gunzip_discard(&gzstate, elfoffset - sizeof(elfheader));
-	len = gunzip_finish(&gzstate, (void *)vmlinux.addr,
-			    vmlinux.memsize);
-	printf("done 0x%lx bytes\n\r", len);
+		printf("Relocating initrd 0x%p <- 0x%p (0x%lx bytes)\n\r",
+		       initrd_addr, old_addr, initrd_size);
+		memmove((void *)initrd_addr, old_addr, initrd_size);
+	}
+
+	printf("initrd head: 0x%lx\n\r", *((unsigned long *)initrd_addr));
+
+	/* Tell the kernel initrd address via device tree */
+	devp = finddevice("/chosen");
+	if (! devp) {
+		printf("Device tree has no chosen node!\n\r");
+		exit();
+	}
+
+	initrd_start = (u32)initrd_addr;
+	initrd_end = (u32)initrd_addr + initrd_size;
+
+	setprop(devp, "linux,initrd-start", &initrd_start,
+		sizeof(initrd_start));
+	setprop(devp, "linux,initrd-end", &initrd_end, sizeof(initrd_end));
 
-	flush_cache((void *)vmlinux.addr, vmlinux.size);
+	return (struct addr_range){(void *)initrd_addr, initrd_size};
 }
 
 /* A buffer that may be edited by tools operating on a zImage binary so as to
@@ -223,6 +257,7 @@ struct console_ops console_ops;
 
 void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
 {
+	struct addr_range vmlinux, initrd;
 	kernel_entry_t kentry;
 	char cmdline[COMMAND_LINE_SIZE];
 	unsigned long ft_addr = 0;
@@ -242,7 +277,8 @@ void start(unsigned long a1, unsigned lo
 	printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r",
 	       _start, sp);
 
-	prep_kernel(a1, a2);
+	vmlinux = prep_kernel();
+	initrd = prep_initrd(vmlinux, a1, a2);
 
 	/* If cmdline came from zimage wrapper or if we can edit the one
 	 * in the dt, print it out and edit it, if possible.
@@ -271,8 +307,7 @@ void start(unsigned long a1, unsigned lo
 	if (ft_addr)
 		kentry(ft_addr, 0, NULL);
 	else
-		/* XXX initrd addr/size should be passed in properties */
-		kentry(initrd.addr, initrd.size, promptr);
+		kentry((unsigned long)initrd.addr, initrd.size, promptr);
 
 	/* console closed so printf below may not work */
 	printf("Error: Linux kernel returned to zImage boot wrapper!\n\r");
Index: working-2.6/arch/powerpc/boot/ops.h
===================================================================
--- working-2.6.orig/arch/powerpc/boot/ops.h	2007-02-19 14:00:51.000000000 +1100
+++ working-2.6/arch/powerpc/boot/ops.h	2007-02-19 14:01:38.000000000 +1100
@@ -25,6 +25,7 @@ struct platform_ops {
 	void	(*free)(void *ptr);
 	void *	(*realloc)(void *ptr, unsigned long size);
 	void	(*exit)(void);
+	void *	(*vmlinux_alloc)(unsigned long size);
 };
 extern struct platform_ops platform_ops;
 
Index: working-2.6/arch/powerpc/boot/of.c
===================================================================
--- working-2.6.orig/arch/powerpc/boot/of.c	2007-02-19 14:00:51.000000000 +1100
+++ working-2.6/arch/powerpc/boot/of.c	2007-02-19 14:01:38.000000000 +1100
@@ -208,6 +208,17 @@ static void of_image_hdr(const void *hdr
 	}
 }
 
+static void *of_vmlinux_alloc(unsigned long size)
+{
+	void *p = malloc(size);
+
+	if (!p) {
+		printf("Can't allocate memory for kernel image!\n\r");
+		exit();
+	}
+	return p;
+}
+
 static void of_exit(void)
 {
 	call_prom("exit", 0, 0);
@@ -261,6 +272,7 @@ int platform_init(void *promptr, char *d
 	platform_ops.image_hdr = of_image_hdr;
 	platform_ops.malloc = of_try_claim;
 	platform_ops.exit = of_exit;
+	platform_ops.vmlinux_alloc = of_vmlinux_alloc;
 
 	dt_ops.finddevice = of_finddevice;
 	dt_ops.getprop = of_getprop;

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (6 preceding siblings ...)
  2007-03-05  3:24 ` [PATCH 4/15] Use resource_size_t for serial port IO addresses David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-15 22:35   ` Mark A. Greer
  2007-03-15 23:02   ` Mark A. Greer
  2007-03-05  3:24 ` [PATCH 9/15] Add arch/powerpc driver for UIC, PPC4xx interrupt controller David Gibson
                   ` (8 subsequent siblings)
  16 siblings, 2 replies; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

This patch re-organises the way the zImage wrapper code is entered, to
allow more flexibility on platforms with unusual entry conditions.
After this patch, a platform .o file has two options:

1) It can define a _zimage_start, in which case the platform code gets
   control from the very beginning of execution.  In this case the
   platform code is responsible for relocating the zImage if necessary,
   clearing the BSS, performing any platform specific initialization, and
   finally calling start() to load and enter the kernel.

2) It can define platform_init().  In this case the generic crt0.S
   handles initial entry, and calls platform_init() before calling
   start().  The signature of platform_init() is changed, however, to
   take up to 5 parameters (in r3..r7) as they come from the platform's
   initial loader, instead of a fixed set of parameters based on OF's
   usage.

   When using the generic crt0.S, the platform .o can optionally
   supply a custom stack to use, using the BSS_STACK() macro.  If this
   is not supplied, the crt0.S will assume that the loader has
   supplied a usable stack.

In either case, the platform code communicates information to the
generic code (specifically, a PROM pointer for OF systems, and/or an
initrd image address supplied by the bootloader) via a global
structure "loader_info".

In addition the wrapper script is rearranged to ensure that the
platform .o is always linked first.  This means that platforms where
the zImage entry point is at a fixed address or offset, rather than
being encoded in the binary header can be supported using option (1).

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---

 arch/powerpc/boot/Makefile          |    6 +++---
 arch/powerpc/boot/crt0.S            |   32 +++++++++++++++++++++++++++++---
 arch/powerpc/boot/main.c            |   18 +++++++-----------
 arch/powerpc/boot/of.c              |    6 ++++--
 arch/powerpc/boot/ops.h             |   12 +++++++++++-
 arch/powerpc/boot/wrapper           |    6 ++++--
 arch/powerpc/boot/zImage.coff.lds.S |    3 ++-
 arch/powerpc/boot/zImage.lds.S      |    1 +
 8 files changed, 61 insertions(+), 23 deletions(-)

Index: working-2.6/arch/powerpc/boot/crt0.S
===================================================================
--- working-2.6.orig/arch/powerpc/boot/crt0.S	2007-02-19 14:00:50.000000000 +1100
+++ working-2.6/arch/powerpc/boot/crt0.S	2007-02-19 14:01:43.000000000 +1100
@@ -16,6 +16,7 @@
 _zimage_start_opd:
 	.long	_zimage_start, 0, 0, 0
 
+	.weak	_zimage_start
 	.globl	_zimage_start
 _zimage_start:
 	/* Work out the offset between the address we were linked at
@@ -44,7 +45,7 @@ _zimage_start:
 	addi	r9,r9,4
 	bdnz	2b
 
-	/* Do a cache flush for our text, in case OF didn't */
+	/* Do a cache flush for our text, in case the loader didn't */
 3:	lis	r9,_start@ha
 	addi	r9,r9,_start@l
 	add	r9,r0,r9
@@ -59,6 +60,31 @@ _zimage_start:
 	sync
 	isync
 
-	mr	r6,r1
-	b	start
+	/* Clear the BSS */
+	lis	r9,__bss_start@ha
+	addi	r9,r9,__bss_start@l
+	lis	r8,_end@ha
+	addi	r8,r8,_end@l
+	li	r0,0
+5:	stw	r0,0(r9)
+	addi	r9,r9,4
+	cmplw	cr0,r9,r8
+	blt	5b
 
+	/* Possibly set up a custom stack */
+.weak	_platform_stack_top
+	lis	r8,_platform_stack_top@ha
+	addi	r8,r8,_platform_stack_top@l
+	cmpwi	r8,0
+	beq	6f
+	lwz	r1,0(r8)
+	li	r0,0
+	stwu	r0,-16(r1)	/* establish a stack frame */
+6:
+
+	/* Call platform_init() */
+	bl	platform_init
+
+	/* Call start */
+	mr	r3,r1
+	b	start
Index: working-2.6/arch/powerpc/boot/ops.h
===================================================================
--- working-2.6.orig/arch/powerpc/boot/ops.h	2007-02-19 14:01:38.000000000 +1100
+++ working-2.6/arch/powerpc/boot/ops.h	2007-02-19 14:01:43.000000000 +1100
@@ -59,7 +59,13 @@ struct serial_console_data {
 	void		(*close)(void);
 };
 
-int platform_init(void *promptr, char *dt_blob_start, char *dt_blob_end);
+struct loader_info {
+	void *promptr;
+	unsigned long initrd_addr, initrd_size;
+};
+extern struct loader_info loader_info;
+
+void start(void *sp);
 int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device);
 int serial_console_init(void);
 int ns16550_console_init(void *devp, struct serial_console_data *scdp);
@@ -100,4 +106,8 @@ static inline void exit(void)
 	for(;;);
 }
 
+#define BSS_STACK(size) \
+	static char _bss_stack[size]; \
+	void *_platform_stack_top = _bss_stack + sizeof(_bss_stack);
+
 #endif /* _PPC_BOOT_OPS_H_ */
Index: working-2.6/arch/powerpc/boot/main.c
===================================================================
--- working-2.6.orig/arch/powerpc/boot/main.c	2007-02-19 14:01:38.000000000 +1100
+++ working-2.6/arch/powerpc/boot/main.c	2007-02-19 14:01:43.000000000 +1100
@@ -254,21 +254,15 @@ static void set_cmdline(char *buf)
 struct platform_ops platform_ops;
 struct dt_ops dt_ops;
 struct console_ops console_ops;
+struct loader_info loader_info;
 
-void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
+void start(void *sp)
 {
 	struct addr_range vmlinux, initrd;
 	kernel_entry_t kentry;
 	char cmdline[COMMAND_LINE_SIZE];
 	unsigned long ft_addr = 0;
 
-	memset(__bss_start, 0, _end - __bss_start);
-	memset(&platform_ops, 0, sizeof(platform_ops));
-	memset(&dt_ops, 0, sizeof(dt_ops));
-	memset(&console_ops, 0, sizeof(console_ops));
-
-	if (platform_init(promptr, _dtb_start, _dtb_end))
-		exit();
 	if (console_ops.open && (console_ops.open() < 0))
 		exit();
 	if (platform_ops.fixups)
@@ -278,7 +272,8 @@ void start(unsigned long a1, unsigned lo
 	       _start, sp);
 
 	vmlinux = prep_kernel();
-	initrd = prep_initrd(vmlinux, a1, a2);
+	initrd = prep_initrd(vmlinux, loader_info.initrd_addr,
+			     loader_info.initrd_size);
 
 	/* If cmdline came from zimage wrapper or if we can edit the one
 	 * in the dt, print it out and edit it, if possible.
@@ -298,7 +293,7 @@ void start(unsigned long a1, unsigned lo
 	if (ft_addr)
 		printf(" flat tree at 0x%lx\n\r", ft_addr);
 	else
-		printf(" using OF tree (promptr=%p)\n\r", promptr);
+		printf(" using OF tree (promptr=%p)\n\r", loader_info.promptr);
 
 	if (console_ops.close)
 		console_ops.close();
@@ -307,7 +302,8 @@ void start(unsigned long a1, unsigned lo
 	if (ft_addr)
 		kentry(ft_addr, 0, NULL);
 	else
-		kentry((unsigned long)initrd.addr, initrd.size, promptr);
+		kentry((unsigned long)initrd.addr, initrd.size,
+		       loader_info.promptr);
 
 	/* console closed so printf below may not work */
 	printf("Error: Linux kernel returned to zImage boot wrapper!\n\r");
Index: working-2.6/arch/powerpc/boot/of.c
===================================================================
--- working-2.6.orig/arch/powerpc/boot/of.c	2007-02-19 14:01:38.000000000 +1100
+++ working-2.6/arch/powerpc/boot/of.c	2007-02-19 14:01:43.000000000 +1100
@@ -267,7 +267,7 @@ static void of_console_write(char *buf, 
 	call_prom("write", 3, 1, of_stdout_handle, buf, len);
 }
 
-int platform_init(void *promptr, char *dt_blob_start, char *dt_blob_end)
+void platform_init(unsigned long a1, unsigned long a2, void *promptr)
 {
 	platform_ops.image_hdr = of_image_hdr;
 	platform_ops.malloc = of_try_claim;
@@ -282,5 +282,7 @@ int platform_init(void *promptr, char *d
 	console_ops.write = of_console_write;
 
 	prom = (int (*)(void *))promptr;
-	return 0;
+	loader_info.promptr = promptr;
+	loader_info.initrd_addr = a1;
+	loader_info.initrd_size = a2;
 }
Index: working-2.6/arch/powerpc/boot/Makefile
===================================================================
--- working-2.6.orig/arch/powerpc/boot/Makefile	2007-02-19 14:00:50.000000000 +1100
+++ working-2.6/arch/powerpc/boot/Makefile	2007-02-19 14:01:43.000000000 +1100
@@ -40,11 +40,11 @@ zliblinuxheader := zlib.h zconf.h zutil.
 $(addprefix $(obj)/,$(zlib) main.o): $(addprefix $(obj)/,$(zliblinuxheader)) \
 		$(addprefix $(obj)/,$(zlibheader))
 
-src-wlib := string.S stdio.c main.c flatdevtree.c flatdevtree_misc.c \
+src-wlib := string.S crt0.S stdio.c main.c flatdevtree.c flatdevtree_misc.c \
 		ns16550.c serial.c simple_alloc.c div64.S util.S \
 		gunzip_util.c $(zlib)
 src-plat := of.c
-src-boot := crt0.S $(src-wlib) $(src-plat) empty.c
+src-boot := $(src-wlib) $(src-plat) empty.c
 
 src-boot := $(addprefix $(obj)/, $(src-boot))
 obj-boot := $(addsuffix .o, $(basename $(src-boot)))
@@ -97,7 +97,7 @@ $(obj)/wrapper.a: $(obj-wlib)
 
 hostprogs-y	:= addnote addRamDisk hack-coff mktree
 
-extra-y		:= $(obj)/crt0.o $(obj)/wrapper.a $(obj-plat) $(obj)/empty.o \
+extra-y		:= $(obj)/wrapper.a $(obj-plat) $(obj)/empty.o \
 		   $(obj)/zImage.lds $(obj)/zImage.coff.lds
 
 wrapper		:=$(srctree)/$(src)/wrapper
Index: working-2.6/arch/powerpc/boot/wrapper
===================================================================
--- working-2.6.orig/arch/powerpc/boot/wrapper	2007-02-19 14:00:50.000000000 +1100
+++ working-2.6/arch/powerpc/boot/wrapper	2007-02-19 14:01:43.000000000 +1100
@@ -191,7 +191,7 @@ fi
 
 if [ "$platform" != "miboot" ]; then
     ${CROSS}ld -m elf32ppc -T $lds -o "$ofile" \
-	$object/crt0.o $platformo $tmp $object/wrapper.a
+	$platformo $tmp $object/wrapper.a
     rm $tmp
 fi
 
@@ -201,7 +201,9 @@ pseries|chrp)
     $object/addnote "$ofile"
     ;;
 pmaccoff)
-    ${CROSS}objcopy -O aixcoff-rs6000 --set-start 0x500000 "$ofile"
+    entry=`objdump -f "$ofile" | grep '^start address ' | \
+	cut -d' ' -f3`
+    ${CROSS}objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile"
     $object/hack-coff "$ofile"
     ;;
 esac
Index: working-2.6/arch/powerpc/boot/zImage.lds.S
===================================================================
--- working-2.6.orig/arch/powerpc/boot/zImage.lds.S	2007-02-19 14:00:50.000000000 +1100
+++ working-2.6/arch/powerpc/boot/zImage.lds.S	2007-02-19 14:01:43.000000000 +1100
@@ -1,5 +1,6 @@
 OUTPUT_ARCH(powerpc:common)
 ENTRY(_zimage_start)
+EXTERN(_zimage_start)
 SECTIONS
 {
   . = (4*1024*1024);
Index: working-2.6/arch/powerpc/boot/zImage.coff.lds.S
===================================================================
--- working-2.6.orig/arch/powerpc/boot/zImage.coff.lds.S	2007-02-19 14:00:50.000000000 +1100
+++ working-2.6/arch/powerpc/boot/zImage.coff.lds.S	2007-02-19 14:01:43.000000000 +1100
@@ -1,5 +1,6 @@
 OUTPUT_ARCH(powerpc:common)
-ENTRY(_start)
+ENTRY(_zimage_start_opd)
+EXTERN(_zimage_start_opd)
 SECTIONS
 {
   . = (5*1024*1024);

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 10/15] Add device tree for Ebony
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (8 preceding siblings ...)
  2007-03-05  3:24 ` [PATCH 9/15] Add arch/powerpc driver for UIC, PPC4xx interrupt controller David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-05 14:23   ` Josh Boyer
  2007-03-05  3:24 ` [PATCH 6/15] zImage: Add more flexible gunzip convenience functions David Gibson
                   ` (6 subsequent siblings)
  16 siblings, 1 reply; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

Add a device tree for the Ebony evaluation board (440GP based).  This
tree is not complete or finalized.  This tree needs a very recent
version of dtc to process.

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---

 arch/powerpc/boot/dts/ebony.dts |  246 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 246 insertions(+)

Index: working-2.6/arch/powerpc/boot/dts/ebony.dts
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ working-2.6/arch/powerpc/boot/dts/ebony.dts	2007-02-27 12:07:05.000000000 +1100
@@ -0,0 +1,246 @@
+/*
+ * Device Tree Source for IBM Ebony
+ *
+ * Copyright (c) 2006, 2007 IBM Corp.
+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>, David Gibson <dwg@au1.ibm.com>
+ *
+ * FIXME: Draft only!
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without
+ * any warranty of any kind, whether express or implied.
+ *
+ * To build:
+ *   dtc -I dts -O asm -o ebony.S -b 0 -V 16 ebony.dts
+ *   dtc -I dts -O dtb -o ebony.dtb -b 0 -V 16 ebony.dts
+ */
+
+/ {
+	#address-cells = <2>;
+	#size-cells = <1>;
+	model = "Ebony";
+	compatible = "Ebony";
+	dcr-parent = <&/cpus/PowerPC,440GP@0>;
+
+	cpus {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		PowerPC,440GP@0 {
+			device_type = "cpu";
+			reg = <0>;
+			clock-frequency = <0>; // Filled in by zImage
+			timebase-frequency = <0>; // Filled in by zImage
+			i-cache-line-size = <32>;
+			d-cache-line-size = <32>;
+			i-cache-size = <0>;
+			d-cache-size = <0>;
+			dcr-controller;
+			dcr-access-method = "native";
+		};
+	};
+
+	memory {
+		device_type = "memory";
+		reg = <0 0 0>; // Filled in by zImage
+	};
+
+	UIC0: interrupt-controller0 {
+		device_type = "ibm,uic";
+		compatible = "ibm,uic-440gp", "ibm,uic";
+		interrupt-controller;
+		cell-index = <0>;
+		dcr-reg = <0c0 009>;
+		#address-cells = <0>;
+		#size-cells = <0>;
+		#interrupt-cells = <2>;
+
+	};
+
+	UIC1: interrupt-controller1 {
+		device_type = "ibm,uic";
+		compatible = "ibm,uic-440gp", "ibm,uic";
+		interrupt-controller;
+		cell-index = <1>;
+		dcr-reg = <0d0 009>;
+		#address-cells = <0>;
+		#size-cells = <0>;
+		#interrupt-cells = <2>;
+		interrupts = <1e 4 1f 4>; /* cascade */
+		interrupt-parent = <&UIC0>;
+	};
+
+	CPC0: cpc {
+		device_type = "ibm,cpc";
+		compatible = "ibm,cpc-440gp";
+		dcr-reg = <0b0 003 0e0 010>;
+		// FIXME: anything else?
+	};
+
+	plb {
+		device_type = "ibm,plb";
+		compatible = "ibm,plb-440gp", "ibm,plb4";
+		#address-cells = <2>;
+		#size-cells = <1>;
+		ranges;
+		clock-frequency = <0>; // Filled in by zImage
+
+		SDRAM0: sdram {
+			device_type = "memory-controller";
+			compatible = "ibm,sdram-440gp", "ibm,sdram";
+			dcr-reg = <010 2>;
+			// FIXME: anything else?
+		};
+
+		DMA0: dma {
+			// FIXME: ???
+			device_type = "ibm,dma-4xx";
+			compatible = "ibm,dma-440gp", "ibm,dma-4xx";
+			dcr-reg = <100 027>;
+		};
+
+		MAL0: mcmal {
+			device_type = "mcmal-dma";
+			compatible = "ibm,mcmal-440gp", "ibm,mcmal";
+			dcr-reg = <180 62>;
+			num-tx-chans = <4>;
+			num-rx-chans = <4>;
+			interrupt-parent = <&MAL0>;
+			interrupts = <0 1 2 3 4>;
+			#interrupt-cells = <1>;
+			#address-cells = <0>;
+			#size-cells = <0>;
+			interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
+					 /*RXEOB*/ 1 &UIC0 b 4
+					 /*SERR*/  2 &UIC1 0 4
+					 /*TXDE*/  3 &UIC1 1 4
+					 /*RXDE*/  4 &UIC1 2 4>;
+			interrupt-map-mask = <ffffffff>;
+		};
+
+		POB0: opb@0 {
+			device_type = "ibm,opb";
+			compatible = "ibm,opb-440gp", "ibm,opb";
+			ranges;
+			dcr-reg = <090 00b>;
+			interrupt-parent = <&UIC1>;
+			interrupts = <7 4>;
+			clock-frequency = <0>; // Filled in by zImage
+
+			UART0: serial@140000200 {
+				device_type = "serial";
+				compatible = "ns16550";
+				reg = <1 40000200 8>;
+				virtual-reg = <e0000200>;
+				clock-frequency = <A8C000>;
+				current-speed = <2580>;
+				interrupt-parent = <&UIC0>;
+				interrupts = <0 4>;
+			};
+
+			UART1: serial@140000300 {
+				device_type = "serial";
+				compatible = "ns16550";
+				reg = <1 40000300 8>;
+				virtual-reg = <e0000300>;
+				clock-frequency = <A8C000>;
+				current-speed = <2580>;
+				interrupt-parent = <&UIC0>;
+				interrupts = <1 4>;
+			};
+
+			IIC0: i2c@140000400 {
+				/* FIXME */
+				device_type = "i2c";
+				compatible = "ibm,iic-440gp", "ibm,iic";
+				reg = <1 40000400 14>;
+				interrupt-parent = <&UIC0>;
+				interrupts = <2 4>;
+			};
+			IIC1: i2c@140000500 {
+				/* FIXME */
+				device_type = "i2c";
+				compatible = "ibm,iic-440gp", "ibm,iic";
+				reg = <1 40000500 14>;
+				interrupt-parent = <&UIC0>;
+				interrupts = <3 4>;
+			};
+
+			GPIO0: gpio@140000700 {
+				/* FIXME */
+				device_type = "gpio";
+				compatible = "ibm,gpio-440gp";
+				reg = <1 40000700 20>;
+			};
+
+			ZMII0: emac-zmii@140000780 {
+				device_type = "emac-zmii";
+				compatible = "ibm,zmii-440gp", "ibm,zmii";
+				reg = <1 40000780 c>;
+			};
+
+			EMAC0: ethernet@140000800 {
+				device_type = "network";
+				compatible = "ibm,emac-440gp", "ibm,emac";
+				interrupt-parent = <&UIC1>;
+				interrupts = <1c 4 1d 4>;
+				reg = <1 40000800 70>;
+				local-mac-address = [000000000000]; // Filled in by zImage
+				mal-device = <&MAL0>;
+				mal-tx-channel = <0 1>;
+				mal-rx-channel = <0>;
+				cell-index = <0>;
+				max-frame-size = <5dc>;
+				rx-fifo-size = <1000>;
+				tx-fifo-size = <800>;
+				phy-mode = "rmii";
+				phy-map = <00000001>;
+				zmii-device = <&ZMII0>;
+				zmii-channel = <0>;
+			};
+			EMAC1: ethernet@140000900 {
+				device_type = "network";
+				compatible = "ibm,emac-440gp", "ibm,emac";
+				interrupt-parent = <&UIC1>;
+				interrupts = <1e 4 1f 4>;
+				reg = <1 40000900 70>;
+				local-mac-address = [000000000000]; // Filled in by zImage
+				mal-device = <&MAL0>;
+				mal-tx-channel = <2 3>;
+				mal-rx-channel = <1>;
+				cell-index = <1>;
+				max-frame-size = <5dc>;
+				rx-fifo-size = <1000>;
+				tx-fifo-size = <800>;
+				phy-mode = "rmii";
+				phy-map = <00000001>;
+				zmii-device = <&ZMII0>;
+				zmii-channel = <1>;
+			};
+
+
+			GPT0: gpt@140000a00 {
+				/* FIXME */
+				reg = <1 40000a00 d4>;
+				interrupt-parent = <&UIC0>;
+				interrupts = <12 4 13 4 14 4 15 4 16 4>;
+			};
+
+		};
+
+		PCIX0: pci@1234 {
+			device_type = "pci";
+			/* FIXME */
+			reg = <2 0ec00000 8
+			       2 0ec80000 f0
+			       2 0ec80100 fc>;
+		};
+	};
+
+	chosen {
+		linux,stdout-path = "/plb/opb@0/serial@140000200";
+		linux,initrd-start = <0>; /* FIXME */
+		linux,initrd-end = <0>;
+	};
+};
+

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 9/15] Add arch/powerpc driver for UIC, PPC4xx interrupt controller
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (7 preceding siblings ...)
  2007-03-05  3:24 ` [PATCH 8/15] zImage: Cleanup and improve zImage entry point David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-05  3:24 ` [PATCH 10/15] Add device tree for Ebony David Gibson
                   ` (7 subsequent siblings)
  16 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

This patch adds a driver to arch/powerpc/sysdev for the UIC, the
on-chip interrupt controller from IBM/AMCC 4xx chips.  It uses the new
irq host mapping infrastructure.

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---

 arch/powerpc/sysdev/Makefile |    1 
 arch/powerpc/sysdev/uic.c    |  338 +++++++++++++++++++++++++++++++++++++++++++
 include/asm-powerpc/uic.h    |   23 ++
 3 files changed, 362 insertions(+)

Index: working-2.6/arch/powerpc/sysdev/uic.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ working-2.6/arch/powerpc/sysdev/uic.c	2007-02-21 15:54:39.000000000 +1100
@@ -0,0 +1,338 @@
+/*
+ * arch/powerpc/sysdev/uic.c
+ *
+ * IBM PowerPC 4xx Universal Interrupt Controller
+ *
+ * Copyright 2007 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/reboot.h>
+#include <linux/slab.h>
+#include <linux/stddef.h>
+#include <linux/sched.h>
+#include <linux/signal.h>
+#include <linux/sysdev.h>
+#include <linux/device.h>
+#include <linux/bootmem.h>
+#include <linux/spinlock.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <asm/irq.h>
+#include <asm/io.h>
+#include <asm/prom.h>
+#include <asm/dcr.h>
+
+#define NR_UIC_INTS	32
+
+#define UIC_SR		0x0
+#define UIC_ER		0x2
+#define UIC_CR		0x3
+#define UIC_PR		0x4
+#define UIC_TR		0x5
+#define UIC_MSR		0x6
+#define UIC_VR		0x7
+#define UIC_VCR		0x8
+
+#define uic_irq_to_hw(virq)	(irq_map[virq].hwirq)
+
+struct uic *primary_uic;
+
+struct uic {
+	int index;
+	int dcrbase;
+
+	spinlock_t lock;
+
+	/* The remapper for this UIC */
+	struct irq_host	*irqhost;
+
+	/* For secondary UICs, the cascade interrupt's irqaction */
+	struct irqaction cascade;
+
+	/* The device node of the interrupt controller */
+	struct device_node *of_node;
+};
+
+static void uic_unmask_irq(unsigned int virq)
+{
+	struct uic *uic = get_irq_chip_data(virq);
+	unsigned int src = uic_irq_to_hw(virq);
+	unsigned long flags;
+	u32 er;
+
+	spin_lock_irqsave(&uic->lock, flags);
+	er = mfdcr(uic->dcrbase + UIC_ER);
+	er |= 1 << (31 - src);
+	mtdcr(uic->dcrbase + UIC_ER, er);
+	spin_unlock_irqrestore(&uic->lock, flags);
+}
+
+static void uic_mask_irq(unsigned int virq)
+{
+	struct uic *uic = get_irq_chip_data(virq);
+	unsigned int src = uic_irq_to_hw(virq);
+	unsigned long flags;
+	u32 er;
+
+	spin_lock_irqsave(&uic->lock, flags);
+	er = mfdcr(uic->dcrbase + UIC_ER);
+	er &= ~(1 << (31 - src));
+	mtdcr(uic->dcrbase + UIC_ER, er);
+	spin_unlock_irqrestore(&uic->lock, flags);
+}
+
+static void uic_ack_irq(unsigned int virq)
+{
+	struct uic *uic = get_irq_chip_data(virq);
+	unsigned int src = uic_irq_to_hw(virq);
+	unsigned long flags;
+
+	spin_lock_irqsave(&uic->lock, flags);
+	mtdcr(uic->dcrbase + UIC_SR, 1 << (31-src));
+	spin_unlock_irqrestore(&uic->lock, flags);
+}
+
+static int uic_set_irq_type(unsigned int virq, unsigned int flow_type)
+{
+	struct uic *uic = get_irq_chip_data(virq);
+	unsigned int src = uic_irq_to_hw(virq);
+	struct irq_desc *desc = get_irq_desc(virq);
+	unsigned long flags;
+	int trigger, polarity;
+	u32 tr, pr, mask;
+
+	switch (flow_type & IRQ_TYPE_SENSE_MASK) {
+	case IRQ_TYPE_NONE:
+		uic_mask_irq(virq);
+		return 0;
+
+	case IRQ_TYPE_EDGE_RISING:
+		trigger = 1; polarity = 1;
+		break;
+	case IRQ_TYPE_EDGE_FALLING:
+		trigger = 1; polarity = 0;
+		break;
+	case IRQ_TYPE_LEVEL_HIGH:
+		trigger = 0; polarity = 1;
+		break;
+	case IRQ_TYPE_LEVEL_LOW:
+		trigger = 0; polarity = 1;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	mask = ~(1 << (31 - src));
+
+	spin_lock_irqsave(&uic->lock, flags);
+	tr = mfdcr(uic->dcrbase + UIC_TR);
+	pr = mfdcr(uic->dcrbase + UIC_PR);
+	tr = (tr & mask) | (trigger << (31-src));
+	pr = (pr & mask) | (polarity << (31-src));
+
+	mtdcr(uic->dcrbase + UIC_PR, pr);
+	mtdcr(uic->dcrbase + UIC_TR, tr);
+
+	desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);
+	desc->status |= flow_type & IRQ_TYPE_SENSE_MASK;
+	if (trigger)
+		desc->status |= IRQ_LEVEL;
+
+	spin_unlock_irqrestore(&uic->lock, flags);
+
+	return 0;
+}
+
+static struct irq_chip uic_irq_chip = {
+	.typename	= " UIC  ",
+	.unmask		= uic_unmask_irq,
+	.mask		= uic_mask_irq,
+/* 	.mask_ack	= uic_mask_irq_and_ack, */
+	.ack		= uic_ack_irq,
+	.set_type	= uic_set_irq_type,
+};
+
+static int uic_host_match(struct irq_host *h, struct device_node *node)
+{
+	struct uic *uic = h->host_data;
+	return uic->of_node == node;
+}
+
+static int uic_host_map(struct irq_host *h, unsigned int virq,
+			irq_hw_number_t hw)
+{
+	struct uic *uic = h->host_data;
+
+	set_irq_chip_data(virq, uic);
+	/* Despite the name, handle_level_irq() works for both level
+	 * and edge irqs on UIC.  FIXME: check this is correct */
+	set_irq_chip_and_handler(virq, &uic_irq_chip, handle_level_irq);
+
+	/* Set default irq type */
+	set_irq_type(virq, IRQ_TYPE_NONE);
+
+	return 0;
+}
+
+static int uic_host_xlate(struct irq_host *h, struct device_node *ct,
+			  u32 *intspec, unsigned int intsize,
+			  irq_hw_number_t *out_hwirq, unsigned int *out_type)
+
+{
+	/* UIC intspecs must have 2 cells */
+	BUG_ON(intsize != 2);
+	*out_hwirq = intspec[0];
+	*out_type = intspec[1];
+	return 0;
+}
+
+static struct irq_host_ops uic_host_ops = {
+	.match	= uic_host_match,
+	.map	= uic_host_map,
+	.xlate	= uic_host_xlate,
+};
+
+irqreturn_t uic_cascade(int virq, void *data)
+{
+	struct uic *uic = data;
+	u32 msr;
+	int src;
+	int subvirq;
+
+	msr = mfdcr(uic->dcrbase + UIC_MSR);
+	src = 32 - ffs(msr);
+
+	subvirq = irq_linear_revmap(uic->irqhost, src);
+	generic_handle_irq(subvirq);
+
+	return IRQ_HANDLED;
+}
+
+static struct uic * __init uic_init_one(struct device_node *node)
+{
+	struct uic *uic;
+	const u32 *indexp, *dcrreg;
+	int len;
+
+	BUG_ON(! device_is_compatible(node, "ibm,uic"));
+
+	uic = alloc_bootmem(sizeof(*uic));
+	if (! uic)
+		return NULL; /* FIXME: panic? */
+
+	memset(uic, 0, sizeof(*uic));
+	uic->of_node = of_node_get(node);
+	indexp = get_property(node, "cell-index", &len);
+	if (!indexp || (len != sizeof(u32))) {
+		printk(KERN_ERR "uic: Device node %s has missing or invalid "
+		       "cell-index property\n", node->full_name);
+		return NULL;
+	}
+	uic->index = *indexp;
+
+	dcrreg = get_property(node, "dcr-reg", &len);
+	if (!dcrreg || (len != 2*sizeof(u32))) {
+		printk(KERN_ERR "uic: Device node %s has missing or invalid "
+		       "dcr-reg property\n", node->full_name);
+		return NULL;
+	}
+	uic->dcrbase = *dcrreg;
+
+	uic->irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR, NR_UIC_INTS,
+				      &uic_host_ops, -1);
+	if (! uic->irqhost) {
+		of_node_put(node);
+		return NULL; /* FIXME: panic? */
+	}
+
+	uic->irqhost->host_data = uic;
+
+	/* Start with all interrupts disable and non-critical */
+	mtdcr(uic->dcrbase + UIC_ER, 0);
+	mtdcr(uic->dcrbase + UIC_CR, 0);
+
+	printk ("UIC%d (%d IRQ sources) at DCR 0x%x\n", uic->index,
+		NR_UIC_INTS, uic->dcrbase);
+
+	return uic;
+}
+
+void __init uic_init_tree(void)
+{
+	struct device_node *np;
+	struct uic *uic;
+	const u32 *interrupts;
+
+	/* First locate and initialize the top-level UIC */
+
+	np = of_find_compatible_node(NULL, NULL, "ibm,uic");
+	while (np) {
+		interrupts = get_property(np, "interrupts", NULL);
+		if (! interrupts)
+			break;
+
+		np = of_find_compatible_node(np, NULL, "ibm,uic");
+	}
+
+	BUG_ON(!np); /* uic_init_tree() assumes there's a UIC as the
+		      * top-level interrupt controller */
+	primary_uic = uic_init_one(np);
+	if (! primary_uic)
+		panic("Unable to initialize primary UIC %s\n", np->full_name);
+
+	irq_set_default_host(primary_uic->irqhost);
+	of_node_put(np);
+
+	/* The scan again for cascaded UICs */
+	np = of_find_compatible_node(NULL, NULL, "ibm,uic");
+	while (np) {
+		interrupts = get_property(np, "interrupts", NULL);
+		if (interrupts) {
+			/* Secondary UIC */
+			int cascade_virq;
+			int ret;
+
+			uic = uic_init_one(np);
+			if (! uic)
+				panic("Unable to initialize a secondary UIC %s\n",
+				      np->full_name);
+
+			cascade_virq = irq_of_parse_and_map(np, 0);
+
+			uic->cascade.handler = uic_cascade;
+			uic->cascade.name = "UIC cascade";
+			uic->cascade.dev_id = uic;
+
+			ret = setup_irq(cascade_virq, &uic->cascade);
+			if (ret)
+				printk(KERN_ERR "Failed to setup_irq(%d) for "
+				       "UIC%d cascade\n", cascade_virq,
+				       uic->index);
+
+			/* FIXME: setup critical cascade?? */
+		}
+
+		np = of_find_compatible_node(np, NULL, "ibm,uic");
+	}
+}
+
+/* Return an interrupt vector or NO_IRQ if no interrupt is pending. */
+unsigned int uic_get_irq(void)
+{
+	u32 msr;
+	int src;
+
+	BUG_ON(! primary_uic);
+
+	msr = mfdcr(primary_uic->dcrbase + UIC_MSR);
+	src = 32 - ffs(msr);
+
+	return irq_linear_revmap(primary_uic->irqhost, src);
+}
Index: working-2.6/arch/powerpc/sysdev/Makefile
===================================================================
--- working-2.6.orig/arch/powerpc/sysdev/Makefile	2007-02-19 11:05:31.000000000 +1100
+++ working-2.6/arch/powerpc/sysdev/Makefile	2007-02-21 15:35:25.000000000 +1100
@@ -17,6 +17,7 @@ obj-$(CONFIG_QUICC_ENGINE)	+= qe_lib/
 ifeq ($(CONFIG_PPC_MERGE),y)
 obj-$(CONFIG_PPC_I8259)		+= i8259.o
 obj-$(CONFIG_PPC_83xx)		+= ipic.o
+obj-$(CONFIG_4xx)		+= uic.o
 endif
 
 # Temporary hack until we have migrated to asm-powerpc
Index: working-2.6/include/asm-powerpc/uic.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ working-2.6/include/asm-powerpc/uic.h	2007-02-21 15:35:25.000000000 +1100
@@ -0,0 +1,23 @@
+/*
+ * include/asm-powerpc/uic.h
+ *
+ * IBM PPC4xx UIC external definitions and structure.
+ *
+ * Maintainer: David Gibson <dwg@au1.ibm.com>
+ * Copyright 2007 IBM Corporation.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+#ifndef _ASM_POWERPC_UIC_H
+#define _ASM_POWERPC_UIC_H
+
+#ifdef __KERNEL__
+
+extern void __init uic_init_tree(void);
+extern unsigned int uic_get_irq(void);
+
+#endif /* __KERNEL__ */
+#endif /* _ASM_POWERPC_UIC_H */

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 11/15] zImage wrapper for Ebony
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (4 preceding siblings ...)
  2007-03-05  3:24 ` [PATCH 5/15] Re-organize Kconfig code for 4xx in arch/powerpc David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-05 17:10   ` Mark A. Greer
  2007-03-09 17:50   ` Josh Boyer
  2007-03-05  3:24 ` [PATCH 4/15] Use resource_size_t for serial port IO addresses David Gibson
                   ` (10 subsequent siblings)
  16 siblings, 2 replies; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

This patch adds support for building a zImage wrapper suitable for the
Ebony (440GP) evaluation board.  This supports booting both from uboot
(old versions which don't supply a flattened device tree) and IBM
Openbios (aka "treeboot").

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---

 arch/powerpc/boot/Makefile |   33 +++++++
 arch/powerpc/boot/dcr.h    |   85 ++++++++++++++++++++
 arch/powerpc/boot/ebony.c  |  188 +++++++++++++++++++++++++++++++++++++++++++++
 arch/powerpc/boot/mktree.c |   10 --
 arch/powerpc/boot/wrapper  |   33 +++++++
 5 files changed, 342 insertions(+), 7 deletions(-)

Index: working-2.6/arch/powerpc/boot/Makefile
===================================================================
--- working-2.6.orig/arch/powerpc/boot/Makefile	2007-02-26 13:25:31.000000000 +1100
+++ working-2.6/arch/powerpc/boot/Makefile	2007-02-26 13:25:33.000000000 +1100
@@ -43,7 +43,7 @@ $(addprefix $(obj)/,$(zlib) main.o): $(a
 src-wlib := string.S crt0.S stdio.c main.c flatdevtree.c flatdevtree_misc.c \
 		ns16550.c serial.c simple_alloc.c div64.S util.S \
 		gunzip_util.c $(zlib)
-src-plat := of.c
+src-plat := of.c ebony.c
 src-boot := $(src-wlib) $(src-plat) empty.c
 
 src-boot := $(addprefix $(obj)/, $(src-boot))
@@ -95,6 +95,12 @@ $(patsubst %.S,%.o, $(filter %.S, $(src-
 $(obj)/wrapper.a: $(obj-wlib)
 	$(call cmd,bootar)
 
+quiet_cmd_dtc = DTC     $@
+      cmd_dtc = $(dtc) -O dtb -o $@ -b 0 -V 16 $<
+
+$(obj)/%.dtb: $(srctree)/$(src)/dts/%.dts
+	$(call if_changed,dtc)
+
 hostprogs-y	:= addnote addRamDisk hack-coff mktree
 
 extra-y		:= $(obj)/wrapper.a $(obj-plat) $(obj)/empty.o \
@@ -103,6 +109,8 @@ extra-y		:= $(obj)/wrapper.a $(obj-plat)
 wrapper		:=$(srctree)/$(src)/wrapper
 wrapperbits	:= $(extra-y) $(addprefix $(obj)/,addnote hack-coff mktree)
 
+dtc		:= dtc
+
 #############
 # Bits for building various flavours of zImage
 
@@ -120,6 +128,13 @@ quiet_cmd_wrap_initrd = WRAP    $@
       cmd_wrap_initrd =$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \
 				-i $(obj)/ramdisk.image.gz vmlinux
 
+quiet_cmd_wrap_dtb	= WRAP    $@
+      cmd_wrap_dtb	=$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \
+				-d $3 vmlinux
+quiet_cmd_wrap_dtb_initrd = WRAP    $@
+      cmd_wrap_dtb_initrd =$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \
+				-d $3 -i $(obj)/ramdisk.image.gz vmlinux
+
 $(obj)/zImage.chrp: vmlinux $(wrapperbits)
 	$(call cmd,wrap,chrp)
 
@@ -156,6 +171,21 @@ $(obj)/zImage.ps3: vmlinux
 $(obj)/zImage.initrd.ps3: vmlinux
 	@echo "  WARNING zImage.initrd.ps3 not supported (yet)"
 
+$(obj)/zImage.ebony-elf: vmlinux $(wrapperbits) $(obj)/ebony.dtb
+	$(call cmd,wrap_dtb,ebony,$(obj)/ebony.dtb)
+
+$(obj)/zImage.initrd.ebony-elf: vmlinux $(wrapperbits) $(obj)/ebony.dtb $(obj)/ramdisk.image.gz
+	$(call cmd,wrap_dtb_initrd,ebony,$(obj)/ebony.dtb)
+
+$(obj)/zImage.ebony: vmlinux $(wrapperbits) $(obj)/ebony.dtb $(obj)/mktree
+	$(call cmd,wrap_dtb,ebony-tree,$(obj)/ebony.dtb)
+
+$(obj)/zImage.initrd.ebony: vmlinux $(wrapperbits) $(obj)/ebony.dtb $(obj)/mktree
+	$(call cmd,wrap_dtb_initrd,ebony-tree,$(obj)/ebony.dtb)
+
+$(obj)/uImage.ebony: vmlinux $(wrapperbits)  $(obj)/ebony.dtb
+	$(call cmd,wrap_dtb,ebony-uboot,$(obj)/ebony.dtb)
+
 $(obj)/uImage: vmlinux $(wrapperbits)
 	$(call cmd,wrap,uboot)
 
@@ -167,6 +197,7 @@ image-$(CONFIG_PPC_CELLEB)		+= zImage.ps
 image-$(CONFIG_PPC_CHRP)		+= zImage.chrp
 image-$(CONFIG_PPC_EFIKA)		+= zImage.chrp
 image-$(CONFIG_PPC_PMAC)		+= zImage.pmac
+image-$(CONFIG_EBONY)			+= zImage.ebony-elf zImage.ebony uImage.ebony
 image-$(CONFIG_DEFAULT_UIMAGE)		+= uImage
 
 # For 32-bit powermacs, build the COFF and miboot images
Index: working-2.6/arch/powerpc/boot/ebony.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ working-2.6/arch/powerpc/boot/ebony.c	2007-02-26 13:46:05.000000000 +1100
@@ -0,0 +1,188 @@
+/*
+ * Copyright 2007 David Gibson, IBM Corporation.
+ *
+ * Based on earlier code:
+ * Copyright (C) Paul Mackerras 1997.
+ * Copyright 2002-2005 MontaVista Software Inc.
+ * Copyright (c) 2003, 2004 Zultys Technologies
+
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#include <stdarg.h>
+#include <stddef.h>
+#include "types.h"
+#include "elf.h"
+#include "string.h"
+#include "stdio.h"
+#include "page.h"
+#include "ops.h"
+#include "dcr.h"
+
+extern char _start[];
+extern char _end[];
+extern char _dtb_start[];
+extern char _dtb_end[];
+
+BSS_STACK(4096);
+
+#define OPENBIOS_MAC_BASE	0xfffffe0c
+#define OPENBIOS_MAC_OFFSET	0xc
+
+static inline u32 mfpvr(void)
+{
+	u32 pvr;
+	asm volatile ("mfpvr	%0" : "=r"(pvr));
+	return pvr;
+}
+
+void poke_tree(const char *path, const char *name, void *val, int size)
+{
+	void *devp;
+	int ret;
+
+	devp = finddevice(path);
+	if (! devp) {
+		printf("Couldn't find node %s to poke\n\r", path);
+		exit();
+	}
+
+	ret = setprop(devp, name, val, size);
+	if (ret != 0) {
+		printf("Couldn't set %s property in %s\n\r", name, path);
+		exit();
+	}
+}
+
+#define poke_tree_val(path, name, val)	\
+	do { \
+		typeof(val) x = val; \
+		poke_tree((path),(name),&x,sizeof(x)); \
+	} while (0)
+
+/* Read the 44x memory controller to get size of system memory. */
+static void ibm44x_fixup_memsize(void)
+{
+	int i;
+	unsigned long memsize, bank_config;
+	u32 memreg[3];
+
+	memsize = 0;
+	for (i = 0; i < ARRAY_SIZE(sdram_bxcr); i++) {
+		mtdcr(DCRN_SDRAM0_CFGADDR, sdram_bxcr[i]);
+		bank_config = mfdcr(DCRN_SDRAM0_CFGDATA);
+
+		if (bank_config & SDRAM_CONFIG_BANK_ENABLE)
+			memsize += SDRAM_CONFIG_BANK_SIZE(bank_config);
+	}
+
+	printf("PPC44X: %dM RAM\n\r", memsize / 1024 / 1024);
+	memreg[0] = memreg[1] = 0;
+	memreg[2] = memsize;
+	poke_tree("/memory", "reg", memreg, sizeof(memreg));
+}
+
+/* Calculate 440GP clocks */
+void ibm440gp_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
+{
+	u32 sys0 = mfdcr(DCRN_CPC0_SYS0);
+	u32 cr0 = mfdcr(DCRN_CPC0_CR0);
+	u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
+	u32 opdv = CPC0_SYS0_OPDV(sys0);
+	u32 epdv = CPC0_SYS0_EPDV(sys0);
+
+	if (sys0 & CPC0_SYS0_BYPASS) {
+		/* Bypass system PLL */
+		cpu = plb = sysclk;
+	} else {
+		if (sys0 & CPC0_SYS0_EXTSL)
+			/* PerClk */
+			m = CPC0_SYS0_FWDVB(sys0) * opdv * epdv;
+		else
+			/* CPU clock */
+			m = CPC0_SYS0_FBDV(sys0) * CPC0_SYS0_FWDVA(sys0);
+		cpu = sysclk * m / CPC0_SYS0_FWDVA(sys0);
+		plb = sysclk * m / CPC0_SYS0_FWDVB(sys0);
+	}
+
+	opb = plb / opdv;
+	ebc = opb / epdv;
+
+	/* FIXME: Check if this is for all 440GP, or just Ebony */
+	if ((mfpvr() & 0xf0000fff) == 0x40000440)
+		/* Rev. B 440GP, use external system clock */
+		tb = sysclk;
+	else
+		/* Rev. C 440GP, errata force us to use internal clock */
+		tb = cpu;
+
+	if (cr0 & CPC0_CR0_U0EC)
+		/* External UART clock */
+		uart0 = ser_clk;
+	else
+		/* Internal UART clock */
+		uart0 = plb / CPC0_CR0_UDIV(cr0);
+
+	if (cr0 & CPC0_CR0_U1EC)
+		/* External UART clock */
+		uart1 = ser_clk;
+	else
+		/* Internal UART clock */
+		uart1 = plb / CPC0_CR0_UDIV(cr0);
+
+	printf("PPC440GP: SysClk = %dMHz (%x)\n\r",
+	       (sysclk + 500000) / 1000000, sysclk);
+	printf("PPC440GP: CPU clock = %dMHz (%x)\n\r",
+	       (cpu + 500000) / 1000000, cpu);
+	poke_tree_val("/cpus/PowerPC,440GP", "clock-frequency", cpu);
+	printf("PPC440GP: timebase frequency = %dMHz (%x)\n\r",
+	       (tb + 500000) / 1000000, tb);
+	poke_tree_val("/cpus/PowerPC,440GP", "timebase-frequency", tb);
+	printf("PPC440GP: PLB clock = %dMHz (%x)\n\r",
+	       (plb + 500000) / 1000000, plb);
+	poke_tree_val("/plb", "clock-frequency", plb);
+	printf("PPC440GP: OPB clock = %dMHz (%x)\n\r",
+	       (opb + 500000) / 1000000, opb);
+	poke_tree_val("/plb/opb", "clock-frequency", opb);
+	printf("PPC440GP: EBC clock = %dMHz (%x)\n\r",
+	       (ebc + 500000) / 1000000, ebc);
+	printf("PPC440GP: UART0 clock = %dMHz (%x)\n\r",
+	       (uart0 + 500000) / 1000000, uart0);
+	poke_tree_val("/plb/opb/serial@140000200", "clock-frequency", uart0);
+	printf("PPC440GP: UART1 clock = %dMHz (%x)\n\r",
+	       (uart1 + 500000) / 1000000, uart1);
+	poke_tree_val("/plb/opb/serial@140000200", "clock-frequency", uart1);
+}
+
+static void ebony_fixups(void)
+{
+	// FIXME: sysclk should be derived by reading the FPGA registers
+	unsigned long sysclk = 33000000;
+	u8 *mac0, *mac1;
+
+	ibm440gp_fixup_clocks(sysclk, 6 * 1843200);
+	ibm44x_fixup_memsize();
+
+	mac0 = (u8 *)OPENBIOS_MAC_BASE;
+	mac1 = (u8 *)(OPENBIOS_MAC_BASE + OPENBIOS_MAC_OFFSET);
+	printf("Ebony: EMAC0 addr %02x:%02x:%02x:%02x:%02x:%02x\n\r",
+	       mac0[0], mac0[1], mac0[2], mac0[3], mac0[4], mac0[5]);
+	poke_tree("/plb/opb/ethernet@140000800", "local-mac-address",
+		  mac0, 6);
+	printf("Ebony: EMAC1 addr %02x:%02x:%02x:%02x:%02x:%02x\n\r",
+	       mac1[0], mac1[1], mac1[2], mac1[3], mac1[4], mac1[5]);
+	poke_tree("/plb/opb/ethernet@140000900", "local-mac-address",
+		  mac1, 6);
+}
+
+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5)
+{
+	u32 heapsize = 0x8000000 - (u32)_end; /* 128M */
+
+	platform_ops.fixups = ebony_fixups;
+	simple_alloc_init(_end, heapsize, 32, 64);
+	ft_init(_dtb_start, 0, 32);
+	serial_console_init();
+}
Index: working-2.6/arch/powerpc/boot/wrapper
===================================================================
--- working-2.6.orig/arch/powerpc/boot/wrapper	2007-02-26 13:25:31.000000000 +1100
+++ working-2.6/arch/powerpc/boot/wrapper	2007-02-26 13:25:33.000000000 +1100
@@ -137,6 +137,12 @@ miboot|uboot)
     ksection=image
     isection=initrd
     ;;
+*-tree)
+    platformo=$object/"${platform%%-tree}".o
+    ;;
+*-uboot)
+    platformo=$object/"${platform%%-uboot}".o
+    ;;
 esac
 
 vmz="$tmpdir/`basename \"$kernel\"`.$ext"
@@ -206,4 +212,31 @@ pmaccoff)
     ${CROSS}objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile"
     $object/hack-coff "$ofile"
     ;;
+*-tree)
+    mv "$ofile" "$ofile.elf"
+    entry=`objdump -f "$ofile.elf" | grep '^start address ' | \
+	cut -d' ' -f3`
+    $object/mktree "$ofile.elf" "$ofile" 0x00400000 "$entry"
+    if [ -z "$cacheit" ]; then
+	rm -f "$ofile.elf"
+    fi
+    exit 0
+    ;;
+*-uboot)
+    mv "$ofile" "$ofile.elf"
+    version=`${CROSS}strings "$kernel" | grep '^Linux version [-0-9.]' | \
+	cut -d' ' -f3`
+    if [ -n "$version" ]; then
+	version="-n Linux-$version"
+    fi
+    entry=`objdump -f "$ofile.elf" | grep '^start address ' | \
+	cut -d' ' -f3`
+    ${CROSS}objcopy -O binary "$ofile.elf" "$ofile.bin"
+    mkimage -A ppc -O linux -T kernel -C none -a 0x00400000 -e $entry \
+	$version -d "$ofile.bin" "$ofile"
+    if [ -z "$cacheit" ]; then
+	rm -f "$ofile.elf" "$ofile.bin"
+    fi
+    exit 0
+    ;;
 esac
Index: working-2.6/arch/powerpc/boot/mktree.c
===================================================================
--- working-2.6.orig/arch/powerpc/boot/mktree.c	2007-02-26 13:25:31.000000000 +1100
+++ working-2.6/arch/powerpc/boot/mktree.c	2007-02-26 13:25:33.000000000 +1100
@@ -46,8 +46,8 @@ int main(int argc, char *argv[])
 	struct	stat	st;
 	boot_block_t	bt;
 
-	if (argc < 3) {
-		fprintf(stderr, "usage: %s <zImage-file> <boot-image> [entry-point]\n",argv[0]);
+	if (argc < 5) {
+		fprintf(stderr, "usage: %s <zImage-file> <boot-image> <load address> <entry point>\n",argv[0]);
 		exit(1);
 	}
 
@@ -61,10 +61,8 @@ int main(int argc, char *argv[])
 	bt.bb_magic = htonl(0x0052504F);
 
 	/* If we have the optional entry point parameter, use it */
-	if (argc == 4)
-		bt.bb_dest = bt.bb_entry_point = htonl(strtoul(argv[3], NULL, 0));
-	else
-		bt.bb_dest = bt.bb_entry_point = htonl(0x500000);
+	bt.bb_dest = htonl(strtoul(argv[3], NULL, 0));
+	bt.bb_entry_point = htonl(strtoul(argv[4], NULL, 0));
 
 	/* We know these from the linker command.
 	 * ...and then move it up into memory a little more so the
Index: working-2.6/arch/powerpc/boot/dcr.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ working-2.6/arch/powerpc/boot/dcr.h	2007-02-26 13:25:33.000000000 +1100
@@ -0,0 +1,85 @@
+#ifndef _PPC_BOOT_DCR_H_
+#define _PPC_BOOT_DCR_H_
+
+#define mfdcr(rn) \
+	({	\
+		unsigned long rval; \
+		asm volatile("mfdcr %0,%1" : "=r"(rval) : "i"(rn)); \
+		rval; \
+	})
+#define mtdcr(rn, val) \
+	asm volatile("mtdcr %0,%1" : : "i"(rn), "r"(val))
+
+/* 440GP/440GX SDRAM controller DCRs */
+#define DCRN_SDRAM0_CFGADDR				0x010
+#define DCRN_SDRAM0_CFGDATA				0x011
+
+#define 	SDRAM0_B0CR				0x40
+#define 	SDRAM0_B1CR				0x44
+#define 	SDRAM0_B2CR				0x48
+#define 	SDRAM0_B3CR				0x4c
+
+static const unsigned long sdram_bxcr[] = { SDRAM0_B0CR, SDRAM0_B1CR, SDRAM0_B2CR, SDRAM0_B3CR };
+
+#define			SDRAM_CONFIG_BANK_ENABLE        0x00000001
+#define			SDRAM_CONFIG_SIZE_MASK          0x000e0000
+#define			SDRAM_CONFIG_BANK_SIZE(reg)	\
+	(0x00400000 << ((reg & SDRAM_CONFIG_SIZE_MASK) >> 17))
+
+/* 440GP Clock, PM, chip control */
+#define DCRN_CPC0_SR					0x0b0
+#define DCRN_CPC0_ER					0x0b1
+#define DCRN_CPC0_FR					0x0b2
+#define DCRN_CPC0_SYS0					0x0e0
+#define		CPC0_SYS0_TUNE				0xffc00000
+#define		CPC0_SYS0_FBDV_MASK			0x003c0000
+#define		CPC0_SYS0_FBDV(reg)			\
+	((((((reg) & CPC0_SYS0_FBDV_MASK) >> 18) - 1) & 0xf) + 1)
+#define		CPC0_SYS0_FWDVA_MASK			0x00038000
+#define		CPC0_SYS0_FWDVA(reg)			\
+	(8 - (((reg) & CPC0_SYS0_FWDVA_MASK) >> 15))
+#define		CPC0_SYS0_FWDVB_MASK			0x00007000
+#define		CPC0_SYS0_FWDVB(reg)			\
+	(8 - (((reg) & CPC0_SYS0_FWDVB_MASK) >> 12))
+#define		CPC0_SYS0_OPDV_MASK			0x00000c00
+#define		CPC0_SYS0_OPDV(reg)			\
+	((((reg) & CPC0_SYS0_OPDV_MASK) >> 10) + 1)
+#define		CPC0_SYS0_EPDV_MASK			0x00000300
+#define		CPC0_SYS0_EPDV(reg)			\
+	((((reg) & CPC0_SYS0_EPDV_MASK) >> 8) + 1)
+#define		CPC0_SYS0_EXTSL				0x00000080
+#define		CPC0_SYS0_RW_MASK			0x00000060
+#define		CPC0_SYS0_RL				0x00000010
+#define		CPC0_SYS0_ZMIISL_MASK			0x0000000c
+#define		CPC0_SYS0_BYPASS			0x00000002
+#define		CPC0_SYS0_NTO1				0x00000001
+#define DCRN_CPC0_SYS1					0x0e1
+#define DCRN_CPC0_CUST0					0x0e2
+#define DCRN_CPC0_CUST1					0x0e3
+#define DCRN_CPC0_STRP0					0x0e4
+#define DCRN_CPC0_STRP1					0x0e5
+#define DCRN_CPC0_STRP2					0x0e6
+#define DCRN_CPC0_STRP3					0x0e7
+#define DCRN_CPC0_GPIO					0x0e8
+#define DCRN_CPC0_PLB					0x0e9
+#define DCRN_CPC0_CR1					0x0ea
+#define DCRN_CPC0_CR0					0x0eb
+#define		CPC0_CR0_SWE				0x80000000
+#define		CPC0_CR0_CETE				0x40000000
+#define		CPC0_CR0_U1FCS				0x20000000
+#define		CPC0_CR0_U0DTE				0x10000000
+#define		CPC0_CR0_U0DRE				0x08000000
+#define		CPC0_CR0_U0DC				0x04000000
+#define		CPC0_CR0_U1DTE				0x02000000
+#define		CPC0_CR0_U1DRE				0x01000000
+#define		CPC0_CR0_U1DC				0x00800000
+#define		CPC0_CR0_U0EC				0x00400000
+#define		CPC0_CR0_U1EC				0x00200000
+#define		CPC0_CR0_UDIV_MASK			0x001f0000
+#define		CPC0_CR0_UDIV(reg)			\
+	((((reg) & CPC0_CR0_UDIV_MASK) >> 16) + 1)
+#define DCRN_CPC0_MIRQ0					0x0ec
+#define DCRN_CPC0_MIRQ1					0x0ed
+#define DCRN_CPC0_JTAGID				0x0ef
+
+#endif	/* _PPC_BOOT_DCR_H_ */

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 12/15] Support for Ebony in arch/powerpc
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (11 preceding siblings ...)
  2007-03-05  3:24 ` [PATCH 13/15] Port 44x MMU definitions to ARCH=powerpc David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-05  3:24 ` [PATCH 14/15] Early serial debug support for PPC44x David Gibson
                   ` (3 subsequent siblings)
  16 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

This patch adds platform support code for the Ebony (440GP) evaluation
board.

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---

 arch/powerpc/configs/ebony_defconfig |  886 +++++++++++++++++++++++++++++++++++
 arch/powerpc/platforms/4xx/Makefile  |    2 
 arch/powerpc/platforms/4xx/ebony.c   |   69 ++
 3 files changed, 956 insertions(+), 1 deletion(-)

Index: working-2.6/arch/powerpc/platforms/4xx/Makefile
===================================================================
--- working-2.6.orig/arch/powerpc/platforms/4xx/Makefile	2006-12-08 10:42:48.000000000 +1100
+++ working-2.6/arch/powerpc/platforms/4xx/Makefile	2007-02-28 13:38:44.000000000 +1100
@@ -1 +1 @@
-# empty makefile so make clean works
\ No newline at end of file
+obj-$(CONFIG_EBONY)	:= ebony.o
Index: working-2.6/arch/powerpc/platforms/4xx/ebony.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ working-2.6/arch/powerpc/platforms/4xx/ebony.c	2007-02-28 13:38:44.000000000 +1100
@@ -0,0 +1,69 @@
+/*
+ * Ebony board specific routines
+ *
+ * Matt Porter <mporter@kernel.crashing.org>
+ * Copyright 2002-2005 MontaVista Software Inc.
+ *
+ * Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
+ * Copyright (c) 2003-2005 Zultys Technologies
+ *
+ * Rewritten and ported to the merged powerpc tree:
+ * Copyright 2007 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/init.h>
+#include <asm/machdep.h>
+#include <asm/prom.h>
+#include <asm/udbg.h>
+#include <asm/time.h>
+#include <asm/uic.h>
+#include <asm/of_platform.h>
+
+static struct of_device_id ebony_of_bus[] = {
+	{ .type = "ibm,plb", },
+	{ .type = "ibm,opb", },
+	{},
+};
+
+static int __init ebony_device_probe(void)
+{
+	if (! machine_is(ebony))
+		return 0;
+
+	of_platform_bus_probe(NULL, ebony_of_bus, NULL);
+
+	return 0;
+}
+device_initcall(ebony_device_probe);
+
+/*
+ * Called very early, MMU is off, device-tree isn't unflattened
+ */
+static int __init ebony_probe(void)
+{
+	unsigned long root = of_get_flat_dt_root();
+
+	if (!of_flat_dt_is_compatible(root, "Ebony"))
+		return 0;
+
+	return 1;
+}
+
+static void __init ebony_setup_arch(void)
+{
+}
+
+define_machine(ebony) {
+	.name			= "Ebony",
+	.probe			= ebony_probe,
+	.setup_arch		= ebony_setup_arch,
+	.progress		= udbg_progress,
+	.init_IRQ		= uic_init_tree,
+	.get_irq		= uic_get_irq,
+	.calibrate_decr		= generic_calibrate_decr,
+};
Index: working-2.6/arch/powerpc/configs/ebony_defconfig
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ working-2.6/arch/powerpc/configs/ebony_defconfig	2007-02-28 15:28:39.000000000 +1100
@@ -0,0 +1,886 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.20-powerpc-emac-new-20070212.diff
+# Wed Feb 28 15:24:15 2007
+#
+# CONFIG_PPC64 is not set
+CONFIG_PPC32=y
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_PPC=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_PPC_OF=y
+# CONFIG_PPC_UDBG_16550 is not set
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+# CONFIG_DEFAULT_UIMAGE is not set
+
+#
+# Processor support
+#
+# CONFIG_CLASSIC32 is not set
+# CONFIG_PPC_82xx is not set
+# CONFIG_PPC_83xx is not set
+# CONFIG_PPC_85xx is not set
+# CONFIG_PPC_86xx is not set
+# CONFIG_PPC_8xx is not set
+# CONFIG_40x is not set
+CONFIG_44x=y
+# CONFIG_E200 is not set
+CONFIG_PPC_DCR_NATIVE=y
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_PPC_DCR=y
+CONFIG_BOOKE=y
+CONFIG_PTE_64BIT=y
+CONFIG_PHYS_64BIT=y
+CONFIG_NOT_COHERENT_CACHE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+CONFIG_LBD=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+CONFIG_4xx=y
+
+#
+# AMCC 44x options
+#
+CONFIG_EBONY=y
+CONFIG_440GP=y
+# CONFIG_MPIC is not set
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_MATH_EMULATION=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+# CONFIG_PC_KEYBOARD is not set
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_RESOURCES_64BIT=y
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_PROC_DEVICETREE=y
+CONFIG_CMDLINE_BOOL=y
+CONFIG_CMDLINE=""
+CONFIG_SECCOMP=y
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_ZONE_DMA=y
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+CONFIG_PPC_INDIRECT_PCI=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+# CONFIG_PCIEPORTBUS is not set
+# CONFIG_PCI_DEBUG is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Advanced setup
+#
+# CONFIG_ADVANCED_OPTIONS is not set
+
+#
+# Default settings for advanced configuration options are used
+#
+CONFIG_HIGHMEM_START=0xfe000000
+CONFIG_LOWMEM_SIZE=0x30000000
+CONFIG_KERNEL_START=0xc0000000
+CONFIG_TASK_SIZE=0x80000000
+CONFIG_CONSISTENT_START=0xff100000
+CONFIG_CONSISTENT_SIZE=0x00200000
+CONFIG_BOOT_LOAD=0x01000000
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=35000
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Macintosh device drivers
+#
+# CONFIG_MAC_EMUMOUSEBTN is not set
+# CONFIG_WINDFARM is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+CONFIG_IBM_NEW_EMAC=y
+CONFIG_IBM_NEW_EMAC_RXB=128
+CONFIG_IBM_NEW_EMAC_TXB=64
+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
+CONFIG_IBM_NEW_EMAC_ZMII=y
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+# CONFIG_QLA3XXX is not set
+# CONFIG_ATL1 is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+# CONFIG_INPUT is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_PCI is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+# CONFIG_SERIAL_8250_MANY_PORTS is not set
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
+CONFIG_SERIAL_OF_PLATFORM=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Auxiliary Display support
+#
+
+#
+# Virtualization
+#
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_CRAMFS=y
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+CONFIG_DEBUGGER=y
+# CONFIG_KGDB is not set
+# CONFIG_XMON is not set
+# CONFIG_BDI_SWITCH is not set
+# CONFIG_BOOTX_TEXT is not set
+# CONFIG_PPC_EARLY_DEBUG is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_MANAGER=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_GF128MUL is not set
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_PCBC=y
+# CONFIG_CRYPTO_LRW is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 13/15] Port 44x MMU definitions to ARCH=powerpc
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (10 preceding siblings ...)
  2007-03-05  3:24 ` [PATCH 6/15] zImage: Add more flexible gunzip convenience functions David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-05  3:24 ` [PATCH 12/15] Support for Ebony in arch/powerpc David Gibson
                   ` (4 subsequent siblings)
  16 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

This patch moves the mmu.h definitions which are still relevant for
ARCH=powerpc from include/asm-ppc/mmu.h to their own file,
include/asm-powerpc/mmu_44x.h.  The new file is included from
asm-powerpc/mmu.h, and a couple of other tweaks to correct mmu
definitions for 44x are made.

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---

 arch/powerpc/kernel/head_44x.S    |    4 -
 arch/powerpc/mm/44x_mmu.c         |   81 +++++++-------------------------------
 arch/powerpc/mm/mmu_decl.h        |    2 
 include/asm-powerpc/mmu-44x/mmu.h |   75 +++++++++++++++++++++++++++++++++++
 include/asm-powerpc/mmu.h         |   11 ++++-
 5 files changed, 105 insertions(+), 68 deletions(-)

Index: working-2.6/include/asm-powerpc/mmu.h
===================================================================
--- working-2.6.orig/include/asm-powerpc/mmu.h	2007-02-28 16:49:19.000000000 +1100
+++ working-2.6/include/asm-powerpc/mmu.h	2007-02-28 16:49:36.000000000 +1100
@@ -2,8 +2,15 @@
 #define _ASM_POWERPC_MMU_H_
 #ifdef __KERNEL__
 
-#ifndef CONFIG_PPC64
-#include <asm-ppc/mmu.h>
+#if defined(CONFIG_44x)
+/* 44x-style software loaded TLB */
+#  include <asm/mmu-44x/mmu.h>
+#elif !defined(CONFIG_PPC64)
+/* Other 32-bit.
+ *
+ * FIXME: split up the other 32-bit MMU types, and revise for
+ * arch/powerpc */
+#  include <asm-ppc/mmu.h>
 #else
 
 /*
Index: working-2.6/arch/powerpc/mm/44x_mmu.c
===================================================================
--- working-2.6.orig/arch/powerpc/mm/44x_mmu.c	2007-02-28 16:49:19.000000000 +1100
+++ working-2.6/arch/powerpc/mm/44x_mmu.c	2007-02-28 16:49:20.000000000 +1100
@@ -24,73 +24,35 @@
  *
  */
 
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/swap.h>
-#include <linux/stddef.h>
-#include <linux/vmalloc.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/highmem.h>
-
-#include <asm/pgalloc.h>
-#include <asm/prom.h>
-#include <asm/io.h>
-#include <asm/mmu_context.h>
-#include <asm/pgtable.h>
 #include <asm/mmu.h>
-#include <asm/uaccess.h>
-#include <asm/smp.h>
-#include <asm/bootx.h>
-#include <asm/machdep.h>
-#include <asm/setup.h>
 
 #include "mmu_decl.h"
 
-extern char etext[], _stext[];
-
 /* Used by the 44x TLB replacement exception handler.
  * Just needed it declared someplace.
  */
-unsigned int tlb_44x_index = 0;
-unsigned int tlb_44x_hwater = 62;
+unsigned int tlb_44x_index; /* = 0 */
+unsigned int tlb_44x_hwater = PPC44x_TLB_SIZE - 1 - PPC44x_EARLY_TLBS;
 
 /*
  * "Pins" a 256MB TLB entry in AS0 for kernel lowmem
  */
-static void __init
-ppc44x_pin_tlb(int slot, unsigned int virt, unsigned int phys)
+static void __init ppc44x_pin_tlb(unsigned int virt, unsigned int phys)
 {
-	unsigned long attrib = 0;
-
-	__asm__ __volatile__("\
-	clrrwi	%2,%2,10\n\
-	ori	%2,%2,%4\n\
-	clrrwi	%1,%1,10\n\
-	li	%0,0\n\
-	ori	%0,%0,%5\n\
-	tlbwe	%2,%3,%6\n\
-	tlbwe	%1,%3,%7\n\
-	tlbwe	%0,%3,%8"
+	__asm__ __volatile__(
+		"tlbwe	%2,%3,%4\n"
+		"tlbwe	%1,%3,%5\n"
+		"tlbwe	%0,%3,%6\n"
 	:
-	: "r" (attrib), "r" (phys), "r" (virt), "r" (slot),
-	  "i" (PPC44x_TLB_VALID | PPC44x_TLB_256M),
-	  "i" (PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G),
+	: "r" (PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G),
+	  "r" (phys),
+	  "r" (virt | PPC44x_TLB_VALID | PPC44x_TLB_256M),
+	  "r" (tlb_44x_hwater--), /* slot for this TLB entry */
 	  "i" (PPC44x_TLB_PAGEID),
 	  "i" (PPC44x_TLB_XLAT),
 	  "i" (PPC44x_TLB_ATTRIB));
 }
 
-/*
- * MMU_init_hw does the chip-specific initialization of the MMU hardware.
- */
 void __init MMU_init_hw(void)
 {
 	flush_instruction_cache();
@@ -98,22 +60,13 @@ void __init MMU_init_hw(void)
 
 unsigned long __init mmu_mapin_ram(void)
 {
-	unsigned int pinned_tlbs = 1;
-	int i;
+	unsigned long addr;
 
-	/* Determine number of entries necessary to cover lowmem */
-	pinned_tlbs = (unsigned int)
-		(_ALIGN(total_lowmem, PPC_PIN_SIZE) >> PPC44x_PIN_SHIFT);
-
-	/* Write upper watermark to save location */
-	tlb_44x_hwater = PPC44x_LOW_SLOT - pinned_tlbs;
-
-	/* If necessary, set additional pinned TLBs */
-	if (pinned_tlbs > 1)
-		for (i = (PPC44x_LOW_SLOT-(pinned_tlbs-1)); i < PPC44x_LOW_SLOT; i++) {
-			unsigned int phys_addr = (PPC44x_LOW_SLOT-i) * PPC_PIN_SIZE;
-			ppc44x_pin_tlb(i, phys_addr+PAGE_OFFSET, phys_addr);
-		}
+	/* Pin in enough TLBs to cover any lowmem not covered by the
+	 * initial 256M mapping established in head_44x.S */
+	for (addr = PPC_PIN_SIZE; addr < total_lowmem;
+	     addr += PPC_PIN_SIZE)
+		ppc44x_pin_tlb(addr + PAGE_OFFSET, addr);
 
 	return total_lowmem;
 }
Index: working-2.6/arch/powerpc/mm/mmu_decl.h
===================================================================
--- working-2.6.orig/arch/powerpc/mm/mmu_decl.h	2007-02-28 16:49:19.000000000 +1100
+++ working-2.6/arch/powerpc/mm/mmu_decl.h	2007-02-28 16:49:20.000000000 +1100
@@ -35,8 +35,10 @@ extern int __map_without_bats;
 extern unsigned long ioremap_base;
 extern unsigned int rtas_data, rtas_size;
 
+#ifdef CONFIG_CLASSIC32
 extern PTE *Hash, *Hash_end;
 extern unsigned long Hash_size, Hash_mask;
+#endif /* CONFIG_CLASSIC32 */
 
 extern unsigned int num_tlbcam_entries;
 #endif
Index: working-2.6/arch/powerpc/kernel/head_44x.S
===================================================================
--- working-2.6.orig/arch/powerpc/kernel/head_44x.S	2007-02-28 16:49:19.000000000 +1100
+++ working-2.6/arch/powerpc/kernel/head_44x.S	2007-02-28 16:49:20.000000000 +1100
@@ -120,8 +120,8 @@ skpinv:	addi	r4,r4,1				/* Increment */
  * Configure and load pinned entry into TLB slot 63.
  */
 
-	lis	r3,KERNELBASE@h		/* Load the kernel virtual address */
-	ori	r3,r3,KERNELBASE@l
+	lis	r3,PAGE_OFFSET@h
+	ori	r3,r3,PAGE_OFFSET@l
 
 	/* Kernel is at the base of RAM */
 	li r4, 0			/* Load the kernel physical address */
Index: working-2.6/include/asm-powerpc/mmu-44x/mmu.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ working-2.6/include/asm-powerpc/mmu-44x/mmu.h	2007-02-28 16:51:37.000000000 +1100
@@ -0,0 +1,75 @@
+#ifndef _ASM_POWERPC_MMU_44X_MMU_H_
+#define _ASM_POWERPC_MMU_44X_MMU_H_
+
+/*
+ * PPC440 support
+ */
+#define PPC44x_MMUCR_TID	0x000000ff
+#define PPC44x_MMUCR_STS	0x00010000
+
+#define	PPC44x_TLB_PAGEID	0
+#define	PPC44x_TLB_XLAT		1
+#define	PPC44x_TLB_ATTRIB	2
+
+/* Page identification fields */
+#define PPC44x_TLB_EPN_MASK	0xfffffc00      /* Effective Page Number */
+#define	PPC44x_TLB_VALID	0x00000200      /* Valid flag */
+#define PPC44x_TLB_TS		0x00000100	/* Translation address space */
+#define PPC44x_TLB_1K		0x00000000	/* Page sizes */
+#define PPC44x_TLB_4K		0x00000010
+#define PPC44x_TLB_16K		0x00000020
+#define PPC44x_TLB_64K		0x00000030
+#define PPC44x_TLB_256K		0x00000040
+#define PPC44x_TLB_1M		0x00000050
+#define PPC44x_TLB_16M		0x00000070
+#define	PPC44x_TLB_256M		0x00000090
+
+/* Translation fields */
+#define PPC44x_TLB_RPN_MASK	0xfffffc00      /* Real Page Number */
+#define	PPC44x_TLB_ERPN_MASK	0x0000000f
+
+/* Storage attribute and access control fields */
+#define PPC44x_TLB_ATTR_MASK	0x0000ff80
+#define PPC44x_TLB_U0		0x00008000      /* User 0 */
+#define PPC44x_TLB_U1		0x00004000      /* User 1 */
+#define PPC44x_TLB_U2		0x00002000      /* User 2 */
+#define PPC44x_TLB_U3		0x00001000      /* User 3 */
+#define PPC44x_TLB_W		0x00000800      /* Caching is write-through */
+#define PPC44x_TLB_I		0x00000400      /* Caching is inhibited */
+#define PPC44x_TLB_M		0x00000200      /* Memory is coherent */
+#define PPC44x_TLB_G		0x00000100      /* Memory is guarded */
+#define PPC44x_TLB_E		0x00000080      /* Memory is guarded */
+
+#define PPC44x_TLB_PERM_MASK	0x0000003f
+#define PPC44x_TLB_UX		0x00000020      /* User execution */
+#define PPC44x_TLB_UW		0x00000010      /* User write */
+#define PPC44x_TLB_UR		0x00000008      /* User read */
+#define PPC44x_TLB_SX		0x00000004      /* Super execution */
+#define PPC44x_TLB_SW		0x00000002      /* Super write */
+#define PPC44x_TLB_SR		0x00000001      /* Super read */
+
+/* Number of TLB entries */
+#define PPC44x_TLB_SIZE		64
+
+#ifndef __ASSEMBLY__
+
+typedef unsigned long long phys_addr_t;
+
+extern phys_addr_t fixup_bigphys_addr(phys_addr_t, phys_addr_t);
+#define PHYS_FMT	"%16Lx"
+
+typedef struct {
+	unsigned long id;
+	unsigned long vdso_base;
+} mm_context_t;
+
+#endif /* !__ASSEMBLY__ */
+
+/* TLB entry offset/size used for pinning kernel lowmem */
+#define PPC44x_PIN_SHIFT	28
+#define PPC_PIN_SIZE		(1 << PPC44x_PIN_SHIFT)
+
+#define PPC44x_EARLY_TLBS	1
+
+#endif /* _ASM_POWERPC_MMU_44X_MMU_H_ */
+

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 15/15] Add support for reset on Ebony
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (13 preceding siblings ...)
  2007-03-05  3:24 ` [PATCH 14/15] Early serial debug support for PPC44x David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-05  8:02 ` Real time clock support in arch/powerpc Zang Roy-r61911
  2007-03-05 13:57 ` [0/15] Ebony support, spin 3 Josh Boyer
  16 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

This patch implements the appropriate hooks to allow both the kernel
and the zImage wrapper to reboot an Ebony.  In the process we move the
low-level abort() function from head_44x.S to misc_44x.S and rename it
something clearer.

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---

 arch/powerpc/boot/ebony.c             |   17 +++++++++++++++++
 arch/powerpc/kernel/head_44x.S        |   10 ----------
 arch/powerpc/platforms/4xx/44x.h      |    1 +
 arch/powerpc/platforms/4xx/ebony.c    |    2 ++
 arch/powerpc/platforms/4xx/misc_44x.S |   10 ++++++++++
 5 files changed, 30 insertions(+), 10 deletions(-)

Index: working-2.6/arch/powerpc/kernel/head_44x.S
===================================================================
--- working-2.6.orig/arch/powerpc/kernel/head_44x.S	2007-03-02 17:19:37.000000000 +1100
+++ working-2.6/arch/powerpc/kernel/head_44x.S	2007-03-02 17:19:38.000000000 +1100
@@ -701,16 +701,6 @@ _GLOBAL(giveup_fpu)
 	blr
 #endif
 
-/*
- * extern void abort(void)
- *
- * At present, this routine just applies a system reset.
- */
-_GLOBAL(abort)
-        mfspr   r13,SPRN_DBCR0
-        oris    r13,r13,DBCR0_RST_SYSTEM@h
-        mtspr   SPRN_DBCR0,r13
-
 _GLOBAL(set_context)
 
 #ifdef CONFIG_BDI_SWITCH
Index: working-2.6/arch/powerpc/platforms/4xx/misc_44x.S
===================================================================
--- working-2.6.orig/arch/powerpc/platforms/4xx/misc_44x.S	2007-03-02 17:19:37.000000000 +1100
+++ working-2.6/arch/powerpc/platforms/4xx/misc_44x.S	2007-03-02 17:19:38.000000000 +1100
@@ -44,3 +44,13 @@ _GLOBAL(as1_writeb)
 	sync
 	isync
 	blr
+
+/*
+ * void ppc44x_reset_system(char *cmd)
+ *
+ * At present, this routine just applies a system reset.
+ */
+_GLOBAL(ppc44x_reset_system)
+        mfspr   r13,SPRN_DBCR0
+        oris    r13,r13,DBCR0_RST_SYSTEM@h
+        mtspr   SPRN_DBCR0,r13
Index: working-2.6/arch/powerpc/platforms/4xx/44x.h
===================================================================
--- working-2.6.orig/arch/powerpc/platforms/4xx/44x.h	2007-03-02 17:19:37.000000000 +1100
+++ working-2.6/arch/powerpc/platforms/4xx/44x.h	2007-03-02 17:19:38.000000000 +1100
@@ -3,6 +3,7 @@
 
 extern u8 as1_readb(volatile u8 __iomem  *addr);
 extern void as1_writeb(u8 data, volatile u8 __iomem *addr);
+extern void ppc44x_reset_system(char *cmd);
 
 #endif /* __POWERPC_PLATFORMS_4XX_44X_H */
 
Index: working-2.6/arch/powerpc/platforms/4xx/ebony.c
===================================================================
--- working-2.6.orig/arch/powerpc/platforms/4xx/ebony.c	2007-03-02 17:19:37.000000000 +1100
+++ working-2.6/arch/powerpc/platforms/4xx/ebony.c	2007-03-02 17:19:38.000000000 +1100
@@ -23,6 +23,7 @@
 #include <asm/time.h>
 #include <asm/uic.h>
 #include <asm/of_platform.h>
+#include "44x.h"
 
 static struct of_device_id ebony_of_bus[] = {
 	{ .type = "ibm,plb", },
@@ -65,5 +66,6 @@ define_machine(ebony) {
 	.progress		= udbg_progress,
 	.init_IRQ		= uic_init_tree,
 	.get_irq		= uic_get_irq,
+	.restart		= ppc44x_reset_system,
 	.calibrate_decr		= generic_calibrate_decr,
 };
Index: working-2.6/arch/powerpc/boot/ebony.c
===================================================================
--- working-2.6.orig/arch/powerpc/boot/ebony.c	2007-03-02 17:19:39.000000000 +1100
+++ working-2.6/arch/powerpc/boot/ebony.c	2007-03-02 17:30:23.000000000 +1100
@@ -177,11 +177,28 @@ static void ebony_fixups(void)
 		  mac1, 6);
 }
 
+#define SPRN_DBCR0		0x134
+#define   DBCR0_RST_SYSTEM	0x30000000
+
+static void ebony_exit(void)
+{
+	unsigned long tmp;
+
+	asm volatile (
+		"mfspr	%0,%1\n"
+		"oris	%0,%0,%2@h\n"
+		"mtspr	%1,%0"
+		: "=&r"(tmp) : "i"(SPRN_DBCR0), "i"(DBCR0_RST_SYSTEM)
+		);
+
+}
+
 void platform_init(unsigned long r3, unsigned long r4, unsigned long r5)
 {
 	u32 heapsize = 0x8000000 - (u32)_end; /* 128M */
 
 	platform_ops.fixups = ebony_fixups;
+	platform_ops.exit = ebony_exit;
 	simple_alloc_init(_end, heapsize, 32, 64);
 	ft_init(_dtb_start, 0, 32);
 	serial_console_init();

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 14/15] Early serial debug support for PPC44x
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (12 preceding siblings ...)
  2007-03-05  3:24 ` [PATCH 12/15] Support for Ebony in arch/powerpc David Gibson
@ 2007-03-05  3:24 ` David Gibson
  2007-03-08 19:44   ` Josh Boyer
  2007-03-05  3:24 ` [PATCH 15/15] Add support for reset on Ebony David Gibson
                   ` (2 subsequent siblings)
  16 siblings, 1 reply; 53+ messages in thread
From: David Gibson @ 2007-03-05  3:24 UTC (permalink / raw)
  To: linuxppc-dev

This patch 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: David Gibson <dwg@au1.ibm.com>
---

 arch/powerpc/Kconfig.debug            |   23 +++++++++++++----
 arch/powerpc/kernel/head_44x.S        |   34 +++++++++----------------
 arch/powerpc/kernel/of_platform.c     |    1 
 arch/powerpc/kernel/udbg.c            |    3 ++
 arch/powerpc/kernel/udbg_16550.c      |   23 +++++++++++++++++
 arch/powerpc/platforms/4xx/44x.h      |    8 +++++
 arch/powerpc/platforms/4xx/Makefile   |    1 
 arch/powerpc/platforms/4xx/misc_44x.S |   46 ++++++++++++++++++++++++++++++++++
 include/asm-powerpc/mmu-44x/mmu.h     |    7 ++++-
 include/asm-powerpc/udbg.h            |    1 
 10 files changed, 119 insertions(+), 28 deletions(-)

Index: working-2.6/arch/powerpc/Kconfig.debug
===================================================================
--- working-2.6.orig/arch/powerpc/Kconfig.debug	2007-03-02 16:57:36.000000000 +1100
+++ working-2.6/arch/powerpc/Kconfig.debug	2007-03-02 16:57:37.000000000 +1100
@@ -130,11 +130,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 || LOPEC || MV64X60 || PPLUS || PRPMC800 || \
-		PPC_GEN550 || PPC_MPC52xx
-
 config PPC_EARLY_DEBUG
 	bool "Early debugging (dangerous)"
 
@@ -199,6 +194,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
+	depends PPC_EARLY_DEBUG_44x
+	default "0x40000200"
+
+config PPC_EARLY_DEBUG_44x_PHYSHIGH
+	hex
+	depends PPC_EARLY_DEBUG_44x
+	default "0x1"
+
 endmenu
Index: working-2.6/arch/powerpc/kernel/head_44x.S
===================================================================
--- working-2.6.orig/arch/powerpc/kernel/head_44x.S	2007-03-02 16:57:36.000000000 +1100
+++ working-2.6/arch/powerpc/kernel/head_44x.S	2007-03-02 17:12:00.000000000 +1100
@@ -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      r0,0                    /* TLB slot 0 */
+	li	r5,(PPC44x_TLB_SW|PPC44x_TLB_SR|PPC44x_TLB_I|PPC44x_TLB_G)
+        li      r0,62                    /* 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);
Index: working-2.6/arch/powerpc/kernel/udbg_16550.c
===================================================================
--- working-2.6.orig/arch/powerpc/kernel/udbg_16550.c	2007-03-02 16:57:36.000000000 +1100
+++ working-2.6/arch/powerpc/kernel/udbg_16550.c	2007-03-02 17:12:13.000000000 +1100
@@ -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/4xx/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 */
Index: working-2.6/include/asm-powerpc/mmu-44x/mmu.h
===================================================================
--- working-2.6.orig/include/asm-powerpc/mmu-44x/mmu.h	2007-03-02 16:57:37.000000000 +1100
+++ working-2.6/include/asm-powerpc/mmu-44x/mmu.h	2007-03-02 16:57:37.000000000 +1100
@@ -69,7 +69,12 @@ typedef struct {
 #define PPC44x_PIN_SHIFT	28
 #define PPC_PIN_SIZE		(1 << PPC44x_PIN_SHIFT)
 
+#ifndef CONFIG_PPC_EARLY_DEBUG_44x
 #define PPC44x_EARLY_TLBS	1
+#else
+#define PPC44x_EARLY_TLBS	2
+#define PPC44x_EARLY_DEBUG_VIRTADDR	(ASM_CONST(0xf0000000) \
+	| (ASM_CONST(CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW) & 0xffff))
+#endif
 
 #endif /* _ASM_POWERPC_MMU_44X_MMU_H_ */
-
Index: working-2.6/arch/powerpc/kernel/udbg.c
===================================================================
--- working-2.6.orig/arch/powerpc/kernel/udbg.c	2007-03-02 16:57:36.000000000 +1100
+++ working-2.6/arch/powerpc/kernel/udbg.c	2007-03-02 16:57:37.000000000 +1100
@@ -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
 }
 
Index: working-2.6/include/asm-powerpc/udbg.h
===================================================================
--- working-2.6.orig/include/asm-powerpc/udbg.h	2007-03-02 16:57:37.000000000 +1100
+++ working-2.6/include/asm-powerpc/udbg.h	2007-03-02 16:57:37.000000000 +1100
@@ -47,6 +47,7 @@ extern void __init udbg_init_rtas_panel(
 extern void __init udbg_init_rtas_console(void);
 extern void __init udbg_init_debug_beat(void);
 extern void __init udbg_init_btext(void);
+extern void __init udbg_init_44x_as1(void);
 
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_UDBG_H */
Index: working-2.6/arch/powerpc/kernel/of_platform.c
===================================================================
--- working-2.6.orig/arch/powerpc/kernel/of_platform.c	2007-03-02 16:57:36.000000000 +1100
+++ working-2.6/arch/powerpc/kernel/of_platform.c	2007-03-02 16:57:37.000000000 +1100
@@ -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.
Index: working-2.6/arch/powerpc/platforms/4xx/Makefile
===================================================================
--- working-2.6.orig/arch/powerpc/platforms/4xx/Makefile	2007-03-02 16:57:36.000000000 +1100
+++ working-2.6/arch/powerpc/platforms/4xx/Makefile	2007-03-02 17:10:52.000000000 +1100
@@ -1 +1,2 @@
 obj-$(CONFIG_EBONY)	:= ebony.o
+obj-$(CONFIG_44x)	+= misc_44x.o
Index: working-2.6/arch/powerpc/platforms/4xx/misc_44x.S
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ working-2.6/arch/powerpc/platforms/4xx/misc_44x.S	2007-03-02 17:12:00.000000000 +1100
@@ -0,0 +1,46 @@
+/*
+ * This file contains miscellaneous low-level functions for PPC 44x.
+ *    Copyright 2007 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ */
+
+#include <asm/reg.h>
+#include <asm/ppc_asm.h>
+
+	.text
+
+/*
+ * Do an IO access in AS1
+ */
+_GLOBAL(as1_readb)
+	mfmsr	r7
+	ori	r0,r7,MSR_DS
+	sync
+	mtmsr	r0
+	sync
+	isync
+	lbz	r3,0(r3)
+	sync
+	mtmsr	r7
+	sync
+	isync
+	blr
+
+_GLOBAL(as1_writeb)
+	mfmsr	r7
+	ori	r0,r7,MSR_DS
+	sync
+	mtmsr	r0
+	sync
+	isync
+	stb	r3,0(r4)
+	sync
+	mtmsr	r7
+	sync
+	isync
+	blr
Index: working-2.6/arch/powerpc/platforms/4xx/44x.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ working-2.6/arch/powerpc/platforms/4xx/44x.h	2007-03-02 17:12:00.000000000 +1100
@@ -0,0 +1,8 @@
+#ifndef __POWERPC_PLATFORMS_4XX_44X_H
+#define __POWERPC_PLATFORMS_4XX_44X_H
+
+extern u8 as1_readb(volatile u8 __iomem  *addr);
+extern void as1_writeb(u8 data, volatile u8 __iomem *addr);
+
+#endif /* __POWERPC_PLATFORMS_4XX_44X_H */
+

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Real time clock support in arch/powerpc
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (14 preceding siblings ...)
  2007-03-05  3:24 ` [PATCH 15/15] Add support for reset on Ebony David Gibson
@ 2007-03-05  8:02 ` Zang Roy-r61911
  2007-03-05 15:10   ` Kumar Gala
  2007-03-05 13:57 ` [0/15] Ebony support, spin 3 Josh Boyer
  16 siblings, 1 reply; 53+ messages in thread
From: Zang Roy-r61911 @ 2007-03-05  8:02 UTC (permalink / raw)
  To: mgreer; +Cc: linuxppc-dev


Is there any plan to add real time clock support in arch/powerpc?
I can find the support in arch/ppc/syslib/todc_time.c
Roy

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [0/15] Ebony support, spin 3
  2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
                   ` (15 preceding siblings ...)
  2007-03-05  8:02 ` Real time clock support in arch/powerpc Zang Roy-r61911
@ 2007-03-05 13:57 ` Josh Boyer
  16 siblings, 0 replies; 53+ messages in thread
From: Josh Boyer @ 2007-03-05 13:57 UTC (permalink / raw)
  To: David Gibson; +Cc: linuxppc-dev

On Mon, 2007-03-05 at 14:23 +1100, David Gibson wrote:
> Third version of the Ebony support patch series.  Notable changes:
> 	- Clock speeds, memory size and MAC addresses are now obtained
> from the hardware/firmware by the zImage and inserted into the device
> tree accordingly.  i.e. these patches should now work on any Ebony,
> not just one identical to mine.
> 	- The kernel can now restart the Ebony.

After including Ben's emac port, these patches boot to a prompt via NFS
rootfs on my board just fine.

josh

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 10/15] Add device tree for Ebony
  2007-03-05  3:24 ` [PATCH 10/15] Add device tree for Ebony David Gibson
@ 2007-03-05 14:23   ` Josh Boyer
  2007-03-06  0:04     ` David Gibson
  0 siblings, 1 reply; 53+ messages in thread
From: Josh Boyer @ 2007-03-05 14:23 UTC (permalink / raw)
  To: David Gibson; +Cc: linuxppc-dev

On Mon, 2007-03-05 at 14:24 +1100, David Gibson wrote:
> Add a device tree for the Ebony evaluation board (440GP based).  This
> tree is not complete or finalized.  This tree needs a very recent
> version of dtc to process.
> 
> Signed-off-by: David Gibson <dwg@au1.ibm.com>
> ---
> +
> +	chosen {
> +		linux,stdout-path = "/plb/opb@0/serial@140000200";
> +		linux,initrd-start = <0>; /* FIXME */
> +		linux,initrd-end = <0>;

Could we add a bootargs property here?  It needs to be present to allow
set_cmdline in the wrapper to actually function.  Without it, the
console ops allow you to specify on at the

Linux/PowerPC load:

line, but it doesn't actually get set in the DT.  In my testing, having

bootargs = "";

was sufficient to allow the cmdline editing (or inserting in this case)
to work.

josh

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: Real time clock support in arch/powerpc
  2007-03-05  8:02 ` Real time clock support in arch/powerpc Zang Roy-r61911
@ 2007-03-05 15:10   ` Kumar Gala
  2007-03-05 17:04     ` Mark A. Greer
  0 siblings, 1 reply; 53+ messages in thread
From: Kumar Gala @ 2007-03-05 15:10 UTC (permalink / raw)
  To: Zang Roy-r61911; +Cc: linuxppc-dev


On Mar 5, 2007, at 2:02 AM, Zang Roy-r61911 wrote:

>
> Is there any plan to add real time clock support in arch/powerpc?
> I can find the support in arch/ppc/syslib/todc_time.c

I thought our intent was to try and start using the drivers rtc  
subsystem going forward.

- k

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: Real time clock support in arch/powerpc
  2007-03-05 15:10   ` Kumar Gala
@ 2007-03-05 17:04     ` Mark A. Greer
  0 siblings, 0 replies; 53+ messages in thread
From: Mark A. Greer @ 2007-03-05 17:04 UTC (permalink / raw)
  To: Kumar Gala; +Cc: linuxppc-dev

On Mon, Mar 05, 2007 at 09:10:47AM -0600, Kumar Gala wrote:
> 
> On Mar 5, 2007, at 2:02 AM, Zang Roy-r61911 wrote:
> 
> >
> >Is there any plan to add real time clock support in arch/powerpc?
> >I can find the support in arch/ppc/syslib/todc_time.c
> 
> I thought our intent was to try and start using the drivers rtc  
> subsystem going forward.

It is.  todc is deprecated and removed from arch/powerpc.  drivers/rtc
is what we should use from now on.

Mark

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 11/15] zImage wrapper for Ebony
  2007-03-05  3:24 ` [PATCH 11/15] zImage wrapper for Ebony David Gibson
@ 2007-03-05 17:10   ` Mark A. Greer
  2007-03-06  0:09     ` David Gibson
  2007-03-09 17:50   ` Josh Boyer
  1 sibling, 1 reply; 53+ messages in thread
From: Mark A. Greer @ 2007-03-05 17:10 UTC (permalink / raw)
  To: David Gibson; +Cc: linuxppc-dev

On Mon, Mar 05, 2007 at 02:24:52PM +1100, David Gibson wrote:
> This patch adds support for building a zImage wrapper suitable for the
> Ebony (440GP) evaluation board.  This supports booting both from uboot
> (old versions which don't supply a flattened device tree) and IBM
> Openbios (aka "treeboot").
> 
> Signed-off-by: David Gibson <dwg@au1.ibm.com>
> ---

<snip>

> Index: working-2.6/arch/powerpc/boot/Makefile
> ===================================================================
> --- working-2.6.orig/arch/powerpc/boot/Makefile	2007-02-26 13:25:31.000000000 +1100
> +++ working-2.6/arch/powerpc/boot/Makefile	2007-02-26 13:25:33.000000000 +1100

<snip>

> @@ -120,6 +128,13 @@ quiet_cmd_wrap_initrd = WRAP    $@
>        cmd_wrap_initrd =$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \
>  				-i $(obj)/ramdisk.image.gz vmlinux
>  
> +quiet_cmd_wrap_dtb	= WRAP    $@
> +      cmd_wrap_dtb	=$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \
> +				-d $3 vmlinux
> +quiet_cmd_wrap_dtb_initrd = WRAP    $@
> +      cmd_wrap_dtb_initrd =$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \
> +				-d $3 -i $(obj)/ramdisk.image.gz vmlinux
> +

David,

I think we more-or-less agreed to go with Scott Wood's 'wrap' method
(unless there is a problem with it).

http://ozlabs.org/pipermail/linuxppc-dev/2007-February/031337.html

Mark

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 10/15] Add device tree for Ebony
  2007-03-05 14:23   ` Josh Boyer
@ 2007-03-06  0:04     ` David Gibson
  0 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-06  0:04 UTC (permalink / raw)
  To: Josh Boyer; +Cc: linuxppc-dev

On Mon, Mar 05, 2007 at 08:23:04AM -0600, Josh Boyer wrote:
> On Mon, 2007-03-05 at 14:24 +1100, David Gibson wrote:
> > Add a device tree for the Ebony evaluation board (440GP based).  This
> > tree is not complete or finalized.  This tree needs a very recent
> > version of dtc to process.
> > 
> > Signed-off-by: David Gibson <dwg@au1.ibm.com>
> > ---
> > +
> > +	chosen {
> > +		linux,stdout-path = "/plb/opb@0/serial@140000200";
> > +		linux,initrd-start = <0>; /* FIXME */
> > +		linux,initrd-end = <0>;
> 
> Could we add a bootargs property here?  It needs to be present to allow
> set_cmdline in the wrapper to actually function.  Without it, the
> console ops allow you to specify on at the
> 
> Linux/PowerPC load:
> 
> line, but it doesn't actually get set in the DT.  In my testing, having
> 
> bootargs = "";
> 
> was sufficient to allow the cmdline editing (or inserting in this case)
> to work.

Ah, yes, I can do that.  In the interim, at least, until I get libfdt
going properly which can add new properties without difficulty.

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 11/15] zImage wrapper for Ebony
  2007-03-05 17:10   ` Mark A. Greer
@ 2007-03-06  0:09     ` David Gibson
  2007-03-07 19:47       ` Scott Wood
  0 siblings, 1 reply; 53+ messages in thread
From: David Gibson @ 2007-03-06  0:09 UTC (permalink / raw)
  To: Mark A. Greer; +Cc: linuxppc-dev

On Mon, Mar 05, 2007 at 10:10:53AM -0700, Mark A. Greer wrote:
> On Mon, Mar 05, 2007 at 02:24:52PM +1100, David Gibson wrote:
> > This patch adds support for building a zImage wrapper suitable for the
> > Ebony (440GP) evaluation board.  This supports booting both from uboot
> > (old versions which don't supply a flattened device tree) and IBM
> > Openbios (aka "treeboot").
> > 
> > Signed-off-by: David Gibson <dwg@au1.ibm.com>
> > ---
> 
> <snip>
> 
> > Index: working-2.6/arch/powerpc/boot/Makefile
> > ===================================================================
> > --- working-2.6.orig/arch/powerpc/boot/Makefile	2007-02-26 13:25:31.000000000 +1100
> > +++ working-2.6/arch/powerpc/boot/Makefile	2007-02-26 13:25:33.000000000 +1100
> 
> <snip>
> 
> > @@ -120,6 +128,13 @@ quiet_cmd_wrap_initrd = WRAP    $@
> >        cmd_wrap_initrd =$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \
> >  				-i $(obj)/ramdisk.image.gz vmlinux
> >  
> > +quiet_cmd_wrap_dtb	= WRAP    $@
> > +      cmd_wrap_dtb	=$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \
> > +				-d $3 vmlinux
> > +quiet_cmd_wrap_dtb_initrd = WRAP    $@
> > +      cmd_wrap_dtb_initrd =$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \
> > +				-d $3 -i $(obj)/ramdisk.image.gz vmlinux
> > +
> 
> David,
> 
> I think we more-or-less agreed to go with Scott Wood's 'wrap' method
> (unless there is a problem with it).

Oh, we had?

> http://ozlabs.org/pipermail/linuxppc-dev/2007-February/031337.html

Um.. I'm pretty uneasy about that, because I'm not at all sure that
the wrapper script does the right thing w.r.t. where it puts the .dtb
file, when building with a VPATH.

Actually, longer term what I think might be a better option is to
build *all* the dts files into asm (with different symbolic names) and
fold them into the wrapper library.

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 11/15] zImage wrapper for Ebony
  2007-03-06  0:09     ` David Gibson
@ 2007-03-07 19:47       ` Scott Wood
  2007-03-08  0:24         ` David Gibson
  0 siblings, 1 reply; 53+ messages in thread
From: Scott Wood @ 2007-03-07 19:47 UTC (permalink / raw)
  To: Mark A. Greer, linuxppc-dev

On Tue, Mar 06, 2007 at 11:09:05AM +1100, David Gibson wrote:
> On Mon, Mar 05, 2007 at 10:10:53AM -0700, Mark A. Greer wrote:
> > I think we more-or-less agreed to go with Scott Wood's 'wrap' method
> > (unless there is a problem with it).
> 
> Oh, we had?
> 
> > http://ozlabs.org/pipermail/linuxppc-dev/2007-February/031337.html
> 
> Um.. I'm pretty uneasy about that, because I'm not at all sure that
> the wrapper script does the right thing w.r.t. where it puts the .dtb
> file, when building with a VPATH.

My patches don't change where the dtb goes as far as I can tell.  If
there's a problem, it can be addressed with an additional patch (or if my
patches do change it, please tell me how).

> Actually, longer term what I think might be a better option is to
> build *all* the dts files into asm (with different symbolic names) and
> fold them into the wrapper library.

I can see potential benefit in allowing multiple dtbs to be included, to
be chosen at runtime (such as from a board ID passed from the bootloader,
or based on detection of how the board is configured (such as detecting
whether an MDS board is plugged into a PCI backplane, or is acting as a
PCI agent, or is standalone)).  But why all of them?

-Scott

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 11/15] zImage wrapper for Ebony
  2007-03-07 19:47       ` Scott Wood
@ 2007-03-08  0:24         ` David Gibson
  2007-03-08  0:54           ` Mark A. Greer
  0 siblings, 1 reply; 53+ messages in thread
From: David Gibson @ 2007-03-08  0:24 UTC (permalink / raw)
  To: Scott Wood; +Cc: linuxppc-dev

On Wed, Mar 07, 2007 at 01:47:32PM -0600, Scott Wood wrote:
> On Tue, Mar 06, 2007 at 11:09:05AM +1100, David Gibson wrote:
> > On Mon, Mar 05, 2007 at 10:10:53AM -0700, Mark A. Greer wrote:
> > > I think we more-or-less agreed to go with Scott Wood's 'wrap' method
> > > (unless there is a problem with it).
> > 
> > Oh, we had?
> > 
> > > http://ozlabs.org/pipermail/linuxppc-dev/2007-February/031337.html
> > 
> > Um.. I'm pretty uneasy about that, because I'm not at all sure that
> > the wrapper script does the right thing w.r.t. where it puts the .dtb
> > file, when building with a VPATH.
> 
> My patches don't change where the dtb goes as far as I can tell.  If
> there's a problem, it can be addressed with an additional patch (or if my
> patches do change it, please tell me how).

If you're building so that the object files go in a separate tree from
the source, with your patch the dtb will still go in the source tree.
The trouble is that this is fiddlier to fix with the -s option as you
use to the wrapper than the -d option, because the correct path for
the dtb must also be passed into the script.

> > Actually, longer term what I think might be a better option is to
> > build *all* the dts files into asm (with different symbolic names) and
> > fold them into the wrapper library.
> 
> I can see potential benefit in allowing multiple dtbs to be included, to
> be chosen at runtime (such as from a board ID passed from the bootloader,
> or based on detection of how the board is configured (such as detecting
> whether an MDS board is plugged into a PCI backplane, or is acting as a
> PCI agent, or is standalone)).  But why all of them?

Simplicity, and a better chance to pick up syntax errors at least for
obscure platforms.  Note that they'd be going as separate modules into
a .a, so only the relevant ones would be included in the final zImage.

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 11/15] zImage wrapper for Ebony
  2007-03-08  0:24         ` David Gibson
@ 2007-03-08  0:54           ` Mark A. Greer
  2007-03-08  1:35             ` Josh Boyer
  0 siblings, 1 reply; 53+ messages in thread
From: Mark A. Greer @ 2007-03-08  0:54 UTC (permalink / raw)
  To: Scott Wood, Mark A. Greer, linuxppc-dev

On Thu, Mar 08, 2007 at 11:24:00AM +1100, David Gibson wrote:
> On Wed, Mar 07, 2007 at 01:47:32PM -0600, Scott Wood wrote:
> > On Tue, Mar 06, 2007 at 11:09:05AM +1100, David Gibson wrote:
> > > On Mon, Mar 05, 2007 at 10:10:53AM -0700, Mark A. Greer wrote:

> > > Actually, longer term what I think might be a better option is to
> > > build *all* the dts files into asm (with different symbolic names) and
> > > fold them into the wrapper library.
> > 
> > I can see potential benefit in allowing multiple dtbs to be included, to
> > be chosen at runtime (such as from a board ID passed from the bootloader,
> > or based on detection of how the board is configured (such as detecting
> > whether an MDS board is plugged into a PCI backplane, or is acting as a
> > PCI agent, or is standalone)).  But why all of them?
> 
> Simplicity, and a better chance to pick up syntax errors at least for
> obscure platforms.  Note that they'd be going as separate modules into
> a .a, so only the relevant ones would be included in the final zImage.

This seems like overkill to me.  I believe Paul's intention was that
you could run the wrapper script any time (e.g., well after you built
the zImage).  I don't really see the benefit of building them all and
now you have to worry about stale .S' in the .a file when it so easy to
just run the wrapper script with whatever .dts file you want.

My $0.02.

Mark

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 11/15] zImage wrapper for Ebony
  2007-03-08  0:54           ` Mark A. Greer
@ 2007-03-08  1:35             ` Josh Boyer
  0 siblings, 0 replies; 53+ messages in thread
From: Josh Boyer @ 2007-03-08  1:35 UTC (permalink / raw)
  To: Mark A. Greer; +Cc: linuxppc-dev

On Wed, Mar 07, 2007 at 05:54:43PM -0700, Mark A. Greer wrote:
> > > 
> > > I can see potential benefit in allowing multiple dtbs to be included, to
> > > be chosen at runtime (such as from a board ID passed from the bootloader,
> > > or based on detection of how the board is configured (such as detecting
> > > whether an MDS board is plugged into a PCI backplane, or is acting as a
> > > PCI agent, or is standalone)).  But why all of them?
> > 
> > Simplicity, and a better chance to pick up syntax errors at least for
> > obscure platforms.  Note that they'd be going as separate modules into
> > a .a, so only the relevant ones would be included in the final zImage.
> 
> This seems like overkill to me.  I believe Paul's intention was that
> you could run the wrapper script any time (e.g., well after you built
> the zImage).  I don't really see the benefit of building them all and
> now you have to worry about stale .S' in the .a file when it so easy to
> just run the wrapper script with whatever .dts file you want.

I don't care either way, but it would be nice to decide on a direction
soon so people can start working on patches again.  Right now we have
David's 3 patches, Scott's 18 or so, and I'm looking at adding a few
for new platform support.

josh

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 14/15] Early serial debug support for PPC44x
  2007-03-05  3:24 ` [PATCH 14/15] Early serial debug support for PPC44x David Gibson
@ 2007-03-08 19:44   ` Josh Boyer
  2007-03-09 17:42     ` Josh Boyer
  0 siblings, 1 reply; 53+ messages in thread
From: Josh Boyer @ 2007-03-08 19:44 UTC (permalink / raw)
  To: David Gibson; +Cc: linuxppc-dev

On Mon, 2007-03-05 at 14:24 +1100, David Gibson wrote:
> 
> +config PPC_EARLY_DEBUG_44x_PHYSLOW
> +	hex
> +	depends PPC_EARLY_DEBUG_44x
> +	default "0x40000200"
> +
> +config PPC_EARLY_DEBUG_44x_PHYSHIGH
> +	hex
> +	depends PPC_EARLY_DEBUG_44x
> +	default "0x1"
> +

These two options need to have some kind of description string next to
hex otherwise Kconfig will not allow you to set them.  I noticed this
while playing with bamboo.  So something like:

config PPC_EARLY_DEBUG_44x_PHYSLOW
	hex "The low 32bits of the UART address"

That will allow you to change the values from the default.

josh

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 14/15] Early serial debug support for PPC44x
  2007-03-08 19:44   ` Josh Boyer
@ 2007-03-09 17:42     ` Josh Boyer
  2007-03-09 23:43       ` David Gibson
  0 siblings, 1 reply; 53+ messages in thread
From: Josh Boyer @ 2007-03-09 17:42 UTC (permalink / raw)
  To: David Gibson; +Cc: linuxppc-dev

On Thu, 2007-03-08 at 13:44 -0600, Josh Boyer wrote:
> On Mon, 2007-03-05 at 14:24 +1100, David Gibson wrote:
> > 
> > +config PPC_EARLY_DEBUG_44x_PHYSLOW
> > +	hex
> > +	depends PPC_EARLY_DEBUG_44x
> > +	default "0x40000200"
> > +
> > +config PPC_EARLY_DEBUG_44x_PHYSHIGH
> > +	hex
> > +	depends PPC_EARLY_DEBUG_44x
> > +	default "0x1"
> > +
> 
> These two options need to have some kind of description string next to
> hex otherwise Kconfig will not allow you to set them.  I noticed this
> while playing with bamboo.  So something like:
> 
> config PPC_EARLY_DEBUG_44x_PHYSLOW
> 	hex "The low 32bits of the UART address"
> 
> That will allow you to change the values from the default.

And here's a patch to do that.

Fix the PPC_EARLY_DEBUG_44x options to allow setting something other
than the default.

Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>

---
 arch/powerpc/Kconfig.debug |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- linux-2.6.orig/arch/powerpc/Kconfig.debug
+++ linux-2.6/arch/powerpc/Kconfig.debug
@@ -205,12 +205,12 @@ config PPC_EARLY_DEBUG_44x
 endchoice
 
 config PPC_EARLY_DEBUG_44x_PHYSLOW
-	hex
+	hex "Low 32bits of UART address"
 	depends PPC_EARLY_DEBUG_44x
 	default "0x40000200"
 
 config PPC_EARLY_DEBUG_44x_PHYSHIGH
-	hex
+	hex "ERPN of UART address"
 	depends PPC_EARLY_DEBUG_44x
 	default "0x1"
 

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 11/15] zImage wrapper for Ebony
  2007-03-05  3:24 ` [PATCH 11/15] zImage wrapper for Ebony David Gibson
  2007-03-05 17:10   ` Mark A. Greer
@ 2007-03-09 17:50   ` Josh Boyer
  2007-03-10  4:08     ` David Gibson
  1 sibling, 1 reply; 53+ messages in thread
From: Josh Boyer @ 2007-03-09 17:50 UTC (permalink / raw)
  To: David Gibson; +Cc: linuxppc-dev

On Mon, 2007-03-05 at 14:24 +1100, David Gibson wrote:
> Index: working-2.6/arch/powerpc/boot/ebony.c
> ===================================================================
> --- /dev/null	1970-01-01 00:00:00.000000000 +0000
> +++ working-2.6/arch/powerpc/boot/ebony.c	2007-02-26 13:46:05.000000000 +1100

> +
> +static inline u32 mfpvr(void)
> +{
> +	u32 pvr;
> +	asm volatile ("mfpvr	%0" : "=r"(pvr));
> +	return pvr;
> +}

This could probably go in a generic util.h file.

> +
> +void poke_tree(const char *path, const char *name, void *val, int size)
> +{
> +	void *devp;
> +	int ret;
> +
> +	devp = finddevice(path);
> +	if (! devp) {
> +		printf("Couldn't find node %s to poke\n\r", path);
> +		exit();
> +	}
> +
> +	ret = setprop(devp, name, val, size);
> +	if (ret != 0) {
> +		printf("Couldn't set %s property in %s\n\r", name, path);
> +		exit();
> +	}
> +}
> +
> +#define poke_tree_val(path, name, val)	\
> +	do { \
> +		typeof(val) x = val; \
> +		poke_tree((path),(name),&x,sizeof(x)); \
> +	} while (0)
> +
> +/* Read the 44x memory controller to get size of system memory. */
> +static void ibm44x_fixup_memsize(void)
> +{
> +	int i;
> +	unsigned long memsize, bank_config;
> +	u32 memreg[3];
> +
> +	memsize = 0;
> +	for (i = 0; i < ARRAY_SIZE(sdram_bxcr); i++) {
> +		mtdcr(DCRN_SDRAM0_CFGADDR, sdram_bxcr[i]);
> +		bank_config = mfdcr(DCRN_SDRAM0_CFGDATA);
> +
> +		if (bank_config & SDRAM_CONFIG_BANK_ENABLE)
> +			memsize += SDRAM_CONFIG_BANK_SIZE(bank_config);
> +	}
> +
> +	printf("PPC44X: %dM RAM\n\r", memsize / 1024 / 1024);
> +	memreg[0] = memreg[1] = 0;
> +	memreg[2] = memsize;
> +	poke_tree("/memory", "reg", memreg, sizeof(memreg));
> +}

Is it possible to pull these three out into a 4xx_misc.c file?  The
exact same memory fixup can be used on boards other than Ebony (Bamboo
for example).

josh

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 14/15] Early serial debug support for PPC44x
  2007-03-09 17:42     ` Josh Boyer
@ 2007-03-09 23:43       ` David Gibson
  0 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-09 23:43 UTC (permalink / raw)
  To: Josh Boyer; +Cc: linuxppc-dev

On Fri, Mar 09, 2007 at 11:42:01AM -0600, Josh Boyer wrote:
> On Thu, 2007-03-08 at 13:44 -0600, Josh Boyer wrote:
> > On Mon, 2007-03-05 at 14:24 +1100, David Gibson wrote:
> > > 
> > > +config PPC_EARLY_DEBUG_44x_PHYSLOW
> > > +	hex
> > > +	depends PPC_EARLY_DEBUG_44x
> > > +	default "0x40000200"
> > > +
> > > +config PPC_EARLY_DEBUG_44x_PHYSHIGH
> > > +	hex
> > > +	depends PPC_EARLY_DEBUG_44x
> > > +	default "0x1"
> > > +
> > 
> > These two options need to have some kind of description string next to
> > hex otherwise Kconfig will not allow you to set them.  I noticed this
> > while playing with bamboo.  So something like:
> > 
> > config PPC_EARLY_DEBUG_44x_PHYSLOW
> > 	hex "The low 32bits of the UART address"
> > 
> > That will allow you to change the values from the default.
> 
> And here's a patch to do that.
> 
> Fix the PPC_EARLY_DEBUG_44x options to allow setting something other
> than the default.

Ta, I'll fold that in.  Incidentally the idea is that the default will
change depending on config.  So if only bamboo is configured, it
should just work.

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 11/15] zImage wrapper for Ebony
  2007-03-09 17:50   ` Josh Boyer
@ 2007-03-10  4:08     ` David Gibson
  0 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-10  4:08 UTC (permalink / raw)
  To: Josh Boyer; +Cc: linuxppc-dev

On Fri, Mar 09, 2007 at 11:50:11AM -0600, Josh Boyer wrote:
> On Mon, 2007-03-05 at 14:24 +1100, David Gibson wrote:
> > Index: working-2.6/arch/powerpc/boot/ebony.c
> > ===================================================================
> > --- /dev/null	1970-01-01 00:00:00.000000000 +0000
> > +++ working-2.6/arch/powerpc/boot/ebony.c	2007-02-26 13:46:05.000000000 +1100
> 
> > +
> > +static inline u32 mfpvr(void)
> > +{
> > +	u32 pvr;
> > +	asm volatile ("mfpvr	%0" : "=r"(pvr));
> > +	return pvr;
> > +}
> 
> This could probably go in a generic util.h file.

Yes.  I just wasn't sure where, so left it there for now.

> > +void poke_tree(const char *path, const char *name, void *val, int size)
> > +{
> > +	void *devp;
> > +	int ret;
> > +
> > +	devp = finddevice(path);
> > +	if (! devp) {
> > +		printf("Couldn't find node %s to poke\n\r", path);
> > +		exit();
> > +	}
> > +
> > +	ret = setprop(devp, name, val, size);
> > +	if (ret != 0) {
> > +		printf("Couldn't set %s property in %s\n\r", name, path);
> > +		exit();
> > +	}
> > +}
> > +
> > +#define poke_tree_val(path, name, val)	\
> > +	do { \
> > +		typeof(val) x = val; \
> > +		poke_tree((path),(name),&x,sizeof(x)); \
> > +	} while (0)
> > +
> > +/* Read the 44x memory controller to get size of system memory. */
> > +static void ibm44x_fixup_memsize(void)
> > +{
> > +	int i;
> > +	unsigned long memsize, bank_config;
> > +	u32 memreg[3];
> > +
> > +	memsize = 0;
> > +	for (i = 0; i < ARRAY_SIZE(sdram_bxcr); i++) {
> > +		mtdcr(DCRN_SDRAM0_CFGADDR, sdram_bxcr[i]);
> > +		bank_config = mfdcr(DCRN_SDRAM0_CFGDATA);
> > +
> > +		if (bank_config & SDRAM_CONFIG_BANK_ENABLE)
> > +			memsize += SDRAM_CONFIG_BANK_SIZE(bank_config);
> > +	}
> > +
> > +	printf("PPC44X: %dM RAM\n\r", memsize / 1024 / 1024);
> > +	memreg[0] = memreg[1] = 0;
> > +	memreg[2] = memsize;
> > +	poke_tree("/memory", "reg", memreg, sizeof(memreg));
> > +}
> 
> Is it possible to pull these three out into a 4xx_misc.c file?  The
> exact same memory fixup can be used on boards other than Ebony (Bamboo
> for example).

Yeah, I've been expecting to move those into a general use file,
something like that.  But I was going to wait until the second board
came along to see what's really common.  Oh, plus I'm not sure what to
do with the poke_tree() functions - they're not 44x specific at all,
but I'm wondering if they want cleaning up before being exported to
everybody.

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-05  3:24 ` [PATCH 8/15] zImage: Cleanup and improve zImage entry point David Gibson
@ 2007-03-15 22:35   ` Mark A. Greer
  2007-03-16  0:14     ` David Gibson
  2007-03-15 23:02   ` Mark A. Greer
  1 sibling, 1 reply; 53+ messages in thread
From: Mark A. Greer @ 2007-03-15 22:35 UTC (permalink / raw)
  To: David Gibson; +Cc: linuxppc-dev

On Mon, Mar 05, 2007 at 02:24:52PM +1100, David Gibson wrote:

Hi David,

<snip>

> Index: working-2.6/arch/powerpc/boot/ops.h
> ===================================================================
> --- working-2.6.orig/arch/powerpc/boot/ops.h	2007-02-19 14:01:38.000000000 +1100
> +++ working-2.6/arch/powerpc/boot/ops.h	2007-02-19 14:01:43.000000000 +1100

<snip>

> @@ -100,4 +106,8 @@ static inline void exit(void)
>  	for(;;);
>  }
>  
> +#define BSS_STACK(size) \
> +	static char _bss_stack[size]; \
> +	void *_platform_stack_top = _bss_stack + sizeof(_bss_stack);
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
>  #endif /* _PPC_BOOT_OPS_H_ */

Statically initializing _platform_stack_top (or any variable) won't
work when you download/run the zImage at a location different than
where its linked at.  Yes, I know the image is "relocatable" but that
doesn't work for addresses put into variables/structs at link time
like this one.  That type of assignment has to be done at runtime.

What happens is the linker puts 0x0040_1234, say, into
_platform_stack_top but when you download the image to 0x0080_0000
it still has a value of 0x0040_1234 even though its running at
0x00800_0000+.

I think there's at least one more biting me in either yours
or Scott's patches that I'm looking for now.

Mark

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-05  3:24 ` [PATCH 8/15] zImage: Cleanup and improve zImage entry point David Gibson
  2007-03-15 22:35   ` Mark A. Greer
@ 2007-03-15 23:02   ` Mark A. Greer
  2007-03-16  0:18     ` David Gibson
  1 sibling, 1 reply; 53+ messages in thread
From: Mark A. Greer @ 2007-03-15 23:02 UTC (permalink / raw)
  To: David Gibson; +Cc: linuxppc-dev

On Mon, Mar 05, 2007 at 02:24:52PM +1100, David Gibson wrote:

<snip>

> 1) It can define a _zimage_start, in which case the platform code gets
>    control from the very beginning of execution.  In this case the
>    platform code is responsible for relocating the zImage if necessary,
>    clearing the BSS, performing any platform specific initialization, and
>    finally calling start() to load and enter the kernel.
> 
> 2) It can define platform_init().  In this case the generic crt0.S
>    handles initial entry, and calls platform_init() before calling
>    start().  The signature of platform_init() is changed, however, to
>    take up to 5 parameters (in r3..r7) as they come from the platform's
>    initial loader, instead of a fixed set of parameters based on OF's
>    usage.

<snip>

> In addition the wrapper script is rearranged to ensure that the
> platform .o is always linked first.  This means that platforms where
> the zImage entry point is at a fixed address or offset, rather than
> being encoded in the binary header can be supported using option (1).

But now you don't have a fixed address for _zimage_start when you use
option 2).  I don't know what address _zimage_start is at so I can't
start it.  This is an issue for fw's that don't understand ELF and simply
download a bucket of bits.  You have to tell the fw where to jump to
(e.g., go 0x410010).

Mark

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-15 22:35   ` Mark A. Greer
@ 2007-03-16  0:14     ` David Gibson
  2007-03-16  1:01       ` Mark A. Greer
  0 siblings, 1 reply; 53+ messages in thread
From: David Gibson @ 2007-03-16  0:14 UTC (permalink / raw)
  To: Mark A. Greer; +Cc: linuxppc-dev

On Thu, Mar 15, 2007 at 03:35:29PM -0700, Mark A. Greer wrote:
> On Mon, Mar 05, 2007 at 02:24:52PM +1100, David Gibson wrote:
> 
> Hi David,
> 
> <snip>
> 
> > Index: working-2.6/arch/powerpc/boot/ops.h
> > ===================================================================
> > --- working-2.6.orig/arch/powerpc/boot/ops.h	2007-02-19 14:01:38.000000000 +1100
> > +++ working-2.6/arch/powerpc/boot/ops.h	2007-02-19 14:01:43.000000000 +1100
> 
> <snip>
> 
> > @@ -100,4 +106,8 @@ static inline void exit(void)
> >  	for(;;);
> >  }
> >  
> > +#define BSS_STACK(size) \
> > +	static char _bss_stack[size]; \
> > +	void *_platform_stack_top = _bss_stack + sizeof(_bss_stack);
>               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > +
> >  #endif /* _PPC_BOOT_OPS_H_ */
> 
> Statically initializing _platform_stack_top (or any variable) won't
> work when you download/run the zImage at a location different than
> where its linked at.  Yes, I know the image is "relocatable" but that
> doesn't work for addresses put into variables/structs at link time
> like this one.  That type of assignment has to be done at runtime.
> 
> What happens is the linker puts 0x0040_1234, say, into
> _platform_stack_top but when you download the image to 0x0080_0000
> it still has a value of 0x0040_1234 even though its running at
> 0x00800_0000+.

Ah, good point.  In this case we should be able to fix this by having
crt0.S relocate the pointer before loading it into r1, yes, in the
same way it relocates the GOT entries?

Incidentally I would have preferred not to store the stack address in
a variable, but just generated a symbol for the stack top and loaded
that directly in crt0.S.  But I couldn't think of a way in the C macro
to generate the necesary symbol at the end of the stack.

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-15 23:02   ` Mark A. Greer
@ 2007-03-16  0:18     ` David Gibson
  2007-03-16  0:47       ` Mark A. Greer
  0 siblings, 1 reply; 53+ messages in thread
From: David Gibson @ 2007-03-16  0:18 UTC (permalink / raw)
  To: Mark A. Greer; +Cc: linuxppc-dev

On Thu, Mar 15, 2007 at 04:02:30PM -0700, Mark A. Greer wrote:
> On Mon, Mar 05, 2007 at 02:24:52PM +1100, David Gibson wrote:
> 
> <snip>
> 
> > 1) It can define a _zimage_start, in which case the platform code gets
> >    control from the very beginning of execution.  In this case the
> >    platform code is responsible for relocating the zImage if necessary,
> >    clearing the BSS, performing any platform specific initialization, and
> >    finally calling start() to load and enter the kernel.
> > 
> > 2) It can define platform_init().  In this case the generic crt0.S
> >    handles initial entry, and calls platform_init() before calling
> >    start().  The signature of platform_init() is changed, however, to
> >    take up to 5 parameters (in r3..r7) as they come from the platform's
> >    initial loader, instead of a fixed set of parameters based on OF's
> >    usage.
> 
> <snip>
> 
> > In addition the wrapper script is rearranged to ensure that the
> > platform .o is always linked first.  This means that platforms where
> > the zImage entry point is at a fixed address or offset, rather than
> > being encoded in the binary header can be supported using option (1).
> 
> But now you don't have a fixed address for _zimage_start when you use
> option 2).  I don't know what address _zimage_start is at so I can't
> start it.  This is an issue for fw's that don't understand ELF and simply
> download a bucket of bits.  You have to tell the fw where to jump to
> (e.g., go 0x410010).

The patch already includes an example that deals with this case,
uImage.  The wrapper script pulls the ELF entry point information out
using objdump and puts it into uboot's structure.

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-16  0:18     ` David Gibson
@ 2007-03-16  0:47       ` Mark A. Greer
  2007-03-16  0:50         ` David Gibson
  0 siblings, 1 reply; 53+ messages in thread
From: Mark A. Greer @ 2007-03-16  0:47 UTC (permalink / raw)
  To: Mark A. Greer, linuxppc-dev

On Fri, Mar 16, 2007 at 11:18:19AM +1100, David Gibson wrote:
> On Thu, Mar 15, 2007 at 04:02:30PM -0700, Mark A. Greer wrote:
> > On Mon, Mar 05, 2007 at 02:24:52PM +1100, David Gibson wrote:
> > > In addition the wrapper script is rearranged to ensure that the
> > > platform .o is always linked first.  This means that platforms where
> > > the zImage entry point is at a fixed address or offset, rather than
> > > being encoded in the binary header can be supported using option (1).
> > 
> > But now you don't have a fixed address for _zimage_start when you use
> > option 2).  I don't know what address _zimage_start is at so I can't
> > start it.  This is an issue for fw's that don't understand ELF and simply
> > download a bucket of bits.  You have to tell the fw where to jump to
> > (e.g., go 0x410010).
> 
> The patch already includes an example that deals with this case,
> uImage.  The wrapper script pulls the ELF entry point information out
> using objdump and puts it into uboot's structure.

Sure, you're putting the addr into a struct in the uimage that u-boot
knows enough to get.

'u-boot' == smart
'my firmware' == dumb

I'm talking about a fw that knows *nothing* about what its downloading/
running--its just a bucket of bits/instructions.  It doesn't get an address
out of the image.  It has to be told explicitly where to download the image
to and where to jump to.  As in, by someone sitting at the console who went
and dug out the start addr.  Or, more likely with a prestored jump cmd that
someone figured out the right address for and stored.  But, when the start
addr changes, suddenly it won't boot and someone has to figure out why,
find the the new start addr, modify the prestored cmd(s), and its good
until the next time the start addr changes.

We need something better than that.

Mark

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-16  0:47       ` Mark A. Greer
@ 2007-03-16  0:50         ` David Gibson
  2007-03-16  3:45           ` Mark A. Greer
  2007-03-16 16:21           ` Scott Wood
  0 siblings, 2 replies; 53+ messages in thread
From: David Gibson @ 2007-03-16  0:50 UTC (permalink / raw)
  To: Mark A. Greer; +Cc: linuxppc-dev

On Thu, Mar 15, 2007 at 05:47:17PM -0700, Mark A. Greer wrote:
> On Fri, Mar 16, 2007 at 11:18:19AM +1100, David Gibson wrote:
> > On Thu, Mar 15, 2007 at 04:02:30PM -0700, Mark A. Greer wrote:
> > > On Mon, Mar 05, 2007 at 02:24:52PM +1100, David Gibson wrote:
> > > > In addition the wrapper script is rearranged to ensure that the
> > > > platform .o is always linked first.  This means that platforms where
> > > > the zImage entry point is at a fixed address or offset, rather than
> > > > being encoded in the binary header can be supported using option (1).
> > > 
> > > But now you don't have a fixed address for _zimage_start when you use
> > > option 2).  I don't know what address _zimage_start is at so I can't
> > > start it.  This is an issue for fw's that don't understand ELF and simply
> > > download a bucket of bits.  You have to tell the fw where to jump to
> > > (e.g., go 0x410010).
> > 
> > The patch already includes an example that deals with this case,
> > uImage.  The wrapper script pulls the ELF entry point information out
> > using objdump and puts it into uboot's structure.
> 
> Sure, you're putting the addr into a struct in the uimage that u-boot
> knows enough to get.
> 
> 'u-boot' == smart
> 'my firmware' == dumb
> 
> I'm talking about a fw that knows *nothing* about what its downloading/
> running--its just a bucket of bits/instructions.  It doesn't get an address
> out of the image.  It has to be told explicitly where to download the image
> to and where to jump to.  As in, by someone sitting at the console who went
> and dug out the start addr.  Or, more likely with a prestored jump cmd that
> someone figured out the right address for and stored.  But, when the start
> addr changes, suddenly it won't boot and someone has to figure out why,
> find the the new start addr, modify the prestored cmd(s), and its good
> until the next time the start addr changes.

Sorry, I misunderstood.  That sort of firmware - and the even dumber
sort where the start address isn't configurable at all - is exactly
what option (1) is for.  You'll need an asm platform file which
defines _zimage_start to a fixed offset.  In your case you could
probably just make it a jump to the generic _zimage_start.

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-16  0:14     ` David Gibson
@ 2007-03-16  1:01       ` Mark A. Greer
  2007-03-16  1:50         ` David Gibson
  0 siblings, 1 reply; 53+ messages in thread
From: Mark A. Greer @ 2007-03-16  1:01 UTC (permalink / raw)
  To: Mark A. Greer, linuxppc-dev

On Fri, Mar 16, 2007 at 11:14:30AM +1100, David Gibson wrote:
> On Thu, Mar 15, 2007 at 03:35:29PM -0700, Mark A. Greer wrote:

<snip>

> > On Mon, Mar 05, 2007 at 02:24:52PM +1100, David Gibson wrote:
> > Statically initializing _platform_stack_top (or any variable) won't
> > work when you download/run the zImage at a location different than
> > where its linked at.  Yes, I know the image is "relocatable" but that
> > doesn't work for addresses put into variables/structs at link time
> > like this one.  That type of assignment has to be done at runtime.
> > 
> > What happens is the linker puts 0x0040_1234, say, into
> > _platform_stack_top but when you download the image to 0x0080_0000
> > it still has a value of 0x0040_1234 even though its running at
> > 0x00800_0000+.
> 
> Ah, good point.  In this case we should be able to fix this by having
> crt0.S relocate the pointer before loading it into r1, yes, in the
> same way it relocates the GOT entries?
>
> Incidentally I would have preferred not to store the stack address in
> a variable, but just generated a symbol for the stack top and loaded
> that directly in crt0.S.  But I couldn't think of a way in the C macro
> to generate the necesary symbol at the end of the stack.

What about something like this:

#define BSS_STACK(size) \
	static char _bss_stack[size]; \
	u32 _platform_stack_size = size;

Then in crt0.S add value of _platform_stack_size to _bss_stack to get r1?
That should relocate correctly.

Mark

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-16  1:01       ` Mark A. Greer
@ 2007-03-16  1:50         ` David Gibson
  2007-03-16  3:36           ` Mark A. Greer
  0 siblings, 1 reply; 53+ messages in thread
From: David Gibson @ 2007-03-16  1:50 UTC (permalink / raw)
  To: Mark A. Greer; +Cc: linuxppc-dev

On Thu, Mar 15, 2007 at 06:01:16PM -0700, Mark A. Greer wrote:
> On Fri, Mar 16, 2007 at 11:14:30AM +1100, David Gibson wrote:
> > On Thu, Mar 15, 2007 at 03:35:29PM -0700, Mark A. Greer wrote:
> 
> <snip>
> 
> > > On Mon, Mar 05, 2007 at 02:24:52PM +1100, David Gibson wrote:
> > > Statically initializing _platform_stack_top (or any variable) won't
> > > work when you download/run the zImage at a location different than
> > > where its linked at.  Yes, I know the image is "relocatable" but that
> > > doesn't work for addresses put into variables/structs at link time
> > > like this one.  That type of assignment has to be done at runtime.
> > > 
> > > What happens is the linker puts 0x0040_1234, say, into
> > > _platform_stack_top but when you download the image to 0x0080_0000
> > > it still has a value of 0x0040_1234 even though its running at
> > > 0x00800_0000+.
> > 
> > Ah, good point.  In this case we should be able to fix this by having
> > crt0.S relocate the pointer before loading it into r1, yes, in the
> > same way it relocates the GOT entries?
> >
> > Incidentally I would have preferred not to store the stack address in
> > a variable, but just generated a symbol for the stack top and loaded
> > that directly in crt0.S.  But I couldn't think of a way in the C macro
> > to generate the necesary symbol at the end of the stack.
> 
> What about something like this:
> 
> #define BSS_STACK(size) \
> 	static char _bss_stack[size]; \
> 	u32 _platform_stack_size = size;
> 
> Then in crt0.S add value of _platform_stack_size to _bss_stack to get r1?
> That should relocate correctly.

That sounds reasonable, though it's slightly more involved that the
current code.  I'm wrangling another stack of bootloader patches at
the moment, you want to send something to implement this?

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-16  1:50         ` David Gibson
@ 2007-03-16  3:36           ` Mark A. Greer
  2007-03-20 20:20             ` Mark A. Greer
  0 siblings, 1 reply; 53+ messages in thread
From: Mark A. Greer @ 2007-03-16  3:36 UTC (permalink / raw)
  To: Mark A. Greer, linuxppc-dev

On Fri, Mar 16, 2007 at 12:50:23PM +1100, David Gibson wrote:
> On Thu, Mar 15, 2007 at 06:01:16PM -0700, Mark A. Greer wrote:
> > On Fri, Mar 16, 2007 at 11:14:30AM +1100, David Gibson wrote:
> > > On Thu, Mar 15, 2007 at 03:35:29PM -0700, Mark A. Greer wrote:
> > 
> > <snip>
> > 
> > > > On Mon, Mar 05, 2007 at 02:24:52PM +1100, David Gibson wrote:
> > > > Statically initializing _platform_stack_top (or any variable) won't
> > > > work when you download/run the zImage at a location different than
> > > > where its linked at.  Yes, I know the image is "relocatable" but that
> > > > doesn't work for addresses put into variables/structs at link time
> > > > like this one.  That type of assignment has to be done at runtime.
> > > > 
> > > > What happens is the linker puts 0x0040_1234, say, into
> > > > _platform_stack_top but when you download the image to 0x0080_0000
> > > > it still has a value of 0x0040_1234 even though its running at
> > > > 0x00800_0000+.
> > > 
> > > Ah, good point.  In this case we should be able to fix this by having
> > > crt0.S relocate the pointer before loading it into r1, yes, in the
> > > same way it relocates the GOT entries?
> > >
> > > Incidentally I would have preferred not to store the stack address in
> > > a variable, but just generated a symbol for the stack top and loaded
> > > that directly in crt0.S.  But I couldn't think of a way in the C macro
> > > to generate the necesary symbol at the end of the stack.
> > 
> > What about something like this:
> > 
> > #define BSS_STACK(size) \
> > 	static char _bss_stack[size]; \
> > 	u32 _platform_stack_size = size;
> > 
> > Then in crt0.S add value of _platform_stack_size to _bss_stack to get r1?
> > That should relocate correctly.
> 
> That sounds reasonable, though it's slightly more involved that the
> current code.  I'm wrangling another stack of bootloader patches at
> the moment, you want to send something to implement this?

Sure.  I want to get my current stack of patches working on top of yours
& Scott's first then I'll make a patch for this (I've just hacked around
this issue for now).  Stay tuned.

Mark

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-16  0:50         ` David Gibson
@ 2007-03-16  3:45           ` Mark A. Greer
  2007-03-16  4:02             ` David Gibson
  2007-03-16 16:21           ` Scott Wood
  1 sibling, 1 reply; 53+ messages in thread
From: Mark A. Greer @ 2007-03-16  3:45 UTC (permalink / raw)
  To: Mark A. Greer, linuxppc-dev

On Fri, Mar 16, 2007 at 11:50:16AM +1100, David Gibson wrote:
> On Thu, Mar 15, 2007 at 05:47:17PM -0700, Mark A. Greer wrote:
> > On Fri, Mar 16, 2007 at 11:18:19AM +1100, David Gibson wrote:
> > > On Thu, Mar 15, 2007 at 04:02:30PM -0700, Mark A. Greer wrote:
> > > > On Mon, Mar 05, 2007 at 02:24:52PM +1100, David Gibson wrote:
> > > > > In addition the wrapper script is rearranged to ensure that the
> > > > > platform .o is always linked first.  This means that platforms where
> > > > > the zImage entry point is at a fixed address or offset, rather than
> > > > > being encoded in the binary header can be supported using option (1).
> > > > 
> > > > But now you don't have a fixed address for _zimage_start when you use
> > > > option 2).  I don't know what address _zimage_start is at so I can't
> > > > start it.  This is an issue for fw's that don't understand ELF and simply
> > > > download a bucket of bits.  You have to tell the fw where to jump to
> > > > (e.g., go 0x410010).
> > > 
> > > The patch already includes an example that deals with this case,
> > > uImage.  The wrapper script pulls the ELF entry point information out
> > > using objdump and puts it into uboot's structure.
> > 
> > Sure, you're putting the addr into a struct in the uimage that u-boot
> > knows enough to get.
> > 
> > 'u-boot' == smart
> > 'my firmware' == dumb
> > 
> > I'm talking about a fw that knows *nothing* about what its downloading/
> > running--its just a bucket of bits/instructions.  It doesn't get an address
> > out of the image.  It has to be told explicitly where to download the image
> > to and where to jump to.  As in, by someone sitting at the console who went
> > and dug out the start addr.  Or, more likely with a prestored jump cmd that
> > someone figured out the right address for and stored.  But, when the start
> > addr changes, suddenly it won't boot and someone has to figure out why,
> > find the the new start addr, modify the prestored cmd(s), and its good
> > until the next time the start addr changes.
> 
> Sorry, I misunderstood.  That sort of firmware - and the even dumber
> sort where the start address isn't configurable at all - is exactly
> what option (1) is for.  You'll need an asm platform file which
> defines _zimage_start to a fixed offset.  In your case you could
> probably just make it a jump to the generic _zimage_start.

Arg, I was afraid you were going to say that.  What I don't like is that
I'll simply duplicate the functionality of crt0.S verbatim just so I know
where the start addr is.  It really has nothing to do with crt0.S and
everything to do with the link order.

/me still thinks there's a better way.

<rant>
Actually, I like it less than I'm letting on.  Basically, you changed
something that has existed for a long time and worked fine for everyone.
In the process, my stuff and others were broken.  All of this to support
an option that there are no users of yet (AFAIK).  I think this needs to
go back to the old link order and/or a better solution found.
</rant>

Mark

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-16  3:45           ` Mark A. Greer
@ 2007-03-16  4:02             ` David Gibson
  0 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-16  4:02 UTC (permalink / raw)
  To: Mark A. Greer; +Cc: linuxppc-dev

On Thu, Mar 15, 2007 at 08:45:39PM -0700, Mark A. Greer wrote:
> On Fri, Mar 16, 2007 at 11:50:16AM +1100, David Gibson wrote:
> > On Thu, Mar 15, 2007 at 05:47:17PM -0700, Mark A. Greer wrote:
> > > On Fri, Mar 16, 2007 at 11:18:19AM +1100, David Gibson wrote:
> > > > On Thu, Mar 15, 2007 at 04:02:30PM -0700, Mark A. Greer wrote:
> > > > > On Mon, Mar 05, 2007 at 02:24:52PM +1100, David Gibson wrote:
> > > > > > In addition the wrapper script is rearranged to ensure that the
> > > > > > platform .o is always linked first.  This means that platforms where
> > > > > > the zImage entry point is at a fixed address or offset, rather than
> > > > > > being encoded in the binary header can be supported using option (1).
> > > > > 
> > > > > But now you don't have a fixed address for _zimage_start when you use
> > > > > option 2).  I don't know what address _zimage_start is at so I can't
> > > > > start it.  This is an issue for fw's that don't understand ELF and simply
> > > > > download a bucket of bits.  You have to tell the fw where to jump to
> > > > > (e.g., go 0x410010).
> > > > 
> > > > The patch already includes an example that deals with this case,
> > > > uImage.  The wrapper script pulls the ELF entry point information out
> > > > using objdump and puts it into uboot's structure.
> > > 
> > > Sure, you're putting the addr into a struct in the uimage that u-boot
> > > knows enough to get.
> > > 
> > > 'u-boot' == smart
> > > 'my firmware' == dumb
> > > 
> > > I'm talking about a fw that knows *nothing* about what its downloading/
> > > running--its just a bucket of bits/instructions.  It doesn't get an address
> > > out of the image.  It has to be told explicitly where to download the image
> > > to and where to jump to.  As in, by someone sitting at the console who went
> > > and dug out the start addr.  Or, more likely with a prestored jump cmd that
> > > someone figured out the right address for and stored.  But, when the start
> > > addr changes, suddenly it won't boot and someone has to figure out why,
> > > find the the new start addr, modify the prestored cmd(s), and its good
> > > until the next time the start addr changes.
> > 
> > Sorry, I misunderstood.  That sort of firmware - and the even dumber
> > sort where the start address isn't configurable at all - is exactly
> > what option (1) is for.  You'll need an asm platform file which
> > defines _zimage_start to a fixed offset.  In your case you could
> > probably just make it a jump to the generic _zimage_start.
> 
> Arg, I was afraid you were going to say that.  What I don't like is that
> I'll simply duplicate the functionality of crt0.S verbatim just so I know
> where the start addr is.  It really has nothing to do with crt0.S and
> everything to do with the link order.

You don't need to duplicate crt0.S verbatim, all you need is a single
branch instruction.  Well, and we'll need to define a second symbol
that's not weak at the same place as crt0.S's version of
_zimage_start, say _default_zimage_start.

Maybe we can come up with an easy way for each platform to generate
that instruction at the right address.

> /me still thinks there's a better way.

Well, if you figure out a better way, let me know.  

> <rant>
> Actually, I like it less than I'm letting on.  Basically, you changed
> something that has existed for a long time and worked fine for everyone.
> In the process, my stuff and others were broken.  All of this to support
> an option that there are no users of yet (AFAIK).  I think this needs to
> go back to the old link order and/or a better solution found.
> </rant>

Well, we'll have a user soon in ps3.  The thing is somewhere along the
line we will have to support platforms that have an absolutely fixed
entry point.  Almost certainly there will be more than one such
platform with a different magic entry point address.  Therefore we
*have* to give ultimate control of the low addresses and entry point
to the platform code; it can't be common.

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-16  0:50         ` David Gibson
  2007-03-16  3:45           ` Mark A. Greer
@ 2007-03-16 16:21           ` Scott Wood
  2007-03-17  1:38             ` David Gibson
  1 sibling, 1 reply; 53+ messages in thread
From: Scott Wood @ 2007-03-16 16:21 UTC (permalink / raw)
  To: Mark A. Greer, linuxppc-dev

On Fri, Mar 16, 2007 at 11:50:16AM +1100, David Gibson wrote:
> Sorry, I misunderstood.  That sort of firmware - and the even dumber
> sort where the start address isn't configurable at all - is exactly
> what option (1) is for.  You'll need an asm platform file which
> defines _zimage_start to a fixed offset.  In your case you could
> probably just make it a jump to the generic _zimage_start.

One problem with that is that the wrapper currently only accepts one
platform .o file -- and presumably one isn't going to want to do all of
the platform code in assembly.

If the wrapper is changed to allow two platform .o files, then the link
order can be "platform_early.o crt0.o platform.o".  If platform_early.o
isn't provided, then crt0.o goes first, and one doesn't need to provide a
platform .S for the special case of having the entry be at a known offset
from the start of the file, while still allowing a platform .S to be
provided for cases where it's really needed.

-Scott

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 6/15] zImage: Add more flexible gunzip convenience functions
  2007-03-05  3:24 ` [PATCH 6/15] zImage: Add more flexible gunzip convenience functions David Gibson
@ 2007-03-16 16:24   ` Geoff Levand
  2007-03-17 12:59     ` David Gibson
  0 siblings, 1 reply; 53+ messages in thread
From: Geoff Levand @ 2007-03-16 16:24 UTC (permalink / raw)
  To: David Gibson; +Cc: linuxppc-dev

David Gibson wrote:
> This patch adds a new set of more flexible convenience wrappers around
> zlib, moving them to their own file, gunzip_util.c, in the process.
> These wrappers allow decompressing sections of the compressed image to
> different locations.  In addition, they transparently handle
> uncompressed data, avoiding special case code to handle uncompressed
> vmlinux images.

Hi.

I was waiting for the zimage churn to settle before looking into this
change, but I though I would let you know so you can keep it in mind
if you do any work here.

As I mentioned in another mail, the PS3's 1st stage loader (in the
hypervisor) supports loading a gzipped binary memory image from flash.
So for Linux, that would be a gzipped zImage.  Since the entire zImage
is uncompressed by the loader, there is no need to have the kernel image
compressed on its own, nor to include the zlib code in the wrapper.

Here is a functional expression of what we have now, and what would
be ideal:

zImage.gz = gzip(wrapper bits + zlib + gzip(vmlinx) + dtb)

zImage.gz = gzip(wrapper bits + vmlinx + dtb)

-Geoff

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-16 16:21           ` Scott Wood
@ 2007-03-17  1:38             ` David Gibson
  2007-03-17  3:15               ` Geoff Levand
  2007-03-19 15:06               ` Scott Wood
  0 siblings, 2 replies; 53+ messages in thread
From: David Gibson @ 2007-03-17  1:38 UTC (permalink / raw)
  To: Scott Wood; +Cc: linuxppc-dev

On Fri, Mar 16, 2007 at 11:21:35AM -0500, Scott Wood wrote:
> On Fri, Mar 16, 2007 at 11:50:16AM +1100, David Gibson wrote:
> > Sorry, I misunderstood.  That sort of firmware - and the even dumber
> > sort where the start address isn't configurable at all - is exactly
> > what option (1) is for.  You'll need an asm platform file which
> > defines _zimage_start to a fixed offset.  In your case you could
> > probably just make it a jump to the generic _zimage_start.
> 
> One problem with that is that the wrapper currently only accepts one
> platform .o file -- and presumably one isn't going to want to do all of
> the platform code in assembly.

Um.. nobody does it yet, but I don't think there's actually any reason
that $platformo can't be set to a list of multiple .o files.

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-17  1:38             ` David Gibson
@ 2007-03-17  3:15               ` Geoff Levand
  2007-03-19 15:06               ` Scott Wood
  1 sibling, 0 replies; 53+ messages in thread
From: Geoff Levand @ 2007-03-17  3:15 UTC (permalink / raw)
  To: Scott Wood, Mark A. Greer, linuxppc-dev

David Gibson wrote:
> On Fri, Mar 16, 2007 at 11:21:35AM -0500, Scott Wood wrote:
>> One problem with that is that the wrapper currently only accepts one
>> platform .o file -- and presumably one isn't going to want to do all of
>> the platform code in assembly.
> 
> Um.. nobody does it yet, but I don't think there's actually any reason
> that $platformo can't be set to a list of multiple .o files.

I have it setup like this, from a mix of .c and .S sources:

+ps3)
+    platformo="$object/head_64.o $object/smp.o $object/ps3-hvcall.o $object/ps3.o"

-Geoff

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 6/15] zImage: Add more flexible gunzip convenience functions
  2007-03-16 16:24   ` Geoff Levand
@ 2007-03-17 12:59     ` David Gibson
  0 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-17 12:59 UTC (permalink / raw)
  To: Geoff Levand; +Cc: linuxppc-dev

On Fri, Mar 16, 2007 at 09:24:02AM -0700, Geoff Levand wrote:
> David Gibson wrote:
> > This patch adds a new set of more flexible convenience wrappers around
> > zlib, moving them to their own file, gunzip_util.c, in the process.
> > These wrappers allow decompressing sections of the compressed image to
> > different locations.  In addition, they transparently handle
> > uncompressed data, avoiding special case code to handle uncompressed
> > vmlinux images.
> 
> Hi.
> 
> I was waiting for the zimage churn to settle before looking into this
> change, but I though I would let you know so you can keep it in mind
> if you do any work here.
> 
> As I mentioned in another mail, the PS3's 1st stage loader (in the
> hypervisor) supports loading a gzipped binary memory image from flash.
> So for Linux, that would be a gzipped zImage.  Since the entire zImage
> is uncompressed by the loader, there is no need to have the kernel image
> compressed on its own, nor to include the zlib code in the wrapper.
> 
> Here is a functional expression of what we have now, and what would
> be ideal:
> 
> zImage.gz = gzip(wrapper bits + zlib + gzip(vmlinx) + dtb)
> 
> zImage.gz = gzip(wrapper bits + vmlinx + dtb)

Ok.  The only bit of that we don't do already is omitting zlib from an
zImage with a decompressed kernel.  I imagine that's a fairly marginal
gain, and slightly fiddly to achieve, but we can probably arrange it
if we want.

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-17  1:38             ` David Gibson
  2007-03-17  3:15               ` Geoff Levand
@ 2007-03-19 15:06               ` Scott Wood
  2007-03-20  0:45                 ` David Gibson
  1 sibling, 1 reply; 53+ messages in thread
From: Scott Wood @ 2007-03-19 15:06 UTC (permalink / raw)
  To: Mark A. Greer, linuxppc-dev

On Sat, Mar 17, 2007 at 12:38:59PM +1100, David Gibson wrote:
> On Fri, Mar 16, 2007 at 11:21:35AM -0500, Scott Wood wrote:
> > One problem with that is that the wrapper currently only accepts one
> > platform .o file -- and presumably one isn't going to want to do all of
> > the platform code in assembly.
> 
> Um.. nobody does it yet, but I don't think there's actually any reason
> that $platformo can't be set to a list of multiple .o files.

Sorry, I was thinking about the default generation of a .o file from the
platform name.  Obviously, the wrapper script can add to platformo.

Still, I think it'd be better to only stick something other than crt0 at
the beginning if the platform explicitly asks for it.

-Scott

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-19 15:06               ` Scott Wood
@ 2007-03-20  0:45                 ` David Gibson
  0 siblings, 0 replies; 53+ messages in thread
From: David Gibson @ 2007-03-20  0:45 UTC (permalink / raw)
  To: Scott Wood; +Cc: linuxppc-dev

On Mon, Mar 19, 2007 at 10:06:01AM -0500, Scott Wood wrote:
> On Sat, Mar 17, 2007 at 12:38:59PM +1100, David Gibson wrote:
> > On Fri, Mar 16, 2007 at 11:21:35AM -0500, Scott Wood wrote:
> > > One problem with that is that the wrapper currently only accepts one
> > > platform .o file -- and presumably one isn't going to want to do all of
> > > the platform code in assembly.
> > 
> > Um.. nobody does it yet, but I don't think there's actually any reason
> > that $platformo can't be set to a list of multiple .o files.
> 
> Sorry, I was thinking about the default generation of a .o file from the
> platform name.  Obviously, the wrapper script can add to platformo.
> 
> Still, I think it'd be better to only stick something other than crt0 at
> the beginning if the platform explicitly asks for it.

The trouble is that's more difficult to arrange, i.e. it requires
splitting the platform information across more places.  The nice thing
about the current thing is that crt0.S is included just based on what
the symbols the platformo defines.

-- 
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

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 8/15] zImage: Cleanup and improve zImage entry point
  2007-03-16  3:36           ` Mark A. Greer
@ 2007-03-20 20:20             ` Mark A. Greer
  0 siblings, 0 replies; 53+ messages in thread
From: Mark A. Greer @ 2007-03-20 20:20 UTC (permalink / raw)
  To: Mark A. Greer; +Cc: linuxppc-dev

On Thu, Mar 15, 2007 at 08:36:49PM -0700, Mark A. Greer wrote:
> On Fri, Mar 16, 2007 at 12:50:23PM +1100, David Gibson wrote:
> > On Thu, Mar 15, 2007 at 06:01:16PM -0700, Mark A. Greer wrote:
> > > On Fri, Mar 16, 2007 at 11:14:30AM +1100, David Gibson wrote:
> > > 
> > > What about something like this:
> > > 
> > > #define BSS_STACK(size) \
> > > 	static char _bss_stack[size]; \
> > > 	u32 _platform_stack_size = size;
> > > 
> > > Then in crt0.S add value of _platform_stack_size to _bss_stack to get r1?
> > > That should relocate correctly.
> > 
> > That sounds reasonable, though it's slightly more involved that the
> > current code.  I'm wrangling another stack of bootloader patches at
> > the moment, you want to send something to implement this?
> 
> Sure.  I want to get my current stack of patches working on top of yours
> & Scott's first then I'll make a patch for this (I've just hacked around
> this issue for now).  Stay tuned.

Just in case it wasn't noticed, Milton took care of this in

	"[PATCH 5/7] bootwrapper: missing relocation in crt0.S"

Thank you Milton.

Mark

^ permalink raw reply	[flat|nested] 53+ messages in thread

* RE: [PATCH 2/15] Automatically lmb_reserve() initrd
  2007-03-05  3:24 ` [PATCH 2/15] Automatically lmb_reserve() initrd David Gibson
@ 2007-04-18 11:43   ` Uytterhoeven, Geert
  0 siblings, 0 replies; 53+ messages in thread
From: Uytterhoeven, Geert @ 2007-04-18 11:43 UTC (permalink / raw)
  To: David Gibson, linuxppc-dev

On March 5, 2007, David Gibson wrote:
> At present, when an initrd is passed to the kernel used flat device
> tree properties, the memory the initrd occupies must also be reserved
> in the flat tree's reserve map, or the kernel may overwrite it.  That
> makes life more complicated than it could be for the bootwrapper.
>=20
> This patch makes the kernel automatically reserve the initrd's space.
> That in turn requires parsing the initrd parameters earlier than they
> are currently, in early_init_dt_scan_chosen() instead of
> check_for_initrd().
>=20
> Signed-off-by: David Gibson <dwg@au1.ibm.com>
> ---
>=20
>  arch/powerpc/kernel/prom.c         |   23 +++++++++++++++++++++++
>  arch/powerpc/kernel/setup-common.c |   22 ++--------------------
>  2 files changed, 25 insertions(+), 20 deletions(-)
>=20
> Index: working-2.6/arch/powerpc/kernel/prom.c
> =
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- working-2.6.orig/arch/powerpc/kernel/prom.c=09
> 2007-02-09 15:12:00.000000000 +1100
> +++ working-2.6/arch/powerpc/kernel/prom.c	2007-02-09=20
> 15:14:27.000000000 +1100
> @@ -719,6 +719,7 @@ static int __init early_init_dt_scan_cho
>  					    const char *uname,=20
> int depth, void *data)
>  {
>  	unsigned long *lprop;
> +	u32 *prop;

This causes a compiler warning if CONFIG_BLK_DEV_INITRD is not set.

>  	unsigned long l;
>  	char *p;
> =20
> @@ -760,6 +761,22 @@ static int __init early_init_dt_scan_cho
>                 crashk_res.end =3D crashk_res.start + *lprop - 1;
>  #endif
> =20
> +#ifdef CONFIG_BLK_DEV_INITRD
> +	DBG("Looking for initrd properties... ");
> +	prop =3D of_get_flat_dt_prop(node, "linux,initrd-start", &l);
> +	if (prop) {
> +		initrd_start =3D (unsigned long)__va(of_read_ulong(prop, l/4));
> +		prop =3D of_get_flat_dt_prop(node, "linux,initrd-end", &l);
> +		if (prop) {
> +			initrd_end =3D (unsigned long)__va(of_read_ulong(prop, l/4));
> +			initrd_below_start_ok =3D 1;
> +		} else {
> +			initrd_start =3D 0;
> +		}
> +	}
> +	DBG("initrd_start=3D0x%lx  initrd_end=3D0x%lx\n", initrd_start, =
initrd_end);
> +#endif /* CONFIG_BLK_DEV_INITRD */
> +
>  	/* Retreive command line */
>   	p =3D of_get_flat_dt_prop(node, "bootargs", &l);
>  	if (p !=3D NULL && l > 0)

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- Sony Network and Software Technology Center Europe =
(NSCE)
Geert.Uytterhoeven@eu.sony.com ------- The Corporate Village, Da =
Vincilaan 7-D1
Voice +32-2-7008453 Fax +32-2-7008622 ---------------- B-1935 Zaventem, =
Belgium

^ permalink raw reply	[flat|nested] 53+ messages in thread

end of thread, other threads:[~2007-04-18 11:48 UTC | newest]

Thread overview: 53+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-03-05  3:23 [0/15] Ebony support, spin 3 David Gibson
2007-03-05  3:24 ` [PATCH 1/15] powerpc: Allow duplicate lmb_reserve() calls David Gibson
2007-03-05  3:24 ` [PATCH 2/15] Automatically lmb_reserve() initrd David Gibson
2007-04-18 11:43   ` Uytterhoeven, Geert
2007-03-05  3:24 ` [PATCH 3/15] Define FIXED_PORT flag for serial_core David Gibson
2007-03-05  3:24 ` [PATCH 7/15] zImage: Cleanup and improve prep_kernel() David Gibson
2007-03-05  3:24 ` [PATCH 5/15] Re-organize Kconfig code for 4xx in arch/powerpc David Gibson
2007-03-05  3:24 ` [PATCH 11/15] zImage wrapper for Ebony David Gibson
2007-03-05 17:10   ` Mark A. Greer
2007-03-06  0:09     ` David Gibson
2007-03-07 19:47       ` Scott Wood
2007-03-08  0:24         ` David Gibson
2007-03-08  0:54           ` Mark A. Greer
2007-03-08  1:35             ` Josh Boyer
2007-03-09 17:50   ` Josh Boyer
2007-03-10  4:08     ` David Gibson
2007-03-05  3:24 ` [PATCH 4/15] Use resource_size_t for serial port IO addresses David Gibson
2007-03-05  3:24 ` [PATCH 8/15] zImage: Cleanup and improve zImage entry point David Gibson
2007-03-15 22:35   ` Mark A. Greer
2007-03-16  0:14     ` David Gibson
2007-03-16  1:01       ` Mark A. Greer
2007-03-16  1:50         ` David Gibson
2007-03-16  3:36           ` Mark A. Greer
2007-03-20 20:20             ` Mark A. Greer
2007-03-15 23:02   ` Mark A. Greer
2007-03-16  0:18     ` David Gibson
2007-03-16  0:47       ` Mark A. Greer
2007-03-16  0:50         ` David Gibson
2007-03-16  3:45           ` Mark A. Greer
2007-03-16  4:02             ` David Gibson
2007-03-16 16:21           ` Scott Wood
2007-03-17  1:38             ` David Gibson
2007-03-17  3:15               ` Geoff Levand
2007-03-19 15:06               ` Scott Wood
2007-03-20  0:45                 ` David Gibson
2007-03-05  3:24 ` [PATCH 9/15] Add arch/powerpc driver for UIC, PPC4xx interrupt controller David Gibson
2007-03-05  3:24 ` [PATCH 10/15] Add device tree for Ebony David Gibson
2007-03-05 14:23   ` Josh Boyer
2007-03-06  0:04     ` David Gibson
2007-03-05  3:24 ` [PATCH 6/15] zImage: Add more flexible gunzip convenience functions David Gibson
2007-03-16 16:24   ` Geoff Levand
2007-03-17 12:59     ` David Gibson
2007-03-05  3:24 ` [PATCH 13/15] Port 44x MMU definitions to ARCH=powerpc David Gibson
2007-03-05  3:24 ` [PATCH 12/15] Support for Ebony in arch/powerpc David Gibson
2007-03-05  3:24 ` [PATCH 14/15] Early serial debug support for PPC44x David Gibson
2007-03-08 19:44   ` Josh Boyer
2007-03-09 17:42     ` Josh Boyer
2007-03-09 23:43       ` David Gibson
2007-03-05  3:24 ` [PATCH 15/15] Add support for reset on Ebony David Gibson
2007-03-05  8:02 ` Real time clock support in arch/powerpc Zang Roy-r61911
2007-03-05 15:10   ` Kumar Gala
2007-03-05 17:04     ` Mark A. Greer
2007-03-05 13:57 ` [0/15] Ebony support, spin 3 Josh Boyer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).