From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jim Fridlund Date: Wed, 10 May 2006 20:17:29 -0700 Subject: [U-Boot-Users] questions booting Linux on a mpc8247 Message-ID: <4462ACC9.8060206@code4fun.us> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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