Issue with overlay for Xavier NX

We have custom carrier board for TX2 which works fine and uses approach with plugin manager for DTB overlay. CBoot finds IDS (ID string) in external Eeprom on carrier board and apply necessary nodes accordingly Log in | NVIDIA Developer. For TX2 we use L4T 32.4.4. IDS stored in external Eeprom by address 0x57 and have next record:

No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 00 02 ff ff ff ff ff ff ff ff ff ff ff ff ff ff .?..
10: ff ff ff ff cc 41 42 53 2d 31 30 00 ff ff ff ff …?ABS-10…
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
50: ff ff ff ff ff ff ff ff ff 70 01 ff ff ff ff ff …p?..
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff …
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 22 …"

We need to migrate from TX2 to Xavier NX for current carrier board with Auvidea NX/TX2 Adapter. For Xavier NX we use L4T 35.5.0 and it does not have plugin manager because this L4T uses UEFI instead of. Accordingly documentation from Sensor Software Driver Programming — NVIDIA Jetson Linux Developer Guide 1 documentation this L4T provides another approach for DTB overlay.

I have done next necessary steps:

  1. The file tegra194-p3668-abs10.dtsi has been created and included in general .dts file.
  2. The overlay file tegra194-p3668-abs10-overlay.dts created and the tegra194-p3668-abs10-overlay.dtbo file compiled.
  3. The files tegra194-p3668-abs10-overlay.dtbo and tegra194-p3668-abs10.dtb copied to Linux_for_Tegra/kernel/dtb.
  4. Line for overlay in the p3668.conf file is changed:
    OVERLAY_DTB_FILE="${OVERLAY_DTB_FILE},tegra194-p3668-abs10-overlay.dtbo”;
  5. The file Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-mb1-bct-misc-l4t.cfgis changed, because Eeprom connected to i2c-2 :
    cvb_eeprom_instanse = 2;
  6. Xavier NX is flashed.
  7. After reboot UEFI found external Eeprom on carrier board:
    [0002.272] > DEVICE_PROD: device prod is not initialized.
    [0002.297] > DEVICE_PROD: device prod is not initialized.

[0000.919] I> Welcome to MB2(TBoot-BPMP) (version: default.t194-mobile-8e4b789e)
[0000.919] I> DMA Heap @ [0x526fa000 - 0x52ffa000]
[0000.920] I> Default Heap @ [0xd486400 - 0xd48a400]
[0000.921] E> DEVICE_PROD: Invalid value data = 70020000, size = 0.
[0000.926] W> device prod register failed
[0000.930] I> gpio framework initialized
[0000.934] I> tegrabl_gpio_driver_register: register ‘nvidia,tegra194-gpio’ driver
[0000.941] I> tegrabl_gpio_driver_register: register ‘nvidia,tegra194-gpio-aon’ driver
[0000.949] I> No valid sdcard_params in mb1_bct
[0000.953] I> Boot_device: QSPI_FLASH instance: 0
[0000.958] I> qspi flash-0 params source = boot args
[0000.963] I> QSPI-0l initialized successfully
[0000.966] I> sdmmc-3 params source = safe params
[0001.400] I> sdmmc DDR50 mode
[0001.418] I> Found 41 partitions in QSPI_FLASH (instance 0)
[0001.435] W> Cannot find any partition table for 00000003
[0001.436] > PARTITION_MANAGER: Failed to publish partition.
[0001.451] I> Found 22 partitions in SDMMC_USER (instance 3)
[0001.452] I> Active Boot chain : 0
[0002.271] I> Relocating BR-BCT
[0002.272] > DEVICE_PROD: device prod is not initialized.
[0002.297] > DEVICE_PROD: device prod is not initialized.
[0002.621] I> Relocating OP-TEE dtb from: 0x6bfff720 to 0x70050000, size: 1008
[0002.621] I> [0] START: 0x80000000, SIZE: 0x2f000000
[0002.622] I> [1] START: 0xaf010000, SIZE: 0x189f0000
[0002.622] I> [2] START: 0xc7b00000, SIZE: 0xc0000
[0002.623] I> [3] START: 0xca000000, SIZE: 0x800000
[0002.623] I> dram_block larger than 80000000
[0002.626] I> [4] START: 0x100000000, SIZE: 0x380000000
[0002.637] I> Setting NS memory ranges to OP-TEE dtb finished.
[0002.640] I> found decompressor handler: lz4
[0003.129] I> EKB detected (length: 0x410) @ VA:0x52709400
[0003.131] I> Setting EKB blob info to OPTEE dtb finished.

but didn’t find any IDs:
[0004.194] W> No board IDs available
[0004.196] E> Failed to get board id info!

