From 3e07d3ed7cfe95c1cfc5117e99a57722d55d66cd Mon Sep 17 00:00:00 2001 From: The-going <48602507+The-going@users.noreply.github.com> Date: Sat, 16 Nov 2024 23:18:30 +0300 Subject: [PATCH] bootscript: sunxi: Add a dtb file path analyzer Device tree files and overlay files are interconnected and always located in the same place, separated by the overlay subdirectory. ${fdtdir}/${fdtfile} ${fdtdir}/overlay/${overlay_prefix}-${overlay_file}.dtbo By default, we are trying to download a dtb file from the /boot/dtb folder, which is a link to the real folder. Depending on the time and type of build, this link may point directly to the target folder or to a subdirectory, i.e. possible path options: /boot/dtb/overlay /boot/dtb/allwinner/overlay In the file armbianEnv.txt we can also see: fdtfile=sun8i-*.dtb or fdtfile=allwinner/sun8i-*.dtb Thus, when the user has frozen the kernel and updated the BSP package, or vice versa, updated only the kernel, the following options are possible in the paths after their concatenation in the script: /boot/dtb/sun8i-*.dtb /boot/dtb/allwinner/sun8i-*.dtb /boot/dtb/allwinner/allwinner/sun8i-*.dtb Define and remember default path variables. Provide the user with the ability to specify the path to the target folder as: fdtdir=/path/to/dir Check the existence of the dtb file in all reasonable paths and set the path to it. If not found, download the default file from the default path. Signed-off-by: The-going <48602507+The-going@users.noreply.github.com> --- config/bootscripts/boot-sun50i-next.cmd | 48 +++++++++++++++++++-- config/bootscripts/boot-sunxi.cmd | 57 ++++++++++++++++++++++--- 2 files changed, 94 insertions(+), 11 deletions(-) diff --git a/config/bootscripts/boot-sun50i-next.cmd b/config/bootscripts/boot-sun50i-next.cmd index f3fc703a9..2724f49c5 100644 --- a/config/bootscripts/boot-sun50i-next.cmd +++ b/config/bootscripts/boot-sun50i-next.cmd @@ -13,6 +13,15 @@ setenv console "both" setenv docker_optimizations "on" setenv bootlogo "false" +# Remember the default u-boot fdtfile +setenv deffdt_file ${fdtfile} + +# Remember the default u-boot fdtdir +setenv deffdt_dir "${prefix}dtb" +if test "$fdtdir" = ""; then setenv fdtdir "${deffdt_dir}";fi + +setenv vendor "allwinner" + # Print boot source itest.b *0x10028 == 0x00 && echo "U-boot loaded from SD" itest.b *0x10028 == 0x02 && echo "U-boot loaded from eMMC or secondary SD" @@ -25,6 +34,37 @@ if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then env import -t ${load_addr} ${filesize} fi +# In this shell, we can only check the existence of the file. +# Make a check of reasonable ways to find the dtb file. +# Set the true value of the paths. +if test -e ${devtype} ${devnum} "${fdtdir}/${fdtfile}"; then + : +else + echo "File ${fdtdir}/${fdtfile} does not exists" + if test -e ${devtype} ${devnum} "${deffdt_dir}/${vendor}/${fdtfile}"; then + setenv fdtdir "${deffdt_dir}/${vendor}" + else + echo "File ${deffdt_dir}/${vendor}/${fdtfile} does not exists" + if test -e ${devtype} ${devnum} "${deffdt_dir}/${fdtfile}"; then + setenv fdtdir "${deffdt_dir}" + else + echo "File ${deffdt_dir}/${fdtfile} does not exists" + if test -e ${devtype} ${devnum} "${deffdt_dir}/${vendor}/${deffdt_file}"; then + setenv fdtdir "${deffdt_dir}/${vendor}" + setenv fdtfile "${deffdt_file}" + else + echo "File ${deffdt_dir}/${vendor}/${deffdt_file} does not exists" + if test -e ${devtype} ${devnum} "${deffdt_dir}/${deffdt_file}"; then + setenv fdtdir "${deffdt_dir}" + setenv fdtfile "${deffdt_file}" + else + echo "File ${deffdt_dir}/${deffdt_file} does not exists" + fi + fi + fi + fi +fi + if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=ttyS0,115200 console=tty1"; fi if test "${console}" = "serial"; then setenv consoleargs "console=ttyS0,115200"; fi if test "${bootlogo}" = "true"; then @@ -41,11 +81,11 @@ setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=memory"; fi -load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} +load ${devtype} ${devnum} ${fdt_addr_r} ${fdtdir}/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do - if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/allwinner/overlay/${overlay_prefix}-${overlay_file}.dtbo; then + if load ${devtype} ${devnum} ${load_addr} ${fdtdir}/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi @@ -58,9 +98,9 @@ for overlay_file in ${user_overlays}; do done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" - load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} + load ${devtype} ${devnum} ${fdt_addr_r} ${fdtdir}/${fdtfile} else - if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/allwinner/overlay/${overlay_prefix}-fixup.scr; then + if load ${devtype} ${devnum} ${load_addr} ${fdtdir}/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi diff --git a/config/bootscripts/boot-sunxi.cmd b/config/bootscripts/boot-sunxi.cmd index 7c05f7a29..5c561957c 100644 --- a/config/bootscripts/boot-sunxi.cmd +++ b/config/bootscripts/boot-sunxi.cmd @@ -17,6 +17,15 @@ setenv devnum "0" setenv rootdev "/dev/mmcblk${devnum}p1" setenv earlycon "off" +# Remember the default u-boot fdtfile +setenv deffdt_file ${fdtfile} + +# Remember the default u-boot fdtdir +setenv deffdt_dir "${prefix}dtb" +if test "$fdtdir" = ""; then setenv fdtdir "${deffdt_dir}";fi + +setenv vendor "allwinner" + # Print boot source itest.b *0x28 == 0x00 && echo "U-boot loaded from SD" itest.b *0x28 == 0x01 && echo "U-boot loaded from NAND" @@ -31,13 +40,42 @@ if test "${devtype}" = "mmc"; then setenv rootdev "/dev/mmcblk${mmc_bootdev}p1" fi -echo "Boot script loaded from ${devtype}" - if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi +# In this shell, we can only check the existence of the file. +# Make a check of reasonable ways to find the dtb file. +# Set the true value of the paths. +if test -e ${devtype} ${devnum} "${fdtdir}/${fdtfile}"; then + : +else + echo "File ${fdtdir}/${fdtfile} does not exists" + if test -e ${devtype} ${devnum} "${deffdt_dir}/${vendor}/${fdtfile}"; then + setenv fdtdir "${deffdt_dir}/${vendor}" + else + echo "File ${deffdt_dir}/${vendor}/${fdtfile} does not exists" + if test -e ${devtype} ${devnum} "${deffdt_dir}/${fdtfile}"; then + setenv fdtdir "${deffdt_dir}" + else + echo "File ${deffdt_dir}/${fdtfile} does not exists" + if test -e ${devtype} ${devnum} "${deffdt_dir}/${vendor}/${deffdt_file}"; then + setenv fdtdir "${deffdt_dir}/${vendor}" + setenv fdtfile "${deffdt_file}" + else + echo "File ${deffdt_dir}/${vendor}/${deffdt_file} does not exists" + if test -e ${devtype} ${devnum} "${deffdt_dir}/${deffdt_file}"; then + setenv fdtdir "${deffdt_dir}" + setenv fdtfile "${deffdt_file}" + else + echo "File ${deffdt_dir}/${deffdt_file} does not exists" + fi + fi + fi + fi +fi + if test "${console}" = "display"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial"; then setenv consoleargs "console=ttyS0,115200"; fi if test "${console}" = "both"; then setenv consoleargs "console=ttyS0,115200 console=tty1"; fi @@ -50,7 +88,10 @@ fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} hdmi.audio=EDID:0 disp.screen0_output_mode=${disp_mode} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} ubootsource=${devtype} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" -if test "${disp_mem_reserves}" = "off"; then setenv bootargs "${bootargs} sunxi_ve_mem_reserve=0 sunxi_g2d_mem_reserve=0 sunxi_fb_mem_reserve=16"; fi +if test "${disp_mem_reserves}" = "off"; then + setenv bootargs "${bootargs} sunxi_ve_mem_reserve=0 sunxi_g2d_mem_reserve=0 sunxi_fb_mem_reserve=16" +fi + if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=memory"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd @@ -58,11 +99,13 @@ load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}zImage if test -e ${devtype} ${devnum} "${prefix}.next"; then echo "Found mainline kernel configuration" - load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} + if load ${devtype} ${devnum} ${fdt_addr_r} ${fdtdir}/${fdtfile}; then + echo "Load fdt: ${fdtdir}/${fdtfile}" + fi fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do - if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/overlay/${overlay_prefix}-${overlay_file}.dtbo; then + if load ${devtype} ${devnum} ${load_addr} ${fdtdir}/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi @@ -75,9 +118,9 @@ if test -e ${devtype} ${devnum} "${prefix}.next"; then done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" - load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} + load ${devtype} ${devnum} ${fdt_addr_r} ${fdtdir}/${fdtfile} else - if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/overlay/${overlay_prefix}-fixup.scr; then + if load ${devtype} ${devnum} ${load_addr} ${fdtdir}/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi