TX2 Bootloader update redundancy and FAB ID

Hello,

I am using TX2 R28.3

I have trouble using BUP to update my TX2

The reason why I use this is because I need to change device tree without flashing it,
and i find out that BUP can write dtb partition.

I have followed the “Generating the Bootloader Payload Update” section in documents and have create a BUP file through the command below:

sudo FAB=D00 BOARDID=3310 FUSELEVEL=fuselevel_production ./build_l4t_bup.sh jetson-tx2 mmcblk0p1

Now I have 2 TX2.

One can use nv_update_engine just fine like the log below:

Nvidia A/B-Redundancy Update tool Version 1.1.02
current slot 0
Start updating slot 1
Tegra User Block Device: /dev/disk/by-partlabel
Tegra Boot Block Device: /dev/mmcblk0boot0
HEADER: MAGIC NVIDIA__BLOB__V2
HEX_VALUE 131072
BLOB_SIZE 4624352
HEADER_SIZE 48
NUMBER_OF_ELEMENTS 16
HEADER_TYPE 0
UNCOMP_SIZE 4624352
MB1_RATCHET_LV 0
MTS_RATCHET_LV 0
ROLLBACK_FUSE_LV 0
Device TN Spec: 3310-D00-1-0-jetson-tx2-mmcblk0p1
Device is fused board.
ENTRY_TABLE:
PART POS LEN VER TNSPEC TYPE UPDATABLE
bpmp-fw 1968 533056 2 1 1
sce-fw 535024 76992 2 1 1
cpu-bootloader 612016 294832 2 1 1
mb2 906848 104256 2 0 1
spe-fw 1011104 81936 2 0 1
secure-os 1093040 63088 2 1 1
kernel 1156128 428432 2 1 1
mb1 1584560 99504 2 2 1
mts-bootpack 1684064 2082144 2 1 1
mts-preboot 3766208 63104 2 0 1
sc7 3829312 22576 2 1 1
BCT 3851888 3584 2 3310-D00-1-0-jetson-tx2-mmcblk0p1 2 1
MB1_BCT 3855472 50080 2 3310-D00-1-0-jetson-tx2-mmcblk0p1 0 1
bpmp-fw-dtb 3905552 466160 2 3310-D00-1-0-jetson-tx2-mmcblk0p1 1 1
bootloader-dtb 4371712 126320 2 3310-D00-1-0-jetson-tx2-mmcblk0p1 1 1
kernel-dtb 4498032 126320 2 3310-D00-1-0-jetson-tx2-mmcblk0p1 1 1
Writing 533056 bytes to /dev/disk/by-partlabel/bpmp-fw_b for bpmp-fw
Writing 76992 bytes to /dev/disk/by-partlabel/sce-fw_b for sce-fw
Writing 294832 bytes to /dev/disk/by-partlabel/cpu-bootloader_b for cpu-bootloader
mb2 write: slot = 1 offset = 1253888 bytes = 104256
spe-fw write: slot = 1 offset = 860672 bytes = 81936
Writing 63088 bytes to /dev/disk/by-partlabel/secure-os_b for secure-os
Writing 428432 bytes to /dev/disk/by-partlabel/kernel_b for kernel
Writing 2082144 bytes to /dev/disk/by-partlabel/mts-bootpack_b for mts-bootpack
mts-preboot write: slot = 1 offset = 1778176 bytes = 63104
Writing 22576 bytes to /dev/disk/by-partlabel/sc7_b for sc7
MB1_BCT write: slot = 1 offset = 622592 bytes = 50080
Writing 466160 bytes to /dev/disk/by-partlabel/bpmp-fw-dtb_b for bpmp-fw-dtb
Writing 126320 bytes to /dev/disk/by-partlabel/bootloader-dtb_b for bootloader-dtb
Writing 126320 bytes to /dev/disk/by-partlabel/kernel-dtb_b for kernel-dtb
Update successful
Setting slot 1 as active boot slot
Rebooting system…10.9.8.7.6.5.4.3.2.1

But another one showed error message below:

