Nokia RX-51: Add support for booting kernel in zImage format

Enable U-Boot bootz command and update env scripts to try loading also
zImage file and to try booting via bootz command.

Update also lowlevel_init.S code for checking validity of zImage magic to
correctly relocate kernel in zImage format.

This change allows U-Boot to directly boot Linux kernel without need for
converting kernel image into U-Boot uImage format.

Signed-off-by: Pali Rohár <pali@kernel.org>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
Link: https://lore.kernel.org/r/20210618132704.32066-1-pali@kernel.org
This commit is contained in:
Pali Rohár 2021-06-18 15:27:03 +02:00 committed by Lokesh Vutla
parent 149389424f
commit cc434fccba
5 changed files with 91 additions and 19 deletions

View file

@ -27,6 +27,9 @@ imagesize: /* maximal size of image */
ih_magic: /* IH_MAGIC in big endian from include/image.h */ ih_magic: /* IH_MAGIC in big endian from include/image.h */
.word 0x56190527 .word 0x56190527
z_magic: /* LINUX_ARM_ZIMAGE_MAGIC */
.word 0x016f2818
/* /*
* Routine: save_boot_params (called after reset from start.S) * Routine: save_boot_params (called after reset from start.S)
* Description: Copy attached kernel to address KERNEL_ADDRESS * Description: Copy attached kernel to address KERNEL_ADDRESS
@ -75,6 +78,12 @@ copy_kernel_start:
ldr r4, [r0] /* r4 - 4 bytes header of kernel */ ldr r4, [r0] /* r4 - 4 bytes header of kernel */
ldr r5, ih_magic /* r5 - IH_MAGIC */ ldr r5, ih_magic /* r5 - IH_MAGIC */
cmp r4, r5 cmp r4, r5
beq copy_kernel_loop
/* check for valid kernel zImage */
ldr r4, [r0, #36] /* r4 - 4 bytes header of kernel at offset 36 */
ldr r5, z_magic /* r5 - LINUX_ARM_ZIMAGE_MAGIC */
cmp r4, r5
bne copy_kernel_end /* skip if invalid image */ bne copy_kernel_end /* skip if invalid image */
copy_kernel_loop: copy_kernel_loop:
@ -85,7 +94,8 @@ copy_kernel_loop:
copy_kernel_end: copy_kernel_end:
mov r5, #0 mov r5, #0
str r5, [r0] /* remove 4 bytes header of kernel */ str r5, [r0] /* remove 4 bytes header of kernel uImage */
str r5, [r0, #36] /* remove 4 bytes header of kernel zImage */
/* Fix u-boot code */ /* Fix u-boot code */

View file

@ -18,6 +18,7 @@ CONFIG_CONSOLE_MUX=y
CONFIG_HUSH_PARSER=y CONFIG_HUSH_PARSER=y
CONFIG_SYS_PROMPT="Nokia RX-51 # " CONFIG_SYS_PROMPT="Nokia RX-51 # "
# CONFIG_CMD_BDI is not set # CONFIG_CMD_BDI is not set
CONFIG_CMD_BOOTZ=y
# CONFIG_BOOTM_NETBSD is not set # CONFIG_BOOTM_NETBSD is not set
# CONFIG_BOOTM_PLAN9 is not set # CONFIG_BOOTM_PLAN9 is not set
# CONFIG_BOOTM_RTEMS is not set # CONFIG_BOOTM_RTEMS is not set

View file

@ -11,13 +11,14 @@ a kernel. In order to transparently boot the original kernel, it will be
appended to u-boot.bin at 0x40000. NOLO will load the entire image into appended to u-boot.bin at 0x40000. NOLO will load the entire image into
(random) memory and execute u-boot, which saves hw revision, boot reason (random) memory and execute u-boot, which saves hw revision, boot reason
and boot mode ATAGs set by NOLO. Then the bootscripts will attempt to load and boot mode ATAGs set by NOLO. Then the bootscripts will attempt to load
uImage or boot.scr from a fat, ext2/ext3 or ext4 filesystem in external uImage, zImage or boot.scr from a fat or ext2/3/4 filesystem on external
SD card or internal eMMC memory. If this fails or keyboard is closed then SD card or internal eMMC memory. If this fails or keyboard is closed then
the appended kernel image will be booted using some generated and some the appended kernel image will be booted using some generated and some
stored ATAGs (see boot order). stored ATAGs (see boot order).
For generating combined image of u-boot and kernel there is a simple script For generating combined image of u-boot and kernel (either in uImage or zImage
called u-boot-gen-combined. It is available in following repository: format) there is a simple script called u-boot-gen-combined. It is available in
following repository:
https://github.com/pali/u-boot-maemo https://github.com/pali/u-boot-maemo
@ -41,7 +42,8 @@ Boot from SD or eMMC in this order:
* 1. * 1.
* 1.1 find boot.scr on first fat partition * 1.1 find boot.scr on first fat partition
* 1.2 find uImage on first fat partition * 1.2 find uImage on first fat partition
* 1.3 same order for 2. - 4. fat partition * 1.3 find zImage on first fat partition
* 1.4 same order for 2. - 4. fat partition
* 2. same as 1. but for ext2/3 partition * 2. same as 1. but for ext2/3 partition
* 3. same as 1. but for ext4 partition * 3. same as 1. but for ext4 partition

View file

@ -129,12 +129,14 @@ int rx51_kp_getc(struct stdio_dev *sdev);
"scriptboot=echo Running ${mmcscriptfile} from mmc " \ "scriptboot=echo Running ${mmcscriptfile} from mmc " \
"${mmcnum}:${mmcpart} ...; source ${scriptaddr}\0" \ "${mmcnum}:${mmcpart} ...; source ${scriptaddr}\0" \
"kernboot=echo Booting ${mmckernfile} from mmc " \ "kernboot=echo Booting ${mmckernfile} from mmc " \
"${mmcnum}:${mmcpart} ...; bootm ${kernaddr}\0" \ "${mmcnum}:${mmcpart} ...; bootm ${kernaddr} || " \
"bootz ${kernaddr}\0" \
"kerninitrdboot=echo Booting ${mmckernfile} ${mmcinitrdfile} from mmc "\ "kerninitrdboot=echo Booting ${mmckernfile} ${mmcinitrdfile} from mmc "\
"${mmcnum}:${mmcpart} ...; bootm ${kernaddr} ${initrdaddr}\0" \ "${mmcnum}:${mmcpart} ...; bootm ${kernaddr} ${initrdaddr} || " \
"bootz ${kernaddr} ${initrdaddr}\0" \
"attachboot=echo Booting attached kernel image ...;" \ "attachboot=echo Booting attached kernel image ...;" \
"setenv setup_omap_atag 1;" \ "setenv setup_omap_atag 1;" \
"bootm ${attkernaddr};" \ "bootm ${attkernaddr} || bootz ${attkernaddr};" \
"setenv setup_omap_atag\0" \ "setenv setup_omap_atag\0" \
"trymmcscriptboot=if run switchmmc; then " \ "trymmcscriptboot=if run switchmmc; then " \
"if run scriptload; then " \ "if run scriptload; then " \
@ -154,7 +156,8 @@ int rx51_kp_getc(struct stdio_dev *sdev);
"fi; " \ "fi; " \
"fi\0" \ "fi\0" \
"trymmcpartboot=setenv mmcscriptfile boot.scr; run trymmcscriptboot;" \ "trymmcpartboot=setenv mmcscriptfile boot.scr; run trymmcscriptboot;" \
"setenv mmckernfile uImage; run trymmckernboot\0" \ "setenv mmckernfile uImage; run trymmckernboot;" \
"setenv mmckernfile zImage; run trymmckernboot\0" \
"trymmcallpartboot=setenv mmcpart 1; run trymmcpartboot;" \ "trymmcallpartboot=setenv mmcpart 1; run trymmcpartboot;" \
"setenv mmcpart 2; run trymmcpartboot;" \ "setenv mmcpart 2; run trymmcpartboot;" \
"setenv mmcpart 3; run trymmcpartboot;" \ "setenv mmcpart 3; run trymmcpartboot;" \

View file

@ -159,7 +159,7 @@ setenv bootdelay 1;
EOF EOF
./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n bootmenu_uboot -d bootmenu_uboot bootmenu_uboot.scr ./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n bootmenu_uboot -d bootmenu_uboot bootmenu_uboot.scr
# Generate bootmenu for eMMC booting # Generate bootmenu for eMMC booting (uImage)
cat > bootmenu_emmc << EOF cat > bootmenu_emmc << EOF
setenv bootmenu_0 'uImage-2.6.28-omap1 from eMMC=setenv mmcnum 1; setenv mmcpart 1; setenv mmctype fat; setenv bootargs; setenv setup_omap_atag 1; setenv mmckernfile uImage-2.6.28-omap1; run trymmckernboot'; setenv bootmenu_0 'uImage-2.6.28-omap1 from eMMC=setenv mmcnum 1; setenv mmcpart 1; setenv mmctype fat; setenv bootargs; setenv setup_omap_atag 1; setenv mmckernfile uImage-2.6.28-omap1; run trymmckernboot';
setenv bootmenu_1; setenv bootmenu_1;
@ -168,6 +168,15 @@ setenv bootdelay 1;
EOF EOF
./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n bootmenu_emmc -d bootmenu_emmc bootmenu_emmc.scr ./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n bootmenu_emmc -d bootmenu_emmc bootmenu_emmc.scr
# Generate bootmenu for eMMC booting (zImage)
cat > bootmenu_emmc2 << EOF
setenv bootmenu_0 'zImage-2.6.28-omap1 from eMMC=setenv mmcnum 1; setenv mmcpart 1; setenv mmctype fat; setenv bootargs; setenv setup_omap_atag 1; setenv mmckernfile zImage-2.6.28-omap1; run trymmckernboot';
setenv bootmenu_1;
setenv bootmenu_delay 1;
setenv bootdelay 1;
EOF
./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n bootmenu_emmc2 -d bootmenu_emmc2 bootmenu_emmc2.scr
# Generate bootmenu for OneNAND booting # Generate bootmenu for OneNAND booting
cat > bootmenu_nand << EOF cat > bootmenu_nand << EOF
setenv bootmenu_0 'uImage-2.6.28-omap1 from OneNAND=mtd read initfs \${kernaddr}; setenv bootargs; setenv setup_omap_atag 1; bootm \${kernaddr}'; setenv bootmenu_0 'uImage-2.6.28-omap1 from OneNAND=mtd read initfs \${kernaddr}; setenv bootargs; setenv setup_omap_atag 1; bootm \${kernaddr}';
@ -177,10 +186,18 @@ setenv bootdelay 1;
EOF EOF
./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n bootmenu_nand -d bootmenu_nand bootmenu_nand.scr ./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n bootmenu_nand -d bootmenu_nand bootmenu_nand.scr
# Generate bootmenu for default booting
cat > bootmenu_default << EOF
setenv bootmenu_delay 1;
setenv bootdelay 1;
EOF
./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n bootmenu_default -d bootmenu_default bootmenu_default.scr
# Generate combined image from u-boot and Maemo fiasco kernel # Generate combined image from u-boot and Maemo fiasco kernel
dd if=kernel_2.6.28/boot/zImage-2.6.28-20103103+0m5.fiasco of=zImage-2.6.28-omap1 skip=95 bs=1 dd if=kernel_2.6.28/boot/zImage-2.6.28-20103103+0m5.fiasco of=zImage-2.6.28-omap1 skip=95 bs=1
./u-boot-gen-combined u-boot.bin zImage-2.6.28-omap1 combined_zimage.bin
./mkimage -A arm -O linux -T kernel -C none -a 80008000 -e 80008000 -n zImage-2.6.28-omap1 -d zImage-2.6.28-omap1 uImage-2.6.28-omap1 ./mkimage -A arm -O linux -T kernel -C none -a 80008000 -e 80008000 -n zImage-2.6.28-omap1 -d zImage-2.6.28-omap1 uImage-2.6.28-omap1
./u-boot-gen-combined u-boot.bin uImage-2.6.28-omap1 combined.bin ./u-boot-gen-combined u-boot.bin uImage-2.6.28-omap1 combined_uimage.bin
# Generate combined hack image from u-boot and Maemo fiasco kernel (kernel starts at 2MB offset and qflasher puts 2kB header before supplied image) # Generate combined hack image from u-boot and Maemo fiasco kernel (kernel starts at 2MB offset and qflasher puts 2kB header before supplied image)
cp u-boot.bin combined_hack.bin cp u-boot.bin combined_hack.bin
@ -191,24 +208,37 @@ truncate -s 50MiB emmc_uboot.img
mformat -m 0xf8 -F -h 4 -s 16 -c 1 -t $((50*1024*1024/(4*16*512))) :: -i emmc_uboot.img mformat -m 0xf8 -F -h 4 -s 16 -c 1 -t $((50*1024*1024/(4*16*512))) :: -i emmc_uboot.img
mcopy bootmenu_uboot.scr ::/bootmenu.scr -i emmc_uboot.img mcopy bootmenu_uboot.scr ::/bootmenu.scr -i emmc_uboot.img
# Generate FAT32 eMMC image for eMMC booting # Generate FAT32 eMMC image for eMMC booting (uImage)
truncate -s 50MiB emmc_emmc.img truncate -s 50MiB emmc_emmc.img
mformat -m 0xf8 -F -h 4 -s 16 -c 1 -t $((50*1024*1024/(4*16*512))) :: -i emmc_emmc.img mformat -m 0xf8 -F -h 4 -s 16 -c 1 -t $((50*1024*1024/(4*16*512))) :: -i emmc_emmc.img
mcopy uImage-2.6.28-omap1 ::/uImage-2.6.28-omap1 -i emmc_emmc.img mcopy uImage-2.6.28-omap1 ::/uImage-2.6.28-omap1 -i emmc_emmc.img
mcopy bootmenu_emmc.scr ::/bootmenu.scr -i emmc_emmc.img mcopy bootmenu_emmc.scr ::/bootmenu.scr -i emmc_emmc.img
# Generate FAT32 eMMC image for eMMC booting (zImage)
truncate -s 50MiB emmc_emmc2.img
mformat -m 0xf8 -F -h 4 -s 16 -c 1 -t $((50*1024*1024/(4*16*512))) :: -i emmc_emmc2.img
mcopy zImage-2.6.28-omap1 ::/zImage-2.6.28-omap1 -i emmc_emmc2.img
mcopy bootmenu_emmc2.scr ::/bootmenu.scr -i emmc_emmc2.img
# Generate FAT32 eMMC image for OneNAND booting # Generate FAT32 eMMC image for OneNAND booting
truncate -s 50MiB emmc_nand.img truncate -s 50MiB emmc_nand.img
mformat -m 0xf8 -F -h 4 -s 16 -c 1 -t $((50*1024*1024/(4*16*512))) :: -i emmc_nand.img mformat -m 0xf8 -F -h 4 -s 16 -c 1 -t $((50*1024*1024/(4*16*512))) :: -i emmc_nand.img
mcopy bootmenu_nand.scr ::/bootmenu.scr -i emmc_nand.img mcopy bootmenu_nand.scr ::/bootmenu.scr -i emmc_nand.img
# Generate FAT32 eMMC image for default booting
truncate -s 50MiB emmc_default.img
mformat -m 0xf8 -F -h 4 -s 16 -c 1 -t $((50*1024*1024/(4*16*512))) :: -i emmc_default.img
mcopy bootmenu_default.scr ::/bootmenu.scr -i emmc_default.img
# Generate MTD image for U-Boot serial console testing # Generate MTD image for U-Boot serial console testing
rm -f mtd_uboot.img rm -f mtd_uboot.img
./qflasher -v -x xloader-qemu.bin -s secondary-qemu.bin -k u-boot.bin -m rx51 -o mtd_uboot.img ./qflasher -v -x xloader-qemu.bin -s secondary-qemu.bin -k u-boot.bin -m rx51 -o mtd_uboot.img
# Generate MTD image for RAM booting from bootloader nolo images, compiled image and rootfs image # Generate MTD image for RAM booting from bootloader nolo images, compiled image and rootfs image
rm -f mtd_ram.img rm -f mtd_ram.img
./qflasher -v -x xloader-qemu.bin -s secondary-qemu.bin -k combined.bin -r ubi.img -m rx51 -o mtd_ram.img ./qflasher -v -x xloader-qemu.bin -s secondary-qemu.bin -k combined_uimage.bin -r ubi.img -m rx51 -o mtd_ram.img
rm -f mtd_ram2.img
./qflasher -v -x xloader-qemu.bin -s secondary-qemu.bin -k combined_zimage.bin -r ubi.img -m rx51 -o mtd_ram2.img
# Generate MTD image for eMMC booting from bootloader nolo images, u-boot image and rootfs image # Generate MTD image for eMMC booting from bootloader nolo images, u-boot image and rootfs image
rm -f mtd_emmc.img rm -f mtd_emmc.img
@ -238,7 +268,7 @@ wait -n $sleep_pid $qemu_pid || true
kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true
wait || true wait || true
# Run MTD image in qemu and wait for 300s if kernel from RAM is correctly booted # Run MTD image in qemu and wait for 300s if uImage kernel from RAM is correctly booted
rm -f qemu_ram.log rm -f qemu_ram.log
./qemu-system-arm -M n900 -mtdblock mtd_ram.img -serial /dev/stdout -display none > qemu_ram.log & ./qemu-system-arm -M n900 -mtdblock mtd_ram.img -serial /dev/stdout -display none > qemu_ram.log &
qemu_pid=$! qemu_pid=$!
@ -250,7 +280,19 @@ wait -n $sleep_pid $qemu_pid || true
kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true
wait || true wait || true
# Run MTD image in qemu and wait for 300s if kernel from eMMC is correctly booted # Run MTD image in qemu and wait for 300s if zImage kernel from RAM is correctly booted
rm -f qemu_ram2.log
./qemu-system-arm -M n900 -mtdblock mtd_ram2.img -sd emmc_default.img -serial /dev/stdout -display none > qemu_ram2.log &
qemu_pid=$!
tail -F qemu_ram2.log &
tail_pid=$!
sleep 300 &
sleep_pid=$!
wait -n $sleep_pid $qemu_pid || true
kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true
wait || true
# Run MTD image in qemu and wait for 300s if uImage kernel from eMMC is correctly booted
rm -f qemu_emmc.log rm -f qemu_emmc.log
./qemu-system-arm -M n900 -mtdblock mtd_emmc.img -sd emmc_emmc.img -serial /dev/stdout -display none > qemu_emmc.log & ./qemu-system-arm -M n900 -mtdblock mtd_emmc.img -sd emmc_emmc.img -serial /dev/stdout -display none > qemu_emmc.log &
qemu_pid=$! qemu_pid=$!
@ -262,6 +304,18 @@ wait -n $sleep_pid $qemu_pid || true
kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true
wait || true wait || true
# Run MTD image in qemu and wait for 300s if zImage kernel from eMMC is correctly booted
rm -f qemu_emmc2.log
./qemu-system-arm -M n900 -mtdblock mtd_emmc.img -sd emmc_emmc2.img -serial /dev/stdout -display none > qemu_emmc2.log &
qemu_pid=$!
tail -F qemu_emmc2.log &
tail_pid=$!
sleep 300 &
sleep_pid=$!
wait -n $sleep_pid $qemu_pid || true
kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true
wait || true
# Run MTD image in qemu and wait for 300s if kernel from OneNAND is correctly booted # Run MTD image in qemu and wait for 300s if kernel from OneNAND is correctly booted
rm -f qemu_nand.log rm -f qemu_nand.log
./qemu-system-arm -M n900 -mtdblock mtd_nand.img -sd emmc_nand.img -serial /dev/stdout -display none > qemu_nand.log & ./qemu-system-arm -M n900 -mtdblock mtd_nand.img -sd emmc_nand.img -serial /dev/stdout -display none > qemu_nand.log &
@ -281,13 +335,15 @@ echo "============================="
echo echo
if grep -q 'Successfully booted' qemu_uboot.log; then echo "U-Boot serial console is working"; else echo "U-Boot serial console test failed"; fi if grep -q 'Successfully booted' qemu_uboot.log; then echo "U-Boot serial console is working"; else echo "U-Boot serial console test failed"; fi
if grep -q 'Successfully booted' qemu_ram.log; then echo "Kernel was successfully booted from RAM"; else echo "Failed to boot kernel from RAM"; fi if grep -q 'Successfully booted' qemu_ram.log; then echo "Kernel (uImage) was successfully booted from RAM"; else echo "Failed to boot kernel (uImage) from RAM"; fi
if grep -q 'Successfully booted' qemu_emmc.log; then echo "Kernel was successfully booted from eMMC"; else echo "Failed to boot kernel from eMMC"; fi if grep -q 'Successfully booted' qemu_ram2.log; then echo "Kernel (zImage) was successfully booted from RAM"; else echo "Failed to boot kernel (zImage) from RAM"; fi
if grep -q 'Successfully booted' qemu_nand.log; then echo "Kernel was successfully booted from OneNAND"; else echo "Failed to boot kernel from OneNAND"; fi if grep -q 'Successfully booted' qemu_emmc.log; then echo "Kernel (uImage) was successfully booted from eMMC"; else echo "Failed to boot kernel (uImage) from eMMC"; fi
if grep -q 'Successfully booted' qemu_emmc2.log; then echo "Kernel (zImage) was successfully booted from eMMC"; else echo "Failed to boot kernel (zImage) from eMMC"; fi
if grep -q 'Successfully booted' qemu_nand.log; then echo "Kernel (uImage) was successfully booted from OneNAND"; else echo "Failed to boot kernel (uImage) from OneNAND"; fi
echo echo
if grep -q 'Successfully booted' qemu_uboot.log && grep -q 'Successfully booted' qemu_ram.log && grep -q 'Successfully booted' qemu_emmc.log && grep -q 'Successfully booted' qemu_nand.log; then if grep -q 'Successfully booted' qemu_uboot.log && grep -q 'Successfully booted' qemu_ram.log && grep -q 'Successfully booted' qemu_ram2.log && grep -q 'Successfully booted' qemu_emmc.log && grep -q 'Successfully booted' qemu_emmc2.log && grep -q 'Successfully booted' qemu_nand.log; then
echo "All tests passed" echo "All tests passed"
exit 0 exit 0
else else