PCIe
文章平均质量分 70
PCIe协议相关各种知识整理。
码农老王(JN)
多年嵌入式开发经验,对C、Python、PCIe、Linux、Markdown等有所了解。
展开
-
聊聊PCIe协议的BDF
本文主要介绍 PCIe 协议中 Bus、Device 和 Function 的基本定义。原创 2023-06-27 16:17:56 · 1514 阅读 · 0 评论 -
PCIe配置空间:Base 和 Limit 寄存器
1. 基础知识当 PCIe Function 的 BAR(Base Address Register)被 RC 进行配置之后,它就知道了自己被分配的地址段是多少。当 PCIe Function 收到一个 TLP 之后,会将该 TLP 访问的地址与自己的 BAR 中配置的地址段进行匹配,如果能匹配上,则进行处理。对于 RC 或者 Switch,必须要知道它们的下游端口(Downstream Port)连接的设备所占用的地址空间在哪个区段。只有这样,当 RC 或者 Switch 收到 TLP 之后,才能决定原创 2021-08-04 10:55:59 · 3488 阅读 · 0 评论 -
Ubuntu 触发 PCIe 设备的 FLR
测试环境:Ubuntu 18.04测试目标:通过 Linux 命令,触发 PCIe 设备的 FLR (Function-Level Reset)。测试步骤:通过 lspci 指令确定设备的 PCIe Function IDbryan@bryan-pc:~$ lspci00:00.0 Host bridge: Intel Corporation 8th Gen Core Processor Host Bridge/DRAM Registers (rev 08)00:01.0 PCI原创 2021-08-03 11:37:19 · 1550 阅读 · 5 评论 -
PCIe 配置空间:Status 寄存器
1. Status 寄存器位置2. Status 寄存器细节2.1 特殊位对于 PCIe 设备,status 寄存器中有几个 bit 的值是固定的。Bit 4:Capability List,该位必须为 1,因为 PCIe 设备中有些 Capability 是必须的。Bit 5:66 MHz Capable,该位必须为 0,PCIe 中用不到。Bit 7:Fast Back-to-Back Capable,该位必须为 0,PCIe 中用不到。Bit 9~10:DEVSEL Timing,原创 2021-05-28 11:49:28 · 6276 阅读 · 0 评论 -
PCIe 配置空间:Command 寄存器
在 type 0 header 中,command 寄存器的位置如下图所示:在 type 1 header 中,command 寄存器的位置如下图所示:Command 寄存器的结构如下图:对于 PCIe,只有 Bit 0/1/2/6/8/10 是有效的,其他必须配置为 0 。IO Space Enable该位用于控制设别如何响应 I/O 空间的访问请求。该位为 0 时,设备不会响应 I/O 空间访问请求。该位为 1 时,设备正常响应 I/O 空间访问请求。复位后,默认为 0原创 2021-05-27 15:39:13 · 7034 阅读 · 0 评论 -
Ubuntu 卸载 PCI/PCIe 设备
首先,通过 lspci 命令确定设备的 Domain、Bus、Device、Function 信息:bryan@bryan-pc:~$ sudo lspci -D0000:00:00.0 Host bridge: Intel Corporation 8th Gen Core Processor Host Bridge/DRAM Registers (rev 08)0000:00:01.0 PCI bridge: Intel Corporation Xeon E3-1200 v5/E3-1500 v5/原创 2021-04-28 13:46:13 · 4394 阅读 · 3 评论 -
如何让 Ubuntu 系统重新枚举 PCI/PCIe 总线?
使用场景:正常情况下,PCI/PCIe 总线的枚举发生在系统启动阶段,如果这个时候我们的设备(例如,PCIe FPGA 开发板)还没准备好,那系统启动之后就会发现设备没有被枚举到。那么当我们的设备准备好之后,有没有办法不重启系统就直接进行设备重新枚举呢?解决方案:切换到 root 用户,执行如下命令:echo "1" > /sys/bus/pci/rescan...原创 2021-04-25 09:58:36 · 3826 阅读 · 0 评论 -
PCIe 总线传输顺序的那些坑
设置了 Relaxed Ordering 也不一定生效。在 TLP 的 Attr 字段有个 Relaxed Ordering 位,表示该 TLP 是否支持 Relaxed Ordering。但即使将这个位设置为 1,如果 TLP 通过的 Switch 设备不支持 Relaxed Ordering,那也只能乖乖的按照强制顺序通过这个 Switch。Relaxed Ordering 关注的是 VC,不是 TC。每个 TLP 都有一个唯一的 TC(Traffic Class),而这个 TC 又和一.原创 2021-04-22 18:08:03 · 6865 阅读 · 8 评论 -
PCIe LTSSM 之 Detect 状态
Detect 状态由 Detect.Quiet、Detect.Active 两个子状态组成。该状态的主要功能是检测 PCIe 链路的对端是否有 PCIe 设备存在,如果存在,一共使用了多少可用的 Lane 资源。1. Detect.QuietDetect.Quiet 状态是上电之后或者复位(Function Level Reset 除外)的初始状态,并且协议要求必须在复位之后的 20 ms 内进入 Detect.Quiet 状态。PCIe 设备进入 Detect.Quiet 状态时,其发送逻辑 TX原创 2021-04-22 11:22:40 · 5585 阅读 · 0 评论 -
PCIe 链路训练状态机(LTSSM)基础
LTSSM:Link Training and Status State Machine下图展示了 LTSSM 的顶层状态(顶层状态下包含子状态):LTSSM 包含 11 个顶层状态:Detect、Polling、Configuration、Recovery、L0、L0s、L1、L2、Hot Reset、Loopback 和 Disable。这些状态可以分为 5 类:Link Training states(链路训练状态)Re-Training(Recovery)state(重训练状态)Sof原创 2021-04-21 21:00:17 · 25834 阅读 · 0 评论 -
PCIe 是如何发现对端设备的:Receiver Detect
PCIe 总线是一种端到端的总线,即总线的两端连接了分别连接了一个 PCIe 设备。那么,这两个设备上电之后是怎么发现对面的另一个设备的?对于 Root Complex 或者 Switch ,它们是如何知道自己的 downstream port 上有没有连接其他设备? 对于 PCIe Endpoint,它们又如何知道自己的 upstream port 有没有被正确的连接到 Root Complex 或者 Switch 上?这些问题的答案就是:Receiver Detect。Receiver Detect原创 2021-04-19 20:36:02 · 8005 阅读 · 0 评论 -
PCIe 链路训练基础
PCIe Link Initialization and Training ProcessPCIe 链路初始化及训练是由物理层控制的硬件过程。该过程对设备的端口及链路进行配置及初始化,从而能够支持后续的数据传递。复位之后,硬件会开始链路训练流程,并且流程由 LTSSM(Link Training and Status Machine)管理。LTSSM 的位置如下图所示:链路初始化及训练过程会对进行许多配置,可能会涉及到以下内容:Bit Lock:当链路训练开始时,接收设备的时钟尚未与发送.原创 2021-04-13 16:16:58 · 4076 阅读 · 0 评论 -
lspci 指令
1. 指令名称lspci2. 指令简介lspci 是一个用于显示系统中所有 PCI/PCIe 总线及设备信息的工具。默认情况下,它只显示设备的最简要信息。通过传入指定参数,可以输出更详细的信息,或者可以按照特定格式输出,以便于用其他程序进行解析。有些 PCI/PCIe 的设备信息需要在 root 权限下才能获取到。3. 参数先来看看不加任何参数时输出的结果。bryan@bryan-pc:~$ lspci00:00.0 Host bridge: Intel Corporation 8.原创 2021-04-12 20:59:22 · 7683 阅读 · 0 评论 -
PCIe LTR 使用指南
1. Endpoints每当 Endpoint 对请求的响应时间需求有变化时,都应该发送 LTR 消息。在发送 LTR 消息变更要求的响应时间时,设备应该考虑到所有可能的延时,包括:参考时钟(reference clock)关闭的状态下,恢复时钟所需的时间。链路层从其他状态恢复到 L0 状态所需要的时间。LTR 消息发送的时间。系统准备好处理新请求所需的时间。如果是要降低对某类请求的响应延迟时间的容忍度(即要求系统在更快的时间内响应),那么应该在发送该类型的请求之前,尽量早的发送 .原创 2021-04-09 18:59:44 · 3869 阅读 · 1 评论 -
PCIe LTR 基本知识
LTR:Latency Tolerance ReportingLTR 是 PCIe 协议中规定的一项可选特性,可用于提高系统的电源管理效率。通过 LTR,PCIe 设备可以告知系统它们能容忍的最大响应延迟是多少,只要系统在这个时间之内对 PCIe 设备提出的请求做出响应即可。系统的电源管理策略可以根据 LTR 提供的信息做出优化。在设备需要的时候,系统快速响应设备提出的请求;在设备不需要的时候,系统可以延迟一会再对设备请求做出响应,只要不超出设备 LTR 消息中规定的时间即可。例如,如果系统在低功耗状态原创 2021-04-09 16:51:54 · 15065 阅读 · 0 评论 -
OBFF (Optimized Buffer Flush and Fill)
1. 背景随着电源管理机制越来越完善,处理器和其他系统组件的功耗越来越低,而像 PCIe 组件这样的外围设备在 PC 系统功耗中占据的比重越来越大。虽然早期的 PCIe 允许一些软件和硬件电源管理,但是并没有把电源管理策略与系统的协调放在一个高优先级,所以软件的控制也很有限。缺乏系统与电源管理策略之间的协调会导致一个很明显的问题:某些时候,系统可能已经进入睡眠状态 (sleep state)了,而 PCIe 设备可能还处于工作状态。这些 PCIe 设备可能会产生中断或者 DMA 数据传输请求,虽然这些.原创 2021-04-09 11:48:56 · 5102 阅读 · 3 评论 -
PCIe 枚举示例 (Single Root)
摘要:本文主要是对 Single-Root System 的枚举过程进行分析。启动阶段,处理器上的系统软件执行的枚举步骤如下:系统软件将 Host/PCI 桥的 Secondary Bus Number 设置为 0,将 Subordinate Bus Number 设置为 255。直到所有的总线都被枚举完成后,再改变这两个值。Secondary Bus Number: 桥设备(Bridge)下游端口连接的 PCIe 总线号。Subordinate Bus Number:挂载到桥设备(Bri原创 2021-04-08 21:14:40 · 3527 阅读 · 0 评论 -
理解 PCIe 的枚举机制
声明:本文中的图片来自MindShare, Inc 经典书籍《PCI Express Technology》。计算机系统复位或者上电之后,软件首先要对 PCIe 总线进行扫描来枚举该总线下连接的所有设备。在扫描之前,软件唯一能感知到的设备就是 Host/PCI 桥,同时还知道 Host/PCI 桥下面的总线号是 0,如下图所示:对于桥设备(bridge),它们的上游端口(upstream side)连接的总线称为 primary bus,下游端口(downstream side)连接的总线称为 s.原创 2021-04-08 17:40:20 · 9074 阅读 · 2 评论 -
PCIe 设备中 function number 不需要连续
对于包含多个 PCIe function 的设备,它们的 function number 不需要连续。例如,一个PCIe 设备中可以只包含 function 0,2,7,不包含 function 1/3/4/5/6。这也就导致了在 PCIe Root Complex 枚举设备时需要遍历所有可能的 Bus, Device, Function 。...原创 2021-04-06 18:38:36 · 1249 阅读 · 0 评论 -
PCIe配置空间:基址寄存器(Base Address Registers)
1. 基址寄存器的作用一般的,每个 PCIe 设备内部都会有一部分资源需要提供给系统软件访问。与此同时,不同的 PCIe 设备可供系统软件访问的资源大小、资源类型也不一样。在计算机系统中,只有系统软件可以为 PCIe 设备内部的资源指定合适的地址,而 PCIe 设备能做的就是告诉系统软件该设备内部可访问的资源大小、资源类型和资源特性。基址寄存器(Base Address Registers)就是 PCIe 协议提供的、用于向系统软件展示 PCIe 设备内部资源大小、资源类型和资源属性的机制。2. 基址原创 2021-04-04 18:26:00 · 8900 阅读 · 1 评论 -
初识PCI和PCI-X
PCI (Peripheral Component Interface)总线出现在1990’s早期。在那个时候,标准协议还是IBM搞出来的ISA (Industry Standard Architecture)总线。ISA总线在80286 16位处理器的机器上还是很好用的。后来有了32位处理器,计算机的外设也进行了技术革新,这时就要求总线能够更快速,并且支持像即插即用这样的一系列新功能,ISA总线就有点吃力了。此外,ISA总线还有一点饱受诟病,那就是连接器的引脚数量多、体积大。计算机厂商们开始意识到,原创 2021-01-25 22:38:59 · 946 阅读 · 0 评论 -
想学PCIe,为啥先要了解PCI
随便翻看几本PCIe相关的书籍就会发现,几乎每一本书前面的章节都在介绍PCI总线的内容,有些甚至篇幅还不短,为什么要这样?仔细想想,其实这也不难理解。每项新技术的发明通常都是为了解决某项就技术的痛点,而发明新技术,有两个方向可选:一刀切,完全刨除原有技术,从0开始搞一个,使用方式和原有技术完全不一样。继承加创新,从原有技术中继承一些精华部分和关键部分,针对原有技术的弊端,添加新特性。PCIe技术就是为了解决PCI技术的痛点才发明的,而且它选择了继承加创新的方式。这种方式有一个很重要的优点:易于原创 2021-01-25 22:35:48 · 711 阅读 · 0 评论 -
Ubuntu系统开启Intel千兆网卡SR-IOV
将网卡插在主板上。BIOS中开启CPU虚拟化支持(Intel VT-d或者AMD AMD-Vi)在我测试的PC中,进入BIOS界面后,依次选择Advanced->CPU Setup进入CPU配置界面,然后将该界面下的Intel Virtual Technology和VT-d Feature设置为Enabled。网上有人说BIOS中还需要开启SR-IOV选项卡,但是在我的机器上没找到。保存BIOS配置,重启PC进入Ubuntu 18.04系统。安装libvirt,并查看是否开启相..原创 2021-01-29 15:01:56 · 5838 阅读 · 0 评论 -
HOST主桥实现(PowerPC MPC9548)
HOST主桥实现(PowerPC MPC9548)《PCI Express体系结构导读》第2.2章节笔记。文章目录HOST主桥实现(PowerPC MPC9548)1. 背景简介1.1 Cache1.2 SoC平台总线1.3 OCeaN2. PCI设备配置空间的访问机制2.1 寄存器2.1.1 CFG_ADDR & CFG_DATA2.1.2 INT_ACK2.2 流程分析3. 地址转换3.1 存储器域->PCI总线域3.1.1 原理简介3.1.2 Outbound寄存器;POTARn原创 2020-06-29 11:45:39 · 1277 阅读 · 0 评论 -
PCIe SR-IOV:为什么需要SR-IOV
PCIe SR-IOV:为什么需要SR-IOV目录PCIe SR-IOV:为什么需要SR-IOV1. SR-IOV的最终目标2 发展历程2.1 原始状态v1.02.2 进化版v2.02.3 进化版v3.0 —— SR-IOV1. SR-IOV的最终目标终极目标:提高硬件资源利用率。2 发展历程2.1 原始状态v1.0上图展示了在没有引入任何虚拟化技术时,一个PCIe系统的状态。它主要有以下组件构成:处理器:可以是通用处理器、嵌入式处理器、专用处理器等等。内存PCIe Root Comp原创 2020-05-14 11:33:57 · 7379 阅读 · 0 评论 -
PCIe Expansion Roms
PCIe Expansion ROMs入门PCIe Expansion ROMsPCIe Expansion ROMs入门1. 为什么需要Expansion Roms2. 怎么知道PCIe设备是否包含Expansion ROM1. 为什么需要Expansion Roms为了将操作系统加载到内存中,系统需要三类设备:存储设备:用于保存操作系统。显示设备:用于显示当前的启动进度。输入设备:用于接收用户输入信息。在这个阶段,操作系统还没有被加载到内存执行,也就意味着操作系统中对应的设备驱动程序也原创 2020-05-13 11:12:05 · 5586 阅读 · 7 评论 -
PCIe带宽计算
PCIe总线传输速率所谓的总线传输速率就是PCIe硬件链路传输比特流的速度,PCIe Gen1是2.5Gb/s,PCIe Gen2是5.0Gb/s,PCIe Gen3是8.0Gb/s。PCIe总线带宽总线带宽是指PCIe总线上传输有效数据的速度。这里称之为有效数据,是因为涉及到数据编码的概念。在PCIe Gen1和Gen2中,如果要传输8bit的数据,硬件将数据编码时会额外添加2b...原创 2020-04-24 15:44:37 · 11536 阅读 · 0 评论 -
PCI Address Space Map
PCI体系结构中支持三种地址空间:Memory空间、I/O空间、Configuration空间。x86的处理器可以直接访问Memory空间和I/O空间。PCI的设备可以直接映射到处理器的Memory空间中,支持32bit/64bit寻址。在I/O地址空间中,PCI支持32bit地址,但是x86只用了16bit访问I/O空间,所以很多平台的I/O空间大小限制在64KB。PCI还引入了配置空间(...原创 2020-04-15 17:11:46 · 1539 阅读 · 0 评论 -
PCI Interrupt Handling
PCI Interrupt HandlingPCI设备使用四个边带信号(INTA#,INTB#,INTC#,INTD#)之一向系统发送中断请求。对于单CPU系统,当PCI设备的一个中断信号引脚触发时,系统的中断控制器会触发CPU的INTR(Interrupt Request)引脚。在多CPU系统中,APIC(Advanced Programmable Interrupt Controller...原创 2020-04-15 17:04:47 · 634 阅读 · 1 评论 -
PCI Error Handling
PCI Error Handling在传输过程中,PCI设备能够检测、汇报地址段或者数据段的校验错误。借助PAR信号,PCI设备能够完成“偶校验”。如果传输的地址或者数据中,值为“1”的位数是奇数,那么主设备(Master Device)会将PAR信号设置为“1”,从而使整体上“1”的位数变为偶数。目标设备(Target Device)收到地址或数据之后进行校验。如果目标设备检测到数据传输...原创 2020-04-15 17:08:22 · 1352 阅读 · 0 评论