Nvidia A/B-Redundancy Update tool Version 1.1.02
current slot 0
Start updating slot 1
Tegra User Block Device: /dev/disk/by-partlabel
Tegra Boot Block Device: /dev/mmcblk0boot0
HEADER: MAGIC NVIDIA__BLOB__V2
HEX_VALUE 131072
BLOB_SIZE 4624352
HEADER_SIZE 48
NUMBER_OF_ELEMENTS 16
HEADER_TYPE 0
UNCOMP_SIZE 4624352
MB1_RATCHET_LV 0
MTS_RATCHET_LV 0
ROLLBACK_FUSE_LV 0
Device TN Spec: 3310-B02-1-0-jetson-tx2-mmcblk0p1
Device is fused board.
ENTRY_TABLE:
PART POS LEN VER TNSPEC TYPE UPDATABLE
bpmp-fw 1968 533056 2 1 1
sce-fw 535024 76992 2 1 1
cpu-bootloader 612016 294832 2 1 1
mb2 906848 104256 2 0 1
spe-fw 1011104 81936 2 0 1
secure-os 1093040 63088 2 1 1
kernel 1156128 428432 2 1 1
mb1 1584560 99504 2 2 1
mts-bootpack 1684064 2082144 2 1 1
mts-preboot 3766208 63104 2 0 1
sc7 3829312 22576 2 1 1
BCT 3851888 3584 2 3310-D00-1-0-jetson-tx2-mmcblk0p1 2 0
MB1_BCT 3855472 50080 2 3310-D00-1-0-jetson-tx2-mmcblk0p1 0 0
bpmp-fw-dtb 3905552 466160 2 3310-D00-1-0-jetson-tx2-mmcblk0p1 1 0
bootloader-dtb 4371712 126320 2 3310-D00-1-0-jetson-tx2-mmcblk0p1 1 0
kernel-dtb 4498032 126320 2 3310-D00-1-0-jetson-tx2-mmcblk0p1 1 0
Writing 533056 bytes to /dev/disk/by-partlabel/bpmp-fw_b for bpmp-fw
Writing 76992 bytes to /dev/disk/by-partlabel/sce-fw_b for sce-fw
Writing 294832 bytes to /dev/disk/by-partlabel/cpu-bootloader_b for cpu-bootloader
mb2 write: slot = 1 offset = 1253888 bytes = 104256
spe-fw write: slot = 1 offset = 860672 bytes = 81936
Writing 63088 bytes to /dev/disk/by-partlabel/secure-os_b for secure-os
Writing 428432 bytes to /dev/disk/by-partlabel/kernel_b for kernel
Writing 2082144 bytes to /dev/disk/by-partlabel/mts-bootpack_b for mts-bootpack
mts-preboot write: slot = 1 offset = 1778176 bytes = 63104
Writing 22576 bytes to /dev/disk/by-partlabel/sc7_b for sc7
GetEntryTable failed
Fail to write Dependence partitions
Writing to partitions failed.
OTA Blob update failed. Status: 3
Slot 1 update failed

I have noticed that their Device TN Spec is different : D00 vs. B02

So here’s the question:
Q1. What does FAB id stand for?
Q2. Is there any configuration difference between different FAB id?

Another question is :

I found that build_l4t_bup.sh has a parameter “–multi-spec”.

It seems that I can combine numerous FAB id signed file into 1 BUP file.

This partially solve my problem about updating different TX2 with 1 BUP file.

But, the size of BUP file keeps growing as I keep adding signed files.

This makes it more difficult to copy form host to device

So,
Q3. Is there any way to build BUP file that can update TX2 with all kinds of FAB ID?

Hi,

Q1. What does FAB id stand for?

Ans: This only indicate the modules are different. The functionality should be same.

Q2. Is there any configuration difference between different FAB id?
Ans: The DVFS table may be different so we need to use differnet MB1-BCT config.

I notice when you hit the error on B02 module, you are still using the D00 BCT file. Could you try to use B02 FAB?

Also, actually you don’t need to add FAB manually.

$ sudo ./build_l4t_bup.sh jetson-tx2 mmcblk0p1

This command would read the FAB automatically.

Hi Wayne,

Thanks for reply.

It will work if I use B02 FAB.

According to documents, DVFS seems to be a feature that can lower CPU’s frequency to prevent from overheat, which is a feature I don’t need, so,

  1. Where can I find this DVFS table or how to disable it?

  2. Suppose I can ignore the DVFS differences between modules, is there a way to build BUP file that is FAB-free?

Hi,

I just wonder why you don’t use below command? So that there is no need to care about the FAB #

$ sudo ./build_l4t_bup.sh jetson-tx2 mmcblk0p1

DVFS is just an example I threw out in previous comment. I didn’t mean you could use config from D00 to B02 just by disabling DVFS.

Please read the log file you pasted. There are plenty different configs need to update when using different FAB.

BCT
MB1_BCT
bpmp-fw-dtb
bootloader-dtb
kernel-dtb

Hi Wayne,

I have tried the command you suggest, but it needs to connect target module to host system.

I now have to update my module remotely.

