The Orin module has 22 lanes of PCIe.
What PCIe devices does it support? What drivers are available for these?
Is a custom driver needed for each device?
The question is a bit open ended, so it isn’t possible to give a complete answer. The gist of how PCIe works though would probably answer a lot of this.
The PCI protocol and bus is fairly standard, and acts only as an intelligent pipe which can query end point devices. The PCIe part is just the added PHY which serializes, and can be ignored for the purposes of what is supported or not in software. Bottom line, PCIe is supported for anything following PCIe standards, but this is just the data pipe.
What the end point device query does is to announce information about the device for the rest of the system to decide what to do with the device. In that sense there is virtually nothing PCIe not supported via PCI protocol, but that’s only the data pipe end.
Once the device is announced, then the kernel must find drivers which can support the device (mostly not caring that the device has a PCIe bus doing the talking). For example, a custom network device might use the same driver to talk to a USB version as it does to talk to a PCIe version (there would be code to know about talking to USB or PCIe, but the chipset support would be virtually identical).
If the Linux kernel has support for that chipset, then it won’t matter that this Jetson is used as the hardware surrounding the device. During boot, prior to the Linux kernel running, the boot system would have to have its own driver (which might be the same or a simplified version of the driver the Linux kernel uses). PCIe is indeed fully supported in the boot stages, but similar to Linux, one would need specific chipset driver support in this independent boot environment if the device is needed to boot.
A side-effect example would be that if you are booting from some custom RAID device, and if the bootloader has a driver for this, then using that device for rootfs is likely simple. If such a driver existed for USB, but not PCIe, then the controller would have to be USB for boot, but could still work fine once Linux loads if Linux has the driver for both PCIe and USB versions (but it isn’t a PCIe driver, nor is it a USB driver…it is just a chipset driver the surrounding environment is able to know to take advantage of once the data pipe reports what is there),
A typical problem of not having a driver within boot stages, but having such a driver within Linux, would be using an initial ramdisk (initrd) to run a simple Linux system in which has the needed driver, and then to pivot_root to the new device to transfer control (the initrd can be an adapter to the bootloader which the bootloader always understands, and use drivers the bootloader needs but doesn’t have).
Many common chipsets will have support out of the box simply because the driver is part of the kernel in the base Ubuntu distribution. Embedded systems don’t have as much storage resource though in comparison to a desktop PC, and so less common drivers won’t be there by default. It would be a mistake to suggest it is the Jetson which does or does not support this though, it is just a case that when you need a driver which exists, but is not installed, to simply install it. Often on a PC this might be automated to search for and find a new driver, but for an embedded system, this is typically a case of the end user needing to copy the kernel module with the driver to the correct location. That file in turn probably requires compiling this from the kernel source (which isn’t particularly hard, but you’d need to do this one to convince yourself due to a few details the average software build would not care about).
So the main question about support for a PCIe device on a Jetson is no different than it is for a PC: Is there a driver available in the Linux kernel? If there is only a manufacturer’s proprietary binary driver, then the driver would have to work with the Jetson’s current kernel release, and arm64/aarch64 architecture (which differs from a PC’s x86_64/amd64 architecture).
Thanks for the detailed and helpful response.
Please excuse my ignorance, I am a hardware engineer so I do not know much about these things.
So it sounds like we can use any add in PCIe card, connect it to the Orin PCIe lanes and it should work as long as there a driver available for the OS we are using?
That is correct. There might be some cases where the card requires extra firmware, but that’s rare. Also, some PCIe cards might need an external power source as well.
Thanks for the great info!
This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.