PCIe从入门到精通之二十:利用lspci对PCIe设备拓扑结构解析实战2
0,引言
在上一篇文章《PCIe从入门到精通之十九:利用lspci对PCIe设备拓扑结构解析实战1》中,我们利用lspci -t -v的输出,以一个简单的PCIe体系结构为例,重构它的拓扑结构。
这一篇我们将列举含有PCIe Switch的复杂PCIe体系架构,对此进行进一步深入的实战解析。
所有PCIe主题的文章都会收录在《深入浅出聊PCIe》
https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU3NDY3OTA2Nw==&action=getalbum&album_id=4142016342255960068#wechat_redirect合集里,你们的转发和评论是对我最大的支持。
需要下载PCIe学习资料标准的朋友(pdf格式),请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。
一, 含有PCIe Switch的PCIe体系拓扑结构重建
1、lspci -t -v 输出的详细解析:
图一是一个含有PCIe Switch的HOST CPU在运行lspci -t -v 命令后的输出结果,我们只截取了一部分内容来分析。这个系统是基于Intel Sky Lake-E的双CPU服务器架构,CPU本身有两个root port和两个集成的endpoint device。两个root port其中之一挂载有一个PCIe Switch,另外一个root port没有设备。
再此之前,我们把上一篇学习的内容再复习一遍。
根节点 (Root Node): 这里以以 +-[0000:17]开始,其中0000: 表示 PCI 域 (Domain)。在一个系统中可以有多个 PCI 域,但通常只有一个,即 0000。
子节点 (Child Nodes): 每个子节点代表一个连接到 PCI 总线上的设备。bus number是17(这篇文章里的数据都是十六进制).+-00.0是这个bus下的CPU root port1.
+- 或 \-: 表示连接关系,紧接着后面是[device.function]:
[Bus:Dev.Fun]是bus number, device number和function number:它会首先以树状图的形式展示 PCI 设备的拓扑结构,然后为每个设备提供详细的配置信息。
[PB:SB.Sub]是PCIe Bridge的三个寄存器,分别是Primary Bus Number Register, Secondary Bus Number Register和Subordinate Bus Number Register。


图一、含有PCIe Switch的HOST CPU lspci的输出结果
2、PCIe device设备列表
在这个PCIe体系中一共有下面这些PCIe device:
*一个Host Bridge(这个是CPU直接挂载),其下面直接连接Bus 17.
*两个PCI Bridge(就是CPU的一个Root port)分别是17:00.0和17:02.0。
*三个外置的NVMe SSD(外置独立的endpoint必须挂载在一个PCI Bridge下),该系统是挂载在PCIe Switch下的downstream port下。
*两个集成在CPU里的Endpoint device
其中,17:05.0, 17:05.2和17:05.4是一个device 17:05里的三个不同function;
17:08.0, 17:08.1, 17:08.2和17:08.3是一个device 17:08里的4个不同的function。
3, 构建该PCIe体系拓扑结构
图二是重建后该PCIe体系的拓扑结构。

图二、重建后的PCIe体系拓扑结构
其中Host Domain是0000,下面面直接挂载Bus 17。
* Host Domain的Bus17下有两个Virtual PCI-PCI Bridge 0和Virtual PCI-PCI Bridge 1。
* Virtual PCI-PCI Bridge 0下挂载有PCIe Switch0。Switch0的upstream 端口Virtual PCI-PCI Bridge 2的下面有且只有一条总线bus是bus19,在bus 19的downstream 方向,还有三个bridge:Virtual PCI-PCI Bridge 3,Virtual PCI-PCI Bridge 4, Virtual PCI-PCI Bridge 5和Virtual PCI-PCI Bridge 6。
Virtual PCI-PCI Bridge 3的本身ID是[Bus=19,Dev=04,Fun=0],下面直接相连的是Bus 1a,但是没有连接任何device。
Virtual PCI-PCI Bridge 4的本身ID是[Bus=19,Dev=05,Fun=0],下面直接相连的是Bus 1b,并且连接一个Samsung NVMe SSD,这个SSD的本身ID是[Bus=1b,Dev=00,Fun=0]。
Virtual PCI-PCI Bridge 5的本身ID是[Bus=19,Dev=06,Fun=0],下面直接相连的是Bus 1c,并且连接另外一个Samsung NVMe SSD,这个SSD的本身ID是[Bus=1c,Dev=00,Fun=0]。
Virtual PCI-PCI Bridge 6的本身ID是[Bus=19,Dev=07,Fun=0],下面直接相连的是Bus 1d,并且连接另外一个Intel NVMe SSD,这个SSD的本身ID是[Bus=1d,Dev=00,Fun=0]。
因此Virtual PCI-PCI Bridge 0的三个Bus(Primary Bus Number Register, Secondary Bus Number Register 和Subordinate Bus Number Register)的值是[PB=17,SB=18,Sub=22],该Virtual PCI-PCI Bridge2下Root port0本身的PCIe ID是[Bus=17,Dev=00,Fun=0]。Virtual PCI-PCI Bridge 2的三个Bus(Primary Bus Number Register, Secondary Bus Number Register 和Subordinate Bus Number Register)的值是[PB=18,SB=19,Sub=22]。
* Virtual PCI-PCI Bridge1没有连接任何设备,但系统BIOS仍然给它预留了Bus 23~2d,它的上游总线是17,下游总线是23,整个下游总线范围的上限2d。因此它的三个Bus(Primary Bus Number Register, Secondary Bus Number Register 和Subordinate Bus Number Register)的值是[PB=17,SB=23,Sub=2d],该Virtual PCI-PCI Bridge1下Root port1本身的PCIe ID是[Bus=17,Dev=02,Fun=0]。
* 剩下的都是位于Intel CPU内部的integrated Endpoint,它们按照Device ID的序号一次排开,其中[Bus=17,Dev=05,Fun=0], [Bus=17,Dev=05,Fun=2]和[Bus=17,Dev=05,Fun=4]是同一个PCIe device[Bus=17,Dev=05]的三个不同的function。[Bus=17,Dev=08,Fun=0], [Bus=17,Dev=08,Fun=1], [Bus=17,Dev=08,Fun=2]和[Bus=17,Dev=08,Fun=3]是同一个PCIe device[Bus=17,Dev=08]的四个不同的function。
三,抛砖引玉
在这一章中我们具体介绍了如何利用lspci对含有PCIe Switch的拓扑结构解析实战,这个例子比较复杂,期望大家能够掌握。
下一章我们将列举含有PCIe Switch的架构,对此进行深入的实战解析。
敬请关注下一篇:《PCIe从入门到精通之二十一:PCIe物理层实现的功能》
四,参考文献:
需要以下参考文献(PCIe标准)的朋友,请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。

百度网盘分享的文件
更多推荐
所有评论(0)