Document shows that I can build the BUP file for a board that is not connected to host system by assigning FAB/BOARDID/FUSELEVEL.

Plus, I have lots of modules and I can’t make sure what’s the FAB ID of module that I’m going to update.

So, I need to create a BUP file which can update modules regardless of their FAB ID

Hi ts01399984,

I just checked with our internal team. If you don’t connect a cable to RCM device, then you need to know what FAB is your module and update it manually.

You could remotely access to your device and check the nodes under /proc/device-tree/chosen/. to know what module is in use.

Hi Wayne,

Thanks. I will try the command you suggest.

One last question, is there any way to check whether the update is successful besides the logs from nv_update_engine and nvbootctrl?

For example: A return value from nv_update_engine or a file that can be check

$ nv_update_engine --verify should tell the result.

Per checked the source code of update_engine. The update would have print (“Slot %d update failed\n”, non_current_slot); if the update gets failed and return.

Hi Wayne,

Q1. Is the source code of update_engine released?

Q2. I’m using R28.3.1. I download my BSP and root file system from here:

https://developer.nvidia.com/embedded/linux-tegra-r2831

But /proc/device-tree/chosen seems nothing for me to check the module I use.

Here are items inside, I have check every file using cat command and found nothing.

root@jetson-0422518025885:/proc/device-tree/chosen# ls -l
total 0
-r–r--r-- 1 root root 0 May 6 05:51 board-has-eeprom
-r–r--r-- 1 root root 524 May 6 05:51 bootargs
-r–r--r-- 1 root root 4 May 6 05:51 linux,initrd-end
-r–r--r-- 1 root root 4 May 6 05:51 linux,initrd-start
-r–r--r-- 1 root root 7 May 6 05:51 name
-r–r--r-- 1 root root 18 May 6 05:51 nvidia,bluetooth-mac
-r–r--r-- 1 root root 18 May 6 05:51 nvidia,ether-mac
-r–r--r-- 1 root root 18 May 6 05:51 nvidia,wifi-mac
drwxr-xr-x 6 root root 0 May 6 05:51 plugin-manager
drwxr-xr-x 4 root root 0 May 6 05:51 reset
-r–r--r-- 1 root root 16 May 6 05:51 stdout-path

Q1. Is the source code of update_engine released?

Sorry, it is not released.

Here are items inside, I have check every file using cat command and found nothing.

How about digging into the folder plugin-manager?

I did, but most of files seems no content.

plugin-manager:

root@tegra-ubuntu:/proc/device-tree/chosen/plugin-manager# ls -l
total 0
drwxr-xr-x 2 root root 0 Feb 11 16:57 chip-id
drwxr-xr-x 2 root root 0 Feb 11 16:57 configs
drwxr-xr-x 3 root root 0 Feb 11 16:57 ids
-r–r--r-- 1 root root 15 Feb 11 16:57 name
drwxr-xr-x 2 root root 0 Feb 11 16:57 odm-data

chip-id

root@tegra-ubuntu:/proc/device-tree/chosen/plugin-manager/chip-id# ls -l
total 0
-r–r--r-- 1 root root 4 Feb 11 16:58 A02P
-r–r--r-- 1 root root 8 Feb 11 16:58 name

configs

root@tegra-ubuntu:/proc/device-tree/chosen/plugin-manager/configs# ls -l
total 0
-r–r--r-- 1 root root 8 Feb 11 17:00 name

ids and ids/connection

root@tegra-ubuntu:/proc/device-tree/chosen/plugin-manager/ids# ls -l
total 0
drwxr-xr-x 2 root root 0 Feb 11 16:59 connection
-r–r--r-- 1 root root 4 Feb 11 16:59 name
root@tegra-ubuntu:/proc/device-tree/chosen/plugin-manager/ids/connection# ls -l
total 0
-r–r--r-- 1 root root 11 Feb 11 16:59 name

odm-data

