tizen: bootscript: vf2: update boot scripts 06/309506/1
authorMarek Szyprowski <m.szyprowski@samsung.com>
Thu, 11 Apr 2024 09:11:56 +0000 (11:11 +0200)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Thu, 11 Apr 2024 12:55:00 +0000 (14:55 +0200)
Update VF2 boot script to match the one developped recently for
LicheePi4A. This improves the following things:
- partitions are discovered by GPT name, not by hardcoded number
- root= kernel parameter is correctly set for partitions up to 19th
- switch to generic devtype/devnum envs like for typical distro_boot case
- reordered some operations and added more comments
- tested A/B booting

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Change-Id: I038f42c8b4f1133798b8d8c8e2f89955b717ca9d

configs/tizen_qemu-riscv64_smode_defconfig
configs/tizen_starfive_visionfive2_defconfig
include/samsung/tizen_riscv.h
tizen/bootscript/tizen-boot-vf2.scr

index fb28519..1a7da79 100644 (file)
@@ -11,7 +11,7 @@ CONFIG_DISTRO_DEFAULTS=y
 CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
 CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x80200000
 CONFIG_FIT=y
-CONFIG_BOOTCOMMAND="load ${bootdevtype} ${bootdevnum}:${bootpart} ${scriptaddr} ${prefix}${script}; devtype=${bootdevtype}; devnum=${bootdevnum}; distro_bootpart=${bootpart}; source ${scriptaddr}"
+CONFIG_BOOTCOMMAND="part number ${devtype} ${devnum} ${bootname} bootpart; load ${devtype} ${devnum}:${bootpart} ${scriptaddr} ${prefix}${script}; distro_bootpart=${bootpart}; source ${scriptaddr}"
 CONFIG_USE_PREBOOT=y
 CONFIG_PREBOOT="setenv fdt_addr ${fdtcontroladdr}; fdt addr ${fdtcontroladdr}; test -n \"${loadbootenv}\" -a -n \"${importbootenv}\" && run loadbootenv && run importbootenv;"
 CONFIG_DISPLAY_CPUINFO=y
index e68eab6..32c8491 100644 (file)
@@ -32,7 +32,7 @@ CONFIG_QSPI_BOOT=y
 CONFIG_SD_BOOT=y
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 debug rootwait earlycon=sbi"
-CONFIG_BOOTCOMMAND="load ${bootdevtype} ${bootdevnum}:${bootpart} ${scriptaddr} ${prefix}${script}; devtype=${bootdevtype}; devnum=${bootdevnum}; distro_bootpart=${bootpart}; source ${scriptaddr}"
+CONFIG_BOOTCOMMAND="part number ${devtype} ${devnum} ${bootname} bootpart; load ${devtype} ${devnum}:${bootpart} ${scriptaddr} ${prefix}${script}; distro_bootpart=${bootpart}; source ${scriptaddr}"
 CONFIG_USE_PREBOOT=y
 CONFIG_PREBOOT="setenv fdt_addr ${fdtcontroladdr}; fdt addr ${fdtcontroladdr}; test -n \"${loadbootenv}\" -a -n \"${importbootenv}\" && run loadbootenv && run importbootenv;"
 CONFIG_DEFAULT_FDT_FILE="jh7110-starfive-visionfive-2.dtb"
@@ -67,6 +67,7 @@ CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS=5
 CONFIG_CMD_MEMINFO=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_TFTPPUT=y
+CONFIG_CMD_EXT4_WRITE=y
 CONFIG_OF_BOARD=y
 CONFIG_ENV_IS_IN_FAT=y
 CONFIG_ENV_FAT_DEVICE_AND_PART="1:3"
index b852195..ee0d74f 100644 (file)
@@ -9,23 +9,29 @@
 #ifndef __CONFIG_TIZEN_RISCV_H
 #define __CONFIG_TIZEN_RISCV_H
 
-#ifdef CONFIG_TARGET_STARFIVE_VISIONFIVE2
+#if defined(CONFIG_TARGET_STARFIVE_VISIONFIVE2) || \
+    defined(CONFIG_TARGET_LIGHT_FM_C910_LPI4A)
 #define TIZEN_TARGET_ENV_SETTING \
-       "bootdevnum=1\0"                        \
-       "bootdevtype=mmc\0"                     \
+       "devnum=1\0"                    \
+       "devtype=mmc\0"                 \
        ""
 #elif defined(CONFIG_TARGET_QEMU_VIRT)
 #define TIZEN_TARGET_ENV_SETTING \
-       "bootdevnum=0\0"                        \
-       "bootdevtype=virtio\0"                  \
+       "devnum=0\0"                    \
+       "devtype=virtio\0"              \
        ""
 #else /* CONFIG_TARGET_* */
 #define TIZEN_TARGET_ENV_SETTING ""
 #endif /* CONFIG_TARGET_* */
 
