linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2.6.14] ppc32: Allow for bigger compressed kernels
@ 2005-11-03 18:32 Tom Rini
  2005-11-04  4:25 ` Olof Johansson
  2005-11-05  5:16 ` Andrew Morton
  0 siblings, 2 replies; 7+ messages in thread
From: Tom Rini @ 2005-11-03 18:32 UTC (permalink / raw)
  To: linuxppc-dev, Andrew Morton

The ppc (not ppc64) boot loader (zimage wrapper) has a hard coded limit of
4 MB on the size of an uncompressed kernel it can boot. The boot loader has
been changed to dynamically determine the largest possible kernel and
support it. Relocating the boot loader to a higher address (currently
located at 8 MB) will provide additional room.

Signed-off-by: Mark Bellon <mbellon@mvista.com>
Signed-off-by: Tom Rini <trini@kernel.crashing.org>

diff --git a/arch/ppc/boot/simple/misc.c b/arch/ppc/boot/simple/misc.c
--- a/arch/ppc/boot/simple/misc.c
+++ b/arch/ppc/boot/simple/misc.c
@@ -7,10 +7,10 @@
  * your serial console.  If a machine meets these requirements, it can quite
  * likely use this code during boot.
  *
- * Author: Matt Porter <mporter@mvista.com>
+ * Author: Tom Rini <trini@mvista.com>
  * Derived from arch/ppc/boot/prep/misc.c
  *
- * 2001 (c) MontaVista, Software, Inc.  This file is licensed under
+ * 2001-2005 (c) MontaVista, Software, Inc.  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.
@@ -56,6 +56,11 @@
 #define INTERACTIVE_CONSOLE	1
 #endif
 
+#define	ONE_MB		(1 << 20)
+#define	MAX_BI_RECS	(8 * 1024)
+#define	MAX_AVAIL_MEM	(4 * ONE_MB)
+#define	RAM_RESERVE	(4 * ONE_MB)
+
 char *avail_ram;
 char *end_avail;
 char *zimage_start;
