PCIe总线-RK3588 PCIe RC初始化流程分析(十二)

news2025/7/6 19:09:50

1.简介

RK3588 PCIe RC的初始化涉及PCIe设备枚举、中断(INTx、MSI、MSI-X)配置、BAR配置、ATU配置、链路训练等,下面一一介绍。

2.初始化

当RC的模式为RK_PCIE_EP_TYPE时,平台驱动调用rk_add_pcie_port函数初始化RC,流程如下图所示,具体的工作有:

  1. 设置Host初始化回调函数结构体rk_pcie_host_ops,该结构体的实现和SoC硬件相关。
  2. 分配pci_host_bridge数据结构,并解析设备树中的"bus-range""ranges""dma-ranges"属性,后面详细分析该函数。
  3. 初始化中断
    1. 设置MSI/MSI-X中断控制器的irq_chip,该结构体用来响应、屏蔽、解除屏蔽、设置MSI/MSI-X中断功能。
    2. 创建MSI/MSI-X中断的第一级irq_domain,对应的irq_domain_opsdw_pcie_msi_domain_ops
    3. 创建MSI/MSI-X中断的第二级irq_domain,对应的msi_domain_infodw_pcie_msi_domain_info,第一级和第二级的irq_domain级联。
    4. 映射MSI Data的地址。
  4. 设置Root Bus配置空间访问方法为dw_pcie_ops,其他Bus的配置空间访问方法为dw_child_pcie_ops
  5. 初始化RC Port相关的配置和建立link。
    1. 初始化RC Port相关的配置。
      1. 设置速度、lanes数量、lanes的编号、link width,使能fast link。
      2. 关闭和屏蔽MSI中断。
      3. 设置RC Inbound BAR为64位P-MEM。
      4. 设置INTx中断为INTA#。
      5. 设置Primary、Secondary、Subordinate总线编号分别为0、1、0xFF。
      6. 使能IO、MEM、Bus Master、SERR。
      7. 配置OUT Bound MEM类型的ATU。主要设置Region的方向和编号、CPU低32位地址、CPU高32位地址、Region的大小、PCIe低32位地址、PCIe高32位地址、匹配的Function Number和TLP类型,最后使能Region。
      8. 配置OUT Bound IO类型的ATU。配置内容和步骤8一样。
      9. 设置RC Port的类型为PCI_CLASS_BRIDGE_PCI。
      10. 关闭RC Inbound的BAR0和BAR1。
    2. 建立link。
      1. 拉低PERST#,复位总线上的所有设备。
      2. 先关闭LTSSM,清除link状态,使能client reset or link down中断,最后使能LTSSM。
      3. 延时,CEM要求PERST#的时间至少为100ms+100us,这里延时200ms。
      4. 拉高PERST#,释放复位。
      5. 等待PCIe链路硬件link训练完成,建立link。
  6. 枚举PCIe总线,后面详细分析该函数。

RC初始化流程

如下图所示,pci_host_bridge数据结构的分配和桥地址资源的解析在devm_pci_alloc_host_bridge函数中,具体的工作有:

  1. 首先分配pci_host_bridge数据结构。
  2. 设置中断相关的回调函数,pci_common_swizzle用于处理PCI设备INTx#中断引脚路由的函数,将PCI设备中断引脚INTx#通过旋转的方式接到PCI Host主桥上。of_irq_parse_and_map_pci用于将INTx#中断号映射为Linux软件中断号。
  3. 请求资源。
    1. 从设备树中解析"bus-range"属性,即总线编号资源,同时转总线编号范围换成resource,最后添加到pci_host_bridge结构体中的windows链表中。
    2. 从设备树中解析"range"属性,即Outbound地址资源(CPU地址、PCI地址、MEM和IO地址类型),同时将地址资源换成resource,最后添加到pci_host_bridge结构体中的windows链表中。
    3. 从设备树中解析"dma-ranges"属性,即Inbound地址资源(CPU地址、PCI地址、MEM地址类型),同时将地址资源换成resource,最后添加到pci_host_bridge结构体中的windows链表中。

