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.