关于前一章
前一章节对 PCIe 体系结构进行了全面介绍,我们将其看作是一种“执行层 (executive level)”概述。它对协议中描述 PCIe 端口分层设计方法进行了介绍。在介绍事务协议时也一并介绍了各种数据包的种类。
关于本章
本章节将对如何对 PCIe 环境进行配置来展开介绍。内容包括了实现 Function 配置寄存器的空间、如何发现一个 Function、如何产生并路由转发配置事务、PCI 兼容配置空间(PCI-compatible configuration space)与 PCIe 扩展配置空间的不同 点(PCIe extended configuration space),以及软件是如何区分开 EP 和 Bridge 的。
关于下一章
下一章的内容将描述 Function 如何通过基址寄存器(Base Address Register,BARs)来请求 memory 或者 IO 地址空间,以及这种请求的目的与作用,并且将介绍软件是如何初始化这两种地址空间的。另外在下一章还会描述 Bridge 的 Base/Limit 寄存器(基/边界寄存器)是如何被初始化的,因为只有当 Base/Limit 寄存器初始化后 Switch 才能在 PCIe 网络中路由转发 TLP。
3.1总线/设备/功能/的定义(Definition of Bus,Device and Function)
正如 PCI 一样,每个 PCIe 功能(Function)在其所在的设备内,以及这个设 备所连接的总线内,都是被唯一标识的。这个唯一的标识符一般被称为“BDF”。配置软件负责在一个给出的 PCIe 拓扑中检测出每个 Bus、Device 和 Function, 这就是 BDF。接下来的几节将会结合一个 PCIe 拓扑示例的上下文,来讨论 BDF 的主要特征。图 3-1 展示了一个 PCIe 拓扑结构,图中着重标识了示例系统中的 Buses、Devices 和 Functions。在本章的后面,将解释如何分配总线号和设备号。
图3-1 示例系统
3.2 PCIe 总线(PCIe Buses)
软件总舵可以分配 256 个总线号。最初的总线号,Bus 0,通常由硬件分配 给 RC(Root Complex)。Bus 0 由一个带有内部集成 EP 的虚拟 PCI 总线,一些 虚拟 PCI-to-PCI Bridges(P2P)组成,这其中的 P2PBridges 拥有确定写死(hardcoded)的设备号和功能号。每个 P2PBridge 都会产生一个新的总线,额外的 PCIe设备可以连接在这些总线上面。每个总线都必须被分配一个唯一的总线号。配置 软件分配总线号的过程中,第一件事情就是从 Bus 0/Device 0/Function 0 开始搜 索其他的 Bridges。当找到一个 Bridge 之后,软件就给这个 Bridge 产生的新总线 分配一个总线号,新总线的总线号会比 Bridge 所属的上一级总线的总线号要大。一旦新总线被分配了一个总线号之后,软件就会在这个新总线上开始搜索 Bridges,而不是在上一级总线上继续搜索。这被称为“深度优先搜索(depth first search)”,关于这种搜索的细节内容,请参阅“Enumeration – Discovering the Topology”一节。
3.3 PCIe 设备(PCIe Devices)
PCIe 允许在单个 PCI 总线上最多挂载 32 个设备,然而 PCIe 点对点(pointto-point)的性质意味着只有一个设备可以直接连接在 PCIe 链路上,该设备只能 是 Device 0。RC 和 Switches 都含有虚拟 PCI 总线,这些虚拟总线使得可以让更 多的设备“连接”在总线上。每个设备都必须实现 Function 0,其最多可以有 8 个功能(Function)。当一个设备拥有 2 个或以上的 Function 时,便把这个设备成 为多功能设备(Multi-Function Device)。
3.4 PCIe 功能(PCIe Functions)
正如此前所讨论的一样,Function 是被设计在每个设备中的。这些 Function 可能包含硬盘驱动接口、显示控制器、以太网控制器、USB 控制器等等。具有多 Function 的设备不需要依次来逐个实现它们。例如,一个设备可以实现 Function 0、2、7。因此,当配置软件检测到了一个多 Function 设备时,必须检查所有可 能的 Function,以了解当前 Device 存在哪些 Function。每个 Function 都有它们自 己的配置地址空间,这个配置地址空间用于设置与 Function 相关的资源。
3.5 配置地址空间(Configuration Address Space)
初期的 PC 需要用户设置开关和跳线来给每个安装上去的板卡分配资源,这 样的方法经常会导致 memory、IO 和中断的设置出现冲突。这之后出现的两种 IO 架构——扩展 ISA(EISA,Extended ISA)和 IBM PS2 系统,这二者是初次实现 了即插即用(plug and play)的架构。在这些架构中,配置文件随每个插件卡一 起被提供,允许系统软件分配基本资源。PCI 扩展了这种能力,它通过实现标准 化的配置寄存器,允许通用的 Shrink-Wrapped(压缩包装)操作系统管理几乎所 有的系统资源。当拥有了一个标准化的方式来进行错误报告的开启与关闭、传送 中断、进行地址映射以及更多其他的操作之后,就使得可以通过一个实体——配 置软件,来进行系统资源的分配和配置,这样做就可以消除几乎所有的资源冲突。PCI 为每个 Function 都定义了一个专用的配置地址空间块。映射入这个配置 空间的寄存器们使得软件可以发现这个 Function 的存在,并对这个 Function 进 行一般的操作和检查状态。大多数需要标准化的基本功能都存在于配置寄存器块 的 Header 中,但是 PCI 架构师意识到若将可选功能(option feature,区别于前面 的基本功能)也标准化可以带来很多好处,称这些可选功能标准化后的结构为“能 力结构 capability structures”,(例如电源管理、热插拔等等)。对于每个 Function,都含有 256byte 的 PCI 兼容配置空间(PCI-Compatible configuration space)。
3.5.1 PCI 兼容空间(PCI-Compatible Space)
在阅读下面的讨论内容时,请同时参阅图 3-2。之所以将这256Byte命名为PCI-compatible configuration space(PCI 兼容配置空间),是因为这些配置空间原 本就是为 PCI 所设计的。这个配置空间的前 16DW(64bytes)就是配置头部 (header),有两种类型的 Header,分别为 Type 0 和 Type 1。Type 0 Header 对于 每个 Function 都是必须含有的,除了 Bridge,对于 Bridge Function 来说它使用的 是 Type 1 Header。剩余的 48DW 是一些可选寄存器,包括 PCI 能力结构(capability structure)。对于 PCIe Functions,也需要 capability structure 中的一部分。例如 PCIe Function 就必须实现如下的能力结构:
◆ PCI Express 能力(PCI Express Capability)
◆ 电源管理
◆ MSI、MSI-X
图3-2 PCI 兼容配置寄存器空间
3.5.2 扩展配置空间(Extended Configuration Space)
在阅读下面的讨论内容时,请同时参阅图 3-3。当引入 PCIe 之后,最初始 的 256byte 配置空间已经不足以放下所有的新的需要的 Capability Structure 了。因此配置空间的大小从原先的每个 Function 256Byte 扩展至了每个 Function 4KByte。新增加出来的 960DW 扩展配置空间只能通过增强配置机制(Enhanced configuration mechanism)来进行访问,因此这部分区域对于传统的 PCI 软件是不可见的,因为它无法发现这个区域并进行访问。在扩展配置空间内包含了新增 加的 PCIe 可选扩展能力寄存器(Extended Capability register),通过图 3-3 就可以看到一些被罗列出来的扩展能力寄存器(列出来的并非全部)。
图3-3 PCIe Function 拥有的4KB配置空间
没有回复内容