+#define SET_INFORM_PART        \
+       "part number ${devtype} ${devnum} ${informname} informpart; "
+
 #define CLEAR_REBOOT_PARAM \
+       SET_INFORM_PART \
        "mw.l ${rebootparam_addr} ${normal_val} ; "                                             \
-       "ext4write ${bootdevtype} ${bootdevnum}:${informpart} ${rebootparam_addr} /${rebootparamfile} 8; "
+       "ext4write ${devtype} ${devnum}:${informpart} ${rebootparam_addr} /${rebootparamfile} 8; "
+
 
 /* SD/MMC configuration */
 #define CONFIG_MMC_DEFAULT_DEV 1
@@ -35,9 +41,8 @@
 #define TIZEN_ENV_SETTING \
        TIZEN_TARGET_ENV_SETTING                \
        "kernel=" KERNEL_NAME "\0"              \
-       "bootpart=3\0"                  \
-       "rootpart=5\0"                  \
-       "informpart=0xb\0"                      \
+       "informname=inform\0"                   \
+       "bootname=boot_a\0"                     \
        "rebootparamfile=reboot-param.bin\0"    \
        "slotfile=partition-ab.info\0"  \
        "slot_addr=0x82200000\0"                \
@@ -47,9 +52,6 @@
        "nodef_val=6665646e\0"                  \
        "normal_val=6d726f6e\0"                 \
        "download_val=6c6e7764\0"               \
-       "ramdiskpart=9\0"                       \
-       "part=9\0"                              \
-       "bootmode=ramdisk\0"                    \
        "tfm=setenv bootmode download; run bootcmd\0"   \
        "tizen_bootarg= \0"     \
        "opts=loglevel=7\0"                     \
        "script=boot.scr.uimg\0" \
        "prefix=/\0" \
        "set_to_part_a=" \
-               "if test -e ${bootdevtype} ${bootdevnum}:${informpart} ${slotfile}; then; " \
-                       "load ${bootdevtype} ${bootdevnum}:${informpart} ${slot_addr} /${slotfile} 2; " \
+               SET_INFORM_PART \
+               "if test -e ${devtype} ${devnum}:${informpart} ${slotfile}; then; " \
+                       "load ${devtype} ${devnum}:${informpart} ${slot_addr} /${slotfile} 2; " \
                "fi; " \
                "mw.b ${slot_addr} 0x61; " \
-               "ext4write ${bootdevtype} ${bootdevnum}:${informpart} ${slot_addr} /${slotfile} 2;\0" \
+               "ext4write ${devtype} ${devnum}:${informpart} ${slot_addr} /${slotfile} 2;\0" \
        "set_to_part_b=" \
-               "if test -e ${bootdevtype} ${bootdevnum}:${informpart} ${slotfile}; then; " \
-                       "load ${bootdevtype} ${bootdevnum}:${informpart} ${slot_addr} /${slotfile} 2; " \
+               SET_INFORM_PART \
+               "if test -e ${devtype} ${devnum}:${informpart} ${slotfile}; then; " \
+                       "load ${devtype} ${devnum}:${informpart} ${slot_addr} /${slotfile} 2; " \
                "fi; " \
                "mw.b ${slot_addr} 0x62; " \
-               "ext4write ${bootdevtype} ${bootdevnum}:${informpart} ${slot_addr} /${slotfile} 2;\0" \
+               "ext4write ${devtype} ${devnum}:${informpart} ${slot_addr} /${slotfile} 2;\0" \
        "bootenv=uEnv.txt\0"                    \
        "loadbootenv=" \
-               "if test -e ${bootdevtype} ${bootdevnum}:${bootpart} ${loadaddr} ${prefix}${bootenv}; then " \
-                       "load ${bootdevtype} ${bootdevnum}:${bootpart} ${loadaddr} ${prefix}${bootenv}; " \
+               "part number ${devtype} ${devnum} ${bootname} bootpart; " \
+               "if test -e ${devtype} ${devnum}:${bootpart} ${loadaddr} ${prefix}${bootenv}; then " \
+                       "load ${devtype} ${devnum}:${bootpart} ${loadaddr} ${prefix}${bootenv}; " \
                "fi;\0" \
-        "importbootenv=echo Importing environment from ${bootdevtype} ...; " \
+        "importbootenv=echo Importing environment from ${devtype} ...; " \
                 "env import -t $loadaddr $filesize;\0" \
        ""
 
index 7afbe23..e3cb235 100644 (file)
@@ -16,55 +16,47 @@ if test -z "${devtype}"; then
        fi
 fi
 
