OE4T / tegra-demo-distro

Reference/demonstration distro for meta-tegra
MIT License
73 stars 74 forks source link

UEFI boot screen does not show up #268

Closed picanteAvi closed 1 year ago

picanteAvi commented 1 year ago

Firstly, thank you for all the effort in putting this BSP together! I am trying to investigate an issue where the UEFI boot screen will not display at bootup. I am creating this issue here as it's reproducable on the devkits as well. I can move it to the meta-tegra project if desired.

Hardware is jetson-xavier-nx-devkit with sd card. I am currently on the kirkstone branch that uses jetpack 35.3.1 version. I built demo-image-base without any modifications; it boots up fine but i do not see the Nvidia bootlogo at startup. Using the UEFI prebuilt binary from Nvidia works. Basically just adding this to demo-image-base.bb: PREFERRED_PROVIDER_virtual/bootloader = "tegra-uefi-prebuilt"

So seems like the default edk2-firmware-tegra bootloader provider is broken somewhere. Any workarounds/fixes? I need to modify the UEFI source to implement drivers for our custom board, which i have completed. This is one last remaining features i am trying to get to work.

Thank you for all your effort. I have attached the logs here which seem identical between prebuilt and locally built uefi bin. By locally i mean using the default settings in tegra-common.inc: PREFERRED_PROVIDER_virtual/bootloader ?= "edk2-firmware-tegra"

log_kirk-demo_Uefi-prebuilt_Kern-stock_devkit.log log_kirk-demo_Uefi-local_Kern-stock_devkit.log

kekiefer commented 1 year ago

Does it work as intended if you use PREFERRED_PROVIDER_virtual/bootloader = "edk2-firmware-tegra"? The reason I ask is that on Xavier systems, the initialization of the display isn't handled by UEFI, but by a preloader based on the old cboot code that is basically just prepended on the bootloader binary. It's been a while since I've looked at this, but I wonder if maybe the prebuilt UEFI doesn't get this treatment.

picanteAvi commented 1 year ago

No it doesn't. edk2-firmware-tegra is what the project uses as default currently. The prebuilt binary also uses the nvdisp preloader (according to the logs anyway)

picanteAvi commented 1 year ago

There is also some discussion here but i dont think there was any real solution other than upgrading jetpack. https://forums.developer.nvidia.com/t/replace-uefi-boot-splash-screen-logo-jetpack-5-0-1-r35-1/240365/34

Maybe a build issue? I haven't been able to resolve it by building the uefi binary seperatly and then copying it over to the tegra-flash package either.

kekiefer commented 1 year ago

I see it in your logs now. nvdisp-init recognizes and initializes the display for both, to 1024x768@65hz

I wonder if UEFI is choking on that resolution? You might have a look at the logic to see how it chooses logos from edk2-nvidia/Silicon/NVIDIA/Assets/*.bmp to put on the screen. It is curious that it would work with stock Jetpack, does nvdisp-init in there set the display with a different resolution?

In my case, I'm customizing by replacing 1080p, 720p, and 640x480 bitmaps in this location, and it does work.

picanteAvi commented 1 year ago

Looks like the nvdisp that comes with prebuilt package is setting it to 1024x768, but the locally built one is setting it to 640x480. The image for 640 exists in the path you mentioned though.

prebuilt (working):

[0003.453] I> width = 640, height = 480, frequency = 25174825
[0003.454] I> width = 640, height = 480, frequency = 25174825
[0003.454] I> width = 1024, height = 768, frequency = 65000000
[0003.455] I> width = 1024, height = 768, frequency = 65000000
[0003.459] I> width = 1600, height = 1200, frequency = 162000000
[0003.464] I> Best mode Width = 1024, Height = 768, freq = 65000000

local build:

[0003.495] I> width = 640, height = 480, frequency = 25174825
[0003.496] I> width = 640, height = 480, frequency = 25174825
[0003.496] I> width = 1600, height = 1200, frequency = 162000000
[0003.496] I> Best mode Width = 640, Height = 480, freq = 25174825

Have you tried it using the stock NVIDIA images? Does it work for you with the edk2-firmware-tegra build? Is changing the logo images the only modification you made? That seems odd.

kekiefer commented 1 year ago

I’ve only been using the source build, and as far as uefi goes replacing the bitmaps was my only change.

My nvdisp-init probably does follow a different path, because I have some minor modifications to get the display set up on DisplayPort. This precludes me from using my system’s display with stock jetpack. That said, at the point where edk2 gets the frame buffer, I doubt it knows the difference.

Hopefully someone else can pitch in here with additional data points. Have you tried a different display?

picanteAvi commented 1 year ago

I think i resolved it. 0005-nvdisp-init.patch needs to updated. Below patch is from the jetpack 35.3.1 release and it includes updates to hdmi modes and minimum resolution uefi supports nvdisp-init-patch.txt

madisongh commented 1 year ago

Thanks, @picanteAvi ... I've refreshed that patch in the R35.3.1-based branches in meta-tegra, and it will get picked up on the next submodule update here in the distro.