分配host_bridge

桥地址资源使用下面的回调函数解析。

[drivers/of/address.c]
static struct of_bus of_busses[] = {
#ifdef CONFIG_PCI
	/* PCI */
	{
		.name = "pci",
		.addresses = "assigned-addresses",
		.match = of_bus_pci_match,
		.count_cells = of_bus_pci_count_cells,
		.map = of_bus_pci_map,
		.translate = of_bus_pci_translate,
		.has_flags = true,
		.get_flags = of_bus_pci_get_flags,
	},
	......
};

static unsigned int of_bus_pci_get_flags(const __be32 *addr)
{
	unsigned int flags = 0;
	u32 w = be32_to_cpup(addr);

	if (!IS_ENABLED(CONFIG_PCI))
		return 0;

	switch((w >> 24) & 0x03) {
	case 0x01:
		flags |= IORESOURCE_IO;  // IO
		break;
	case 0x02: /* 32 bits */
	case 0x03: /* 64 bits */
		flags |= IORESOURCE_MEM; // MEM
		break;
	}
	if (w & 0x40000000)
		flags |= IORESOURCE_PREFETCH; // P-MEM
	return flags;
}

3.ATU

RC初始化的时候,会调用dw_pcie_prog_outbound_atu函数配置Outbound ATU region。每个ATU region有7组寄存器,分别是1个VIEWPORT寄存器、3组CTRL寄存器、1组BASE寄存器、1组TARGET寄存器、1组LIMIT寄存器。

3.1.VIEWPORT寄存器

ATU region的7组寄存器地址相同,设置某个region,由IATU_VIEWPORT_OFF寄存器设置。如下图所示,REGION_INDEX设置region的编号,REGION_DIR设置region的方向。

VIEWPORT

3.2.CTRL寄存器

下图是画出了两组CTRL寄存器,第三组用于配置Virtual Function,这里不介绍。第一组CTRL寄存器,用于配置Outbound/Inbound的传输的类型、TC、ATTR、Function编号等。第二组CTRL寄存器用于配置Outbound/Inbound的MSG_CODE、BAR编号、使能Region等。

CTRL寄存器

3.3.BASE寄存器

如下图所示,BASE寄存器共有2两个,一个配置Outbound/Inbound的低32的BASE地址,另一个配置Outbound/Inbound的高32的BASE地址。LWR_BASE_HW为硬件设置,表示该region地址的最小范围(4kB、8kB、16kB、32kB、64kB,默认为64kB),Outbound方向时LWR_BASE_RW表示存储器域基地址,Inbound方向时LWR_BASE_RW表示PCIe域基地址,UPPER_BASE_RW表示对应基地址的高32位。

BASE寄存器

3.4.TARGET寄存器

如下图所示,TARGET寄存器共有2两个,一个配置Outbound/Inbound的低32的TARGET地址,另一个配置Outbound/Inbound的高32的TARGET地址。LWR_TARGET_HW为硬件设置,表示该region地址的最小范围(4kB、8kB、16kB、32kB、64kB,默认为64kB),Outbound方向时LWR_TARGET_HW表示PCIe域基地址,Inbound方向时LWR_TARGET_HW表示存储器域基地址,UPPER_TARGET_RW表示对应基地址的高32位。

TARGET寄存器

3.5.LIMIT寄存器

如下图所示,LIMIT寄存器用于配置region的大小。

LIMIT寄存器

参考资料

  1. PCIEXPRESS体系结构导读
  2. PCI Express technology 3.0
  3. PCI Express® Base Specification Revision 5.0 Version 1.0
  4. Rockchip RK3588 TRM
  5. Linux kernel 5.10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1978652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何将Maven子项目插入到Maven父项目中

