PCI Endpoint 框架、Function 与 ConfigFS
1. Host 与 Endpoint
RC 模式扫描总线、分配 BAR 并驱动对端设备;EP 模式则让本 SoC 在另一台 Host 看来是一张 PCIe 卡。Endpoint Framework 分为:
1 | EPC driver 硬件控制器:BAR、地址窗口、IRQ、链路 |
核心对象为struct pci_epc、struct pci_epf及二者之间的pci_epf_link关系。
2. 目录组成
| 文件 | 职责 |
|---|---|
endpoint/pci-epc-core.c |
EPC 注册、start/stop、BAR、映射和 IRQ API |
endpoint/pci-epc-mem.c |
EPC outbound 地址空间分配器 |
endpoint/pci-epf-core.c |
EPF device/driver 总线、bind/unbind |
endpoint/pci-ep-cfs.c |
ConfigFS 控制平面 |
endpoint/functions/pci-epf-test.c |
测试 Function |
endpoint/functions/pci-epf-ntb.c |
NTB Function |
endpoint/functions/pci-epf-vntb.c |
Virtual NTB |
需要特别区分:本树controller/dwc/pcie-dw-ep-rockchip.c虽然复用pcie-designware-ep.c的 DWC EP 底层能力,但它没有注册标准pci_epc。它提供厂商 misc 设备/dev/pcie_ep及 ioctl/mmap/DMA 接口,因此不能直接通过本章所述 ConfigFS 组装 EPF。标准 EPC/EPF 框架和 Rockchip 厂商 EP 数据面是两条并存的软件路径。
3. EPC 注册
控制器驱动准备struct pci_epc_ops并调用devm_pci_epc_create()或pci_epc_create()。ops 典型包括:
write_header;set_bar/clear_bar;map_addr/unmap_addr;raise_irq;start/stop;get_features。
EPC Core 只做锁、参数校验和转发,实际寄存器与 iATU 编程由控制器实现。
4. EPF 生命周期
1 | pci_epf_create("pci_epf_test") |
pci_epf_bind()位于pci-epf-core.c:91。解绑时必须先停止对端访问,再撤销映射、BAR 和内存;Host 可能仍缓存 BAR 或保持 DMA,产品协议应提供停机握手。
5. EPC 操作入口
pci-epc-core.c中:
pci_epc_start():192 行;pci_epc_stop():175 行;pci_epc_write_header():563 行;pci_epc_set_bar():522 行;pci_epc_map_addr():461 行。
这些 API 按 Function Number/Virtual Function Number 定位功能。并非所有 EPC 都支持所有 BAR 大小、64 位 BAR、MSI-X 或多 Function,EPF 应先查询 features。
6. 地址方向
EP 视角容易混淆:
- inbound:Host 访问 EP BAR,EPC 将 PCIe 地址映射到 EP 本地内存;
- outbound:EP CPU/DMA 访问 Host 地址,EPC 将本地窗口映射为 PCIe Memory TLP;
- BAR 本身只描述 Host 可见 aperture,不自动分配业务协议缓冲;
- DWC iATU region 数量有限,映射生命周期必须受锁和引用约束。
7. 中断
EPF 可调用pci_epc_raise_irq()向 Host 发:
- Legacy INTx;
- MSI;
- MSI-X。
Host 必须先完成相应 Capability 配置。EP 不能在 Host 尚未启用 MSI 时直接假设消息地址有效;链路重训或 Host reset 后也需重新建立状态。
8. ConfigFS
启用CONFIG_PCI_ENDPOINT_CONFIGFS后,一般通过 ConfigFS:
- 在 functions 下创建某类 EPF 实例;
- 设置 vendor/device ID、BAR 等属性;
- 在 controllers 下将 Function 链接到 EPC;
- 写 start 启动链路/功能。
ConfigFS 是配置和组装接口,不是高速数据通道。数据面由 BAR 共享内存、DMA、doorbell 和 Function 定义的协议完成。
9. pci_epf_test
测试 Function 通常提供:
- BAR 读写校验;
- EP→Host、Host→EP copy;
- Legacy/MSI/MSI-X 触发;
- checksum 和状态寄存器。
Host 侧测试驱动不在本目录 Core 中。测试通过只能证明当前 BAR/IRQ/DMA 路径基本可用,不能替代掉电恢复、并发、IOMMU 和恶意输入测试。
10. RK3588 注意事项
- RC 与 EP compatible、DTS 节点和驱动不同,不能同时把同一控制器当两种角色;
rockchip_linux_defconfig含 DWC EP 和 DMA test,而具体产品配置可能裁剪;- RK3588 EP demo DTS 使用
rockchip,rk3588-pcie-std-ep或厂商 EP compatible; - 本树该 compatible 匹配的
pcie-dw-ep-rockchip.c注册/dev/pcie_ep,应用接口应参考同目录《rockchip-pcie-ep应用层数据传输接口》,不能假定存在 ConfigFS EPC controller; - PERST#在 EP 模式通常由 Host 控制,方向与 RC 模式不同;
- refclk、PHY mode、lane mapping、供电及 link training 必须先正确,之后才讨论 ConfigFS 或厂商 misc 控制面。
11. 安全边界
Host 可写 EP BAR,所有长度、offset、opcode 都应视为不可信;EP 发起 outbound DMA 时必须限制 Host 地址范围。共享内存状态机应有版本、长度、所有权和超时字段,避免 Host reset 后继续消费旧 descriptor。
正在加载留言…