Hi,
We got a custom display with some unusual resolutions.
And now UEFI is freezing somewhere inside this call:
Status = Private->GraphicsOutput->SetMode (Private->GraphicsOutput, ModeNumber);
where SetMode appears to point somewhere inside nvgop-chips-platform.efi, which appears to be a closed source driver, so I cannot fix it.
I added some extra logs around and got:
GraphicsConsoleControllerDriverStart:478 QueryMode 0 ret 0 2160x112
GraphicsConsoleControllerDriverStart:478 QueryMode 1 ret 0 800x600
GraphicsConsoleControllerDriverStart:540 call SetMode #0
freeze
Also, Orin gets very hot while being frozen, its power regulation may not be active at this time, which is kind of dangerous.
I tried to disable display in UEFI according to this post:
I did the following:
sed âs@!include Silicon/NVIDIA/Drivers/NvGopDriver/NvGopDriver.dsc.inc@#!include Silicon/NVIDIA/Drivers/NvGopDriver/NvGopDriver.dsc.inc@gâ -i edk2-nvidia/Platform/NVIDIA/NVIDIA.common.dsc.inc
sed âs@Silicon/NVIDIA/Drivers/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf@#Silicon/NVIDIA/Drivers/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf@gâ -i edk2-nvidia/Platform/NVIDIA/NVIDIA.common.dsc.inc
sed âs@Silicon/NVIDIA/Drivers/NvDisplayControllerDxe/NvDisplayControllerDxe.inf@#Silicon/NVIDIA/Drivers/NvDisplayControllerDxe/NvDisplayControllerDxe.inf@gâ -i edk2-nvidia/Platform/NVIDIA/NVIDIA.common.dsc.inc
sed âs@!include Silicon/NVIDIA/Drivers/NvGopDriver/NvGopDriver.fdf.inc@#!include Silicon/NVIDIA/Drivers/NvGopDriver/NvGopDriver.fdf.inc@gâ -i edk2-nvidia/Platform/NVIDIA/NVIDIA.fvmain.fdf.inc
sed âs@INF Silicon/NVIDIA/Drivers/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf@#INF Silicon/NVIDIA/Drivers/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceDxe.inf@gâ -i edk2-nvidia/Platform/NVIDIA/NVIDIA.fvmain.fdf.inc
sed âs@INF Silicon/NVIDIA/Drivers/NvDisplayControllerDxe/NvDisplayControllerDxe.inf@#INF Silicon/NVIDIA/Drivers/NvDisplayControllerDxe/NvDisplayControllerDxe.inf@gâ -i edk2-nvidia/Platform/NVIDIA/NVIDIA.fvmain.fdf.inc
Then rebuilding UEFI.
OK, it works: UEFI does not init display anymore and boots normally.
But I would prefer to avoid rebuilding UEFI every time Jetson is released.
Rebuilding UEFI is very troublesome process, especially âedk2_docker edkrepo clone nvidia-uefi NVIDIA-Platforms mainâ, which fails almost every time.
So, question is how to disable display in UEFI or force it to use a different mode without rebuilding? May be using some config options?
Are you using the devkit or custom board for AGX Orin?
Whatâs your Jetpack version in use?
Actually, we donât suggest using the main branch, which is the latest branch but may not available for your release. Please download the source corresponding to the L4T release you are using.
UEFI is dtb driven so that you can just disable them in device tree and flash the board to apply the change.
This problem is reproducible with Orin AGX Devkit with Jetson 36.3.0 as well as previous version.
I was following instructions at
which said that for Jetpack 6 to use " edkrepo clone nvidia-uefi NVIDIA-Platforms main"
Unfortunately, it fails out most of the time.
Also note that the problem happens with stock prebuilt uefi_jetson.bin. I only rebuilt it for debugging.
UEFI is dtb driven so that you can just disable them in device tree and flash the board to apply the change.
That would be great. Can you tell me the file and entry name to disable display?
Could you be more specific?
I only see display@13800000 in kernel device tree, but I do need display in kernel,
I need to disable display in UEFI to prevent it from freezing, but I cannot find display@13800000 in any .dts under Jetson_Linux_R36.3.0_aarch64/Linux_for_Tegra/bootloader
I tried reading https://docs.nvidia.com/jetson/archives/r36.3/DeveloperGuide/SD/Bootloader/UEFI.html
but it does not mention how to disable display. Please, tell me
I tried creating tegra234-p3737-0000+p3701-0000-nv-modified.dtb as a copy of tegra234-p3737-0000+p3701-0000-nv.dtb
but with ânvidia,tegra234-displayâ replaced by ânvidia,tegra234-cisplayâ
This disables display in the bootloader, but also disables it in Linux.
It appears that flash.sh copies ./kernel/dtb/tegra234-p3737-0000+p3701-0000-nv-modified.dtb
to ./bootloader/tegra234-p3737-0000+p3701-0000-nv-no-display.dtb
So, both bootloader and Linux always use the same .dtb.
This is what I did:
cp ./bootloader/tegra234-p3737-0000+p3701-0000-nv.dtb \
./bootloader/tegra234-p3737-0000+p3701-0000-nv-modified.dtb
cp ./bootloader/tegra234-p3737-0000+p3701-0000-nv.dtb \
./kernel/dtb//tegra234-p3737-0000+p3701-0000-nv-modified.dtb
# Note: I have to copy .dtb to kernel/dtb/, otherwise flash.sh fails with error:
# 'Error: Can not find --concat_cpubl_bldtb to create --concat_cpubl_bldtb_with_odm'
# Now modify the bootloader copy, but not kernel:
sed 's@nvidia,tegra234-display\x0@nvidia,tegra234-cisplay\x0@g' -i ./bootloader/tegra234-p3737-0000+p3701-0000-nv-modified.dtb
#verify:
grep --text cisplay ./bootloader/tegra234-p3737-0000+p3701-0000-nv-modified.dtb # Should find
grep --text cisplay ./kernel/dtb/tegra234-p3737-0000+p3701-0000-nv-modified.dtb # Should not find
cp jetson-agx-orin-devkit.conf jetson-agx-orin-devkit.conf_save
sed 's@TBCDTB_FILE=.*@TBCDTB_FILE="tegra234-p3737-0000+p3701-0000-nv-modified.dtb";@g' -i jetson-agx-orin-devkit.conf
diff jetson-agx-orin-devkit.conf jetson-agx-orin-devkit.conf_save
sudo st ./flash.sh -k A_cpu-bootloader jetson-agx-orin-devkit mmcblk0p1 | tee flash_out.txt 2>&1
# Now have logo in BL and Kernel
grep --text cisplay ./bootloader/tegra234-p3737-0000+p3701-0000-nv-modified.dtb
# Does not find because flash.sh copied ./kernel/dtb/tegra234-p3737-0000+p3701-0000-nv-modified.dtb to ./bootloader/tegra234-p3737-0000+p3701-0000-nv-modified.dtb
# Now try to modify both:
sed 's@nvidia,tegra234-display\x0@nvidia,tegra234-cisplay\x0@g' -i ./bootloader/tegra234-p3737-0000+p3701-0000-nv-modified.dtb
sed 's@nvidia,tegra234-display\x0@nvidia,tegra234-cisplay\x0@g' -i ./kernel/dtb/tegra234-p3737-0000+p3701-0000-nv-modified.dtb
# Now no display neither in BL nor in kernel. In kernel we can double check:
cat /proc/device-tree/display@13800000/compatible
nvidia,tegra234-cisplay
How to force flash.sh to give different .dtb to Linux?
I replaced the lines above by
mkfilesoft tbcdtbfile âtegra234-p3737-0000+p3701-0000-nv-modified.dtbâ "kernel/dtb/tegra234-p3737-0000+p3701-0000-nv-modified.dtb
using
sed âs@mkfilesoft tbcdtbfile.*@mkfilesoft tbcdtbfile âtegra234-p3737-0000+p3701-0000-nv-modified.dtbâ âkernel/dtb/tegra234-p3737-0000+p3701-0000-nv-modified.dtbâ;@gâ -i flash.sh
cp ./bootloader/tegra234-p3737-0000+p3701-0000-nv.dtb
./kernel/dtb/tegra234-p3737-0000+p3701-0000-nv.dtb-modified
sed âs@nvidia,tegra234-display\x0@nvidia,tegra234-cisplay\x0@gâ -i ./kernel/dtb/tegra234-p3737-0000+p3701-0000-nv.dtb-modified
I tried flashing everything using
sudo ./flash.sh jetson-agx-orin-devkit mmcblk0p1
Now neither UEFI nor kernel has display.
cat /proc/device-tree/display@13800000/compatible
nvidia,tegra234-cisplay
I tried flashing only bootloader alone using
./flash.sh -k A_cpu-bootloader jetson-agx-orin-devkit mmcblk0p1
with original flash.sh or patched one,
and again, UEFI and Linux either both has display or none.
Sorry for the late reply, please let me share the detailed steps to separate the DTB for UEFI and kernel in Jetpack 6.
(UEFI dtb disable display node, Kernel dtb enable display node)
Step 1. Generate device tree for UEFI (tegra234-p3737-0000+p3701-0000-uefi.dtb)
1-1: decompile dtb