Maven项目的融合具体方法: 1.在电脑本地磁盘拷贝Maven子项目; 2.用IDEA软件打开Maven父项目; 3.在IDEA中选中Maven父项目; 4.将复制好的的Maven子项目粘贴到Maven父项目中; 5.选中子项目的pom文件,右键选择…

apk反编译修改教程系列-----修改apk 解除软件限制功能 实例操作步骤解析_5【二十四】

解除apk功能 限制主要是一些app只有付费或者开通vip才可以使用所有功能。这些对于热爱反编译的你是不是比较愤慨,今天继续以一款app为大家来演示如何去除软件的限制功能。教程的目的主要是学习反编译的基础修改方法,了解app的修改步骤以及基础的入门修改常识。 反编译工具:…

无人机无人车固态锂电池技术详解

随着无人机和无人车技术的飞速发展,对高性能、高安全性电池的需求日益迫切。固态锂电池作为下一代电池技术的代表,正逐步从实验室走向市场,为无人机和无人车等应用领域带来革命性的变化。相比传统液态锂电池,固态锂电池在能量密度…

C++中的二维数组

引言 C语言的二维数组可直接用【】【】建立&#xff0c;C的数组更多实用vector<int>表示&#xff0c;那二维数组如何表示呢&#xff1f; 表示法 解读 vector<int>的含义是。 申请了一个连续空间vector&#xff0c;里面的数据是一个个的int vector<vector&l…

Spring - 解析 统一数据格式返回以及统一异常处理

接上篇文章的统一数据格式返回… 文章目录 1. 统一异常处理1.1 使用 2. 统一数据返回和统一异处理是怎么实现的2.1 initHandleAdapters2.2 initHandleExceptionResolvers 1. 统一异常处理 1.1 使用 统一异常处理的两个关键的注解是ControllerAdvice ExceptionHandler Contro…

C++入门基本语法(2)

一、引用 1、基本概念与定义 引用不是新定义一个变量&#xff0c;而是给已存在的变量起一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它所引用的变量公用同一块内存空间&#xff1b; 引用的写法&#xff1a;变量类型& 引用别名 变量&#xff…

第六周:机器学习

目录 摘要 Abstract 一、深度学习的优化算法 1、SGD 2、SGDM 3、Adagrad 4、RMSProp 5、Adam算法 二、分类器 三、卷积神经网络 总结 摘要 接着上周学习率在训练中的影响&#xff0c;本周对深度学习常见的几种优化算法做了总结&#xff0c;着重分析Adam算法的优缺…

太阳光强光照射实验在材料科学中的应用

强光照射实验方法 所谓的强光照射即使用人造太阳光模拟器设备模拟太阳光的真实光照环境。强光照射实验是一种在材料科学中常用的实验方法&#xff0c;主要用于研究材料在强烈光照条件下的稳定性、性能变化及其内在机制。实验通常涉及将材料置于特定波长和强度的光源下&#xff…

【vulnhub】DerpNStink靶机

靶机安装 下载地址&#xff1a;DerpNStink: 1 ~ VulnHub 信息收集 靶机IP扫描 nmap 192.168.93.0/24 端口扫描&#xff0c;开放21、22、80端口 nmap -A 192.168.93.158 -p- 目录扫描 dirsearch -u http://192.168.93.158 进行网址访问&#xff0c;页面上只有个单词DeRPn…

IJCAI 2024 | 时空数据(Spatial-Temporal)论文总结

2024 IJCAI&#xff08;International Joint Conference on Artificial Intelligence, 国际人工智能联合会议&#xff09;在2024年8月3日-9日在韩国济州岛举行。 本文总结了IJCAI2024有关时空数据(Spatial-temporal) 的相关论文&#xff0c;如有疏漏&#xff0c;欢迎大家补充。…

【微服务】springboot 整合 SA-Token 使用详解