[0004.046] GIC-SPI Target CPU: 0
[0004.049] Interrupts Init done
[0004.052] calling constructors
[0004.055] initializing heap
[0004.058] I> Heap: [0xa0a60000 … 0xadf00000]
[0004.062] initializing threads
[0004.065] initializing timers
[0004.068] creating bootstrap completion thread
[0004.072] top of bootstrap2()
[0004.075] CPU: MIDR: 0x4E0F0040, MPIDR: 0x80000000
[0004.079] initializing platform
[0004.082] E> DEVICE_PROD: Invalid value data = 0, size = 0.
[0004.088] W> device prod register failed
[0004.092] I> Bl_dtb @0xadf000000xadf00000
[0004.095] I> gpio framework initialized
[0004.105] I> tegrabl_gpio_driver_register: register ‘nvidia,tegra194-gpio’ driver
[0004.110] I> tegrabl_gpio_@0xadf00000river_register: register ‘nvidia,tegra194-gpio-aon’ driver
[0004.118] I> fixed regulator driver initialized
[0004.141] I> register ‘maxim’ power off handle
[0004.146] I> virtual i2c enabled
[0004.147] I> registered ‘maxim,max20024’ pmic
[0004.147] I> tegrabl_gpio_driver_register: register ‘max20024-gpio’ driver
[0004.148] I> Boot-device: QSPI
[0004.148] I> Boot_device: QSPI_FLASH instance: 0
[0004.148] I> configure_qspi_clk: qparams clk_src = 5, clk_div = 0, clk_src_freq = 800000000, interface_freq = 50000000
[0004.154] I> configure_qspi_clk: FORCING INTERFACE_FREQ TO 133000000!!
[0004.161] I> QSPI source rate = 204000 Khz
[0004.164] I> Requested rate for QSPI clock = 34000 Khz
[0004.169] I> BPMP-set rate for QSPI clk = 34000 Khz
[0004.174] I> tx_clk_tap_delay : 0
[0004.177] I> rx_clk_tap_delay : 16
[0004.180] I> QSPI Flash Size = 32 MB
[0004.188] I> Qspi initialized successfully
[0004.188] I> qspi flash-0 params source = boot args
[0004.194] W> No board IDs available
[0004.196] E> Failed to get board id info!
[0004.202] I> sdmmc-3 params source = safe params
[0004.209] I> Found 41 partitions in QSPI_FLASH (instance 0)
[0004.210] W> Cannot find any partition table for 00000003
[0004.215] E> Failed to publish 00000003
[0004.219] I> Found 22 partitions in SDMMC_USER (instance 3)
[0004.248] I> regulator ‘vdd-hdmi-5v0’ already enabled
[0004.257] I> regulator ‘vdd-hdmi-5v0’ already enabled
[0004.257] E> tegrabl_display_init_regulator: hdmi cable is not connected
[0004.258] E> tegrabl_display_get_pdata, failed to parse dtb settings
[0004.260] E> cannot find any other nvdisp nodes
[0004.260] E> no valid display unit config found in dtb
[0004.263] W> display init failed
[0004.263] initializing target
[0004.265] calling apps_init()
[0004.268] starting app kernel_boot_app
[0004.271] I> Kernel type = Normal

Jetson UEFI firmware (version 202210.4-11fd746-dirty built on 2025-01-13T18:45:41-0

Why UEFI does not see IDS in external Eeprom? Could this IDS be placed in CVB Eeprom or it should used another Eeprom on another I2C bus? It worked for TX2. From documentation Eeprom on Camera Module has address 0x54, but I don’t see any I2C reading cycles for address 0x54. Right now external Eeprom connected to CAM_I2C bus and I see reading 256 bytes from it on I2C bus from UEFI, it looks as reading “DEVICE_PROD: device prod is not initialized.“. How to resolve this issue? Thanks in advance.

Just want to clarify.

The log you are reading there is not UEFI log.

[0004.263] W> display init failed
[0004.263] initializing target
[0004.265] calling apps_init()
[0004.268] starting app kernel_boot_app
[0004.271] I> Kernel type = Normal
->above logs are from nvdisplay init in a small Cboot binary copied from old Cboot.
Jetson UEFI firmware (version 202210.4-11fd746-dirty built on 2025-01-13T18:45:41-0
->UEFI log starts here.

Some logs are are even in earlier stage is from MB2… not UEFI log either.

Yes, I see logs from MB1, MB2 and UEFI separately. I have seen source code of CBoot earlier, but as I understood MB2 source code is still closed? I can’t understood why MB2 has not detect IDS in Eeprom. Will be a good to know for which i2c buses doing search and for which addresses. For CBoot with TX2 it was easy. May be MB2 search it on another I2C bus? I already have check it for i2c-1, i2c-2 and i2c-8 buses. Thanks.

I think you may need to clarify what you want to do here because it could be in vain…

MB1/MB2 are always none open source binaries. It could be only adjusted by using the cfg file.
Same rule still happens to the latest SoC.

The point here is even MB2 could read the ID there or not does not really matter… If you customize some ID, then MB2 does not know about it either. Since this is non open source part, looking into it does not provide much help.

Overlay dtb has nothing to do with MB2 either so better focusing on something that is really important… you should check UEFI part but not MB2…

Ok, I wiil clarify. We have several hardware platforms with different hardware resources on them. I need to create one universal golden image with customized kernel and universal DTB for Xavier NX with possibility applying necessary nodes in DTB depends on carrier board. Previous experience with TX2 used approach with plugin manager and dynamic overlay depends on IDS from Eeprom in carrier board. Each carrier board has unique IDS which could be used for applying necessary DTB overlay. At least it seems to be a possible solution that will make many things much easier in the future.

Then You should enable the UEFI log and check what is wrong with your overlay dtb handle.

By default, UEFI log is not enabled so you won’t see anything.

Download the UEFI source code, rebuild it and then it would have a debug version of binary. Use that binary to flash to your board and then you would see the logs coming out.

MB1/MB2 log has nothing to do with your current situation.