PCIE学习系列 一(PCIe概念、结构、配置空间寄存器)

Pcie 的基本概念和结构

简介
PCIe的诞生是为了取代旧有的PCI(Peripheral Component Interconnect)接口,以满足日益增长的带宽需求和更高性能的要求。与传统的PCI总线相比,PCIe采用串行连接方式,并采用端到端的连接方式,这样可以使用更高的时钟频率,能够提供更高的数据传输速度和更强的性能。
PCIe还引入了许多先进的技术,如差分信号传输、数据包交换和错误检测校正机制,以提高数据传输的可靠性和稳定性。此外,PCIe还支持虚拟化技术,可以对物理设备进行虚拟划分,实现资源的共享和灵活配置。
PCIe采用了多通道的设计,在每个通道中都可以有多个数据通路。这样的设计使PCIe能够实现较高的带宽,并满足日益增长的数据传输需求。通常表示为PCIe x1、PCIe x4、PCIe x8、PCIe x16等不同规格,分别代表着不同的通道数量和带宽。
PCIe协议广泛用于计算机系统中连接各种外部设备,如图形卡、网络适配器、存储控制器等。
本文主要是PCIE的基础知识扫盲。

当前pcie协议支持到5.0版本,不同PCIe版本对应的传输速率如下:
在这里插入图片描述

PCIE总线的拓扑结构
在这里插入图片描述
PCIe采用的是树形拓扑结构, 它的体系架构一般由root complex,switch,endpoint等类型的PCIe设备组成。

root complex
RC是PCIe体系结构中的一个重要的组成部件,它与PCI总线的中Host bridge有些类似,是CPU和PCIe总线直接的接口。它的主要功能是完成存储器域到PCIe总线域的地址转换,随着虚拟化技术的引入,RC的功能也越来越复杂。RC把来自CPU的request转化成PCIe的4种不同的requests(configuration, Memory, I/O, Message)并发送给接在它下面的设备。从软件的角度来看,RC像是一组虚拟的PCI-PCI桥。

PCIe Switch & Bridge
Switch提供了分散或者是聚合的功能,它允许更多的设备接入到 一个PCIe Port。它扮演了数据包路由的功能。Bridge提供了一个转换接口用来连接其他的总线,如PCI/PCI-X。这样可以允许在PCIe的系统中接入一张旧的PCI设备。

PCIe Endpoint
它只有一个上游端口,位于PCIe拓扑结构的树的末端。它作为请求的发起者或者完成者。分为Legacy Endpoint和Native Endpoint,Legacy使用PCI总线的操作用于支持向后兼容。

BDF(Bus、Device、Function)
每一个Pcie设备可以只有一个功能(Function),即Fun0。也可以拥有最多8个功能,即多功能设备(Multi-Fun)。不管这个设备拥有多少个功能,其每一个功能都有唯一的配置空间与之对应。和PCI总线一样,PCIe总线的每一个功能(Function)都有唯一的标识符与之对应。这个标识符就是BDF(Bus、Device、Function),PCIe的配置软件(即root 的应用层)应该有能力识别整个PCIe总线的拓扑逻辑,以及其中的每一条总线(Bus),每一个设备(Device)和每一项功能(Function)。在BDF中,Bus Num占用8位,Device Num占用5位,Function Num占用3位。显然PCIe总线最多支持256条Bus、每条Bus支持32个Device,每个Device支持8个Function。

PCIe 的配置空间

那我们如何知道PCIe拓扑结构中每个PCIe设备的信息呢?此时就需要了解PCIe的配置空间。

什么是配置空间?
PCIe的配置空间(Configuration Space)是一种用于存储和管理PCIe设备相关信息的特殊地址空间。它包含了设备的配置寄存器和扩展配置寄存器,这些寄存器用于描述设备的功能、性能、资源分配等信息,设备在出厂时,配置空间是有一些默认值的。

