初学 PCIe System (一) - PCIe介绍及其配置空间

发布于:2023-01-04 ⋅ 阅读:(917) ⋅ 点赞:(0)

第二部分在:初学 PCIe System (二) - 如何访问PCIe设备的配置空间

PCI Express 介绍

PCI Express (PCIe) 属于第三代的高效能 I/O 汇流排,PCIe Spec对其的介绍是:

PCI Express is a high performance, general purpose I/O interconnect defined for a wide variety of future computing and communication platforms. 

PCI Express 为各种未来的计算和通信平台所定义的高性能、通用互连 I/O 。

因此一个PCIe 系统就是指由许多设备相互透过 PCIe 点对点连接所组成的。如下图范例,其结构是由一个Root Complex (RC)、多个Endpoints、Bridge和Switches所组成。

  • Root Complex (RC):I/O 层次结构的根,负责将 CPU/Memory子系统连接至 I/O ,可视为一虚拟的PCIe Bus(Bus-0)。 RC 比较偏向软体的概念,在x86 架构伺服器上,硬体部分是由CPU和PCH所共同实现。
  • Switch:多个虚拟 PCI-to-PCI 桥设备的逻辑组合
  • Endpoints:指一种Function 类型,可作为 PCIe 交易(Transaction)的请求者(Requester)或完成者(Completer)。

*Transaction 中文我一直不知道怎么翻译会比较好,在电脑科学中,讯息传送通常是点对点的,传送端和接收端的一次完整讯息沟通,包含了事前握手、讯息交换、和结束沟通,整个过程就称之为Transaction。

系统在开机之后,会透过深度优先演算法(DFS)去扫描目前系统上有哪些PCIe Device,并为他们定址。 PCIe Device的地址是由两个byte,并分为三个部分所组成的:

  • Bus Number(8 bits) :PCI Express 将逻辑 PCI 总线编号映射到 PCI Express Link
  • Device Number(5 bits) : 对于非 ARI 设备,PCI Express 组件仅限于在其主接口(上行端口)上实现单个设备编号
  • Function Number(3 bits) :PCI 被允许在该设备编号内实现多达八个独立的功能

因此一个PCIe Device的地址 = bus << 8 | dev << 5 | func

PCIe 配置空间 (PCIe Configuration Space)

PCIe Spec中定义:每个PCIe Function都有 4096 Byte 的配置空间(Configuration Space)。前256 Bytes 是和 PCI 兼容的空间,剩余的为PCIe 扩展配置空间(Extended Configuration Space)。其中前 256 Bytes PCI 兼容的空间是为software-driven的初始化和配置提供的,通常可以透过I/O Programming 或是 Direct Memory Access (DMA) 访问。

另外,在offset 0x00-0x3F的空间为Header(蓝色框部分), 他的内容格式可分为type 0 和 type 1两种,上色部分为他们共同的部分

Type 0 主要为Endpoints,例如PCI Express Endpoint、Legacy PCI Express Endpoint、RCiEP、Root Complex Event Collector 

Type 1主要为Root Complex、Switch和Bridge

我们可以透过访问Configuration Space Header得到许多重要的资讯,例如:

  • Vendor ID Register (Offset 00h):Vendor ID是 HwInit,标示函数的制造商,可以从Member Companies | PCI-SIG (pcisig.com) 输入ID查找制造商
  • Device ID Register (Offset 02h):Device ID 是 HwInit,标示函数的功能。 Device ID 与Vendor ID 和Revision ID 一起用作应加载哪个驱动程序的一种机制。
  • Command Register (Offset 04h):Individual bits in the Command Register may or may not be implemented depending on the feature set supported by the Function.

     
  • Status Register (Offset 06h):Functions may not need to implement all bits, depending on the feature set supported by the Function.

     
  • Revision ID Register (Offset 08h) :Revision ID 是 HwInit。 Device ID 与Vendor ID 和Revision ID 一起用作应加载哪个驱动程序的一种机制。
  • Class Code Register (Offset 09h):是read-only的,用于标示Function的通用操作。由三个Byte组成:


    Class Code 需要另外对照PCI-Code-and-ID 这份Spec,这边用Redfish Resource and Schema Guide (dmtf.org) 中的范例来解释,这边第三个Byte-Base Class Code为0x02,因此这个Function是一个NetworkController


     
  • Header Type Register (Offset 0Eh):标示设备是否可能包含多个Function。

---

以上就是PCIe Configuration Space Header 的资讯内容大概,至于如何访问,会在初学 PCIe System (二) - 如何访问PCIe设备的配置空间介绍

本文含有隐藏内容,请 开通VIP 后查看