On Fri, Feb 08, 2008 at 06:30:56PM -0500, Sean MacLennan wrote:
> The Rev B warp is moving to a 4M NOR / 256M NAND flash setup from the 
> current 64M NOR / 64M NAND. I would like to keep support for the 64M NOR 
> so I modified the boot code to be a bit more dynamic. Here is the new 
> NOR parition layout in the DTS:
> 
> [EMAIL PROTECTED],0 {
>       compatible = "amd,s29gl512n", "cfi-flash";
>       bank-width = <2>;
>       reg = <0 0 4000000>;
>       #address-cells = <1>;
>       #size-cells = <1>;
>       [EMAIL PROTECTED] {
>               label = "fpga";
>               reg = <300000 40000>;
>       };
>       [EMAIL PROTECTED] {
>               label = "env";
>               reg = <340000 40000>;
>       };
>       [EMAIL PROTECTED] {
>               label = "u-boot";
>               reg = <380000 80000>;
>       };
> };
> 
> Yes, the top of the NOR will be empty. Here is the code from 
> cuboot-warp.c to handle fixups for the 64M flash:
> 
> static void warp_fixup_one_nor(u32 from, u32 to)
> {
>       void *devp;
>       char name[40];
>       u32 v[2];
> 
>       sprintf(name, "/plb/opb/ebc/[EMAIL PROTECTED],0/[EMAIL PROTECTED]", 
> from);
> 
>       devp = finddevice(name);
>       if (!devp) return;
> 
>       if (getprop(devp, "reg", v, sizeof(v)) == sizeof(v)) {
>               v[0] = to;
>               setprop(devp, "reg", v, sizeof(v));
> 
>               printf("NOR 64M fixup %x -> %x\n", from, to);
>       }
> }
> 
> 
> static void warp_fixups(void)
> {
>       unsigned long sysclk = 66000000;
> 
>       ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
>       ibm4xx_sdram_fixup_memsize();
>       ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
>       dt_fixup_mac_addresses(&bd.bi_enetaddr);
> 
>       /* Fixup for 64M flash on Rev A boards. */
>       if(bd.bi_flashsize == 0x4000000) {
>               warp_fixup_one_nor(0x300000, 0x3f00000);
>               warp_fixup_one_nor(0x340000, 0x3f40000);
>               warp_fixup_one_nor(0x380000, 0x3f80000);
>       }
> }

This doesn't seem right.  warp_fixup_one_nor() changes only the
partition's offset, so you're not changing the size of any
partitions.  If you're not going to actually use any of the extra
flash space with 64M, I can't see why you'd bother moving around the
partitions you have.

> I have tested this with the 64M NOR, and it seems to work. However, are 
> there going to be problems with the partition name not matching the reg 
> address entry?

In practice, probably not.  We already do a similar fixup on Ebony for
different flash layouts that won't leave the unit names correct.  We
really should get this right - and the fdt_set_name() function that's
now in libfdt should make that possible, it just needs some wiring up
to use in the bootwrapper.  That can come later, though, for now I
think applying your fixups without correcting the unit addresses is
adequate.

> If anybody has suggestions on better ways to do this, fire away.
> 
> And looking at this code, and other board ports, why is sysclk a local 
> variable and all the other numbers hardcoded in the args? I left it the 
> same way as the others but it does look a bit strange.

I think this also came from Ebony.  IIRC, the sysclk isn't strictly
speaking fixed, although it almost always has initialized value.  The
point of the local variable was that I planned to replace the static
initialization with some sort of probing once I figured out the
details.

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to