SOLUTION/TUTORIAL: Jetson ORIN Enabling PCIE power

Hi quite a few posts regarding enabling PCIE power:

This post is meant for anyone who is struggling to get it done. This is how I have enabled power to my PCIE port .

1.) Go to this website Jetson Linux 34.1 | NVIDIA Developer and download L4T Driver Package (BSP) Sources and extract them:

tar -xvf public_sources.tbz2
cd Linux_for_Tegra/source/public
tar –xjf kernel_src.tbz2

2.) The provided patch was only a guide for me on what to change. I went directly to the said folders and changed the needed parameters:
2.1) Find the file tegra234-p3737-fixed-regulator.dtsi, it is in ./Linux_for_Tegra/source/public/hardware/nvidia/platform/t23x/concord/kernel-dts/cvb
Open it and find this entries:
- p3737_vdd_3v3_pcie: regulator@105 - Remove the flag “regulator-boot-on” and change the pin to TEGRA234_MAIN_GPIO(H, 4)
- p3737_vdd_12v_pcie: regulator@114 - Remove the flag “regulator-boot-on”
2.2) Find the file tegra234-p3737-pcie.dtsi, it is in ./Linux_for_Tegra/source/public/hardware/nvidia/platform/t23x/concord/kernel-dts/cvb
Open it and find this entry:

  • pcie_ep@141a0000 - Replace the
    nvidia,refclk-select-gpios = <&tegra_aon_gpio TEGRA234_AON_GPIO(AA, 4) GPIO_ACTIVE_HIGH>;
    with the
    nvidia,refclk-select-gpios = <&tegra_main_gpio TEGRA234_MAIN_GPIO(Q, 4) GPIO_ACTIVE_HIGH>;

3.) Build the kernel following this guide you can do this directly on Orin if your main computer is slow.

4.) After building go in the kernel_out and find the file tegra234-p3701-0000-p3737-0000.dtb and save it somewhere(USB, mail…)

5.) If you have done the building on the Orin move the tegra234-p3701-0000-p3737-0000.dtb to the PC running native Linux, in my findings the virtual machines don’t work. Make a fresh Orin install. I haven’t done the next step on older(not fresh) Orin install but I don’t see why it shouldn’t work.

6.) Boot the Orin and login in. Copy the built file tegra234-p3701-0000-p3737-0000.dtb to the /boot/dtb. Edit the /boot/extlinux/extlinux.conf - Change the path under FDT to /boot/dtb/tegra234-p3701-0000-p3737-0000.dtb

7.) Reboot and it should work

I have attached my tegra234-p3701-0000-p3737-0000.dtb, I am not sure if this file is compatible with all the Orins. If somebody tries this, please let it known
tegra234-p3701-0000-p3737-0000.dtb (300.2 KB)

Take this guide with a grain of salt, I am nowhere close to being good at Linux. I hope I haven’t missed a step or made a big mistake. This procedure worked for me flawlessly.

I hope this guide saves someone precious hours/days

3 Likes

Great! Thanks for your sharing to the community!

Hi dv6386,

Thank you so much for posting this. I too was unable to get the PCIe slot on my Orin dev kit working, even after attempting the device tree changes in your post and the other posts you linked. However, I finally got my slot working after using your DTB file, so I appreciate you including it in your post!

I think the issues I experienced were in the DTS preprocessing steps. I decompiled my DTB and made the four changes you listed, but they didn’t work for me. After I tested your DTB file and it worked, I ended up decompiling your file and using the DTS source to figure out which changes I needed to make without the need to preprocess.

The GPIO changes you list require DTS preprocessing because of the use of the TEGRA234_MAIN_GPIO directive. If anyone else is having issues with preprocessing, here are the raw GPIO values that can be used instead:

  1. regulator@105 - change the gpio field to gpio = <0x14 0x3c 0x00>;
  2. pcie_ep@141a0000 - change the nvidia,refclk-select-gpios field to nvidia,refclk-select-gpios = <0x14 0x7c 0x00>;

After making these changes as well as the two removals of the regulator-boot-on flags, I compiled my DTS into a DTB and flashed the Orin. Once the Orin booted up, I ran the lspci command and saw that my PCIe card was being detected.

1 Like

Thank you so much, steps 1-5 didnt work for me so I flashed an orin with Jetson Linux 34.1.1 and started from step 6. I have been stuck on this for awhile and copying over the tegra234-p3701-0000-p3737-0000.dtb file and changing the path worked for me.

Thank you!!!

1 Like

Thanks for your opinion. But my verison is R35.5.0, and jetpack verison is 5.1.3, when I use your DTB file, the Orin can not boot up and the keyboard is unresponsive, and the monitor is black. And also I find that I can not enter the recovery mode, I don’t know what should I do

This thread is from about 3 years ago, so you should probably start a new thread. Incidentally, if you have a carrier board from a third party, and not from the NVIDIA developer’s kit, then you likely need different firmware. When the firmware is wrong it tends to show up as parts of the hardware not function. The keyboard not working is one of the typical failures. So when you start a new thread be sure to state if your carrier board is from a developer’s kit. Typically, if that isn’t the issue, you’ll be asked to get a serial console boot log (instructions can vary with type of Jetson).

Thanks. I will start a new thread to ask. Anyway, my device is Jetson AGX Orin Developer’s Kit 64GB. How can I get the serial console boot?

See:
https://developer.ridgerun.com/wiki/index.php/NVIDIA_Jetson_Orin/In_Board/Getting_in_Board/Serial_Console

That article uses minicom, and this is the oldest and most commonly used serial program. It works even without a GUI. However, it is from long ago when it was used with dial-up modems (this was when people had to stick their feet through the floor of their car for brakes 😂) and equipment which used “AT” codes, so for just serial console I prefer gtkterm if there is a GUI (“sudo apt-get install gtkterm” if you want to try this one). This runs on your host PC, not the Jetson; you’re basically putting the keyboard and drivers for the keyboard on your other computer, which means your other computer can log the session more easily (it is a function of the program like minicom or gtkterm). On Windows most people use PuTTY, which also happens to work on Linux (different install of course).

Whenever a serial UART (serial console is just a UART specializing in keyboard interaction) attaches there is a file created in “/dev” on the host PC. The name depends on the serial UART manufacturer. For FTDI brand it would be some numbered “/dev/ttyUSB#”. For the one on the Orin I think it is a “/dev/ttyACM#”. If the device special file used on the host PC is /dev/ttyACM0, then this would be the information any serial console program wants:

  • Speed 115200
  • 8-bits, no parity, one stop bit.
  • No CTS/RTS flow control.
  • Connect to /dev/ttyACM0.

That URL shows how to set those on minicom. To do this with gtkterm you’d use this command line:
gtkterm -b 8 -t 1 -s 115200 -p /dev/ttyACM0

The GUI can also be used for setup, and a lot of other programs can do the job. In the GUI of gtkterm it is simple to find the “clear screen” and then “log to file”. Sadly, you might need to create the file first like this if using gtkterm:
touch ~/Downloads/serial_log.txt