root@tegra-ubuntu:/proc/device-tree/chosen/plugin-manager/odm-data# ls -l
total 0
-r–r--r-- 1 root root 4 Feb 11 17:00 android-build
-r–r--r-- 1 root root 4 Feb 11 17:00 disable-pmic-wdt
-r–r--r-- 1 root root 4 Feb 11 17:00 disable-sdmmc-hwcq
-r–r--r-- 1 root root 4 Feb 11 17:00 disable-tegra-wdt
-r–r--r-- 1 root root 4 Feb 11 17:00 enable-debug-console
-r–r--r-- 1 root root 4 Feb 11 17:00 enable-denver-wdt
-r–r--r-- 1 root root 4 Feb 11 17:00 enable-pcie-on-uphy-lane1
-r–r--r-- 1 root root 4 Feb 11 17:00 enable-pcie-on-uphy-lane2
-r–r--r-- 1 root root 4 Feb 11 17:00 enable-pcie-on-uphy-lane4
-r–r--r-- 1 root root 4 Feb 11 17:00 enable-sata-on-uphy-lane5
-r–r--r-- 1 root root 4 Feb 11 17:00 enable-xusb-on-uphy-lane0
-r–r--r-- 1 root root 9 Feb 11 17:00 name
-r–r--r-- 1 root root 4 Feb 11 17:00 no-battery
-r–r--r-- 1 root root 4 Feb 11 17:00 normal-flashed

ok… seems rel-28.3 does not show the module info in these nodes.

Could you compare the result of

sudo i2cdump -y 7 0x50

on B02 and D00 modules?

B02

root@jetson-0422518025885:/home/nvidia# sudo i2cdump -y 7 0x50
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: 01 00 0d 00 ee 0c e8 03 42 45 00 00 00 00 00 00 ?.?.???BE…
10: 00 00 00 00 36 39 39 2d 38 33 33 31 30 2d 31 30 …699-83310-10
20: 30 30 2d 42 30 32 20 45 2e 30 00 00 00 00 00 00 00-B02 E.0…
30: 00 00 11 f7 c4 4b 04 00 12 f7 c4 4b 04 00 00 00 …???K?.???K?..
40: 00 00 00 00 13 f7 c4 4b 04 00 30 34 32 32 35 31 …???K?.042251
50: 38 30 32 35 38 38 35 00 00 00 00 00 00 00 00 00 8025885…
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
90: 00 00 00 00 00 00 4e 56 43 42 1c 00 4d 31 00 00 …NVCB?.M1…
a0: 11 f7 c4 4b 04 00 12 f7 c4 4b 04 00 13 f7 c4 4b ???K?.???K?.???K
b0: 04 00 00 00 00 00 00 00 7d c3 66 ca a1 ac 14 f9 ?..}?f???
c0: 6a af d3 3f 12 4b 13 d1 dc fc 80 46 37 05 f1 b8 j???K???F7???
d0: f6 96 b1 df a4 cf 37 f6 78 69 60 bb 23 c4 87 71 ???7?xi`?#??q
e0: e6 8c 8c bd 0b 25 4b 7b 00 3e 23 b0 66 45 34 15 ???%K{.>#?fE4?
f0: 38 8a a0 4d 35 0a ef 72 00 00 00 00 00 00 00 37 8??M5??r…7

D00

root@jetson-0421219066145:/home/nvidia# i2cdump -y 7 0x50
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: 01 00 0d 00 ee 0c e8 03 44 45 00 00 00 00 00 00 ?.?.???DE…
10: 00 00 00 00 36 39 39 2d 38 33 33 31 30 2d 31 30 …699-83310-10
20: 30 30 2d 44 30 30 20 45 2e 30 00 00 00 00 00 00 00-D00 E.0…
30: 00 00 cc ad dd 4b 04 00 cd ad dd 4b 04 00 00 00 …???K?.???K?..
40: 00 00 00 00 ce ad dd 4b 04 00 30 34 32 31 32 31 …???K?.042121
50: 39 30 36 36 31 34 35 00 00 00 00 00 00 00 00 00 9066145…
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
90: 00 00 00 00 00 00 4e 56 43 42 1c 00 4d 31 00 00 …NVCB?.M1…
a0: cc ad dd 4b 04 00 cd ad dd 4b 04 00 ce ad dd 4b ???K?.???K?.???K
b0: 04 00 00 00 00 00 00 00 f4 3e eb 56 52 dc 59 e5 ?..?>?VR?Y?
c0: f4 e9 f7 1d d5 68 55 41 b0 d8 91 d7 ab b9 a0 11 ???hUA???
d0: c1 97 c9 db 27 37 8a ab 65 90 1d 98 6c c1 ed d2 ???‘7??e???l???
e0: e0 3f 49 95 64 6e 05 21 dd ea 57 05 8d 1e e2 a3 ??I?dn???W???
f0: 4e f4 df 1d ab cf d1 2b 00 00 00 00 00 00 00 27 N???+…’

Too many, I just marked few differences.

Actually you could just check the readable character in the behind instead of the hex values.

You could see there is B02 and D00 value inside it. This is fused value in eeprom on your module.

To know more detail about eeprom, please download the eeprom layout on our download center.

Thanks! This helps a lot!