目录 一、前言 二、认证与授权介绍 2.1 什么是认证 2.1.1 认证的目的 2.1.2 认证基本步骤 2.2 什么是授权 2.2.1 常用的授权模型 三、微服务中常用的认证安全框架 3.1 Spring Security 3.1.1 Spring Security 特点 3.2 JWT (JSON Web Tokens) 3.2.1 JWT特点 3.3 其…

鸿蒙笔记--Socket

这一节主要了解鸿蒙Socket通信&#xff0c;在鸿蒙系统中&#xff0c;Socket TCP通讯是一种常用的网络通信方式&#xff0c;它提供了可靠的、面向连接的数据传输服务。它主要用到ohos.net.socket这个库&#xff1b; 栗子: export default class SocketUtils {public static c…

跟《经济学人》学英文:2024年08月03日这期 How deep is Britain’s fiscal “black hole”?

How deep is Britain’s fiscal “black hole”? Rachel Reeves sets out her first big decisions as chancellor set out: 陈述&#xff0c;阐明 “Set out” 的意思是陈述、阐明或展示。在这个上下文中&#xff0c;指的是Rachel Reeves作为财政大臣阐明了她的第一个重要决…

数据结构(8):排序

1 排序的基本概念 稳定性&#xff01;&#xff01;&#xff01; 分类[内部、外部] 机械硬盘的读取是很慢的&#xff01;&#xff01;&#xff01; 总结 2 内部排序 2.1 插入排序 前面时 保存好的 是排好序的哦 一个一个检查&#xff01;然后放到改在的位置 只有小的时候换&am…

AI论文速读 | 2024MM【开源】时间序列预测中频率动态融合

&#x1f4f0;题目&#xff1a;Pre-Training Identification of Graph Winning Tickets in Adaptive Spatial-Temporal Graph Neural Networks &#x1f58b;作者&#xff1a;Xingyu Zhang&#xff08;张星宇&#xff09;, Siyu Zhao&#xff08;赵思雨&#xff09;, Zeen Song…

200kg大载重履带遥控无人车技术详解

200kg大载重履带遥控无人车&#xff08;以下简称“无人车”&#xff09;是一种专为复杂地形和高负载运输设计的智能化车辆。它集成了先进的动力系统、高效的行走机构、灵活的操控系统以及强大的负载能力&#xff0c;能够在人难以到达或危险的环境中执行物资运输、勘探探测、应急…

【八股文】网络基础

1.简述一下TCP和UDP的区别&#xff1f; 特性TCP&#xff08;Transmission Control Protocol&#xff09;UDP&#xff08;User Datagram Protocol&#xff09;连接类型面向连接&#xff0c;需要建立三次握手连接无连接&#xff0c;发送数据无需建立连接数据传输提供可靠的数据传…

5款免费写作神器,高效率自动生成文章

在当今数字化的时代&#xff0c;写作变得越来越重要&#xff0c;而各种免费的写作神器也应运而生&#xff0c;为创作者们提供了极大的便利。以下是本文为大家详细介绍5个免费写作神器&#xff0c;帮助大家提高写作效率&#xff0c;让创作不再烦恼。 1、火呱ai写作 这是一款综合…

MySQL事务,锁,MVCC总结

mysql中最重要的就是事务&#xff0c;其四大特性让我们维持了数据的平衡&#xff0c;一致。那么事务究竟是什么&#xff0c;与什么相关&#xff0c;他的使用步骤&#xff0c;以及使用过程中我们会遇到什么问题呢&#xff1f;下面我们一起学习交流! 1.MySQL的存储引擎&#xff…

Redis学习[7] ——如何使用Redis实现分布式锁?

如何用Redis实现分布式锁&#xff1f; 9.5.1 为什么Redis能用来实现分布式锁&#xff1f; 分布式锁是用于分布式环境下并发控制的一种机制&#xff0c;用于控制某个资源在同一时刻只能被一个应用所使用。如下图所示&#xff1a; Redis可以被多个客户端共享访问&#xff0c;可…