Load BOOTAA64.efi from a different fat partition

Hi, in 34.1.1 jetson_uefi.bin could load BOOTAA64.efi from other partitions than esp but this doesn’t seem to work anymore in 35.1.0.

I’m currently storing BOOTAA64.efi in
resin-boot/EFI/BOOT/BOOTAA64.efi to avoid having a different esp partition solely for the L4T launcher. The partition table looks like this:


Number  Start     End         Size        File system  Name          Flags
 1      40s       262183s     262144s                  A_kernel      msftdata
 2      262184s   262951s     768s                     A_kernel-dtb  msftdata
 3      262952s   525095s     262144s                  B_kernel      msftdata
 4      525096s   525863s     768s                     B_kernel-dtb  msftdata
 5      525864s   2491943s    1966080s    fat16        resin-boot    msftdata
 6      2491944s  5416487s    2924544s    ext4         resin-rootA   msftdata
 7      5416488s  8341031s    2924544s    ext4         resin-rootB   msftdata
 8      8341032s  8381991s    40960s      ext4         resin-state   msftdata
 9      8381992s  124321758s  115939767s  ext4         resin-data    msftdata

Where I need to edit some code to have BOOTAA64.efi loaded from resin-boot/EFI/BOOT/ by default?

I should mention that I can boot the L4TLauncher if I select it in the Boot Manager using the Test Key, but I would like to have it loaded automatically after the device is flashed.

I’m building edk2-nividia from sources using the nvidia toolchain and recommended build steps, and in the logs I see that the efi firmware proceeds to loading the kernel from it’s partition without attempting the L4T launcher:

PROGRESS CODE: V02010000 I0
PROGRESS CODE: V02010004 I0
PROGRESS CODE: V02010004 I0
PROGRESS CODE: V02010004 I0
DeviceDiscoveryBindingStart, driver returned Unsupported to start notification
DeviceDiscoveryBindingStart, driver returned Unsupported to start notification
PROGRESS CODE: V02020000 I0
RefreshAutoEnumeratedBootOptions: Using DTB Kernel Command Line
RefreshAutoEnumeratedBootOptions: Cmdline: 
console=ttyTCU0,115200 RefreshAutoEnumeratedBootOptions: Using DTB Kernel Command Line
RefreshAutoEnumeratedBootOptions: Cmdline: 
console=ttyTCU0,115200 PROGRESS CODE: V02020000 I0
Found 640x480
Found 1280x720
Found 1920x1080
**********************************
**  WARNING: Test Key is used.  **
**********************************
**  WARNING: Test Key is used.  **
PROGRESS CODE: V03051007 I0
InstallFdt: Installing Kernel DTB
Processing "L4T Configuration Settings" DTB overlay
Deleting fragment fragment@0
Processing "Add PCIe C5 dual mode support" DTB overlay
Deleting fragment fragment@1
Processing "Jetson Concord (40Pin RT5658)" DTB overlay
Deleting fragment fragment@0
Deleting fragment fragment@1
Deleting fragment fragment@2
Deleting fragment fragment@3
Deleting fragment fragment@4
Deleting fragment fragment@5
Deleting fragment fragment@6
Deleting fragment fragment@7
Deleting fragment fragment@8
Deleting fragment fragment@9
Deleting fragment fragment@12
Deleting fragment fragment@13
Deleting fragment fragment@14
Deleting fragment fragment@15
Processing "Add P3737 A03 Overlay Support" DTB overlay
Deleting fragment fragment@0
Processing "Add P3737 A04 Overlay Support" DTB overlay
Processing "L4T Rootfs Information" DTB overlay
Deleting fragment fragment@0
Processing "Jetson Camera Dual-IMX274" DTB overlay
...
[Bds]Booting UEFI NVIDIA eMMC L4T Boot 2 <-----------------------------
PROGRESS CODE: V03058000 I0
Loading driver at 0x007F9930000 EntryPoint=0x007FB0C9F44
Loading driver at 0x007F9930000 EntryPoint=0x007FB0C9F44 
PROGRESS CODE: V03058001 I0
EFI stub: Booting Linux Kernel...
EFI stub: Using DTB from configuration table
EFI stub: Exiting boot services and installing virtual address map...
ConfigureOutputGpios: could not find compatible GPIO node in DT: not on SLT board?
PROGRESS CODE: V03101019 I0

and when use Boot Maintainance Manager I see the following log from Bds:

Deleting fragment fragment@27
UpdateRamOopsMemory: RamOopsBase: 0x82C200000, RamOopsSize: 0x200000
PROGRESS CODE: V03051001 I0
[Bds]Booting BOOTAA64.efi
PROGRESS CODE: V03058000 I0
add-symbol-file /home/acotsach/Downloads/simplehttp/edk2/nvidia-uefi/Build/Jetson/DEBUG_GCC5/AARCH64/Silicon/NVIDIA/Application/L4TLauncher/L4TLauncher/DEBUG/L4TLauncher.dll 0x822880000
Loading driver at 0x0082287F000 EntryPoint=0x00822889410 L4TLauncher.efi
PROGRESS CODE: V03058001 I0

So I suspect that loading L4TLauncher by default is somehow configurable but I don’t know how to enforce this.

Thank you

One option I found seems to be to avoid writing the kernel and dtb altogether to kernel and kernel-dtb partitions, but maybe there’s a better way.

Any suggestion here?

Hi,

What is the purpose to read this from other partition? I don’t think this would be supported.

Hi @WayneWWW, I would like to keep the partition layout as simple as possible and since edk2 can look for the bootaarch64.bin in all supported partitions and not only in esp, I would avoid having one designated partition for a single file.

Are there supposed to be other files in esp/EFI/BOOT/ or in the esp partition generally, other than bootaarch64.bin?

If not, I think I can force loading of the bootloader from another partition in the uefi firmware.

So the L4T launcher can be loaded from any partition as long as the kernel cannot be loaded directly from the A_kernel partition.

My question is: how can I modify the UEFI boot options during flashing to load the L4TLauncher directly (BOOTAA64.efi) instead of loading the kernel and dtb from A_kernel & A_kernel-dtb?