RK3588 kernel-6.1 — Rockchip PCIe EP 模式应用层数据传输接口
1. 文档目的
说明在 PCIe Endpoint(EP) 场景下,用户态应用可通过哪些内核暴露的接口与 Root Complex(RC) 或片上逻辑交换数据;并区分 pcie-rockchip-ep.c(老式 AXI EP)与 pcie-dw-ep-rockchip.c(DesignWare EP,RK3568/RK3588 常用)。
源码基准:rk3588/kernel-6.1/
用户态头文件:include/uapi/linux/rk-pcie-ep.h、include/uapi/linux/rk-pcie-dma.h
2. 两条 EP 驱动路径对照
| 项目 | pcie-rockchip-ep.c |
dwc/pcie-dw-ep-rockchip.c |
|---|---|---|
典型 compatible |
rockchip,rk3399-pcie-ep |
rockchip,rk3588-pcie-ep 等 |
| 内核框架 | pci_epc + pci_epf_* |
DWC dw_pcie + Rockchip 封装 |
专用 /dev 字符设备 |
无 | /dev/pcie_ep |
片上 UDMA (pcie-dev) |
本文件不注册 | rockchip_pcie_init_dma_trx() 后可出现 /dev/pcie-dev |
结论:需要「打开设备 + mmap/ioctl」的典型应用接口,在 RK3588 上应看 DWC EP 驱动,而不是仅 pcie-rockchip-ep.c。
3. pcie-rockchip-ep.c — 应用层无法直接拿到 /dev
- 控制器驱动只实现
struct pci_epc_ops(写头、BAR、OB 映射、MSI/Legacy IRQ 等),不向用户空间注册 misc 设备。 - 配置与功能绑定走
pci_epf子系统(常见配合configfs:/sys/kernel/config/pci_ep/)或内核内的 EP function 驱动。 - 数据面:通常由 RC 侧映射 EP 的 BAR 做 MMIO/DMA;EP 侧若在用户态访问同一块内存,需 自写内核模块导出
mmap,或通过 已存在的 EP function 驱动暴露接口。
4. DesignWare EP:/dev/pcie_ep
驱动:drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c
节点:miscdevice,name = "pcie_ep" → /dev/pcie_ep
4.1 使用顺序(概要)
open("/dev/pcie_ep")ioctl(PCIE_EP_SET_MMAP_RESOURCE, &res)— 选择下一次mmap映射的资源(见enum pcie_ep_mmap_resource,rk-pcie-ep.h)mmap(...)— 将选中资源的 物理窗口映射到进程虚拟地址- 视需要
ioctl(PCIE_DMA_CACHE_INVALIDE / PCIE_DMA_CACHE_FLUSH)维护 CPU 与 DMA/RC 访问的缓存一致性
4.2 mmap 资源类型(节选)
pcie_ep_mmap_resource |
含义 |
|---|---|
PCIE_EP_MMAP_RESOURCE_DBI |
DBI(调试/寄存器访问,慎用) |
PCIE_EP_MMAP_RESOURCE_BAR0/1/2/5 |
Inbound BAR 在 EP SoC 侧对应的 DRAM 物理区:应用可对映射区 读写,与 RC 通过 PCIe 访问同一 BAR 的数据通路一致 |
PCIE_EP_MMAP_RESOURCE_CONTINUOUS_BUFFER 等 |
与连续缓冲相关 ioctl 配合 |
映射属性:BAR2 常用 writecombine;其它多为 noncached(见驱动 pcie_ep_mmap)。
4.3 pcie-dw-ep-rockchip.c 中已处理的 IOCTL(与头文件对照)
实现见 pcie_ep_ioctl();包含但不限于:
IOCTL(rk-pcie-ep.h) |
作用 |
|---|---|
PCIE_DMA_CACHE_INVALIDE |
dma_sync_single_for_cpu |
PCIE_DMA_CACHE_FLUSH |
dma_sync_single_for_device |
PCIE_DMA_IRQ_MASK_ALL |
写 DWC PCIe DMA 中断 mask |
PCIE_EP_RAISE_MSI |
触发 MSI(测试/通知 RC) |
PCIE_EP_SET_MMAP_RESOURCE |
设置 cur_mmap_res |
PCIE_EP_RAISE_IRQ_USER |
用户 IRQ 索引,配合对象协议 |
PCIE_EP_POLL_IRQ_USER |
轮询虚拟 ID / 状态 |
头文件中另有 PCIE_EP_GET_FUNC_DRV_VERSION、PCIE_EP_DMA_XFER_BLOCK、连续缓冲 alloc/free、PCIE_EP_SET_MMAP_RESOURCE_CONTINUOUS_BUFFER 等 —— 是否在你们内核的 pcie-dw-ep-rockchip.c 全部分支实现,请以该文件 switch(cmd) 为准;部分场景可能由 drivers/misc/rockchip/pcie-rkep.c 等模块补充。
4.4 BAR0 对象信息(协议层)
struct pcie_ep_obj_info(rk-pcie-ep.h):约定可放在 BAR0 的结构体(magic PCIE_EP_OBJ_INFO_MAGIC),含 mode/submode、msi_data、irq/dma 状态字等,供 RC 与 EP 应用做握手;与 PCIE_EP_RAISE_IRQ_USER / PCIE_EP_POLL_IRQ_USER 同属一套对象协议。
5. 片上 PCIe UDMA:/dev/pcie-dev
驱动:drivers/pci/controller/rockchip-pcie-dma.c
节点:miscdevice,name = "pcie-dev"
- 依赖
CONFIG_ROCKCHIP_PCIE_DMA_OBJ,且rk_pcie_dma_obj_probe()在 EP probe(如rockchip_pcie_init_dma_trx)或 RC probe 路径上成功执行。 - 接口:
include/uapi/linux/rk-pcie-dma.h—mmap(local_mem)、PCIE_DMA_START、读写缓冲索引、PCIE_DMA_WAIT_TRANSFER_COMPLETE等。 - 语义:在 本地 DRAM 地址 与 PCI 总线地址 之间用 控制器内置 UDMA 搬运数据;需 对端配合映射/缓冲区约定,多用于 双芯片 DMA 演示或专用传输,不是标准 PCI Endpoint 类驱动的通用模型。
6. 应用选型建议
| 场景 | 推荐接口 |
|---|---|
| EP SoC 用户态直接读写「与 RC 共享的 BAR backed 内存」 | /dev/pcie_ep:PCIE_EP_SET_MMAP_RESOURCE + mmap + 按需 PCIE_DMA_CACHE_* |
| 使用 Rockchip UDMA 固定缓冲协议与 RC 高速搬运 | /dev/pcie-dev + rk-pcie-dma.h |
仅 pcie-rockchip-ep.c + 无厂商扩展 |
无现成 /dev:RC 映 BAR + EP 侧内核 pci_epf 或自定义驱动 |
7. 相关文档
| 文档 |
|---|
| rk3588-kernel-6.1-rockchip-pcie-rockchip-rc-ep-dma分析.md |
8. 修订记录
| 日期 | 说明 |
|---|---|
| 2026-05-08 | 初版:pcie_ep / pcie-dev、rk-pcie-ep.h 要点、与 pcie-rockchip-ep.c 区别 |
正在加载留言…