PCI Endpoint 框架、Function 与 ConfigFS

PCI Endpoint 框架、Function 与 ConfigFS

1. Host 与 Endpoint

RC 模式扫描总线、分配 BAR 并驱动对端设备;EP 模式则让本 SoC 在另一台 Host 看来是一张 PCIe 卡。Endpoint Framework 分为:

1
2
3
EPC driver       硬件控制器:BAR、地址窗口、IRQ、链路
EPF driver 对外功能:测试、NTB、厂商协议
ConfigFS 用户配置:创建 Function、绑定 EPC

核心对象为struct pci_epcstruct 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
2
3
4
5
6
7
8
9
pci_epf_create("pci_epf_test")
-> EPF driver match/probe
-> pci_epc_add_epf()
-> pci_epf_bind()
-> EPF 分配 BAR/内存
-> pci_epc_write_header()
-> pci_epc_set_bar()
-> pci_epc_map_addr()
-> pci_epc_start()

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:

  1. 在 functions 下创建某类 EPF 实例;
  2. 设置 vendor/device ID、BAR 等属性;
  3. 在 controllers 下将 Function 链接到 EPC;
  4. 写 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。

文章互动

阅读 --

留言

0 条留言

正在加载留言…