与其用华丽的外衣装饰自己,不如用知识武装自己 –马克思
PCIe wiki
PCI Express Port Bus Driver Support for Linux
PCIe driver development for Exynos SoC
DM81xx_AM38xx_PCI_Express_Endpoint_Driver_User_Guide
DWC pcie reference mannual
PCIe tutorial
深入PCI与PCIe之二:软件篇
PCIe设备枚举流程
在reset之后,通过检测device_type输入进入到RC或者EP模式,CDM内部配置寄存器为复位值。
LTSSM前配置:keep the app_ltssm_enable signal deasserted after reset until the application is ready to establish a Link and start receiving and transmitting TLPs,在这个阶段通过DBI配置好配置寄存器。
开始LTSSM:assert app_ltssm_enable to allow the LTSSM to begin Link establishment
PIPE口,和usb3.0一样。建立链路后,Data Link module发起flow control initialization,完成后通知transaction layer module可以发送接收TLP。
支持传统中断intr和MSI
分为两个phase:初始化和更新。VC0的初始化跟着Link初始化,在发起正常传输之前完成。
完成AMBA memory space到PCI memory space的转换,包括transmit地址转换和receive地址转换
针对switch或者多个port的RC,PCIe支持port到port传输,而不用endpoint-to-root或者root-to-endpoint(这里有个问题,port和endpoint以及root的hierachy是怎样的)
支持PCI Express 2.0 specification中所有非optional feature。
支持多个系统镜像共享PCIe硬件资源,通过CX_SRIOV_ENABLE
开启。包括Function Level Reset(FLR)和Alternate Routing ID Interpretation(ARI)
62.5MHz/125MHz/250MHz/500MHz,所有core的输入信号(除了reset信号)和这个clock同步。
pipe上的信号由这个时钟同步,为125MHz或者250MHz,影响freq_step module
复位core,除了PMC模块
用于PMC域
复位PMC模块,用于上电时的冷复位,会复位aux_clk
域的所有寄存器。
复位所有configuration register space中的sticky bit registers。
复位configuration register space中所有non-sticky bit registers。
给下游设备发送一个Hot Reset。
延迟配置请求直到初始化完成,EP有效。
Hot Reset from upstream component
每个function有4096 bytes配置空间,分为:
包括PF(Physical Function) register map和VF(Virtual Function) register map。
应用通过DBI访问配置寄存器,Bits[11:0]选择target function,Bits[18:16]选择target physical function(在没有使能SR-IOV的情况下)。否则通过dbi_func_num
和dbi_vfunc_num
表征是哪一个PF或者VF。
配置空间映射:分为PF和VF
PF PCI Standard Capability Structures Register
PF PCI Express Extended Capability Register
VF PCI-Compatible Configuration Header Register
VF PCI Standard Capability Structures Register
每个function有4K Bytes配置空间,分为:
PCIe有三个独立的地址空间:mem空间、I/O空间和配置空间,对每个设备都有其配置空间,通过ID寻址(USB通过协议通信,实际上在文件系统中,都统一为ID寻址,通过总线/设备/接口进行标识,PCIe的function对应usb的interface)。
designware的PCIe driver在内核中位于drivers/pci/host/pcie-designware.c
,像samsung exynos的PCIe host驱动为同目录下pci-exynos.c
。
这里的pcie-designware.c
只是作为一个接口库供驱动调用,并不向kernel注册设备(usb dwc3自己是一个platform device,然后再去probe厂商定义的usb device)。
时钟和mem地址映射
clk name | description |
---|---|
pcie clk | |
pcie bus clk | |
elbi base | Customer defined mem region |
phy base | phy寄存器基址 |
block base | ?? |
irq | 中断号 |
msi irq | 如果支持msi的话,配置对应的中断号 |
配置空间地址 | 内核中通过pcie_port管理 |
dbi base | 配置空间基址 |
mem base | mem空间基址 |
num of lanes | 几条lane |
procedure | description |
---|---|
host init | 初始化RC,根据驱动参数进行配置,建立链路 |
scan | 扫描设备 |
参考自drivers/host/pci-exynos.c
procedure | description |
---|---|
assert core reset and phy reset | |
de-assert phy reset | |
power on phy | |
initialize phy | |
pulse for common reset | |
de-assert core reset | |
setup root complex | 设置configuration space header |
enable ltssm | 开始链路训练 |
在pcie-designware.c
中通过调用pci_scan_root_bus_msi
(使能了MSI)或者pci_scan_root_bus
,然后进到pci/probe.c
。
PCIe设备枚举流程
DLLP是由Data Link Layer管理的数据包,包括NAK,High Priority ACK, Flow Control, Vendor Control, Power Management。
abbreviation | description |
---|---|
DLLP | Data Link Layer Packets |
DBI | Data Bus Interface |
CDM | Configuration-Dependent Module |
LBC | Local Bus Controller |
ELBI | External Local Bus Interface |
iATU | Internal Address Translation Unit |