PCIe定义了很多的Cap.
但大多数人只用到了其中一些最常用的,比如MSI/MSIX, PMC, ARI, PCI express, PASID等等
还有很多Cap, 没有深入了解的实践机会, 比如LTR, OBFF, TPH, 等等,等等,非常之多。
另外一些Cap, 比如AER, DPE/eDPC, ACS, ATS, SRIOV有一点点了解。
ATS, PASID可以看成TA(translation agent), ATPT(address trans and protection talbe), ATC的一个有机整体组合。(TA+ATPT = IOMMU)
EP通过ATS从TA取得translated的地址保存于ATC中,之后减轻了AT的负担。
PASID针对于GVA到SPA的地址映射,作为TA中GCR3的index在使用(BDF, PASID, GVA),相较于GPA到SPA的(BDF, GPA)
ACS与SRIOV上一个日志,有过一些讨论
2021,Dec日志-GPU,DPU,IO虚拟化_笃行笔记的博客-CSDN博客
AER/DPC
Linux内核有相应的支持
pcie « pci « drivers - kernel/git/torvalds/linux.git - Linux kernel source tree
PCI « Documentation - kernel/git/torvalds/linux.git - Linux kernel source tree
在PCI express Cap中有关于(CE, UCE Fatal/Non-Fatal,UR)的相应控制与状态Registers
AER则将各error的控制,Severity, 状态, 及LOG, Source,进一步细化与升级(有一点点类似MSI到MSI-X的演进)
其中,有类似advisory-non fatal从UCE到CE的转化,是一个特殊情况
x86的BIOS也参与到AER的信息收集工作中,就是典型的OS-first还是FW/BIOS-first
无论是OS-first或者FW-first,Linux的AER/DPC则通过pcie_do_recovery运行一个简单的状态机,执行struc pci_driver中注册的struct pci_error_handlers (detected, mmio_en, link_reset, slot_reset, resume etc.)