配置空间有多大?pci和pcie的配置空间有何联系?
早期的PCI时期,系统为每个PCI设备分配的内存大小仅有256个Bytes,其中前64字节是标准配置空间header,后面的192字节是Capability结构, 展示pci能提供的能力。到后来的PCIE时期,PCIe设备性能增强,PCIe设备的配置空间扩展至4KBytes。但为了兼容PCI,PCIe的配置空间前256字节与PCI保持一致,256~4096字节是pcie 扩展配置空间。
  我们知道PCIe一共支持256条Bus,每条bus支持32个Dev,每个dev支持8个Func。因此在满负载的情况下,共需内存大小4k * 256 328 = 256MB,这个256M的内存空间是为PCIE设备准备的空间,系统不可用。这也是为什么用户可用内存空间总是会小一些的原因;
  
配置空间的结构是怎样的?
在这里插入图片描述

如图所示,配置空间的前64Bytes位标准的头部空间,之后192字节为Capabilities结构,256~4096Bytes则是PCIe的扩展配置空间。
PCI标准配置空间分为type0和type1两种,其中type0为Endpoint设备,type1为PCI Bridge和Switch设备,结构分别如图所示:
在这里插入图片描述

在这里插入图片描述

配置空间寄存器解释
公共的寄存器
Device ID: 设备ID, 表示该PCI设备的设备号,只读。
Vendor ID: 厂商ID, 表示生产该设备的厂商的编号,只读。
Status: pci设备状态寄存器,用于保存pci设备的状态,如中断状态或运行产生错误时的状态。
在这里插入图片描述

Command: PCI设备命令寄存器,主要是负责使能或关闭pci设备的I/O 访问,memory访问和INTx中断等。
在这里插入图片描述

Class Code: 设备分类信息,表示pci设备属于哪一种类别,如网卡,存储卡,显卡等。
Revision ID: 设备版本ID, 表示PCI设备的版本号。该寄存器可以被认为是Device ID寄存器的扩展。 只读。
BIST: 可选,用于内部自检。
Header type: PCI设备头类型寄存器,表示该设备是PCI EP设备还是PCI 桥设备。PCI配置空间是type0还是type1就是由该寄存器确定。
Lantency Timer: 在PCI总线中,多个设备共享同一条总线带宽,该寄存器用来控制PCI设备占用PCI总线的时间。PCIe设备不需要使用该寄存器,该寄存器的值必须为0。因为PCIe总线的仲裁方法与PCI总线不同,使用的连接方法也与PCI总线不同。
Cache line size: cache缓存大小。对于PCIe设备,该寄存器的值无意义。
Expansion Rom Base Address: 扩展ROM映射基地址寄存器。分配给ROM使用,用于PCI设备在处理器还没有运行操作系统之前,完成基本的初始化设置。
Base Address register: BAR地址寄存器负责PCI设备内部空间的映射,bit 0标识IO空间还是MEM空间,bits 2:1 用来标识address为32bit还是64bit,bit 3标识能否预取。type0有6个32bit的BAR寄存器,type1与2个32bit的BAR寄存器。每一个BAR地址对应一个地址空间。
在这里插入图片描述
在这里插入图片描述

Capbility Pointer: 第一个PCI capbility的地址偏移, capbility用于表示pci设备支持的能力。该寄存器存放Capabilities 结构链表的头指针。在一个PCIe 设备中,可能含有多个Capability 结构,这些寄存器组成一个链表,Next Capability Pointer存放下一个PCI capbility的地址偏移。
在这里插入图片描述

Interrupt Pin: PCI设备中断引脚,支持INTX A/B/C/D四个中断引脚。
Interrupt line: 表示当前PCI设备使用的中断号。

