Jetson Xavier boot from TFTP server

Hi,

I try to boot jetson Xavier from TFTP server. (I’m using JETPACK 4.6 version on Jetson Xavier devkit)
The first thing I did was flashing the Devkit with SDK manager and complete the full installation.
The Xavier Devkit booted successfully from EMMC.
Then I did the following steps in order to boot from TFTP server:

  1. Setting Up a TFTP Server on the Host System (according to Nvidia L4T documentation)
  2. Changing the cbo.dts file to boot from net and recompile cbo.dtb

/dts-v1/;

/ {
compatible = “nvidia,cboot-options-v1”;
boot-configuration {
/* nvme boot-order can be in “nvme:C”, “nvme:pcie@”, or “nvme” format /
boot-order = “net”, “emmc”, “usb”, “nvme”, “sd”;
tftp-server-ip = /bits/ 8 <172 20 182 8>;
dhcp-enabled;
/
remove dhcp-enabled if uncommenting static-ip configuration /
/
static-ip = /bits/ 8 <0 0 0 0>;
* ip-netmask = /bits/ 8 <255 255 255 0>;
* ip-gateway = /bits/ 8 <0 0 0 0>;
*/
};
};

./dtc -I dts -O dtb -o …/bootloader/cbo.dtb …/bootloader/cbo.dts

  1. flashing the new cbo.dtb file using the following command:
    sudo ./flash.sh -r -k CPUBL-CFG jetson-xavier mmcblk0p1

See below:

[0002.371] I> Load in CBoot Boot Options partition and parse it
[0002.377] I> boot-order :-
[0002.378] I> 1.net
[0002.378] I> 2.emmc
[0002.378] I> 3.usb
[0002.378] I> 4.nvme
[0002.378] I> 5.sd
[0002.380] I> tftp-server-ip: 172.20.182.8
[0002.383] W> parse_ip_info: static-ip info is not required, only tftp-server-i.
[0002.392] W> Failed to parse GUID
[0002.395] I> boot-dev-order :-
[0002.398] I> 1.net
[0002.400] I> 2.emmc
[0002.401] I> 3.usb
[0002.403] I> 4.nvme
[0002.405] I> 5.sd
[0002.407] I> Hit any key to stop autoboot: 4 3 2 1
[0004.415] initializing target
[0004.415] calling apps_init()
[0004.416] starting app kernel_boot_app
[0004.435] I> found decompressor handler: lz4-legacy
[0004.436] I> decompressing BMP blob …
[0004.447] I> Kernel type = Normal
[0004.447] I> ########## Net boot ##########
[0004.447] I> EQoS: Init
[0006.450] I> Wait till auto-calibration completes…

Any idea why he stucked in cboot auto-calibration stage?

Thanks,
Yair

Hi yairhav,

Please copy cbo.dtb to “bootloader/t186ref” and full flash again.

$ sudo ./flash.sh jetson-xavier mmcblk0p1

Hello, @carolyuu

Thanks for your help but this solution does’nt work, I’m stuck at the same place.

Any advise?

Yair

I think your ethernet environment may also affect. Does your network environment support dhcp ?

yes,
What does it mean “Wait till auto-calibration completes…”?

I tried to work without DHCP, when both Host and Target connected to switch.
I got the same results.
What the system trying to do at “Wait till auto-calibration completes…” stage?
In order to PASS this stage, the target must detect TFTP server?
Whould you try unplug the Target from the Net while trying to boot from the NET? Is this what you expect to get?

Thanks,
Yair

Hi yairhav,

Please follow below steps and try again:

  1. Create /etc/xinetd.d/tftp:
service tftp
{
protocol        = udp
port            = 69
socket_type     = dgram
wait            = yes
user            = nobody
server          = /usr/sbin/in.tftpd
server_args     = -s /home/carol/tftpboot
disable         = no
}
  1. Create tftpboot folder on your Ubuntu host machine:
$ mkdir /home/carol/tftpboot
  1. Generate encrypt kernel and kernel-dtb:
$ ./l4t_sign_image.sh --file rootfs/boot/tegra194-p3668-all-p3509-0000.dtb --chip 0x19 --type kernel-dtb
$ ./l4t_sign_image.sh --file bootloader/boot.img --chip 0x19 --type kernel
  1. Copy encrypt files to tftpboot folder and rename:
$ cp boot_sigheader.img.encrypt /home/carol/tftpboot/boot.img
$ cp tegra194-p3668-all-p3509-0000_sigheader.dtb.encrypt /home/carol/tftpboot/jetson.dtb
  1. Restart xinetd service:
$ sudo service xinetd restart
  1. Change boot order with cbo.dts and generate to cbo.dtb
  2. Copy cbo.dtb to ‘Linux_for_Tegra/bootloader/t186ref/’ folder
  3. Full flash the device

I got the same error

How many AGX device do you have there? The “Wait till auto-calibration completes…” is actually doing some programming in our ethernet driver.

→ The cboot source code bootloader/partner/common/drivers/eqos/tegrabl_eqos.c → tegrabl_eqos_auto_calib.

This programming needs to wait for register “REG_ETHER_QOS_AUTO_CAL_STATUS_0” to become ready.
I am not sure why it gets stuck on your side. To validate whether this is hardware related or software related, you can also downgrade to rel-32.5.1 and see if it can work.

Thanks, I will try.
Yair

I had the exactly same problem.

The auto-calibration seemed to be a problem because the last log was “Wait till auto-calibration completes…”
In my case, however, after calling tegrabl_eqos_auto_calib(), the following two lines caused the problem.

	/* TODO: add comment */
	//NV_WRITE32(NV_ADDRESS_MAP_LIC_BASE + REG_INTR_CHANNEL0_SLICE5_IEP_CLASS_0, 0xF);
	//NV_WRITE32(NV_ADDRESS_MAP_LIC_BASE + REG_INTR_CHANNEL0_SLICE6_IEP_CLASS_0, 0xF);

I just commented them out, and it works fine now.

2 Likes