[U-Boot] mcf5307, timer 2 issue loading linux

Hi all,
i am reporting the following issue, maybe related to something wrong in my new mcf5307 support addition (still under testing), or maybe not:
1. U-Boot run correctly, timer2 is enabled as a system timestamp counter. 2. I load a uClinux bianry from flash to SDRAM with "cp.l FLASH_ADDR SDRAM_ADDR SIZE/4 3. i launch the binary with "go SDRAM_ADDR"
First startup of linux (head.S) is locked, since U-boot timer2 interrupt happen, exactly while linux startup (in head.S) is moving ROMFS inside sdram. After the interrupt happen, i was assuming it return correctly allowing linux to load, but execution is locked inside this ROMFS copy of head.S.
Disabling the timer2 init in board.c, linux is loaded as expected.
Shouldn't timer2 be disabled for al coldfire models before loading linux ?
Every help is appreciated.
reagrds, angelo

Hi Angelo,
On 08/03/2011 06:09 PM, angelo wrote:
i am reporting the following issue, maybe related to something wrong in my new mcf5307 support addition (still under testing), or maybe not:
- U-Boot run correctly, timer2 is enabled as a system timestamp counter.
- I load a uClinux bianry from flash to SDRAM with "cp.l FLASH_ADDR
SDRAM_ADDR SIZE/4 3. i launch the binary with "go SDRAM_ADDR"
First startup of linux (head.S) is locked, since U-boot timer2 interrupt happen, exactly while linux startup (in head.S) is moving ROMFS inside sdram. After the interrupt happen, i was assuming it return correctly allowing linux to load, but execution is locked inside this ROMFS copy of head.S.
Disabling the timer2 init in board.c, linux is loaded as expected.
Shouldn't timer2 be disabled for al coldfire models before loading linux ?
What interrupt level is timer2 set to?
The second instruction into running uClinux is:
movew #0x2700, %sr
which will disable all interrupts - excepting anything set to the non-maskable level 7.
Regards Greg
------------------------------------------------------------------------ Greg Ungerer -- Principal Engineer EMAIL: gerg@snapgear.com SnapGear Group, McAfee PHONE: +61 7 3435 2888 8 Gardner Close, FAX: +61 7 3891 3630 Milton, QLD, 4064, Australia WEB: http://www.SnapGear.com

Hi all,
finally this is what seems to happen:
1. U-boot setup timer 2 using LEVEL 7 autovectored interrupt. For this case the uClinux " movew #0x2700, %sr " in head.S don't disable the timer interrupt. 2. execution of uClinux proceed into head.S, rewriting %a7 (%sp) just after writing %sr. 3. at a certain (probably variable) moment, timer interrupt happen, and since the stack pointer is no more valid, it seems to get stucked and can't return correctly.
Solution (temporary, RFC) uBoot command bootm allows an "arch_preboot_os()":
cmd_bootm.c
case BOOTM_STATE_OS_GO: disable_interrupts(); arch_preboot_os(); boot_fn(BOOTM_STATE_OS_GO, argc, argv, &images); break;
I used it to disable LEVEL7 interrupt. Next os loading works.
NOTE: For this issue using command "go" is not possible, since it is not meant for os loading, and don't do any arch_preboot_os(); .
What i still don't understand is why this issue is not happening on other coldfire models that have UBoot and uClinux. Probably they are faster, and head.S can be processed and timers re-initialized before interrupt occours.
Let me know your thoughts.
Regards, angelo
On 03/08/2011 14:50, Greg Ungerer wrote:
Hi Angelo,
On 08/03/2011 06:09 PM, angelo wrote:
i am reporting the following issue, maybe related to something wrong in my new mcf5307 support addition (still under testing), or maybe not:
- U-Boot run correctly, timer2 is enabled as a system timestamp
counter. 2. I load a uClinux bianry from flash to SDRAM with "cp.l FLASH_ADDR SDRAM_ADDR SIZE/4 3. i launch the binary with "go SDRAM_ADDR"
First startup of linux (head.S) is locked, since U-boot timer2 interrupt happen, exactly while linux startup (in head.S) is moving ROMFS inside sdram. After the interrupt happen, i was assuming it return correctly allowing linux to load, but execution is locked inside this ROMFS copy of head.S.
Disabling the timer2 init in board.c, linux is loaded as expected.
Shouldn't timer2 be disabled for al coldfire models before loading linux ?
What interrupt level is timer2 set to?
The second instruction into running uClinux is:
movew #0x2700, %sr
which will disable all interrupts - excepting anything set to the non-maskable level 7.
Regards Greg
Greg Ungerer -- Principal Engineer EMAIL: gerg@snapgear.com SnapGear Group, McAfee PHONE: +61 7 3435 2888 8 Gardner Close, FAX: +61 7 3891 3630 Milton, QLD, 4064, Australia WEB: http://www.SnapGear.com

Dear angelo,
In message 4E390235.2090107@gmail.com you wrote:
i am reporting the following issue, maybe related to something wrong in my new mcf5307 support addition (still under testing), or maybe not:
- U-Boot run correctly, timer2 is enabled as a system timestamp counter.
- I load a uClinux bianry from flash to SDRAM with "cp.l FLASH_ADDR
SDRAM_ADDR SIZE/4 3. i launch the binary with "go SDRAM_ADDR"
You must not start Linux with a "go" command. Please use "bootm" for this purpose (and then you also don;t have to copy the kernal manually).
Best regards,
Wolfgang Denk

Hi Wolfgang,
i confirm that before the patch/solution applied (i just posted it), i also tried "bootm FLASH_ADDR". Same result, loading fail, since timer2 interrupt is not stopped and the interrupt happen just after the linux head.S execution.
As i said, probably this issue was not visible in other coldfire models since mcf5307 run at 90mhz only.
I have copied the "arch_preboot_os()" solution from other boards, that was doing the same thing, disabling async interrupts before loading the os.
Regards, angelo
On 03/08/2011 15:07, Wolfgang Denk wrote:
Dear angelo,
In message4E390235.2090107@gmail.com you wrote:
i am reporting the following issue, maybe related to something wrong in my new mcf5307 support addition (still under testing), or maybe not:
- U-Boot run correctly, timer2 is enabled as a system timestamp counter.
- I load a uClinux bianry from flash to SDRAM with "cp.l FLASH_ADDR
SDRAM_ADDR SIZE/4 3. i launch the binary with "go SDRAM_ADDR"
You must not start Linux with a "go" command. Please use "bootm" for this purpose (and then you also don;t have to copy the kernal manually).
Best regards,
Wolfgang Denk
participants (3)
-
angelo
-
Greg Ungerer
-
Wolfgang Denk