type0 独有的寄存器
CardBus CISpointer: 只读,可选,用于表明访问CIS(card info structure)的地址空间, 通常不会涉及。
Subsystem ID/ subsystem Vendor ID: 子系统和子厂商ID,可以结合Device ID和Vendor ID来组成完成的PCI设备标识。
Max_lat: 设备期望的最大延时,只读。
Min_Gbt: 设备期望的最小延时,只读。

type1 独有的寄存器
Primary Bus Number: 表示PCI设备挂在的PCI总线号。
Subordinate Bus Number: PCI桥可以管理其下的PCI总线子树。其中Subordinate Bus Number寄存器存放当前PCI子树中,编号最大的PCI总线号。
Secondary Bus Number: 存放当前PCI桥Secondary Bus使用的总线号,这个PCI总线号也是该PCI桥管理的PCI子树中编号最小的PCI总线号
Secondary Latency Timer: PCI桥下游的延时寄存器,和Latency Timer寄存器的含义相近
I/O base: 表示IO寻址的基地址, 低4bit只读,所以PCI设备默认IO寻址4K对齐,高4bit可写。
I/O limit: IO寻址的上限,高4bit可写,低4bit为全F,所以IO寻址上限是I/O limit地址 + 4K.
Secondary status: 保存PCI下游总线和设备的状态。
Memory Base: 表示memory寻址的基地址。
Memory Limit: 表示memroy寻址的上限,和IO limit类似。
Prefetchable Memory Base: 可预期内存的基地址
Prefetchable Memory Limit: 可预期内存寻址的上限。
Bridge Control Register:管理PCI桥的Secondary Bus, 可以控制 Secondary Bus的 Reset。

配置空间寄存器如何读写?
配置空间的访问分为两种方式,一种是IO访问,一种是内存映射访问。

IO访问
IO访问应该是Intel X86架构的独有产物了,简单可理解为一段存储空间,用户通过IN/OUT指令来访问。
比如这个:通过CF8 / CFC端口,用户可通过这组端口来对PCIE的前256个Byte进行访问,一个指定地址,一个指定数据。代码如下:

/*Access PCI Config Space in IO method*/
Address = BIT31|((BUS & 0XFF)<< 16)|((DEV & 0x1F)<<11)|((Fun & 0x7) << 8);
IoWrite32(0xCF8, address);                 //将要读取的地址写入到CF8
Date32 = IoRead32(0xcfc);                  //从CFC端口读出address的数据

注意:IO访问仅能读取到前256个Byte,256Byte后的空间需要用内存映射访问。

内存访问
PCIe配置空间的寄存器可以通过将其映射到系统内存地址空间的方式进行访问。通过内存映射,可以使用读写内存的指令来读取和写入配置空间的寄存器。
Enhanced Configuration Access Mechanism (ECAM)是访问PCIe配置空间的一种机制。是将PCIe的配置空间映射到MEM空间,使用MEM访问其配置空间的一种实现。

在这里插入图片描述
在内存方式中,需要根据设备的总线号、设备号和功能号计算出相应的内存地址。内存地址的计算公式为 Config Base Address + (Bus Number << 20) + (Device Number << 15) + (Function Number << 12) + offset,得到内存地址之后就可以直接读取到配置空间的寄存器值了。

如果有兴趣可以看看Linux源码中关于ECAM的实现:drivers\pci\ecam.c

PCI capbility结构
PCIE Capability可以分为PCI兼容的capability 和PCIE extended capability两类,64字节到256字节是pci\pcie设备的capability结构,256到4096则为pcie的扩展空间。
在Linux源码中能找到以下的定义,是各个capability ID和各个capability名称的定义。
PCIE Capability\PCI Capability:
在这里插入图片描述
PCIE extended capability:
在这里插入图片描述
常用的pci capability 有以下几个:Power Management、Message Signalled Interrupts、PCI Express、Hot-Plug Controller,PCIe extended capability常用的有:Single Root I/O Virtualization、Address Control Services等。

猜你喜欢

转载自blog.csdn.net/qq_42208449/article/details/132475653
今日推荐