@@ -97,7 +102,8 @@ decompress_kernel(unsigned long load_add
 #endif
 	char *cp;
 	struct bi_record *rec;
-	unsigned long initrd_loc = 0, TotalMemory = 0;
+	unsigned long initrd_loc, TotalMemory;
+	unsigned long max_kernel, top_free;
 
 #if defined(CONFIG_SERIAL_8250_CONSOLE) || defined(CONFIG_SERIAL_MPSC_CONSOLE)
 	com_port = serial_init(0, NULL);
@@ -119,9 +125,6 @@ decompress_kernel(unsigned long load_add
 	 */
 	TotalMemory = get_mem_size();
 
-	/* assume the chunk below 8M is free */
-	end_avail = (char *)0x00800000;
-
 	/*
 	 * Reveal where we were loaded at and where we
 	 * were relocated to.
@@ -153,7 +156,6 @@ decompress_kernel(unsigned long load_add
 	 * The zImage and initrd will be between start and _end, so they've
 	 * already been moved once.  We're good to go now. -- Tom
 	 */
-	avail_ram = (char *)PAGE_ALIGN((unsigned long)_end);
 	puts("zimage at:     "); puthex((unsigned long)zimage_start);
 	puts(" "); puthex((unsigned long)(zimage_size+zimage_start));
 	puts("\n");
@@ -164,11 +166,51 @@ decompress_kernel(unsigned long load_add
 		puts(" "); puthex((unsigned long)(&__ramdisk_end));puts("\n");
 	}
 
-	avail_ram = (char *)0x00400000;
-	end_avail = (char *)0x00800000;
+	/*
+	 * If there is sufficent memory move the available RAM area after
+	 * the zImage (but stay away from the top of RAM). Otherwise fudge
+	 * it to fit in below the zImage as it did in the past.
+	 */
+
+	top_free = _ALIGN((unsigned long)(_end) + ONE_MB - 1, ONE_MB);
+
+	if ((TotalMemory != 0) &&
+		((top_free + MAX_AVAIL_MEM + RAM_RESERVE) < TotalMemory)) {
+		avail_ram = (char *) top_free;
+
+		/*
+		 * We're linked in the middle of RAM and the kernel starts
+		 * at zero. This means that the kernel must fit between
+		 * zero and our starting address. Figure out the highest
+		 * address below this that will allow a complete
+		 * uncompressed kernel and bi_recs to fit - the maximum
+		 * kernel size.
+		 */
+
+		max_kernel = (unsigned long) &start;
+
+		while (1) {
+			avail_ram = (char *) bootinfo_addr(max_kernel);
+
+			if ((avail_ram + MAX_BI_RECS) < ((char *) &start))
+				break;
+
+			max_kernel -= MAX_BI_RECS;
+		}
+	}
+	else {
+		max_kernel = ((unsigned long) &start) - MAX_AVAIL_MEM;
+		avail_ram = max_kernel;
+	}
+
+	end_avail = avail_ram + MAX_AVAIL_MEM;
+
 	puts("avail ram:     "); puthex((unsigned long)avail_ram); puts(" ");
 	puthex((unsigned long)end_avail); puts("\n");
 
+	/* Document the limitation */
+	puts("max kernel:    "); puthex(max_kernel); puts("\n");
+
 	if (keyb_present)
 		CRT_tstc();  /* Forces keyboard to be initialized */
 #ifdef CONFIG_GEMINI
@@ -222,32 +264,12 @@ decompress_kernel(unsigned long load_add
 	puts("\n");
 
 	puts("Uncompressing Linux...");
-	gunzip(NULL, 0x400000, zimage_start, &zimage_size);
+	gunzip(NULL, max_kernel, zimage_start, &zimage_size);
 	puts("done.\n");
 
 	/* get the bi_rec address */
 	rec = bootinfo_addr(zimage_size);
 
-	/* We need to make sure that the initrd and bi_recs do not
-	 * overlap. */
-	if ( initrd_size ) {
-		unsigned long rec_loc = (unsigned long) rec;
-		initrd_loc = (unsigned long)(&__ramdisk_begin);
-		/* If the bi_recs are in the middle of the current
-		 * initrd, move the initrd to the next MB
-		 * boundary. */
-		if ((rec_loc > initrd_loc) &&
-				((initrd_loc + initrd_size) > rec_loc)) {
-			initrd_loc = _ALIGN((unsigned long)(zimage_size)
-					+ (2 << 20) - 1, (2 << 20));
-		 	memmove((void *)initrd_loc, &__ramdisk_begin,
-				 initrd_size);
-	         	puts("initrd moved:  "); puthex(initrd_loc);
-		 	puts(" "); puthex(initrd_loc + initrd_size);
-		 	puts("\n");
-		}
-	}
-
 	bootinfo_init(rec);
 	if ( TotalMemory )
 		bootinfo_append(BI_MEMSIZE, sizeof(int), (void*)&TotalMemory);
@@ -258,7 +280,7 @@ decompress_kernel(unsigned long load_add
 	if (initrd_size) {
 		unsigned long initrd[2];
 
-		initrd[0] = initrd_loc;
+		initrd[0] = (unsigned long)(&__ramdisk_begin);
 		initrd[1] = initrd_size;
 
 		bootinfo_append(BI_INITRD, sizeof(initrd), &initrd);

-- 
Tom Rini
http://gate.crashing.org/~trini/

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

* Re: [PATCH 2.6.14] ppc32: Allow for bigger compressed kernels
  2005-11-03 18:32 [PATCH 2.6.14] ppc32: Allow for bigger compressed kernels Tom Rini
@ 2005-11-04  4:25 ` Olof Johansson
  2005-11-04 14:50   ` Tom Rini
  2005-11-05  5:16 ` Andrew Morton
  1 sibling, 1 reply; 7+ messages in thread
From: Olof Johansson @ 2005-11-04  4:25 UTC (permalink / raw)
  To: Tom Rini; +Cc: Andrew Morton, linuxppc-dev

On Thu, Nov 03, 2005 at 11:32:56AM -0700, Tom Rini wrote:

> --- a/arch/ppc/boot/simple/misc.c
> +++ b/arch/ppc/boot/simple/misc.c
> @@ -7,10 +7,10 @@
>   * your serial console.  If a machine meets these requirements, it can quite
>   * likely use this code during boot.
>   *
> - * Author: Matt Porter <mporter@mvista.com>
> + * Author: Tom Rini <trini@mvista.com>
>   * Derived from arch/ppc/boot/prep/misc.c

I understand adding authors to a file when code is added, but why should
author credit be removed?


-Olof

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

* Re: [PATCH 2.6.14] ppc32: Allow for bigger compressed kernels
  2005-11-04  4:25 ` Olof Johansson
@ 2005-11-04 14:50   ` Tom Rini
  2005-11-04 15:00     ` Matt Porter
  0 siblings, 1 reply; 7+ messages in thread
From: Tom Rini @ 2005-11-04 14:50 UTC (permalink / raw)
  To: Olof Johansson; +Cc: Andrew Morton, linuxppc-dev

On Thu, Nov 03, 2005 at 08:25:24PM -0800, Olof Johansson wrote:
> On Thu, Nov 03, 2005 at 11:32:56AM -0700, Tom Rini wrote:
> 
> > --- a/arch/ppc/boot/simple/misc.c
> > +++ b/arch/ppc/boot/simple/misc.c
> > @@ -7,10 +7,10 @@
> >   * your serial console.  If a machine meets these requirements, it can quite
> >   * likely use this code during boot.
> >   *
> > - * Author: Matt Porter <mporter@mvista.com>
> > + * Author: Tom Rini <trini@mvista.com>
> >   * Derived from arch/ppc/boot/prep/misc.c
> 
> I understand adding authors to a file when code is added, but why should
> author credit be removed?

It wasn't Matt's code really.  I know he did the 44x EMAC fixes, but
other than that it was my code, heavily cribbed from all of the old
per-board bootwrappers, that were cribbed from the prep one.

-- 
Tom Rini
http://gate.crashing.org/~trini/

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

* Re: [PATCH 2.6.14] ppc32: Allow for bigger compressed kernels
  2005-11-04 14:50   ` Tom Rini
@ 2005-11-04 15:00     ` Matt Porter
  0 siblings, 0 replies; 7+ messages in thread
From: Matt Porter @ 2005-11-04 15:00 UTC (permalink / raw)
  To: Tom Rini; +Cc: linuxppc-dev, Andrew Morton

On Fri, Nov 04, 2005 at 07:50:27AM -0700, Tom Rini wrote:
> On Thu, Nov 03, 2005 at 08:25:24PM -0800, Olof Johansson wrote:
> > On Thu, Nov 03, 2005 at 11:32:56AM -0700, Tom Rini wrote:
> > 
> > > --- a/arch/ppc/boot/simple/misc.c
> > > +++ b/arch/ppc/boot/simple/misc.c
> > > @@ -7,10 +7,10 @@
> > >   * your serial console.  If a machine meets these requirements, it can quite
> > >   * likely use this code during boot.
> > >   *
> > > - * Author: Matt Porter <mporter@mvista.com>
> > > + * Author: Tom Rini <trini@mvista.com>
> > >   * Derived from arch/ppc/boot/prep/misc.c
> > 
> > I understand adding authors to a file when code is added, but why should
> > author credit be removed?
> 
> It wasn't Matt's code really.  I know he did the 44x EMAC fixes, but
> other than that it was my code, heavily cribbed from all of the old
> per-board bootwrappers, that were cribbed from the prep one.

Yes, I think what happened was that when you rewrote the arch/ppc/boot/
stuff, you started with the a version of the file I had written for one
of my platforms which is where my name came to stick in there.
The details are hazy in my memory as to how I came to be the "sole
author" of this code. :) In any case, I think having you attributed as
the author of this stuff is appropriate and I can be removed.

-Matt

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

* Re: [PATCH 2.6.14] ppc32: Allow for bigger compressed kernels
  2005-11-03 18:32 [PATCH 2.6.14] ppc32: Allow for bigger compressed kernels Tom Rini
  2005-11-04  4:25 ` Olof Johansson
@ 2005-11-05  5:16 ` Andrew Morton
  2005-11-05 17:50   ` Tom Rini
  1 sibling, 1 reply; 7+ messages in thread
From: Andrew Morton @ 2005-11-05  5:16 UTC (permalink / raw)
  To: Tom Rini; +Cc: linuxppc-dev

Tom Rini <trini@kernel.crashing.org> wrote:
>
> The ppc (not ppc64) boot loader (zimage wrapper) has a hard coded limit of
> 4 MB on the size of an uncompressed kernel it can boot. The boot loader has
> been changed to dynamically determine the largest possible kernel and
> support it. Relocating the boot loader to a higher address (currently
> located at 8 MB) will provide additional room.
> 

I'm getting an unpleasant reject here from Matt's
ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot.patch.  In
decompress_kernel he has added this ifdef:

@@ -164,7 +172,9 @@ decompress_kernel(unsigned long load_add
 		puts(" "); puthex((unsigned long)(&__ramdisk_end));puts("\n");
 	}
 
+#ifndef CONFIG_40x /* don't overwrite the 40x image located at 0x00400000! */
 	avail_ram = (char *)0x00400000;
+#endif
 	end_avail = (char *)0x00800000;
 	puts("avail ram:     "); puthex((unsigned long)avail_ram); puts(" ");
 	puthex((unsigned long)end_avail); puts("\n");


Which would appear to leave avail_ram at zero on CONFIG_40x.  There's no
mention in the changelog that this was the intent, so I dunno what's going
on.

But your change does appear to conflict in intent with Matt's patch (below),
so...  help!

> 
> diff --git a/arch/ppc/boot/simple/misc.c b/arch/ppc/boot/simple/misc.c
> --- a/arch/ppc/boot/simple/misc.c
> +++ b/arch/ppc/boot/simple/misc.c
> @@ -7,10 +7,10 @@
>   * your serial console.  If a machine meets these requirements, it can quite
>   * likely use this code during boot.
>   *
> - * Author: Matt Porter <mporter@mvista.com>
> + * Author: Tom Rini <trini@mvista.com>
>   * Derived from arch/ppc/boot/prep/misc.c
>   *
> - * 2001 (c) MontaVista, Software, Inc.  This file is licensed under
> + * 2001-2005 (c) MontaVista, Software, Inc.  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.
> @@ -56,6 +56,11 @@
>  #define INTERACTIVE_CONSOLE	1
>  #endif
>  
> +#define	ONE_MB		(1 << 20)
> +#define	MAX_BI_RECS	(8 * 1024)
> +#define	MAX_AVAIL_MEM	(4 * ONE_MB)
> +#define	RAM_RESERVE	(4 * ONE_MB)
> +
>  char *avail_ram;
>  char *end_avail;
>  char *zimage_start;
> @@ -97,7 +102,8 @@ decompress_kernel(unsigned long load_add
>  #endif
>  	char *cp;
>  	struct bi_record *rec;
> -	unsigned long initrd_loc = 0, TotalMemory = 0;
> +	unsigned long initrd_loc, TotalMemory;
> +	unsigned long max_kernel, top_free;
>  
>  #if defined(CONFIG_SERIAL_8250_CONSOLE) || defined(CONFIG_SERIAL_MPSC_CONSOLE)
>  	com_port = serial_init(0, NULL);
> @@ -119,9 +125,6 @@ decompress_kernel(unsigned long load_add
>  	 */
>  	TotalMemory = get_mem_size();
>  
> -	/* assume the chunk below 8M is free */
> -	end_avail = (char *)0x00800000;
> -
>  	/*
>  	 * Reveal where we were loaded at and where we
>  	 * were relocated to.
> @@ -153,7 +156,6 @@ decompress_kernel(unsigned long load_add
>  	 * The zImage and initrd will be between start and _end, so they've
>  	 * already been moved once.  We're good to go now. -- Tom
>  	 */
> -	avail_ram = (char *)PAGE_ALIGN((unsigned long)_end);
>  	puts("zimage at:     "); puthex((unsigned long)zimage_start);
>  	puts(" "); puthex((unsigned long)(zimage_size+zimage_start));
>  	puts("\n");
> @@ -164,11 +166,51 @@ decompress_kernel(unsigned long load_add
>  		puts(" "); puthex((unsigned long)(&__ramdisk_end));puts("\n");
>  	}
>  
> -	avail_ram = (char *)0x00400000;
> -	end_avail = (char *)0x00800000;
> +	/*
> +	 * If there is sufficent memory move the available RAM area after
> +	 * the zImage (but stay away from the top of RAM). Otherwise fudge
> +	 * it to fit in below the zImage as it did in the past.
> +	 */
> +
> +	top_free = _ALIGN((unsigned long)(_end) + ONE_MB - 1, ONE_MB);
> +
> +	if ((TotalMemory != 0) &&
> +		((top_free + MAX_AVAIL_MEM + RAM_RESERVE) < TotalMemory)) {
> +		avail_ram = (char *) top_free;
> +
> +		/*
> +		 * We're linked in the middle of RAM and the kernel starts
> +		 * at zero. This means that the kernel must fit between
> +		 * zero and our starting address. Figure out the highest
> +		 * address below this that will allow a complete
> +		 * uncompressed kernel and bi_recs to fit - the maximum
> +		 * kernel size.
> +		 */
> +
> +		max_kernel = (unsigned long) &start;
> +
> +		while (1) {
> +			avail_ram = (char *) bootinfo_addr(max_kernel);
> +
> +			if ((avail_ram + MAX_BI_RECS) < ((char *) &start))
> +				break;
> +
> +			max_kernel -= MAX_BI_RECS;
> +		}
> +	}
> +	else {
> +		max_kernel = ((unsigned long) &start) - MAX_AVAIL_MEM;
> +		avail_ram = max_kernel;
> +	}
> +
> +	end_avail = avail_ram + MAX_AVAIL_MEM;
> +
>  	puts("avail ram:     "); puthex((unsigned long)avail_ram); puts(" ");
>  	puthex((unsigned long)end_avail); puts("\n");
>  
> +	/* Document the limitation */
> +	puts("max kernel:    "); puthex(max_kernel); puts("\n");
> +
>  	if (keyb_present)
>  		CRT_tstc();  /* Forces keyboard to be initialized */
>  #ifdef CONFIG_GEMINI
> @@ -222,32 +264,12 @@ decompress_kernel(unsigned long load_add
>  	puts("\n");
>  
>  	puts("Uncompressing Linux...");
> -	gunzip(NULL, 0x400000, zimage_start, &zimage_size);
> +	gunzip(NULL, max_kernel, zimage_start, &zimage_size);
>  	puts("done.\n");
>  
>  	/* get the bi_rec address */
>  	rec = bootinfo_addr(zimage_size);
>  
> -	/* We need to make sure that the initrd and bi_recs do not
> -	 * overlap. */
> -	if ( initrd_size ) {
> -		unsigned long rec_loc = (unsigned long) rec;
> -		initrd_loc = (unsigned long)(&__ramdisk_begin);
> -		/* If the bi_recs are in the middle of the current
> -		 * initrd, move the initrd to the next MB
> -		 * boundary. */
> -		if ((rec_loc > initrd_loc) &&
> -				((initrd_loc + initrd_size) > rec_loc)) {
> -			initrd_loc = _ALIGN((unsigned long)(zimage_size)
> -					+ (2 << 20) - 1, (2 << 20));
> -		 	memmove((void *)initrd_loc, &__ramdisk_begin,
> -				 initrd_size);
> -	         	puts("initrd moved:  "); puthex(initrd_loc);
> -		 	puts(" "); puthex(initrd_loc + initrd_size);
> -		 	puts("\n");
> -		}
> -	}
> -
>  	bootinfo_init(rec);
>  	if ( TotalMemory )
>  		bootinfo_append(BI_MEMSIZE, sizeof(int), (void*)&TotalMemory);
> @@ -258,7 +280,7 @@ decompress_kernel(unsigned long load_add
>  	if (initrd_size) {
>  		unsigned long initrd[2];
>  
> -		initrd[0] = initrd_loc;
> +		initrd[0] = (unsigned long)(&__ramdisk_begin);
>  		initrd[1] = initrd_size;
>  
>  		bootinfo_append(BI_INITRD, sizeof(initrd), &initrd);
> 


From: Matt Porter <mporter@kernel.crashing.org>

Cleanup PPC40x eval boards (bubinga, walnut and sycamore) to support U-Boot
as bootloader.  The OpenBIOS bd_info struct is not used in the kernel
anymore (only U-Boot now).

uImage (U-Boot) tested on walnut, sycamore and bubinga
zImage (OpenBIOS) tested on sycamore, bubinga and ebony

Signed-off-by: Stefan Roese <sr@denx.de>
Signed-off-by: Matt Porter <mporter@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 arch/ppc/boot/simple/Makefile     |   21 +++++++
 arch/ppc/boot/simple/misc.c       |   16 ++++-
 arch/ppc/boot/simple/openbios.c   |  106 +++++++++++++++++++++++++++++++++++---
 arch/ppc/platforms/4xx/Kconfig    |    2 
 arch/ppc/platforms/4xx/bubinga.c  |    2 
 arch/ppc/platforms/4xx/bubinga.h  |   64 +++++++++-------------
 arch/ppc/platforms/4xx/ebony.h    |    4 -
 arch/ppc/platforms/4xx/sycamore.c |    7 --
 arch/ppc/platforms/4xx/sycamore.h |   67 +++++++++---------------
 arch/ppc/platforms/4xx/walnut.c   |    2 
 arch/ppc/platforms/4xx/walnut.h   |   67 ++++++++----------------
 include/asm-ppc/ibm_ocp.h         |   19 +++++-
 include/asm-ppc/ppcboot.h         |    6 +-
 13 files changed, 237 insertions(+), 146 deletions(-)

diff -puN arch/ppc/boot/simple/Makefile~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot arch/ppc/boot/simple/Makefile
--- devel/arch/ppc/boot/simple/Makefile~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot	2005-10-31 20:15:04.000000000 -0800
+++ devel-akpm/arch/ppc/boot/simple/Makefile	2005-10-31 20:15:04.000000000 -0800
@@ -67,6 +67,12 @@ zimageinitrd-$(CONFIG_BAMBOO)		:= zImage
   entrypoint-$(CONFIG_BAMBOO)		:= 0x01000000
      extra.o-$(CONFIG_BAMBOO)		:= pibs.o
 
+      zimage-$(CONFIG_BUBINGA)		:= zImage-TREE
+zimageinitrd-$(CONFIG_BUBINGA)		:= zImage.initrd-TREE
+         end-$(CONFIG_BUBINGA)		:= bubinga
+  entrypoint-$(CONFIG_BUBINGA)		:= 0x01000000
+     extra.o-$(CONFIG_BUBINGA)		:= openbios.o
+
       zimage-$(CONFIG_EBONY)		:= zImage-TREE
 zimageinitrd-$(CONFIG_EBONY)		:= zImage.initrd-TREE
          end-$(CONFIG_EBONY)		:= ebony
@@ -91,6 +97,18 @@ zimageinitrd-$(CONFIG_OCOTEA)		:= zImage
   entrypoint-$(CONFIG_OCOTEA)		:= 0x01000000
      extra.o-$(CONFIG_OCOTEA)		:= pibs.o
 
+      zimage-$(CONFIG_SYCAMORE)		:= zImage-TREE
+zimageinitrd-$(CONFIG_SYCAMORE)		:= zImage.initrd-TREE
+         end-$(CONFIG_SYCAMORE)		:= sycamore
+  entrypoint-$(CONFIG_SYCAMORE)		:= 0x01000000
+     extra.o-$(CONFIG_SYCAMORE)		:= openbios.o
+
+      zimage-$(CONFIG_WALNUT)		:= zImage-TREE
+zimageinitrd-$(CONFIG_WALNUT)		:= zImage.initrd-TREE
+         end-$(CONFIG_WALNUT)		:= walnut
+  entrypoint-$(CONFIG_WALNUT)		:= 0x01000000
+     extra.o-$(CONFIG_WALNUT)		:= openbios.o
+
      extra.o-$(CONFIG_EV64260)		:= misc-ev64260.o
          end-$(CONFIG_EV64260)		:= ev64260
    cacheflag-$(CONFIG_EV64260)		:= -include $(clear_L2_L3)
@@ -168,7 +186,8 @@ OBJCOPY_ARGS			:= -O elf32-powerpc
 
 # head.o and relocate.o must be at the start.
 boot-y				:= head.o relocate.o $(extra.o-y) $(misc-y)
-boot-$(CONFIG_40x)		+= embed_config.o
+boot-$(CONFIG_REDWOOD_5)	+= embed_config.o
+boot-$(CONFIG_REDWOOD_6)	+= embed_config.o
 boot-$(CONFIG_8xx)		+= embed_config.o
 boot-$(CONFIG_8260)		+= embed_config.o
 boot-$(CONFIG_BSEIP)		+= iic.o
diff -puN arch/ppc/boot/simple/misc.c~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot arch/ppc/boot/simple/misc.c
--- devel/arch/ppc/boot/simple/misc.c~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot	2005-10-31 20:15:04.000000000 -0800
+++ devel-akpm/arch/ppc/boot/simple/misc.c	2005-10-31 20:15:04.000000000 -0800
@@ -23,7 +23,7 @@
 #include <asm/page.h>
 #include <asm/mmu.h>
 #include <asm/bootinfo.h>
-#ifdef CONFIG_44x
+#ifdef CONFIG_4xx
 #include <asm/ibm4xx.h>
 #endif
 #include <asm/reg.h>
@@ -88,6 +88,14 @@ get_mem_size(void)
 	return 0;
 }
 
+#if defined(CONFIG_40x)
+#define PPC4xx_EMAC0_MR0	EMAC0_BASE
+#endif
+
+#if defined(CONFIG_44x) && defined(PPC44x_EMAC0_MR0)
+#define PPC4xx_EMAC0_MR0	PPC44x_EMAC0_MR0
+#endif
+
 struct bi_record *
 decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum)
 {
@@ -103,13 +111,13 @@ decompress_kernel(unsigned long load_add
 	com_port = serial_init(0, NULL);
 #endif
 
-#if defined(CONFIG_44x) && defined(PPC44x_EMAC0_MR0)
+#if defined(PPC4xx_EMAC0_MR0)
 	/* Reset MAL */
 	mtdcr(DCRN_MALCR(DCRN_MAL_BASE), MALCR_MMSR);
 	/* Wait for reset */
 	while (mfdcr(DCRN_MALCR(DCRN_MAL_BASE)) & MALCR_MMSR) {};
 	/* Reset EMAC */
-	*(volatile unsigned long *)PPC44x_EMAC0_MR0 = 0x20000000;
+	*(volatile unsigned long *)PPC4xx_EMAC0_MR0 = 0x20000000;
 	__asm__ __volatile__("eieio");
 #endif
 
@@ -164,7 +172,9 @@ decompress_kernel(unsigned long load_add
 		puts(" "); puthex((unsigned long)(&__ramdisk_end));puts("\n");
 	}
 
+#ifndef CONFIG_40x /* don't overwrite the 40x image located at 0x00400000! */
 	avail_ram = (char *)0x00400000;
+#endif
 	end_avail = (char *)0x00800000;
 	puts("avail ram:     "); puthex((unsigned long)avail_ram); puts(" ");
 	puthex((unsigned long)end_avail); puts("\n");
diff -puN arch/ppc/boot/simple/openbios.c~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot arch/ppc/boot/simple/openbios.c
--- devel/arch/ppc/boot/simple/openbios.c~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot	2005-10-31 20:15:04.000000000 -0800
+++ devel-akpm/arch/ppc/boot/simple/openbios.c	2005-10-31 20:15:04.000000000 -0800
@@ -1,19 +1,43 @@
 /*
  * arch/ppc/boot/simple/openbios.c
  *
- * 2005 (c) SYSGO AG - g.jaeger@sysgo.com
+ * Copyright (c) 2005 DENX Software Engineering
+ * Stefan Roese <sr@denx.de>
+ *
+ * Based on original work by
+ *      2005 (c) SYSGO AG - g.jaeger@sysgo.com
+ *
  * 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.
  *
- * Derived from arch/ppc/boot/simple/pibs.c (from MontaVista)
  */
 
 #include <linux/types.h>
 #include <linux/config.h>
 #include <linux/string.h>
 #include <asm/ppcboot.h>
-#include <platforms/4xx/ebony.h>
+#include <asm/ibm4xx.h>
+#include <asm/reg.h>
+#ifdef CONFIG_40x
+#include <asm/io.h>
+#endif
+
+#if defined(CONFIG_BUBINGA)
+#define BOARD_INFO_VECTOR       0xFFF80B50 /* openbios 1.19 moved this vector down  - armin */
+#else
+#define BOARD_INFO_VECTOR	0xFFFE0B50
+#endif
+
+#ifdef CONFIG_40x
+/* Supply a default Ethernet address for those eval boards that don't
+ * ship with one.  This is an address from the MBX board I have, so
+ * it is unlikely you will find it on your network.
+ */
+static	ushort	def_enet_addr[] = { 0x0800, 0x3e26, 0x1559 };
+
+extern unsigned long timebase_period_ns;
+#endif /* CONFIG_40x */
 
 extern unsigned long decompress_kernel(unsigned long load_addr, int num_words,
 				       unsigned long cksum);
@@ -23,15 +47,85 @@ extern unsigned long decompress_kernel(u
 bd_t hold_resid_buf __attribute__ ((__section__ (".data.boot")));
 bd_t *hold_residual = &hold_resid_buf;
 
+typedef struct openbios_board_info {
+        unsigned char    bi_s_version[4];       /* Version of this structure */
+        unsigned char    bi_r_version[30];      /* Version of the IBM ROM */
+        unsigned int     bi_memsize;            /* DRAM installed, in bytes */
+#ifdef CONFIG_405EP
+        unsigned char    bi_enetaddr[2][6];     /* Local Ethernet MAC address */
+#else /* CONFIG_405EP */
+        unsigned char    bi_enetaddr[6];        /* Local Ethernet MAC address */
+#endif /* CONFIG_405EP */
+        unsigned char    bi_pci_enetaddr[6];    /* PCI Ethernet MAC address */
+        unsigned int     bi_intfreq;            /* Processor speed, in Hz */
+        unsigned int     bi_busfreq;            /* PLB Bus speed, in Hz */
+        unsigned int     bi_pci_busfreq;        /* PCI Bus speed, in Hz */
+#ifdef CONFIG_405EP
+        unsigned int     bi_opb_busfreq;        /* OPB Bus speed, in Hz */
+        unsigned int     bi_pllouta_freq;       /* PLL OUTA speed, in Hz */
+#endif /* CONFIG_405EP */
+} openbios_bd_t;
+
 void *
 load_kernel(unsigned long load_addr, int num_words, unsigned long cksum,
 		void *ign1, void *ign2)
 {
-	decompress_kernel(load_addr, num_words, cksum);
+#ifdef CONFIG_40x
+	openbios_bd_t *openbios_bd = NULL;
+	openbios_bd_t *(*get_board_info)(void) =
+		(openbios_bd_t *(*)(void))(*(unsigned long *)BOARD_INFO_VECTOR);
+
+	/*
+	 * On 40x platforms we not only need the MAC-addresses, but also the
+	 * clocks and memsize. Now try to get all values using the OpenBIOS
+	 * "get_board_info()" callback.
+	 */
+	if ((openbios_bd = get_board_info()) != NULL) {
+		/*
+		 * Copy bd_info from OpenBIOS struct into U-Boot struct
+		 * used by kernel
+		 */
+	        hold_residual->bi_memsize = openbios_bd->bi_memsize;
+	        hold_residual->bi_intfreq = openbios_bd->bi_intfreq;
+	        hold_residual->bi_busfreq = openbios_bd->bi_busfreq;
+	        hold_residual->bi_pci_busfreq = openbios_bd->bi_pci_busfreq;
+		memcpy(hold_residual->bi_pci_enetaddr, openbios_bd->bi_pci_enetaddr, 6);
+#ifdef CONFIG_405EP
+		memcpy(hold_residual->bi_enetaddr, openbios_bd->bi_enetaddr[0], 6);
+		memcpy(hold_residual->bi_enet1addr, openbios_bd->bi_enetaddr[1], 6);
+	        hold_residual->bi_opbfreq = openbios_bd->bi_opb_busfreq;
+	        hold_residual->bi_procfreq = openbios_bd->bi_pllouta_freq;
+#else /* CONFIG_405EP */
+		memcpy(hold_residual->bi_enetaddr, openbios_bd->bi_enetaddr, 6);
+#endif /* CONFIG_405EP */
+	} else {
+		/* Hmmm...better try to stuff some defaults.
+		 */
+		hold_residual->bi_memsize = 16 * 1024 * 1024;
+		hold_residual->bi_intfreq = 200000000;
+		hold_residual->bi_busfreq = 100000000;
+		hold_residual->bi_pci_busfreq = 66666666;
+
+		/*
+		 * Only supply one mac-address in this fallback
+		 */
+		memcpy(hold_residual->bi_enetaddr, (void *)def_enet_addr, 6);
+#ifdef CONFIG_405EP
+	        hold_residual->bi_opbfreq = 50000000;
+	        hold_residual->bi_procfreq = 200000000;
+#endif /* CONFIG_405EP */
+	}
+
+	timebase_period_ns = 1000000000 / hold_residual->bi_intfreq;
+#endif /* CONFIG_40x */
 
+#ifdef CONFIG_440GP
 	/* simply copy the MAC addresses */
-	memcpy(hold_residual->bi_enetaddr,  (char *)EBONY_OPENBIOS_MAC_BASE, 6);
-	memcpy(hold_residual->bi_enet1addr, (char *)(EBONY_OPENBIOS_MAC_BASE+EBONY_OPENBIOS_MAC_OFFSET), 6);
+	memcpy(hold_residual->bi_enetaddr,  (char *)OPENBIOS_MAC_BASE, 6);
+	memcpy(hold_residual->bi_enet1addr, (char *)(OPENBIOS_MAC_BASE+OPENBIOS_MAC_OFFSET), 6);
+#endif /* CONFIG_440GP */
+
+	decompress_kernel(load_addr, num_words, cksum);
 
 	return (void *)hold_residual;
 }
diff -puN arch/ppc/platforms/4xx/bubinga.c~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot arch/ppc/platforms/4xx/bubinga.c
--- devel/arch/ppc/platforms/4xx/bubinga.c~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot	2005-10-31 20:15:04.000000000 -0800
+++ devel-akpm/arch/ppc/platforms/4xx/bubinga.c	2005-10-31 20:15:04.000000000 -0800
@@ -89,7 +89,7 @@ bubinga_early_serial_map(void)
           * by 16.
           */
 	uart_div = (mfdcr(DCRN_CPC0_UCR_BASE) & DCRN_CPC0_UCR_U0DIV);
-	uart_clock = __res.bi_pllouta_freq / uart_div;
+	uart_clock = __res.bi_procfreq / uart_div;
 
 	/* Setup serial port access */
 	memset(&port, 0, sizeof(port));
diff -puN arch/ppc/platforms/4xx/bubinga.h~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot arch/ppc/platforms/4xx/bubinga.h
--- devel/arch/ppc/platforms/4xx/bubinga.h~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot	2005-10-31 20:15:04.000000000 -0800
+++ devel-akpm/arch/ppc/platforms/4xx/bubinga.h	2005-10-31 20:15:04.000000000 -0800
@@ -1,52 +1,34 @@
 /*
- * Support for IBM PPC 405EP evaluation board (Bubinga).
+ * arch/ppc/platforms/4xx/bubinga.h
  *
- * Author: SAW (IBM), derived from walnut.h.
- *         Maintained by MontaVista Software <source@mvista.com>
+ * Bubinga board definitions
+ *
+ * Copyright (c) 2005 DENX Software Engineering
+ * Stefan Roese <sr@denx.de>
+ *
+ * Based on original work by
+ *	SAW (IBM)
+ *	2003 (c) MontaVista Softare Inc.
+ *
+ * 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.
  *
- * 2003 (c) MontaVista Softare Inc.  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.
  */
 
 #ifdef __KERNEL__
 #ifndef __BUBINGA_H__
 #define __BUBINGA_H__
 
-/* 405EP */
+#include <linux/config.h>
 #include <platforms/4xx/ibm405ep.h>
-
-#ifndef __ASSEMBLY__
-/*
- * Data structure defining board information maintained by the boot
- * ROM on IBM's evaluation board. An effort has been made to
- * keep the field names consistent with the 8xx 'bd_t' board info
- * structures.
- */
-
-typedef struct board_info {
-        unsigned char    bi_s_version[4];       /* Version of this structure */
-        unsigned char    bi_r_version[30];      /* Version of the IBM ROM */
-        unsigned int     bi_memsize;            /* DRAM installed, in bytes */
-        unsigned char    bi_enetaddr[2][6];     /* Local Ethernet MAC address */        unsigned char    bi_pci_enetaddr[6];    /* PCI Ethernet MAC address */
-        unsigned int     bi_intfreq;            /* Processor speed, in Hz */
-        unsigned int     bi_busfreq;            /* PLB Bus speed, in Hz */
-        unsigned int     bi_pci_busfreq;        /* PCI Bus speed, in Hz */
-        unsigned int     bi_opb_busfreq;        /* OPB Bus speed, in Hz */
-        unsigned int     bi_pllouta_freq;       /* PLL OUTA speed, in Hz */
-} bd_t;
-
-/* Some 4xx parts use a different timebase frequency from the internal clock.
-*/
-#define bi_tbfreq bi_intfreq
-
+#include <asm/ppcboot.h>
 
 /* Memory map for the Bubinga board.
  * Generic 4xx plus RTC.
  */
 
-extern void *bubinga_rtc_base;
 #define BUBINGA_RTC_PADDR	((uint)0xf0000000)
 #define BUBINGA_RTC_VADDR	BUBINGA_RTC_PADDR
 #define BUBINGA_RTC_SIZE	((uint)8*1024)
@@ -58,12 +40,18 @@ extern void *bubinga_rtc_base;
  * for typical configurations at various CPU speeds.
  * The base baud is calculated as (FWDA / EXT UART DIV / 16)
  */
-#define BASE_BAUD       0
+#define BASE_BAUD		0
 
-#define BUBINGA_FPGA_BASE      0xF0300000
+/* Flash */
+#define PPC40x_FPGA_BASE	0xF0300000
+#define PPC40x_FPGA_REG_OFFS	1	/* offset to flash map reg */
+#define PPC40x_FLASH_ONBD_N(x)	(x & 0x02)
+#define PPC40x_FLASH_SRAM_SEL(x) (x & 0x01)
+#define PPC40x_FLASH_LOW	0xFFF00000
+#define PPC40x_FLASH_HIGH	0xFFF80000
+#define PPC40x_FLASH_SIZE	0x80000
 
-#define PPC4xx_MACHINE_NAME     "IBM Bubinga"
+#define PPC4xx_MACHINE_NAME	"IBM Bubinga"
 
-#endif /* !__ASSEMBLY__ */
 #endif /* __BUBINGA_H__ */
 #endif /* __KERNEL__ */
diff -puN arch/ppc/platforms/4xx/ebony.h~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot arch/ppc/platforms/4xx/ebony.h
--- devel/arch/ppc/platforms/4xx/ebony.h~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot	2005-10-31 20:15:04.000000000 -0800
+++ devel-akpm/arch/ppc/platforms/4xx/ebony.h	2005-10-31 20:15:04.000000000 -0800
@@ -24,8 +24,8 @@
 #define PPC44x_EMAC0_MR0	0xE0000800
 
 /* Where to find the MAC info */
-#define EBONY_OPENBIOS_MAC_BASE   0xfffffe0c
-#define EBONY_OPENBIOS_MAC_OFFSET 0x0c
+#define OPENBIOS_MAC_BASE	0xfffffe0c
+#define OPENBIOS_MAC_OFFSET	0x0c
 
 /* Default clock rates for Rev. B and Rev. C silicon */
 #define EBONY_440GP_RB_SYSCLK	33000000
diff -puN arch/ppc/platforms/4xx/Kconfig~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot arch/ppc/platforms/4xx/Kconfig
--- devel/arch/ppc/platforms/4xx/Kconfig~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot	2005-10-31 20:15:04.000000000 -0800
+++ devel-akpm/arch/ppc/platforms/4xx/Kconfig	2005-10-31 20:15:04.000000000 -0800
@@ -225,7 +225,7 @@ config EMBEDDEDBOOT
 
 config IBM_OPENBIOS
 	bool
-	depends on ASH || BUBINGA || REDWOOD_5 || REDWOOD_6 || SYCAMORE || WALNUT
+	depends on ASH || REDWOOD_5 || REDWOOD_6
 	default y
 
 config PPC4xx_DMA
diff -puN arch/ppc/platforms/4xx/sycamore.c~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot arch/ppc/platforms/4xx/sycamore.c
--- devel/arch/ppc/platforms/4xx/sycamore.c~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot	2005-10-31 20:15:04.000000000 -0800
+++ devel-akpm/arch/ppc/platforms/4xx/sycamore.c	2005-10-31 20:15:04.000000000 -0800
@@ -88,9 +88,6 @@ ppc405_map_irq(struct pci_dev *dev, unsi
 void __init
 sycamore_setup_arch(void)
 {
-#define SYCAMORE_PS2_BASE	0xF0100000
-#define SYCAMORE_FPGA_BASE	0xF0300000
-
 	void *fpga_brdc;
 	unsigned char fpga_brdc_data;
 	void *fpga_enable;
@@ -100,7 +97,7 @@ sycamore_setup_arch(void)
 
 	ppc4xx_setup_arch();
 
-	ibm_ocp_set_emac(0, 1);
+	ibm_ocp_set_emac(0, 0);
 
 	kb_data = ioremap(SYCAMORE_PS2_BASE, 8);
 	if (!kb_data) {
@@ -111,7 +108,7 @@ sycamore_setup_arch(void)
 
 	kb_cs = kb_data + 1;
 
-	fpga_status = ioremap(SYCAMORE_FPGA_BASE, 8);
+	fpga_status = ioremap(PPC40x_FPGA_BASE, 8);
 	if (!fpga_status) {
 		printk(KERN_CRIT
 		       "sycamore_setup_arch() fpga_status ioremap failed\n");
diff -puN arch/ppc/platforms/4xx/sycamore.h~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot arch/ppc/platforms/4xx/sycamore.h
--- devel/arch/ppc/platforms/4xx/sycamore.h~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot	2005-10-31 20:15:04.000000000 -0800
+++ devel-akpm/arch/ppc/platforms/4xx/sycamore.h	2005-10-31 20:15:04.000000000 -0800
@@ -1,67 +1,52 @@
 /*
  * arch/ppc/platforms/4xx/sycamore.h
  *
- * Macros, definitions, and data structures specific to the IBM PowerPC
- * 405GPr "Sycamore" evaluation board.
+ * Sycamore board definitions
  *
- * Author: Armin Kuster <akuster@mvista.com>
+ * Copyright (c) 2005 DENX Software Engineering
+ * Stefan Roese <sr@denx.de>
+ *
+ * Based on original work by
+ * 	Armin Kuster <akuster@mvista.com>
+ *	2000 (c) MontaVista, Software, Inc.
+ *
+ * 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.
  *
- * 2000 (c) MontaVista, Software, Inc.  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.
  */
 
 #ifdef __KERNEL__
 #ifndef __ASM_SYCAMORE_H__
 #define __ASM_SYCAMORE_H__
 
+#include <linux/config.h>
 #include <platforms/4xx/ibm405gpr.h>
+#include <asm/ppcboot.h>
 
-#ifndef __ASSEMBLY__
-/*
- * Data structure defining board information maintained by the boot
- * ROM on IBM's "Sycamore" evaluation board. An effort has been made to
- * keep the field names consistent with the 8xx 'bd_t' board info
- * structures.
- */
-
-typedef struct board_info {
-	unsigned char	 bi_s_version[4];	/* Version of this structure */
-	unsigned char	 bi_r_version[30];	/* Version of the IBM ROM */
-	unsigned int	 bi_memsize;		/* DRAM installed, in bytes */
-	unsigned char	 bi_enetaddr[6];	/* Local Ethernet MAC address */
-	unsigned char	 bi_pci_enetaddr[6];	/* PCI Ethernet MAC address */
-	unsigned int	 bi_intfreq;		/* Processor speed, in Hz */
-	unsigned int	 bi_busfreq;		/* PLB Bus speed, in Hz */
-	unsigned int	 bi_pci_busfreq;	/* PCI Bus speed, in Hz */
-} bd_t;
-
-/* Some 4xx parts use a different timebase frequency from the internal clock.
-*/
-#define bi_tbfreq bi_intfreq
-
-
-/* Memory map for the IBM "Sycamore" 405GP evaluation board.
+/* Memory map for the IBM "Sycamore" 405GPr evaluation board.
  * Generic 4xx plus RTC.
  */
 
-extern void *sycamore_rtc_base;
 #define SYCAMORE_RTC_PADDR	((uint)0xf0000000)
 #define SYCAMORE_RTC_VADDR	SYCAMORE_RTC_PADDR
-#define SYCAMORE_RTC_SIZE		((uint)8*1024)
+#define SYCAMORE_RTC_SIZE	((uint)8*1024)
 
-#ifdef CONFIG_PPC405GP_INTERNAL_CLOCK
-#define BASE_BAUD		201600
-#else
 #define BASE_BAUD		691200
-#endif
 
-#define SYCAMORE_PS2_BASE		0xF0100000
-#define SYCAMORE_FPGA_BASE	0xF0300000
+#define SYCAMORE_PS2_BASE	0xF0100000
+
+/* Flash */
+#define PPC40x_FPGA_BASE	0xF0300000
+#define PPC40x_FPGA_REG_OFFS	5	/* offset to flash map reg */
+#define PPC40x_FLASH_ONBD_N(x)	(x & 0x02)
+#define PPC40x_FLASH_SRAM_SEL(x) (x & 0x01)
+#define PPC40x_FLASH_LOW	0xFFF00000
+#define PPC40x_FLASH_HIGH	0xFFF80000
+#define PPC40x_FLASH_SIZE	0x80000
 
 #define PPC4xx_MACHINE_NAME	"IBM Sycamore"
 
-#endif /* !__ASSEMBLY__ */
 #endif /* __ASM_SYCAMORE_H__ */
 #endif /* __KERNEL__ */
diff -puN arch/ppc/platforms/4xx/walnut.c~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot arch/ppc/platforms/4xx/walnut.c
--- devel/arch/ppc/platforms/4xx/walnut.c~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot	2005-10-31 20:15:04.000000000 -0800
+++ devel-akpm/arch/ppc/platforms/4xx/walnut.c	2005-10-31 20:15:04.000000000 -0800
@@ -90,7 +90,7 @@ walnut_setup_arch(void)
 
 	kb_cs = kb_data + 1;
 
-	fpga_status = ioremap(WALNUT_FPGA_BASE, 8);
+	fpga_status = ioremap(PPC40x_FPGA_BASE, 8);
 	if (!fpga_status) {
 		printk(KERN_CRIT
 		       "walnut_setup_arch() fpga_status ioremap failed\n");
diff -puN arch/ppc/platforms/4xx/walnut.h~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot arch/ppc/platforms/4xx/walnut.h
--- devel/arch/ppc/platforms/4xx/walnut.h~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot	2005-10-31 20:15:04.000000000 -0800
+++ devel-akpm/arch/ppc/platforms/4xx/walnut.h	2005-10-31 20:15:04.000000000 -0800
@@ -1,72 +1,55 @@
 /*
  * arch/ppc/platforms/4xx/walnut.h
  *
- * Macros, definitions, and data structures specific to the IBM PowerPC
- * 405GP "Walnut" evaluation board.
+ * Walnut board definitions
  *
- * Authors: Grant Erickson <grant@lcse.umn.edu>, Frank Rowand
- * <frank_rowand@mvista.com>, Debbie Chu <debbie_chu@mvista.com> or
- * source@mvista.com
+ * Copyright (c) 2005 DENX Software Engineering
+ * Stefan Roese <sr@denx.de>
  *
- * Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
+ * Based on original work by
+ * 	Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
+ *	Frank Rowand <frank_rowand@mvista.com>
+ *	Debbie Chu <debbie_chu@mvista.com>
+ *	2000 (c) MontaVista, Software, Inc.
+ *
+ * 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.
  *
- * 2000 (c) MontaVista, Software, Inc.  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.
  */
 
 #ifdef __KERNEL__
 #ifndef __ASM_WALNUT_H__
 #define __ASM_WALNUT_H__
 
-/* We have a 405GP core */
+#include <linux/config.h>
 #include <platforms/4xx/ibm405gp.h>
-
-#ifndef __ASSEMBLY__
-/*
- * Data structure defining board information maintained by the boot
- * ROM on IBM's "Walnut" evaluation board. An effort has been made to
- * keep the field names consistent with the 8xx 'bd_t' board info
- * structures.
- */
-
-typedef struct board_info {
-	unsigned char	 bi_s_version[4];	/* Version of this structure */
-	unsigned char	 bi_r_version[30];	/* Version of the IBM ROM */
-	unsigned int	 bi_memsize;		/* DRAM installed, in bytes */
-	unsigned char	 bi_enetaddr[6];	/* Local Ethernet MAC address */
-	unsigned char	 bi_pci_enetaddr[6];	/* PCI Ethernet MAC address */
-	unsigned int	 bi_intfreq;		/* Processor speed, in Hz */
-	unsigned int	 bi_busfreq;		/* PLB Bus speed, in Hz */
-	unsigned int	 bi_pci_busfreq;	/* PCI Bus speed, in Hz */
-} bd_t;
-
-/* Some 4xx parts use a different timebase frequency from the internal clock.
-*/
-#define bi_tbfreq bi_intfreq
-
+#include <asm/ppcboot.h>
 
 /* Memory map for the IBM "Walnut" 405GP evaluation board.
  * Generic 4xx plus RTC.
  */
 
-extern void *walnut_rtc_base;
 #define WALNUT_RTC_PADDR	((uint)0xf0000000)
 #define WALNUT_RTC_VADDR	WALNUT_RTC_PADDR
 #define WALNUT_RTC_SIZE		((uint)8*1024)
 
-#ifdef CONFIG_PPC405GP_INTERNAL_CLOCK
-#define BASE_BAUD		201600
-#else
 #define BASE_BAUD		691200
-#endif
 
 #define WALNUT_PS2_BASE		0xF0100000
-#define WALNUT_FPGA_BASE	0xF0300000
+
+/* Flash */
+#define PPC40x_FPGA_BASE	0xF0300000
+#define PPC40x_FPGA_REG_OFFS	5	/* offset to flash map reg */
+#define PPC40x_FLASH_ONBD_N(x)	(x & 0x02)
+#define PPC40x_FLASH_SRAM_SEL(x) (x & 0x01)
+#define PPC40x_FLASH_LOW	0xFFF00000
+#define PPC40x_FLASH_HIGH	0xFFF80000
+#define PPC40x_FLASH_SIZE	0x80000
+#define WALNUT_FPGA_BASE	PPC40x_FPGA_BASE
 
 #define PPC4xx_MACHINE_NAME	"IBM Walnut"
 
-#endif /* !__ASSEMBLY__ */
 #endif /* __ASM_WALNUT_H__ */
 #endif /* __KERNEL__ */
diff -puN include/asm-ppc/ibm_ocp.h~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot include/asm-ppc/ibm_ocp.h
--- devel/include/asm-ppc/ibm_ocp.h~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot	2005-10-31 20:15:04.000000000 -0800
+++ devel-akpm/include/asm-ppc/ibm_ocp.h	2005-10-31 20:15:04.000000000 -0800
@@ -131,9 +131,22 @@ static inline void ibm_ocp_set_emac(int 
 	/* Copy MAC addresses to EMAC additions */
 	for (i=start; i<=end; i++) {
 		def = ocp_get_one_device(OCP_VENDOR_IBM, OCP_FUNC_EMAC, i);
-		memcpy(((struct ocp_func_emac_data *)def->additions)->mac_addr,
-				&__res.bi_enetaddr[i],
-				6);
+		if (i == 0)
+			memcpy(((struct ocp_func_emac_data *)def->additions)->mac_addr,
+			       __res.bi_enetaddr, 6);
+#if defined(CONFIG_405EP) || defined(CONFIG_44x)
+		else if (i == 1)
+			memcpy(((struct ocp_func_emac_data *)def->additions)->mac_addr,
+			       __res.bi_enet1addr, 6);
+#endif
+#if defined(CONFIG_440GX)
+		else if (i == 2)
+			memcpy(((struct ocp_func_emac_data *)def->additions)->mac_addr,
+			       __res.bi_enet2addr, 6);
+		else if (i == 3)
+			memcpy(((struct ocp_func_emac_data *)def->additions)->mac_addr,
+			       __res.bi_enet3addr, 6);
+#endif
 	}
 }
 #endif
diff -puN include/asm-ppc/ppcboot.h~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot include/asm-ppc/ppcboot.h
--- devel/include/asm-ppc/ppcboot.h~ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot	2005-10-31 20:15:04.000000000 -0800
+++ devel-akpm/include/asm-ppc/ppcboot.h	2005-10-31 20:15:04.000000000 -0800
@@ -73,8 +73,8 @@ typedef struct bd_info {
 #if defined(CONFIG_HYMOD)
 	hymod_conf_t	bi_hymod_conf;	/* hymod configuration information */
 #endif
-#if defined(CONFIG_EVB64260) || defined(CONFIG_44x) || defined(CONFIG_85xx) ||\
-	defined(CONFIG_83xx)
+#if defined(CONFIG_EVB64260) || defined(CONFIG_405EP) || defined(CONFIG_44x) || \
+	defined(CONFIG_85xx) ||	defined(CONFIG_83xx)
 	/* second onboard ethernet port */
 	unsigned char	bi_enet1addr[6];
 #endif
@@ -96,5 +96,7 @@ typedef struct bd_info {
 #endif
 } bd_t;
 
+#define bi_tbfreq	bi_intfreq
+
 #endif /* __ASSEMBLY__ */
 #endif	/* __ASM_PPCBOOT_H__ */
_

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

* Re: [PATCH 2.6.14] ppc32: Allow for bigger compressed kernels
  2005-11-05  5:16 ` Andrew Morton
@ 2005-11-05 17:50   ` Tom Rini
  2005-11-05 17:56     ` Andrew Morton
  0 siblings, 1 reply; 7+ messages in thread
From: Tom Rini @ 2005-11-05 17:50 UTC (permalink / raw)
  To: Andrew Morton; +Cc: linuxppc-dev

On Fri, Nov 04, 2005 at 09:16:05PM -0800, Andrew Morton wrote:
> Tom Rini <trini@kernel.crashing.org> wrote:
> >
> > The ppc (not ppc64) boot loader (zimage wrapper) has a hard coded limit of
> > 4 MB on the size of an uncompressed kernel it can boot. The boot loader has
> > been changed to dynamically determine the largest possible kernel and
> > support it. Relocating the boot loader to a higher address (currently
> > located at 8 MB) will provide additional room.
> > 
> 
> I'm getting an unpleasant reject here from Matt's
> ppc32-cleanup-amcc-ppc40x-eval-boards-to-support-u-boot.patch.  In
> decompress_kernel he has added this ifdef:
> 
> @@ -164,7 +172,9 @@ decompress_kernel(unsigned long load_add
>  		puts(" "); puthex((unsigned long)(&__ramdisk_end));puts("\n");
>  	}
>  
> +#ifndef CONFIG_40x /* don't overwrite the 40x image located at 0x00400000! */
>  	avail_ram = (char *)0x00400000;
> +#endif
>  	end_avail = (char *)0x00800000;
>  	puts("avail ram:     "); puthex((unsigned long)avail_ram); puts(" ");
>  	puthex((unsigned long)end_avail); puts("\n");
> 
> 
> Which would appear to leave avail_ram at zero on CONFIG_40x.  There's no
> mention in the changelog that this was the intent, so I dunno what's going
> on.

It's very confusing code, I'll agree, and it's not helped by a
long-missing cleanup.  Going back to
http://linux.bkbits.net:8080/linux-2.6/diffs/arch/ppc/boot/simple/misc.c@1.3?nav=index.html|src/|src/arch/ppc/boot/simple/|hist/arch/ppc/boot/simple/misc.c
we got to the point of doing:
avail_ram = good aligned end of images value;
... do nothing to or with avail_ram ...
avail_ram = 4MB;

What Mark's patch does is get us to use and aligned value again.  So if
I read everything right we should just be able to drop that hunk of
Matt's patch as we really won't be overwriting anyones image.  If you
throw out an interm tree somewhere hopefully Matt can do a quick boot
test on some 4xx board (I unfortunaly don't have one).

-- 
Tom Rini
http://gate.crashing.org/~trini/

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

* Re: [PATCH 2.6.14] ppc32: Allow for bigger compressed kernels
  2005-11-05 17:50   ` Tom Rini
@ 2005-11-05 17:56     ` Andrew Morton
  0 siblings, 0 replies; 7+ messages in thread
From: Andrew Morton @ 2005-11-05 17:56 UTC (permalink / raw)
  To: Tom Rini; +Cc: linuxppc-dev

Tom Rini <trini@kernel.crashing.org> wrote:
>
> If you
>  throw out an interm tree somewhere hopefully Matt can do a quick boot
>  test on some 4xx board (I unfortunaly don't have one).

OK.  I hope to have -mm1 out this weekend.  An interim tree at present
probably won't even vaguely compile.  Sigh.

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

end of thread, other threads:[~2005-11-05 17:56 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-11-03 18:32 [PATCH 2.6.14] ppc32: Allow for bigger compressed kernels Tom Rini
2005-11-04  4:25 ` Olof Johansson
2005-11-04 14:50   ` Tom Rini
2005-11-04 15:00     ` Matt Porter
2005-11-05  5:16 ` Andrew Morton
2005-11-05 17:50   ` Tom Rini
2005-11-05 17:56     ` Andrew Morton

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