From 1beac374a9f01f590c164768dbbd8d54a7a829bb Mon Sep 17 00:00:00 2001 From: CyberMind-FR Date: Thu, 4 Dec 2025 22:23:06 +0100 Subject: [PATCH] Add GlobalScale MOCHAbin board support - Add board configuration for MOCHAbin - Based on Marvell Armada 7040 SoC - Support for 4GB and 8GB RAM variants - Multi-gigabit networking support -> hardware not detected (looks like the dtb is not loaded) - Tested with kernel 6.6.x --- config/boards/mochabin.conf | 22 + config/bootscripts/boot-mvebu.cmd | 547 ++------------------- config/kernel/linux-mvebu64-current.config | 17 +- config/sources/families/mvebu64.conf | 209 +++----- 4 files changed, 145 insertions(+), 650 deletions(-) create mode 100644 config/boards/mochabin.conf diff --git a/config/boards/mochabin.conf b/config/boards/mochabin.conf new file mode 100644 index 000000000000..6470b4291304 --- /dev/null +++ b/config/boards/mochabin.conf @@ -0,0 +1,22 @@ +# GlobalScale MOCHAbin +# Based on Marvell Armada 7040 + +BOARD_NAME="GlobalScale MOCHAbin" +BOARDFAMILY="mvebu64" +BOARD_MAINTAINER="" +KERNEL_TARGET="current,edge" + +# Use ESPRESSObin bootloader configuration (compatible) +BOOTCONFIG="mvebu_db-88f7040_defconfig" + +# MOCHAbin Device Tree +BOOT_FDT_FILE="armada-7040-mochabin.dtb" + +# Serial console +SERIALCON="ttyS0:115200n8" + +# Packages +PACKAGE_LIST_BOARD="ethtool" + +# Modules +MODULES_CURRENT="mvpp2 mvneta mv_xor ahci" diff --git a/config/bootscripts/boot-mvebu.cmd b/config/bootscripts/boot-mvebu.cmd index c7661b353910..cf26be579443 100644 --- a/config/bootscripts/boot-mvebu.cmd +++ b/config/bootscripts/boot-mvebu.cmd @@ -3,539 +3,80 @@ # Please edit /boot/armbianEnv.txt to set supported parameters # -# NOTE -# If you intend to use 'outside' of 'global' variables from U-Boot, make sure that you do not change them! -# The boot logic will attempt a list of 'boot_targets' that all might rely on (environment) variables that -# have been set by U-Boot, either compile-time or as part of U-Boot's default 'bootcmd'. -# Any variable that this bootscript uses needs to be set explicitly and not conflict with any pre-set variables. -# Variables that we might change will be saved in preset_x and variables we use will be copied into l_x. - -# default environment variables -setenv align_overlap_oboe_avoidance "on" -setenv align_to "0x00001000" -setenv console "both" -setenv docker_optimizations "on" -setenv earlycon "off" +setenv load_addr "0x300000" +# default values +setenv overlay_error "false" +setenv rootdev "/dev/mmcblk0p1" +setenv rootfstype "ext4" +setenv verbosity "1" setenv emmc_fix "off" +setenv spi_workaround "off" +setenv ethaddr "00:50:43:84:fb:2f" setenv eth1addr "00:50:43:25:fb:84" setenv eth2addr "00:50:43:84:25:2f" setenv eth3addr "00:50:43:0d:19:18" -setenv ethaddr "00:50:43:84:fb:2f" -setenv exit_on_critical_errors "on" -setenv fdt_extrasize "0x00010000" -setenv kver -setenv load_addr_calc -setenv overlay_error "false" -setenv preset_fdtdir "${fdtdir}" -setenv preset_fdtfile "${fdtfile}" -setenv preset_kernel_comp_addr_r "${kernel_comp_addr_r}" -setenv preset_kernel_comp_size "${kernel_comp_size}" -setenv rootdev "/dev/mmcblk${devnum}p${distro_bootpart}" -setenv rootfstype "ext4" -setenv spi_workaround "off" -setenv vendor "marvell" -setenv verbosity "1" - -# load addresses -setenv load_addr "0x00300000" -setenv fdt_addr_r "0x02040000" # max size 256 KiB (=dtb+dto+fdt_extrasize) -setenv kernel_addr_r "0x02080000" # max size 16 MiB -setenv ramdisk_addr_r "0x03080000" -# environment run variables -setenv func_align_addr_next ' - test "${align_overlap_oboe_avoidance}" = "on" && setexpr l_addr_next ${l_addr_next} + 1 ; - setexpr modulo ${l_addr_next} % ${align_to} ; - if itest ${modulo} -gt 0 ; then - setexpr l_addr_next ${l_addr_next} / ${align_to} ; - setexpr l_addr_next ${l_addr_next} + 1 ; - setexpr l_addr_next ${l_addr_next} * ${align_to} ; - fi' -setenv func_inform 'test "${verbosity}" = "" || itest ${verbosity} -gt 0 && echo "${l_message}"' -setenv func_warn 'echo "** WARNING: ${l_message}"' -setenv func_critical_error ' - echo "!! CRITICAL: ${l_message}" ; - if test "${exit_on_critical_errors}" = "on" ; then - false ; - else - true ; - fi' +echo "Boot script loaded from ${devtype}" -# set some defaults in case there are no pre-sets -if test "${envfile}" = "" ; then - setenv l_envfile 'armbianEnv.txt' -else - setenv l_envfile "${envfile}" +if load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt; then + env import -t ${load_addr} ${filesize} fi -echo "Boot script loaded from ${devtype} ${devnum}:${distro_bootpart}." +setenv bootargs "console=ttyS0,115200 root=${rootdev} rootwait rootfstype=${rootfstype} ubootdev=${devtype} scandelay loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs}" -# load (merge) on-disk environment -setenv l_file "${prefix}${l_envfile}" -if test -e ${devtype} ${devnum}:${distro_bootpart} ${l_file} ; then - if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${l_file} ; then - if env import -t ${load_addr} ${filesize} ; then - setenv l_message "Loaded/imported environment ${l_file} to/from ${load_addr}." - run func_inform - else - setenv l_message "Could not import environment ${l_file} - using default environment!" - run func_warn - fi - else - setenv l_message "Could not load environment ${l_file} - using default environment!" - run func_warn - fi -fi +load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} +load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd +load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}zImage -# compose kernel commandline options (bootargs) -setenv consoleargs -if test "${console}" = "display" || test "${console}" = "both" ; then - setenv consoleargs "console=tty1" -fi -if test "${console}" = "serial" || test "${console}" = "both" ; then - setenv consoleargs "console=ttyS0,115200 ${consoleargs}" -fi -if test "${earlycon}" = "on" ; then - setenv consoleargs "earlycon ${consoleargs}" -fi -if test "${bootlogo}" = "true" ; then - setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" -else - setenv consoleargs "splash=verbose ${consoleargs}" -fi - -part uuid ${devtype} ${devnum}:${distro_bootpart} l_ubootpart - -setenv bootargs "root=${rootdev} rootfstype=${rootfstype} rootwait ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${l_ubootpart} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" - -if test "${docker_optimizations}" = "on" ; then - setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory" -fi - -if test "${vendor}" = "allwinner" ; then - 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" +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 + echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" + fdt apply ${load_addr} || setenv overlay_error "true" fi -fi -if test "${vendor}" = "marvell" ; then - # nothing here yet -fi -if test "${vendor}" = "rockchip" ; then - # nothing here yet -fi - -# check if we are requested (or are able to) use load address calculation -if test "${load_addr_calc}" = "" ; then - if setexpr load_addr_calc 1 + 1 ; then - setenv load_addr_calc 'on' - else - setenv load_addr_calc 'off' - fi -fi -if test "${load_addr_calc}" != "on" ; then - setenv load_addr_calc 'off' - - setenv l_message "Using fixed load addresses." - run func_inform - setenv l_message " fdt_addr_r: ${fdt_addr_r}" - run func_inform - setenv l_message " kernel_addr_r: ${kernel_addr_r}" - run func_inform - setenv l_message " ramdisk_addr_r: ${ramdisk_addr_r}" - run func_inform -fi - -if test "${kver}" != "" ; then - setenv l_message "Using version override ${kver} for image loading." - run func_inform -fi - -# set a default kernel image type in case 'setexpr' not available -if test "${cpu}" = "armv8" ; then - # aarch64 uses a flat kernel image - setenv l_kernel_image_type "flat" - setenv l_bootfile "Image${kver}" -else - if test "${cpu}" = "armv7" ; then - # aarch32 mostly uses compressed kernel image - setenv l_kernel_image_type "compressed" - setenv l_bootfile "zImage${kver}" - else - # per default use compressed kernel image - setenv l_kernel_image_type "compressed" - setenv l_bootfile "zImage${kver}" - fi -fi - -setenv l_ramdiskfile "uInitrd${kver}" - -# $fdtdir: -# some boards use "${prefix}dtb/" others use "${prefix}dtb/${vendor}/" as base location for the DT files -# user can also override by specifying an fdtdir=... in armbianEnv.txt -# try any U-Boot built-in (or pre-set) fdtdir as last resort -# $fdtfile: -# some boards use a "filename.dts" others use "${vendor}/filename.dts" -# user can also override by specifying an fdtfile=... in armbianEnv.txt -# strip any leading path components and try any U-Boot built-in (or pre-set) fdtfile as last resort - -setenv l_fdtfile_basename -setexpr l_fdtfile_basename sub ".*/" "" "${fdtfile}" -if test "${l_fdtfile_basename}" = "" ; then - setenv l_fdtfile_basename "${fdtfile}" -fi - -setenv l_fdtdir "${fdtdir}" -setenv l_fdtfile "${l_fdtfile_basename}" -if test -e ${devtype} ${devnum}:${distro_bootpart} "${l_fdtdir}/${l_fdtfile}" ; then - true -else - setenv l_fdtdir "${prefix}dtb${kver}/${vendor}" - setenv l_fdtfile "${l_fdtfile_basename}" - if test -e ${devtype} ${devnum}:${distro_bootpart} "${l_fdtdir}/${l_fdtfile}" ; then - true - else - setenv l_fdtdir "${prefix}dtb${kver}" - setenv l_fdtfile "${l_fdtfile_basename}" - if test -e ${devtype} ${devnum}:${distro_bootpart} "${l_fdtdir}/${l_fdtfile}" ; then - true - else - setenv l_fdtdir "${fdtdir}" - setenv l_fdtfile "${fdtfile}" - if test -e ${devtype} ${devnum}:${distro_bootpart} "${l_fdtdir}/${l_fdtfile}" ; then - true - else - setenv l_fdtdir "${preset_fdtdir}" - setenv l_fdtfile "${preset_fdtfile}" - if test -e ${devtype} ${devnum}:${distro_bootpart} "${l_fdtdir}/${l_fdtfile}" ; then - true - else - false - fi - fi - fi - fi -fi -if itest $? -ne 0 ; then - setenv l_message "Cannot find DT!" - run func_critical_error || exit -fi - -# load the device tree blob -setenv l_file "${l_fdtdir}/${l_fdtfile}" -if load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${l_file} ; then - setenv l_message "Loaded DT ${l_file} to ${fdt_addr_r}." - run func_inform - - setenv l_fdt_filesize ${filesize} - fdt addr ${fdt_addr_r} - fdt resize ${fdt_extrasize} -else - setenv l_message "Could not load DT ${l_file}!" - run func_critical_error || exit -fi - -# process "overlays=..." from $l_envfile -if test "${overlays}" != "" ; then - setenv l_message "Loading kernel provided DT overlay(s) from ${l_fdtdir}/overlay to ${load_addr} .." - run func_inform - - # as some families offer overlays with different (or no) prefixes, try to guess the most commonly seen ones - # just changing overlay_prefix= will not work for all available overlays, as some have prefixes and some do not - - setenv each_overlay - for each_overlay in ${overlays} ; do - setenv l_overlay_prefix "${overlay_prefix}" - setenv l_file "${l_fdtdir}/overlay/${l_overlay_prefix}-${each_overlay}.dtbo" - if test -e ${devtype} ${devnum}:${distro_bootpart} ${l_file} ; then - true - else - setenv l_overlay_prefix "${vendor}" - setenv l_file "${l_fdtdir}/overlay/${l_overlay_prefix}-${each_overlay}.dtbo" - if test -e ${devtype} ${devnum}:${distro_bootpart} ${l_file} ; then - setenv l_message "Found DT overlay ${l_overlay_prefix}-${each_overlay} instead of ${overlay_prefix}-${each_overlay} in ${l_fdtdir}/overlay!" - run func_warn - setenv l_message "Consider setting overlay_prefix=${l_overlay_prefix} in your ${l_envfile}." - run func_inform - true - else - setenv l_overlay_prefix "${vendor}-${soc}" - setenv l_file "${l_fdtdir}/overlay/${l_overlay_prefix}-${each_overlay}.dtbo" - if test -e ${devtype} ${devnum}:${distro_bootpart} ${l_file} ; then - setenv l_message "Found DT overlay ${l_overlay_prefix}-${each_overlay} instead of ${overlay_prefix}-${each_overlay} in ${l_fdtdir}/overlay!" - run func_warn - setenv l_message "Consider setting overlay_prefix=${l_overlay_prefix} in your ${l_envfile}." - run func_inform - true - else - false - fi - fi - fi - if itest $? -eq 0 ; then - if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${l_file} ; then - if fdt apply ${load_addr} ; then - setenv l_message "Applied DT overlay ${each_overlay} (${l_file})." - run func_inform - else - setenv overlay_error "true" - setenv l_message "Could NOT apply DT overlay ${each_overlay} (${l_file})!" - run func_warn - fi - else - setenv l_message "Could NOT load DT overlay ${each_overlay} (${l_file})!" - run func_warn - fi - else - setenv l_message "Could NOT find DT overlay ${each_overlay}!" - run func_warn - fi - done -fi - -# process "user_overlays=..." from $l_envfile -if test "${user_overlays}" != "" ; then - setenv l_message "Loading user provided DT overlay(s) from ${prefix}overlay-user to ${load_addr} .." - run func_inform - - setenv each_user_overlay - for each_user_overlay in ${user_overlays} ; do - setenv l_file "${prefix}overlay-user/${each_user_overlay}.dtbo" - if test -e ${devtype} ${devnum}:${distro_bootpart} ${l_file} ; then - if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${l_file} ; then - if fdt apply ${load_addr} ; then - setenv l_message "Applied user DT overlay ${each_user_overlay} (${l_file})." - run func_inform - else - setenv overlay_error "true" - setenv l_message "Could NOT apply user DT overlay ${each_user_overlay} (${l_file})!" - run func_warn - fi - else - setenv l_message "Could NOT load user DT overlay ${each_user_overlay} (${l_file})!" - run func_warn - fi - else - setenv l_message "Could NOT find user DT overlay ${each_user_overlay} (${l_file})!" - run func_warn - fi - done -fi -if test "${overlay_error}" = "true" ; then - setenv l_message "Could not apply DT overlays!" - run func_warn - - setenv l_file "${l_fdtdir}/${l_fdtfile}" - if load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${l_file} ; then - setenv l_message "Loaded original DT ${l_file} to ${fdt_addr_r}." - run func_inform - - setenv l_fdt_filesize ${filesize} - fdt addr ${fdt_addr_r} - fdt resize ${fdt_extrasize} - else - setenv l_message "Could not load original DT ${l_file}!" - run func_critical_error || exit +done +for overlay_file in ${user_overlays}; do + if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then + echo "Applying user provided DT overlay ${overlay_file}.dtbo" + fdt apply ${load_addr} || setenv overlay_error "true" fi +done +if test "${overlay_error}" = "true"; then + echo "Error applying DT overlays, restoring original DT" + load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else - # process any available DT fixup scripts - setenv l_fixup_scripts "${prefix}fixup.scr" - if test "${overlay_prefix}" != "" ; then - setenv l_fixup_scripts "${l_fdtdir}/overlay/${overlay_prefix}-fixup.scr ${l_fixup_scripts}" + if test -e ${devtype} ${devnum} ${prefix}dtb/overlay/${overlay_prefix}-fixup.scr; then + load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/overlay/${overlay_prefix}-fixup.scr + echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" + source ${load_addr} fi - if test "${vendor}" != "" ; then - if test "${vendor}" != "${overlay_prefix}" ; then - setenv l_fixup_scripts "${l_fdtdir}/overlay/${vendor}-fixup.scr ${l_fixup_scripts}" - fi + if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then + load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr + echo "Applying user provided fixup script (fixup.scr)" + source ${load_addr} fi - - setenv each_fixup_script - for each_fixup_script in ${l_fixup_scripts} ; do - if test -e ${devtype} ${devnum}:${distro_bootpart} ${each_fixup_script} ; then - if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${each_fixup_script} ; then - if source ${load_addr} ; then - setenv l_message "Loaded/sourced fixup script ${each_fixup_script} to/at ${load_addr}." - run func_inform - else - setenv l_message "Fixup script ${each_fixup_script} returned an error!" - run func_warn - fi - else - setenv l_message "Could not load fixup script ${each_fixup_script}!" - run func_warn - fi - fi - done fi # eMMC fix if test "${emmc_fix}" = "on"; then - echo "Applying eMMC compatibility fix to the DT." + echo "Applying eMMC compatibility fix to the DT" fdt rm /soc/internal-regs/sdhci@d8000/ cd-gpios fdt set /soc/internal-regs/sdhci@d8000/ non-removable fi # SPI - SATA workaround if test "${spi_workaround}" = "on"; then - echo "Applying SPI workaround to the DT." + echo "Applying SPI workaround to the DT" + fdt addr ${fdt_addr} + fdt resize fdt set /soc/internal-regs/sata@e0000 status "disabled" fdt set /soc/internal-regs/sata@a8000 status "disabled" fdt set /soc/spi@10680 status "okay" - fdt set /soc/spi@10680/flash@0 status "okay" -fi - -# resize (trim) device tree after all overlays have been applied and fixup scripts have been run -fdt resize - -# determine the load address for the kernel image -if test "${load_addr_calc}" = "on" ; then - # get the total size of the DT - setenv l_fdt_totalsize - fdt header get l_fdt_totalsize totalsize - - if test "${l_fdt_totalsize}" = "" ; then - # could not get the total size of the DT so calculate it instead - setenv l_message "Calculating DT size." - run func_inform - - # 'fdt resize' will align upwards to 4k address boundary - setexpr l_fdt_totalsize ${l_fdt_filesize} / 0x1000 - setexpr l_fdt_totalsize ${l_fdt_totalsize} + 1 - setexpr l_fdt_totalsize ${l_fdt_totalsize} * 0x1000 - if test "${fdt_extrasize}" != "" ; then - setexpr l_fdt_totalsize ${l_fdt_totalsize} + ${fdt_extrasize} - fi - fi - - setexpr l_addr_next ${fdt_addr_r} + ${l_fdt_totalsize} - run func_align_addr_next - - setenv l_kernel_addr_r ${l_addr_next} -else - setenv l_kernel_addr_r ${kernel_addr_r} -fi - -setenv l_file "${prefix}${l_bootfile}" -if load ${devtype} ${devnum}:${distro_bootpart} ${l_kernel_addr_r} ${l_file} ; then - if test "${load_addr_calc}" = "on" ; then - setenv kernel_comp_size ${filesize} - fi - - setenv l_message "Loaded ${l_kernel_image_type} kernel image ${l_file} to ${l_kernel_addr_r}." - run func_inform -else - if test "${load_addr_calc}" = "on" ; then - setenv kernel_comp_addr_r "${preset_kernel_comp_addr_r}" - setenv kernel_comp_size "${preset_kernel_comp_size}" - fi - setenv l_message "Could not load ${l_kernel_image_type} kernel image ${l_file}!" - run func_critical_error || exit -fi - -# determine the load address for the initial ramdisk -if test "${load_addr_calc}" = "on" ; then - # vmlinux image + 0x38 contain magic (le-double) 'ARMd' - setexpr l_ptr ${l_kernel_addr_r} + 0x00000038 - setexpr.w l_magic_lsw *${l_ptr} - - setexpr l_ptr ${l_kernel_addr_r} + 0x0000003a - setexpr.w l_magic_msw *${l_ptr} - - if test "${l_magic_msw}${l_magic_lsw}" != "" && itest "${l_magic_msw}${l_magic_lsw}" -eq 0x644d5241 ; then - setenv l_kernel_image_type "flat" - else - setenv l_kernel_image_type "compressed" - fi - - if test "${l_kernel_image_type}" = "flat" ; then - # vmlinux image + 0x10 contains image_size - setexpr l_ptr ${l_kernel_addr_r} + 0x00000010 - setexpr.l l_image_size *${l_ptr} - - setenv l_message "Using ${l_kernel_image_type} kernel image image_size 0x${l_image_size} bytes to calculate initial ramdisk load address." - run func_inform - - # vmlinux image + 0x08 contains text_offset - setexpr l_ptr ${l_kernel_addr_r} + 0x00000008 - setexpr.l l_text_offset *${l_ptr} - - setenv l_message "Using ${l_kernel_image_type} kernel image text_offset 0x${l_text_offset} bytes to offset initial ramdisk load address." - run func_inform - - setexpr l_addr_next ${l_kernel_addr_r} + ${l_image_size} - run func_align_addr_next - - # take into account that U-Boot's booti_setup() might relocate the kernel image - setexpr l_addr_next ${l_addr_next} + ${l_text_offset} - else - setexpr l_addr_next ${l_kernel_addr_r} + ${filesize} - run func_align_addr_next - - setenv l_message "Using ${l_kernel_image_type} kernel image filesize 0x${filesize} bytes to calculate initial ramdisk load address." - run func_inform - fi - - setenv l_ramdisk_addr_r ${l_addr_next} -else - setenv l_ramdisk_addr_r ${ramdisk_addr_r} -fi - -setenv l_file "${prefix}${l_ramdiskfile}" -if load ${devtype} ${devnum}:${distro_bootpart} ${l_ramdisk_addr_r} ${l_file} ; then - if test "${load_addr_calc}" = "on" ; then - setexpr l_addr_next ${l_ramdisk_addr_r} + ${filesize} - run func_align_addr_next - - setenv kernel_comp_addr_r ${l_addr_next} - fi - - setenv l_message "Loaded initial ramdisk ${l_file} to ${l_ramdisk_addr_r}." - run func_inform -else - if test "${load_addr_calc}" = "on" ; then - setenv kernel_comp_addr_r "${preset_kernel_comp_addr_r}" - setenv kernel_comp_size "${preset_kernel_comp_size}" - fi - setenv l_message "Could not load initial ramdisk ${l_file}!" - run func_critical_error || exit -fi - -# attempt to prepare for kernel address space randomization -if kaslrseed ; then -else - setenv l_message "Not able to prepare for KASLR." - run func_inform -fi - -setenv l_message "Kernel commandline arguments:" -run func_inform - -setenv each_bootarg -for each_bootarg in ${bootargs} ; do - setenv l_message " ${each_bootarg}" - run func_inform -done - -if test "${l_kernel_image_type}" = "flat" ; then - booti ${l_kernel_addr_r} ${l_ramdisk_addr_r} ${fdt_addr_r} -else - if test "${l_kernel_image_type}" = "compressed" ; then - bootz ${l_kernel_addr_r} ${l_ramdisk_addr_r} ${fdt_addr_r} - else - # default booting command - bootz ${l_kernel_addr_r} ${l_ramdisk_addr_r} ${fdt_addr_r} - fi -fi - -# booting failed, restore environment variables that are not unique -# to this bootmeth -if test "${load_addr_calc}" = "on" ; then - # restore original presets - setenv kernel_comp_addr_r "${preset_kernel_comp_addr_r}" - setenv kernel_comp_size "${preset_kernel_comp_size}" + fdt set /soc/spi@10680/spi-flash@0 status "okay" fi -setenv l_message "Could not boot kernel!" -run func_critical_error || exit +bootz ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr diff --git a/config/kernel/linux-mvebu64-current.config b/config/kernel/linux-mvebu64-current.config index 3d457be03b1c..d069f13b601d 100644 --- a/config/kernel/linux-mvebu64-current.config +++ b/config/kernel/linux-mvebu64-current.config @@ -1,4 +1,4 @@ -# Armbian defconfig generated with 6.12 +# Armbian defconfig generated with 6.6 # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="y" CONFIG_SYSVIPC=y @@ -68,9 +68,9 @@ CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y CONFIG_CPUFREQ_DT=y +CONFIG_ACPI_CPPC_CPUFREQ=y CONFIG_ARM_ARMADA_37XX_CPUFREQ=y CONFIG_ARM_ARMADA_8K_CPUFREQ=y -CONFIG_ACPI_CPPC_CPUFREQ=y CONFIG_ACPI=y CONFIG_ACPI_AC=m CONFIG_VIRTUALIZATION=y @@ -84,7 +84,6 @@ CONFIG_BLK_DEV_THROTTLING=y # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set CONFIG_BINFMT_MISC=m CONFIG_ZSWAP=y -CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD=y # CONFIG_COMPAT_BRK is not set CONFIG_KSM=y CONFIG_TRANSPARENT_HUGEPAGE=y @@ -340,8 +339,6 @@ CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_TTL=m CONFIG_IP_NF_RAW=m CONFIG_IP_NF_SECURITY=m -CONFIG_IP_NF_ARPFILTER=m -CONFIG_IP_NF_ARP_MANGLE=m CONFIG_NFT_DUP_IPV6=m CONFIG_NFT_FIB_IPV6=m CONFIG_IP6_NF_IPTABLES=m @@ -490,6 +487,7 @@ CONFIG_NET_ACT_POLICE=m CONFIG_NET_ACT_GACT=m CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=m +CONFIG_NET_ACT_IPT=m CONFIG_NET_ACT_NAT=m CONFIG_NET_ACT_PEDIT=m CONFIG_NET_ACT_SIMP=m @@ -614,12 +612,6 @@ CONFIG_MTD_SPI_NOR=y CONFIG_MTD_UBI=y CONFIG_BLK_DEV_NULL_BLK=m CONFIG_ZRAM=m -CONFIG_ZRAM_BACKEND_LZ4=y -CONFIG_ZRAM_BACKEND_LZ4HC=y -CONFIG_ZRAM_BACKEND_ZSTD=y -CONFIG_ZRAM_BACKEND_DEFLATE=y -CONFIG_ZRAM_BACKEND_842=y -CONFIG_ZRAM_BACKEND_LZO=y CONFIG_ZRAM_WRITEBACK=y CONFIG_ZRAM_MEMORY_TRACKING=y CONFIG_BLK_DEV_LOOP=y @@ -722,7 +714,6 @@ CONFIG_AMT=m CONFIG_TUN=y CONFIG_VETH=y CONFIG_VIRTIO_NET=y -CONFIG_NETKIT=y CONFIG_NET_VRF=m CONFIG_MHI_NET=m CONFIG_NET_DSA_LOOP=m @@ -1648,6 +1639,7 @@ CONFIG_ADT7316_I2C=m CONFIG_AD9832=m CONFIG_AD9834=m CONFIG_AD5933=m +CONFIG_AD2S1210=m CONFIG_SURFACE_3_POWER_OPREGION=m CONFIG_SURFACE_GPE=m CONFIG_SURFACE_HOTPLUG=m @@ -1945,7 +1937,6 @@ CONFIG_SRF08=m CONFIG_VCNL3020=m CONFIG_AD2S90=m CONFIG_AD2S1200=m -CONFIG_AD2S1210=m CONFIG_IQS620AT_TEMP=m CONFIG_MAXIM_THERMOCOUPLE=m CONFIG_HID_SENSOR_TEMP=m diff --git a/config/sources/families/mvebu64.conf b/config/sources/families/mvebu64.conf index 03fac3797c79..59caf15c50dd 100644 --- a/config/sources/families/mvebu64.conf +++ b/config/sources/families/mvebu64.conf @@ -1,3 +1,4 @@ +#!/bin/bash # # SPDX-License-Identifier: GPL-2.0 # @@ -5,161 +6,101 @@ # # This file is a part of the Armbian Build Framework # https://github.com/armbian/build/ -# -enable_extension "marvell-tools" - -# The C++ compiler is no longer included by default in the Armbian build system (but required for mox related stuff) -# Enable the extension that brings includes it. It could've been an inline extension (eg: the function right here), -# but having a core extension allows it to be pre-included in the Dockerfile generation and thus in the Docker images. -enable_extension "c-plus-plus-compiler" - -# The BLx stuff requires 32-bit compiler, add it using an inline hook. -# This is only used for non-Docker, since the Docker image already has it, since it includes compilers for all architectures. -function add_host_dependencies__mvebu64_add_32_bit_c_compiler() { - display_alert "Adding armhf C compiler to host dependencies" "for mvebu64 BLx compile" "debug" - declare -g EXTRA_BUILD_DEPS="${EXTRA_BUILD_DEPS} gcc-arm-linux-gnueabi" # @TODO: convert to array later -} ARCH=arm64 -BOOTBRANCH='tag:v2025.10' -BOOTPATCHDIR='v2025.10' -BOOTENV_FILE='mvebu64.txt' -BOOTSCRIPT_OUTPUT='boot.scr' -OVERLAY_DIR="/boot/dtb/marvell/overlay" -ATFSOURCE='https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git' -ATFDIR='arm-trusted-firmware-espressobin' -ATFBRANCH='tag:lts-v2.12.8' -ATF_USE_GCC='> 7.2' - -if [[ "${SKIP_EXTERNAL_TOOLCHAINS}" == "yes" ]]; then - ATF_COMPILER='aarch64-linux-gnu-' -else - ATF_COMPILER='aarch64-none-linux-gnu-' -fi - -if [[ $BOARD = macchiatobin-doubleshot ]]; then - export SCP_BL2=$SRC/cache/sources/marvell-binaries/mrvl_scp_bl2.img # ATTENTION! This is actually a required 'export', since it's picked up by ATF's make. - - ATF_TARGET_MAP="USE_COHERENT_MEM=0 LOG_LEVEL=20 MV_DDR_PATH=$SRC/cache/sources/marvell-ddr SECURE=0 PLAT=a80x0_mcbin;;build/a80x0_mcbin/release/bl31.bin" - UBOOT_TARGET_MAP="DEVICE_TREE=armada-8040-mcbin ;;flash-image.bin" - - BOOTSCRIPT="boot-macchiatobin-doubleshot.cmd:boot.cmd" - SERIALCON='ttyS0' -else - ATF_TARGET_MAP="USE_COHERENT_MEM=0 LOG_LEVEL=20 SECURE=0 CLOCKSPRESET=CPU_800_DDR_800 DDR_TOPOLOGY=2 BOOTDEV=SPINOR PARTNUM=0 PLAT=a3700;;build/a3700/release/bl31.bin" - UBOOT_TARGET_MAP="DEVICE_TREE=armada-3720-espressobin ;;flash-image-*.bin" - - BOOTSCRIPT="boot-espressobin.cmd:boot.cmd" - SERIALCON='ttyMV0' -fi +BOOTDELAY=1 +BOOTPATCHDIR="u-boot-mvebu64" +KERNEL_IMAGE_TYPE=Image + +# Use mainline ATF +ATFSOURCE='https://github.com/ARM-software/arm-trusted-firmware' +ATFDIR='arm-trusted-firmware-mvebu' +ATFBRANCH='tag:v2.10' +ATF_COMPILER='aarch64-linux-gnu-' +ATF_USE_GCC='> 8.0' +ATFPLAT="a3700" case $BRANCH in - legacy) - declare -g KERNEL_MAJOR_MINOR="6.6" # Major and minor versions of this kernel. - declare -g KERNELBRANCH='branch:linux-6.6.y' - ;; - current) - declare -g KERNEL_MAJOR_MINOR="6.12" # Major and minor versions of this kernel. - declare -g KERNELBRANCH='branch:linux-6.12.y' - ;; + KERNEL_MAJOR_MINOR="6.6" + KERNELPATCHDIR='mvebu64-current' + LINUXFAMILY=mvebu64 + LINUXCONFIG='linux-mvebu64-current' + ;; + edge) - declare -g KERNEL_MAJOR_MINOR="6.18" # Major and minor versions of this kernel. - ;; + KERNEL_MAJOR_MINOR="6.12" + KERNELPATCHDIR='mvebu64-edge' + LINUXFAMILY=mvebu64 + LINUXCONFIG='linux-mvebu64-edge' + ;; esac -CPUMIN=200000 -CPUMAX=1300000 +# Board-specific settings +CPUMIN=300000 +CPUMAX=1400000 GOVERNOR=ondemand -write_uboot_platform() { - if [[ $BOARD = macchiatobin-doubleshot ]]; then - dd if=$1/flash-image.bin of=$2 bs=512 seek=1 status=noxfer > /dev/null 2>&1 - else - # flashing process via u-boot only for now https://www.armbian.com/espressobin/ - /bin/true - fi -} +# Boot script +BOOTSCRIPT="boot-mvebu.cmd:boot.cmd" +BOOTENV_FILE="mvebu.txt" + +# U-Boot settings +BOOTSOURCE='https://github.com/u-boot/u-boot' +BOOTDIR='u-boot-mvebu' +BOOTBRANCH='tag:v2024.01' + +# Empty UBOOT_TARGET_MAP - let Armbian use defaults +UBOOT_TARGET_MAP="" +BOOTDELAY=3 +BOOTPATCHDIR="u-boot-mvebu64" + +UBOOT_USE_GCC='> 8.0' +UBOOT_COMPILER='aarch64-linux-gnu-' + +# Serialcon +SERIALCON="ttyS0:115200n8" + +# Modules to load +MODULES="ahci mvneta mvpp2 sata_mv" +MODULES_CURRENT="ahci mvneta mvpp2 sata_mv" + +# Family specific tweaks family_tweaks() { - if [[ $BOARD = "espressobin" ]]; then - echo "#Marvell Espressobin Console" >> $SDCARD/etc/securetty - echo "ttyMV0" >> $SDCARD/etc/securetty - fi + : } +# Family specific tweaks for BSP family_tweaks_bsp() { - if [[ $BOARD = "espressobin" ]]; then - cp "$SRC/packages/bsp/mvebu64/initramfs/99-uboot-fit" "$destination/etc/initramfs/post-update.d/" - fi + : } -atf_custom_postprocess() { - # prepare compilers for postprocess - ubootdir="$SRC/cache/sources/u-boot-worktree/$BOOTDIR/${BOOTBRANCH##*:}" - declare -g ATF1=$toolchain/$ATF_COMPILER - if [[ "${SKIP_EXTERNAL_TOOLCHAINS}" == "yes" ]]; then - declare -g TOOLCHAIN_NAME="arm-linux-gnueabi-" +# Write U-Boot to image +write_uboot_platform() { + # For mvebu64 boards, U-Boot is typically written to a specific offset + # MOCHAbin uses similar boot process to ESPRESSObin + + # Check if we have u-boot files + if [[ -f $1/u-boot.bin ]]; then + display_alert "Installing U-Boot to image" "u-boot.bin" "info" + # Write u-boot to the image at offset 0 + # For Armada 3700/7040, the bootloader goes at the beginning + dd if=$1/u-boot.bin of=$2 bs=512 seek=1 conv=notrunc status=none >/dev/null 2>&1 || true + elif [[ -f $1/u-boot-spl.kwb ]]; then + display_alert "Installing U-Boot SPL to image" "u-boot-spl.kwb" "info" + dd if=$1/u-boot-spl.kwb of=$2 bs=512 seek=1 conv=notrunc status=none >/dev/null 2>&1 || true else - declare -g TOOLCHAIN_NAME="arm-none-linux-gnueabihf-" + display_alert "No U-Boot files found" "skipping bootloader installation" "wrn" + # This is OK - we can use existing bootloader on the board + return 0 fi - declare -g ATF2=$(find_toolchain "$TOOLCHAIN_NAME" "> 10.0")/$TOOLCHAIN_NAME - declare -g BL33=$ubootdir"/u-boot.bin" } -uboot_custom_postprocess() { - # clean previous - run_host_command_logged rm -f "$ubootdir"/flash-image* - local atfdir="$SRC/cache/sources/$ATFDIR/${ATFBRANCH##*:}" - local ubootdir="$SRC/cache/sources/u-boot-worktree/$BOOTDIR/${BOOTBRANCH##*:}" - local moxbootdir="$SRC/cache/sources/mox-boot" - cd $atfdir - - if [[ $BOARD = macchiatobin-doubleshot ]]; then - run_host_command_logged make distclean - - FILENAME="flash-image.bin" - display_alert "Building $FILENAME" "" "info" - # http://wiki.macchiatobin.net/tiki-index.php?page=Build+from+source+-+Bootloader#Building_ATF - run_host_command_logged make distclean - run_host_command_logged "CFLAGS=-fdiagnostics-color=always" pipetty make USE_COHERENT_MEM=0 LOG_LEVEL=20 MV_DDR_PATH=$SRC/cache/sources/marvell-ddr PLAT=a80x0_mcbin CROSS_COMPILE=$ATF1 BL33=$BL33 mrvl_flash $CTHREADS - run_host_command_logged cp -pv build/a80x0_mcbin/release/flash-image.bin $ubootdir/$FILENAME - else - cd $moxbootdir - [[ -f Makefile ]] && sed -i "s/aarch64-unknown-linux-gnu-/aarch64-linux-gnu-/" Makefile - [[ -f wtmi/a53_helper/Makefile ]] && sed -i "s/aarch64-unknown-linux-gnu-/aarch64-linux-gnu-/" wtmi/a53_helper/Makefile - make clean # @TODO: rpardini: why? - run_host_command_logged "CFLAGS=-fdiagnostics-color=always" pipetty make CROSS_CM3=$ATF2 wtmi_app.bin - cd $atfdir - - clocks=(600_600 800_800 1000_800 1200_750) - topology=(512m_1cs_0 1g_2cs_2 1g_1cs_4 2g_2cs_7 1g_1cs_5 2g_2cs_6) - for i in "${clocks[@]}"; do - for j in "${topology[@]}"; do - if [[ $j = *cs_5 || $j = *cs_6 ]]; then local ddrname="DDR4"; else ddrname="DDR3"; fi - FILENAME="flash-image-$ddrname-$j-$i.bin" - DDR_TOPOLOGY="${j##*_}" - CLOCKSPRESET="CPU_${i%_*}_DDR_${i##*_}" - display_alert "Building $FILENAME" "mvebu64" "info" - run_host_command_logged make distclean - run_host_command_logged "CFLAGS=-fdiagnostics-color=always" pipetty make CROSS_COMPILE=$ATF1 \ - CROSS_CM3=$ATF2 \ - USE_COHERENT_MEM=0 \ - PLAT=a3700 \ - CLOCKSPRESET=$CLOCKSPRESET DDR_TOPOLOGY=$DDR_TOPOLOGY \ - MV_DDR_PATH=$SRC/cache/sources/marvell-ddr \ - WTP=$SRC/cache/sources/marvell-tools \ - CRYPTOPP_PATH=$SRC/cache/sources/cryptopp \ - BL33=$BL33 \ - WTMI_IMG=$moxbootdir/wtmi_app.bin \ - BOOTDEV=SPINOR PARTNUM=0 \ - LOG_LEVEL=20 all fip mrvl_flash $CTHREADS - run_host_command_logged cp -pv build/a3700/release/flash-image.bin $ubootdir/$FILENAME - done - done - fi - - cd $ubootdir +# Setup for writing u-boot +setup_write_uboot_platform() { + # Nothing special needed for mvebu64 + : }