How to configue the PCI-E bus to PCI-e2.0?

Hi Expert,

NX PCI-E is 3.0 capable. In our embedded design, we don’t want so high speed. To keep the system low risk, we want to decrease the PCI-E bus from 3.0 (8GT) to 2.0(5GT), how to configure it? So the PCI-E negotiation will be up to PCI-E 2.0.

Thanks
Peter

If your device is only a v2 device, then there is no need to do anything.

If you run the command “lspci” you will see a slot assigned for that device. It’ll have a format similar to “00:01.1”. You can then tell lspci to limit its response to that slot. Adjust for your particular result, and post the result of this command:
sudo lspci -s 00:01.1 -vvv

From this it should be easy to see what the device capabilities actually are.

If the device turns out to be capable of higher speeds, then someone can help. If the device shows as only v2 capable, then nothing will be required.

Hi,

Thanks, our device is V3 capable, and the result is V3 speed. We want to limit it to V2 speed from the host.

Peter

Keep in mind with what follows that there are different requirements and methods of changing a device tree. In part it depends on if you have an eMMC model versus SD card model, and also may have different requirements depending on whether it is a dev kit versus a third party carrier board.

When it boots, can you see a mention of that device’s address? If you look at the device tree by examining files under “/proc/device-tree” you will find several “pci” nodes. For illustration:
find /proc/device-tree -type d -name 'pci*'

One of those addresses corresponds to the PCIe device you are interested in. One of the values within this (but perhaps not set until you add it) is “max-speed”. You might find this document of interest (search for “max-speed”):
https://readthedocs.org/projects/devicetree-specification/downloads/pdf/stable/

The relevant “pcie@...” device will have a key/value pair such as “nvidia,max-speed = <0x4>”. To experiment I recommend reverse compiling your existing tree from the running Jetson with your device installed (if you don’t have “dtc”, then “sudo apt-get install device-tree-compiler”):
dtc -I fs -O dts -o extracted.dts /proc/device-tree

Then look at “extracted.dts”, and search for anything “pcie@”. For example:

less -i extracted.dts
/pcie[@]

Within this block you will find something similar to the earlier mentioned:
nvidia,max-speed = <0x4>

You’ll need to edit your existing tree to change this (if you have a flash log it should tell you which dtb was flashed). I am not certain of the correct value, so someone from NVIDIA may need to comment, but I think “0x4” is gen. 4, and so probably you’d want “0x2” (again, I am uncertain of this particular value, but researching the TRM is probably the authoritative reference on the value). I do not know which base address (which is what the number part is in “pcie@number”) for your particular device, but you will probably find clues in boot logs. Someone else may be able to tell you a more logical way of finding the right entry.

You’ll want to be careful about updating your device tree. There is more than one way of updating this, and one method can break or override another method. The safest test is to use “/boot/extlinux/extlinux.conf” and create a new boot entry which is a duplicate of the existing boot entry, and then use serial console to pick the alternate boot entry at boot. That entry would add or alter the “FDT” key/value pair.

If a Jetson has only a partition for the device tree, and it does not have the FDT entry, then you’d need to modify the partition itself via a flash command. On the other hand, if you add the FDT entry yourself, then this will override the partition and avoid the need to flash anything. The FDT entry has no requirement to flash, it is just a file copy and edit of extlinux.conf (provided you have a serial console to pick that entry this is the simplest and safest way to test).

You will need to have the correct device tree, edit that, put it in “/boot”, perhaps in “/boot/dtb/”, include a new entry with FDT naming the file path, and then boot to that entry. This should test it.

To verify your entry is correct you should examine “/proc/device-tree” to see if the edit made its way in. If it made its way in, then the verbose lspci should reflect the change by having nothing over “5GT/s”. 2.5GT/s is gen. 1, 5GT/s is gen. 2, and 8GT/s is gen. 3.