RK3588 kernel-6.1 — Rockchip PCIe EP 模式应用层数据传输接口

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.hinclude/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 的 BARMMIO/DMA;EP 侧若在用户态访问同一块内存,需 自写内核模块导出 mmap,或通过 已存在的 EP function 驱动暴露接口。

4. DesignWare EP:/dev/pcie_ep

驱动drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c
节点miscdevicename = "pcie_ep"/dev/pcie_ep

4.1 使用顺序(概要)

  1. open("/dev/pcie_ep")
  2. ioctl(PCIE_EP_SET_MMAP_RESOURCE, &res) — 选择下一次 mmap 映射的资源(见 enum pcie_ep_mmap_resourcerk-pcie-ep.h
  3. mmap(...) — 将选中资源的 物理窗口映射到进程虚拟地址
  4. 视需要 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_VERSIONPCIE_EP_DMA_XFER_BLOCK连续缓冲 alloc/freePCIE_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_infork-pcie-ep.h):约定可放在 BAR0 的结构体(magic PCIE_EP_OBJ_INFO_MAGIC),含 mode/submodemsi_datairq/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
节点miscdevicename = "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.hmmap(local_mem)PCIE_DMA_START、读写缓冲索引、PCIE_DMA_WAIT_TRANSFER_COMPLETE 等。
  • 语义:在 本地 DRAM 地址PCI 总线地址 之间用 控制器内置 UDMA 搬运数据;需 对端配合映射/缓冲区约定,多用于 双芯片 DMA 演示或专用传输,不是标准 PCI Endpoint 类驱动的通用模型。

6. 应用选型建议

场景 推荐接口
EP SoC 用户态直接读写「与 RC 共享的 BAR backed 内存」 /dev/pcie_epPCIE_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-devrk-pcie-ep.h 要点、与 pcie-rockchip-ep.c 区别

文章互动

阅读 --

留言

0 条留言

正在加载留言…