DEV Community

Luca Barbato
Luca Barbato

Posted on • Updated on

Honeycomb-lx2k - Replacing the bootloader

I saw some interesting changes for u-boot landing in the image-builder SolidRun provides and almost coincidentally their customer service replied to my initial inquiry about the booting process.

That lead to some more tries and testing, I had yet to see if there is a linux kernel update that makes rebooting work as should, but at least now I know that the problem is just software.

Since I do not want to wipe the eMMC image all the time I asked them directions on how to just update the bootloader and they provided me with enough directions.

Since it isn't yet trivial to get the sources in the right shape here a short blogpost about it.

Getting the sources

Our point of truth is again the image-builder since it contains the patches and how to apply them.
I'm using Gentoo so I just read the runme.sh and adapt it.
I want to use u-boot, the boot image is of the Trusted Firmware-A kind, so I need to fetch aft to assemble the whole thing and rcw to build the Pre-Boot Loader initialization code.

cd /usr/src
# Get the build script and the patchsets
git clone https://github.com/SolidRun/lx2160a_build
# u-boot as the main bootloader
git clone https://source.codeaurora.org/external/qoriq/qoriq-components/u-boot
# trusted firmware builder
git clone https://source.codeaurora.org/external/qoriq/qoriq-components/atf
# pre-boot initialization compiler
git clone https://source.codeaurora.org/external/qoriq/qoriq-components/rcw

Patches

There are plenty and they apply on specific tags, I'm using LSDK-20.04 as base.
The patches could live in patches/<tool name> or patches/<tool-name>-<tag>.

for a in rcw u-boot; do
    pushd $a
    git checkout -b LSDK-20.04 refs/tags/LSDK-20.04
    git am ../lx2160a_build/patches/$a-LSDK-20.04/*
    popd
done
pushd aft
git checkout -b LSDK-20.04 refs/tags/LSDK-20.04
git am ../lx2160a_build/patches/aft/*
popd

Binary blobs

The script fetches and uses some binary blobs

cd aft/tools/fiptool/
git clone https://github.com/NXP/ddr-phy-binary.git
make
./fiptool create --ddr-immem-udimm-1d ddr-phy-binary/lx2160a/ddr4_pmu_train_imem.bin --ddr-immem-udimm-2d ddr-phy-binary/lx2160a/ddr4_2d_pmu_train_imem.bin --ddr-dmmem-udimm-1d ddr-phy-binary/lx2160a/ddr4_pmu_train_dmem.bin --ddr-dmmem-udimm-2d ddr-phy-binary/lx2160a/ddr4_2d_pmu_train_dmem.bin --ddr-immem-rdimm-1d ddr-phy-binary/lx2160a/ddr4_rdimm_pmu_train_imem.bin --ddr-immem-rdimm-2d ddr-phy-binary/lx2160a/ddr4_rdimm2d_pmu_train_imem.bin --ddr-dmmem-rdimm-1d ddr-phy-binary/lx2160a/ddr4_rdimm_pmu_train_dmem.bin --ddr-dmmem-rdimm-2d ddr-phy-binary/lx2160a/ddr4_rdimm2d_pmu_train_dmem.bin fip_ddr_all.bin

Building

We need to build u-boot and the rcw images first and then put everything together with atf.

u-boot

pushd u-boot
make lx2160acex7_tfa_defconfig
make -j16
export BL33=$PWD/u-boot.bin
popd

Note: if you are using gcc-10, you should apply a patch on top of the set

diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l
index fd825ebba6..24af549977 100644
--- a/scripts/dtc/dtc-lexer.l
+++ b/scripts/dtc/dtc-lexer.l
@@ -38,7 +38,6 @@ LINECOMMENT   "//".*\n
 #include "srcpos.h"
 #include "dtc-parser.tab.h"

-YYLTYPE yylloc;
 extern bool treesource_error;

 /* CAUTION: this will stop working if we ever use yyless() or yyunput() */

rcw

# Set the configuration for your memory timings and the SERDES configuration for your networking
# Options at hand
# DDR_SPEED=2400,2600,2900,3200
export DDR_SPEED=${DDR_SPEED:-3200}
# SERDES=8_5_2, 13_5_2, 20_5_2
export SERDES=${SERDES:-8_5_2}

export SPEED=2000_700_${DDR_SPEED}
pushd rcw/lx2160acex7
mkdir -p RCW
echo "#include <configs/lx2160a_defaults.rcwi>" > RCW/template.rcw
echo "#include <configs/lx2160a_${SPEED}.rcwi>" >> RCW/template.rcw
echo "#include <configs/lx2160a_${SERDES}.rcwi>" >> RCW/template.rcw
make clean
make -j 16
popd

Once those two componets are built we assemble everything in our image

pushd atf
make PLAT=lx2160acex7 clean
make -j16 PLAT=lx2160acex7 all fip pbl RCW=../rcw/lx2160acex7/RCW/template.bin TRUSTED_BOARD_BOOT=0 GENERATE_COT=0 BOOT_MODE=auto SECURE_BOOT=false

In build/lx2160acex7/release/fip.bin we have our final product if everything went well.

Flashing

The process itself is quite simple, you copy with dd the image to an offset of your boot device (either the eMMC /dev/mmcblk1 or the SD /dev/mmcblk0).

Note: just in case you might back up the firmware

dd if=/dev/mmcblk0 of=backup-fip.bin  bs=512 seek=2048 conv=notrunc

And then overwrite it

dd if=build/lx2160acex7/release/fip.bin of=/dev/mmcblk0 bs=512 seek=2048 conv=notrunc

Once you reboot you should look for something like:

U-Boot 2019.10-00019-g16209d0bf6 (Jul 08 2020 - 15:14:33 +0300)

In the early boot messages.

Word of warning

The current u-boot code available as today is fairly new and has two interesting features:

  • u-boot is able to poweroff (linux is not, yet, sadly)
  • u-boot would stop setting the fan at full blast

Make sure your kernel is able to drive the fans correctly otherwise the system will hit the shutdown temperature.

I'm looking forward the time this nice machine could power on and power off correctly.

Coming next

Hopefully I'll complete and publish some more information about rav1e, both its API and its internals.

Top comments (0)