Fork me on GitHub
侧边栏

PCIe总线-RK3588 PCIe平台驱动分析

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函数的执行流程如下图所示,主要的工作有:

  1. 设置dw_pcie_ops回调函数,主要用于开始链路循环和查询链路训练是否成功
  2. 从设备树中解析并处理资源,如解析并映射"pcie-dbi"、"pcie-apb"地址,获取PERST#的GPIO和延时时间,延时时间默认为200毫秒。
  3. 获取sys中断编号,注册sys中断处理函数。sys中断的处理函数为rk_pcie_sys_irq_handler
  4. 创建处理INTx中断的irq_domain,将INTx中断映射为虚拟中断。
  5. 获取legacy中断(INTx)编号,注册legacy中断处理函数。同时屏蔽所有INTx中断。legacy中断的处理函数为rk_pcie_legacy_int_handler
  6. 根据设备树配置的模式,设置PCIe模式(通过PCIE_CLIENT_GENERAL_CON寄存器设置)。RC模式,还需要配置CLKREQ#,disable L1 PM Substates。
  7. RC模式,调用rk_add_pcie_port函数初始化。
  8. EP模式,调用rk_pcie_add_ep函数初始化。
  9. 配置DMA功能。

image

posted @ 2025-03-22 17:45  yooooooo  阅读(710)  评论(0)    收藏  举报