QSPI booting

Hey all,

I cannot tell if it’s possible to put devicetree, Kernel, and an initrd into the QSPI flash and boot. My target is Jetpack 4.5.1 with a modified initrd that is very small. I also cannot find information on the QSPI flash size.

I appreciate any help!

(P.S. - I’m coming from a Xilinx Zynq and u-boot workflow where QSPI is a first-class boot medium)

please check the partition layout table.



Thanks so much. I spent a bunch of time trying to understand the partition layout. It appears kernel and kernel_b is what holds the kernel and initrd reside? It appears boot.img is a kernel AND initrd. I hope that’s correct.

So, if I prepare a new kernel and new initrd, I basically just replace the files in the Linux_for_Tegra directory tree and do sudo ./flash.sh -k ... and sudo ./flash.sh -I? Maybe just do sudo ./flash.sh without arguments? I guess I have to replace the files as ./flash.sh does some signing magic.

Thanks! I’ll open another thread since I cannot seem to understand the requirements imposed on my new initrd.

That is not fully correct. The reason behind this is because the Xavier NX has multiple location to boot the kernel.

For example, by default the boot path is from the rootfs. Thus, it will load the kernel from APP partition’s /boot/Image.
In this case, “kernel” partition won’t take effect. That partition will only work if the rootfs does not have kernel image.


Thanks! Please excuse my ignorance. My goal is to essentially make the SDCard (or eMMC in production units) not used for booting.

Is this relayed to cboot’s boot order? If I remove the files from /boot/* on the SD card (or remote the SD card), will the device boot my initrd as defined as l4t_initrd.img?


**** EDIT: ****

I tried to go into CBoot, set the boot order to empty string and run boot. Here is what happens:

TEGRA194 # setvar boot-order ""
TEGRA194 # 
TEGRA194 # boot
I> found decompressor handler: lz4-legacy
I> decompressing BMP blob ...
I> Kernel type = Normal
I> Loading kernel-bootctrl from partition
E> Cannot find partition kernel-bootctrl
E> Cannot open partition kernel-bootctrl
W> tegrabl_get_kernel_bootctrl: failed to read primary bootctrl data
I> Loading kernel-bootctrl_b from partition
E> Cannot find partition kernel-bootctrl_b
E> Cannot open partition kernel-bootctrl_b
W> tegrabl_get_kernel_bootctrl: failed to read recovery bootctrl data
W> tegrabl_get_kernel_bootctrl: use default dummy boot control data

I did this to trace where CBoot was trying to load the initrd and kernel from QSPI instead of the SDCard. If I create a partition called kernel-bootctl, will CBoot load the kernel from there? What about the devicetree?..

Back to the first comment here. The xml file will tell you which file is one bootloader while rest of partitions on sd.


If you want to put everything on qspi, then you need to modify the xml file.

Also, if you are not sure what was the original setting, I would suggest you try basic sdcard case and then trace the log first.


Thanks! I’ll try to modify the XML file and put more things on the QSPI. I just can’t tell if I need to since I really can’t tell how CBoot (release 4.5.1) is using these partitions. Tracing the SD card boot just boots the SD card ; I can’t see it using anything on QSPI.

Do you have suggestions to learn about what’s possible on this platform? I found this release-specific documentation (https://docs.nvidia.com/jetson/archives/l4t-archived/l4t-3271/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/bootflow_jetson_xavier.html#wwpID0E0JB0HA) that helps a bit but doesn’t really help me “change anything” to get my desired effect.

I’ll repeat in that I just want CBoot to skip the SD and boot some kernel, devicetree, and initrd from QSPI.


This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.