[U-Boot-Users] questions booting Linux on a mpc8247

Jim Fridlund jim at code4fun.us
Thu May 11 05:17:29 CEST 2006


Hi all. I am trying to load Linux on a board with a mpc8247
processor using u-boot-1.1.4 and I'm running into a problems
booting a multi-boot image (Linux kernel + ram disk).

I can load the image via TFTP, but it hangs when I try to
run bootm. I searched in Google, but I couldn't find anything
related to what I'm seeing so I'm hoping I can get some help
from the u-boot community. What I see here is that u-boot gets
a 0x200 exception because it is trying to load the ram disk
image to memory out of range. My board has 128M of memory. Here
is a snippet:

U-Boot 1.1.4 (May 10 2006 - 11:38:41)

MPC8247 Reset Status: Check Stop, External Soft, External Hard

MPC8247 Clock Configuration
 - Bus-to-Core Mult 4x, VCO Div 2, 60x Bus Freq  25-75 , Core Freq 100-300
 - dfbrg 1, corecnf 0x1a, busdf 5, cpmdf 1, plldf 0, pllmf 5
 - vco_out  399999996, scc_clk   99999999, brg_clk   24999999
 - cpu_clk  266666664, cpm_clk  199999998, bus_clk   66666666
 - pci_clk   66666666

CPU:   MPC8247 (HiP7 Rev 14, Mask 1.0 1K50M) at 266.666 MHz
Board: MPC 8247
I2C:   ready
DRAM:  128 MB
FLASH: 512 kB
Using default environment

In:    serial
Out:   serial
Err:   serial
Net:   FCC1 ETHERNET
IDE:   Bus 0: OK
  Device 0: Model: TOSHIBA THNCF256MMA Firm: 3.10 Ser#: STCB52M6300ZC49843C5
            Type: Removable Hard Disk
            Capacity: 244.5 MB = 0.2 GB (500736 x 512)

Type "run flash_nfs" to mount root filesystem over NFS

=> tftp
Using FCC1 ETHERNET device
TFTP from server 172.16.86.50; our IP address is 172.16.86.177
Filename 'jim/uImage'.
Load address: 0x100000
Loading: #################################################################
...
done
Bytes transferred = 7326900 (6fccb4 hex)
=> bootm
## Booting image at 00100000 ...
   Image Name:   Linux with ramdisk
   Created:      2006-05-10  22:01:21 UTC
   Image Type:   PowerPC Linux Multi-File Image (uncompressed)
   Data Size:    7326836 Bytes =  7 MB
   Load Address: 00000000
   Entry Point:  00000000
   Contents:
   Image 0:  2559077 Bytes =  2.4 MB
   Image 1:  4767744 Bytes =  4.5 MB
   Verifying Checksum ... OK
OK
   Loading Ramdisk to 84344000, end 07f74064 ...

It verifies the image correctly, but the board hangs with a
0x200 exception trying to load the ram disk at 0x84344000
which is out of range. I don't know how u-boot calculates
where it stores the kernel and ram disk at the moment (this
is all magic to me). If I create an image where I specify the
load address, say 16M (0x01000000), it is able to load the ram
disk ok but hangs shortly with exception 0x200.

I generate the multi-boot image by running the following mkimage
command:

$ ./u-boot-1.1.4/tools/mkimage -A ppc -O Linux -T multi -C none -n
'Linux with ramdisk' -d vmlinux:rootfs.powerpc.ext2 uImage.img

Unfortunately, I haven't figured out how to debug u-boot after
it copies the code from rom to memory so progress has slowed.
I am using Vision Probe to debug. I can debug the code prior to
copying itself into memory, but I lose symbols once it relocates
to memory. Does anyone have any advice on how to tackle this? I
saw the GDB serial debug tutorial, but I don't have another serial
port unfortunately.

I also have a question regarding tool chain. I am using uClibC's
buildroot to build a compiler toolchain. At the moment, I am using
gcc 3.4.2 and Linux 2.4.31. I tried using gcc 4.0.2 initially, but
I had a problem with it trying to generate the proper code for
building u-boot. It appears that u-boot is using register r29 as
a global pointer and we had the following code in
./cpu/mpc8260/cpu_init.c:

void cpu_init_f (volatile immap_t * immr)
{
        DECLARE_GLOBAL_DATA_PTR;
        ...

        /* Pointer is writable since we allocated a register for it */
        gd = (gd_t *) (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET);
}

For the PPC, DECLARE_GLOBAL_DATA_PTR is defined as:

#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r29")

As far as I can tell, the above statement is trying to assign
r29 the value of CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET which
is basically an offset in the PPC's internal memory for storing
global data structure. However, gcc 4.0.2 would not generate code
that sets r29 correctly. I temporarily worked around it by adding
a couple of lines in start.S:

        /* Hack to initialize R29 since cpu_init_f code isn't working. */
        lis     r29,(CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@h
        ori     r29, r29, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@l

Is anyone using gcc 4.x to build? I reverted to gcc 3.4.2 just to
be on the safe side. Also, I noticed that Linux 2.6.x kernel doesn't
have much support for embedded mpc82xx so I ended up using Linux 2.4.31
which is the most current version that works with uClibC's buildroot.
Is there anyone doing embedded PPC development based on 2.6 kernel and
gcc 4.x? I sure would like to hear your inputs.

Lastly, is there anyone working on a TIPC implementation in u-boot?
I read the white paper on TIPC and it would seem like a nice solution
to have on a distributed/embedded cluster environment such as a
chassis where there is a single control card with multiple dummy
line cards (flashless) on a custom backplane.

Any help or pointers would be greatly appreciated. Thanks in advance.
--
Jim




More information about the U-Boot mailing list