+# find 'inform' partition
+part number $devtype $devnum "inform" informpart
+if test -z "${informpart}"; then;
+       echo No \"inform\" partition found.
+       exit
+fi
+
+setenv partition_ab "a"
 if test -e $devtype $devnum:$informpart $slotfile; then;
        ext4load $devtype $devnum:$informpart $slot_addr $slotfile;
        if itest.b *${slot_addr} == 0x62; then;
-               setenv ramdiskpart 0xf
-               setenv part 15
-               setenv partition_ab b
-               echo "boot from slot_b";
-       else
-               setenv ramdiskpart 9
-               setenv part 9
-               setenv partition_ab a
-               echo "boot from slot_a";
+               setenv partition_ab "b"
        fi
-else
-       setenv ramdiskpart 9
-       setenv part 9
-       setenv partition_ab a
-       echo "boot from slot_a";
+fi
+echo "boot from slot_${partition_ab}"
+
+# find the boot partition
+part number $devtype $devnum "boot_${partition_ab}" bootpart
+if test -z "${bootpart}"; then;
+       echo No \"boot_${partition_ab}\" partition found.
+       exit
+fi
+
+# set sane defaults
+setenv partition_name "ramdisk"
+if test -z "${bootmode}"; then;
+       setenv bootmode "normal"
 fi
 
+# check rebootparamfile
 if test -e $devtype $devnum:$informpart $rebootparamfile; then;
        ext4load $devtype $devnum:$informpart $rebootparam_addr $rebootparamfile;
        if itest.l *${rebootparam_addr} == ${upgrade_val}; then;
-               if test "${partition_ab}" = "b"; then
-                       setenv ramdiskpart 0x10
-                       setenv part 16
-               else
-                       setenv ramdiskpart 0xa
-                       setenv part 10
-               fi
-               setenv bootmode fota
+               setenv partition_name "ramdisk-recovery"
+               setenv bootmode "fota"
        elif itest.l *${rebootparam_addr} == ${recovery_val}; then;
-               if test "${partition_ab}" = "b"; then
-                       setenv ramdiskpart 0x10
-                       setenv part 16
-               else
-                       setenv ramdiskpart 0xa
-                       setenv part 10
-               fi
-               setenv bootmode recovery
+               setenv partition_name "ramdisk-recovery"
+               setenv bootmode "recovery"
        elif itest.l *${rebootparam_addr} == ${download_val}; then;
-               if test "${partition_ab}" = "b"; then
-                       setenv ramdiskpart 0x10
-                       setenv part 16
-               else
-                       setenv ramdiskpart 0xa
-                       setenv part 10
-               fi
-               setenv bootmode flash
+               setenv partition_name "ramdisk-recovery"
+               setenv bootmode "flash"
        elif itest.l *${rebootparam_addr} == ${nodef_val}; then;
                echo "This reboot parameter is not supported...";
        fi
@@ -72,14 +64,8 @@ fi
 
 # This is for jumping to flash mode on u-boot.
 if test "${bootmode}" = "download"; then;
-       if test "${partition_ab}" = "b"; then
-               setenv ramdiskpart 0x10
-               setenv part 16
-       else
-               setenv ramdiskpart 0xa
-               setenv part 10
-       fi
-       setenv bootmode flash
+       setenv partition_name "ramdisk-recovery"
+       setenv bootmode "flash"
 fi
 
 if test "${bootmode}" = "flash"; then;
@@ -88,9 +74,61 @@ if test "${bootmode}" = "flash"; then;
        fi
 fi
 
-# setting console device if noting is set
+# find the selected ramdisk variant partition and load it
+part number $devtype $devnum "${partition_name}_${partition_ab}" ramdiskpart
+if test -n "${ramdiskpart}"; then;
+       # Find the ramdisk offset and block count
+       part start $devtype $devnum $ramdiskpart ramdisk_start
+       part size $devtype $devnum $ramdiskpart ramdisk_size
+       # Set to ramdisksize with real partition size. (Need to multiply block-size 0x200)
+       setexpr ramdisksize $ramdisk_size * 200
+       # Load it
+       $devtype dev $devnum;
+       $devtype read $ramdisk_addr_r $ramdisk_start $ramdisk_size;
+else
+       echo No \"${partition_name}_${partition_ab}\" partition found.
+fi
+
+# check loaded ramdisk
+if test -e $devtype $devnum:$ramdiskpart sbin/init; then;
+       echo "Using ramdisk from partition ${ramdiskpart}";
+       # boot from ram0 if there is sbin
+       setenv rootargs root=/dev/ram0 rw
+elif itest.w *$ramdisk_addr_r == 0x8b1f; then; # check for gzip (initramfs) magic
+       echo "Using initramfs from partition ${ramdiskpart}";
+       setenv rootargs
+else
+       echo "Booting without initrd/initramfs";
+       setenv bootmode normal
+       setenv ramdisk_size 0
+
+       # find the rootfs partition
+       part number $devtype $devnum "rootfs_${partition_ab}" rootfspart
+       if test -z "${rootfspart}"; then;
+               echo No \"rootfs_${partition_ab}\" partition found.
+               exit
+       fi
+
+       # simplified hex2dec conversion for 0x1..0x13->1..19 range
+       if itest $rootfspart > 9; then;
+               setexpr rootfspart $rootfspart + 6
+       else
+               setexpr rootfspart $rootfspart + 0
+       fi
+       if test "${devtype}" = "mmc"; then;
+               setenv rootargs root=/dev/mmcblk${devnum}p${rootfspart} rw rootwait
+       elif test "${devtype}" = "usb"; then;
+               setenv rootargs root=/dev/sda${rootfspart} rw rootwait
+       elif test "${devtype}" = "nvme"; then;
+               setenv rootargs root=/dev/nvme0n1p${rootfspart} rw rootwait
+       elif test "${devtype}" = "virtio"; then;
+               setenv rootargs root=/dev/vda${rootfspart} rw rootwait
+       fi
+fi
+
+# set console device if nothing is set
 if test -z "${console}"; then;
