1.简介
RK3588 PCIe RC和EP使用同一个平台驱动,其主要的作用是解析设备树中的资源、初始化中断、使能电源、初始化PHY、使能时钟和释放复位,然后根据compatible
属性初始化RC或者EP驱动。
2.入口
平台驱动的定义如下,当compatible
属性为"rockchip,rk3588-pcie"
,则初始化RC驱动,当compatible
属性为"rockchip,rk3588-pcie-ep"
,则初始化EP驱动。入口函数为rk_pcie_probe
。
[drivers/pci/controller/dwc/pcie-dw-rockchip.c]
static const struct rk_pcie_of_data rk_pcie_rc_of_data = {.mode = RK_PCIE_RC_TYPE,
};static const struct rk_pcie_of_data rk_pcie_ep_of_data = {.mode = RK_PCIE_EP_TYPE,
};static const struct of_device_id rk_pcie_of_match[] = {{.compatible = "rockchip,rk1808-pcie",.data = &rk_pcie_rc_of_data,},{.compatible = "rockchip,rk1808-pcie-ep",.data = &rk_pcie_ep_of_data,},{.compatible = "rockchip,rk3568-pcie",.data = &rk_pcie_rc_of_data,},{.compatible = "rockchip,rk3568-pcie-ep",.data = &rk_pcie_ep_of_data,},{.compatible = "rockchip,rk3588-pcie",.data = &rk_pcie_rc_of_data,},{.compatible = "rockchip,rk3588-pcie-ep",.data = &rk_pcie_ep_of_data,},{},
};MODULE_DEVICE_TABLE(of, rk_pcie_of_match);
static struct platform_driver rk_plat_pcie_driver = {.driver = {.name = "rk-pcie",.of_match_table = rk_pcie_of_match,.suppress_bind_attrs = true,.pm = &rockchip_dw_pcie_pm_ops,},.probe = rk_pcie_probe,
};module_platform_driver(rk_plat_pcie_driver);
3.初始化流程
驱动的初始化函数rk_pcie_probe
可以直接调用,也可以放在内核线程执行(配置CONFIG_PCIE_RK_THREADED_INIT选项)。rk_pcie_probe
函数的执行流程如下图所示,主要的工作有:
- 设置
dw_pcie_ops
回调函数,主要用于开始链路循环和查询链路训练是否成功 - 从设备树中解析并处理资源,如解析并映射"pcie-dbi"、"pcie-apb"地址,获取PERST#的GPIO和延时时间,延时时间默认为200毫秒。
- 获取sys中断编号,注册sys中断处理函数。sys中断的处理函数为
rk_pcie_sys_irq_handler
。 - 创建处理INTx中断的
irq_domain
,将INTx中断映射为虚拟中断。 - 获取legacy中断(INTx)编号,注册legacy中断处理函数。同时屏蔽所有INTx中断。legacy中断的处理函数为
rk_pcie_legacy_int_handler
。 - 根据设备树配置的模式,设置PCIe模式(通过PCIE_CLIENT_GENERAL_CON寄存器设置)。RC模式,还需要配置CLKREQ#,disable L1 PM Substates。
- RC模式,调用
rk_add_pcie_port
函数初始化。 - EP模式,调用
rk_pcie_add_ep
函数初始化。 - 配置DMA功能。
参考资料
- PCIEXPRESS体系结构导读
- PCI Express technology 3.0
- PCI Express® Base Specification Revision 5.0 Version 1.0
- Rockchip RK3588 TRM
- PCI Express® Base Specification Revision 5.0 Version 1.0
- Rockchip RK3588 TRM
- Linux kernel 5.10