-       setenv console "console=ttyS0,115200 earlycon"
+       setenv console "console=ttyS0,115200n8 earlycon";
 fi
 echo "console: ${console}"
 
@@ -104,63 +142,22 @@ if setexpr pcb_revision sub "^VF7110(.).*" "\\1" "${serial#}"; then
        fi
 fi
 
-setenv boot_prefixes \"/\"
+setenv bootargs \"${tizen_bootarg} ${rootargs} bootmode=${bootmode} partition_ab=${partition_ab} ${console} ${opts} ${ip_opt}\"
 
-# Find the ramdisk offset and block count
-part start $devtype $devnum $ramdiskpart ramdisk_start
-part size $devtype $devnum $ramdiskpart ramdisk_size
+setenv boot_prefixes \"/\"
 
-# Set to ramdisksize with real partition size. (Need to multiply block-size 0x200)
-setexpr ramdisksize $ramdisk_size * 200
 setexpr tizen_kernel_addr_r $ramdisk_addr_r + $ramdisksize
-
-# boot from ramdisk if there is sbin or it is initramfs
-if test -e $devtype $devnum:$ramdiskpart sbin/init; then;
-       setenv rootdev ram0
-       echo "Loading Ramdisk from partition" ${part};
-       echo "Environment value of ramdiskpart is" ${ramdiskpart};
-       $devtype dev $devnum
-       $devtype read $ramdisk_addr_r $ramdisk_start $ramdisk_size;
-else
-       # Check for gzip (initramfs) magic
-       $devtype dev $devnum;
-       $devtype read $ramdisk_addr_r $ramdisk_start 1;
-       if itest.w *$ramdisk_addr_r == 0x8b1f; then;
-               setenv rootdev ram0
-               echo "Loading initramfs from partition ${part}";
-               echo "Environment value of ramdiskpart is" ${ramdiskpart};
-               $devtype read $ramdisk_addr_r $ramdisk_start $ramdisk_size;
-       else
-               if test "${devtype}" = "mmc"; then;
-                       setenv rootdev mmcblk${devnum}p${rootpart}
-               fi
-               if test "${devtype}" = "usb"; then;
-                       setenv rootdev sda${rootpart}
-               fi
-               if test "${devtype}" = "nvme"; then;
-                       setenv rootdev nvme0n1p${rootpart}
-               fi
-               if test "${devtype}" = "virtio"; then;
-                       setenv rootdev vda${rootpart}
-               fi
-               setenv bootmode normal
-       fi
-fi
-
-# To use cmdline for using serial console. /* Normal mode */
-setenv bootargs \"${tizen_bootarg} root=/dev/${rootdev} rw bootmode=${bootmode} partition_ab=${partition_ab} rootwait ${console} ${opts} ${ip_opt} stmmaceth=chain_mode:1\"
-
 echo "Searching for kernel in"; for prefix in $boot_prefixes; do
-if load $devtype $devnum:$distro_bootpart $tizen_kernel_addr_r $prefix$kernel; then;
+echo $prefix$kernel;
+if load $devtype $devnum:$bootpart $tizen_kernel_addr_r $prefix$kernel; then;
        echo ${bootmode} "boot";
-
        if test "${board_name}" = "qemu-riscv"; then
                # If running in QEMU use the DeviceTree provided by
                # the emulator. It is the most accurate description of
                # the platform.
                fdt move $fdt_addr $fdt_addr_r
        else
-               load $devtype $devnum:$distro_bootpart $fdt_addr_r $prefix$fdtfile
+               load $devtype $devnum:$bootpart $fdt_addr_r $prefix$fdtfile
        fi
        booti $tizen_kernel_addr_r $ramdisk_addr_r:$ramdisksize $fdt_addr_r;
 fi