枚举过程是发现已经存在的、不确定的Device 和Function。枚举遍历基于深度优先,识别出每个device,如果是Bridge 则需要更新bridge 对于的bus Number,最后,找到每一个Endpoint 下的function。


枚举开始之前,CPU 只知道Bus 0存在,具体过程如下:
1、软件读取Device 0 (Bridge A)的Vendor ID,从0开始,读取bus 0的可能32个Device;
Vendor ID 从bus 0、device 0、function 0返回,表示至少有一个function,返回hFFFF 为非法。
2、Header Type 为b0000_0001 表示为PCI-to-PCI bridge,Multifunction bit 为0,表示当前function 0 唯一;
3、软件配置bridge 的bus Number 寄存器:
Primary Bus =0;Second Bus=1; Subordinate Bus =1;
Bridge 现在能直接到达downstream side 为1(Secondary Bus),最远的downstream side 为1(Subordinate Bus);
4、软件更新Host/PCI bridge 的Subordinate Bus Number 寄存器;
5、枚举软件读取bridge A 的Capability 寄存器,Device/Port Type 为b0100,指示为RC 的Root Port;
6、枚举软件必须深度优先,所以扫描bus 1之前必须完成扫描bus 0;
7、软件读取bus 1、device 0、function 0的Vendor ID,返回合理值表示当前的BDF 存在;
8、Header Type 返回b0000_0001 表示为PCI-to-PCI bridge,single-function device;
9、读取Bridge C 的Capability 寄存器,Device/Port Type 为b0100,指示upstream port为Switch;
10、软件更新bridge C 的bus Number 为:
Primary Bus =1;Second Bus=2; Subordinate Bus =2;
Bridge C 现在能直接到达downstream side 为2(Secondary Bus),最远的downstream side 为2(Subordinate Bus);
11、软件更新Host/PCI bridge 和 Bridge A 的Subordinate Bus Number 为2;
12、继续以深度优先枚举,读取bus 2、device 0、function 0 的Vendor ID寄存器,跟前面相同;
13、得到合理的Vendor ID,证明bus 2、device 0、function 0 存在;
14、Header Type 返回b0000_0001 表示Bridge D 为PCI-to-PCI bridge,single-function device;
15、读取Bridge D 的Capability 寄存器,Device/Port Type 为b0110,表示downstream 为Switch;
16、软件更新写Bridge D 的bus Number 为:
Primary Bus =2;Second Bus=3; Subordinate Bus =3;
Bridge D 现在能直接到达downstream side 为3(Secondary Bus),最远的downstream side 为3(Subordinate Bus);
17、软件更新Host/PCI bridge 和 Bridge A、Bridge C 的Subordinate Bus Number 为3;
18、继续以深度优先枚举,读取bus 3、device 0、function 0 的Vendor ID寄存器,跟前面相同;
19、得到合理的Vendor ID,证明bus 3、device 0、function 0 存在;
20、Header Type 返回b1000_0000,表示为一个Endpoint device,multi-function device;
21、读取Device 的Capability 寄存器,Device/Port Type 为b0000 表示一个Endpoint device;
22、枚举软件访问bus 3的Vendor ID对应的function 0-7,device 0返回额外function 1;
23、继续以深度优先枚举,返回一级bus 到bus 2,读取下一个device到device 1,发现Bridge E,BDF 为bus 2、device 1、function 0;
24、读取得到合理的Vendor ID,bus 2、device 1、function 0存在;
25、Header Type 返回b0000_0001 表示Bridge E 为PCI-to-PCI bridge,single-function device;
26、读取Bridge E的Capability 寄存器,Device/Port Type 为b0110,表示downstream 为Switch;
27、软件更新写Bridge E 的bus Number 为:
Primary Bus =2;Second Bus=4; Subordinate Bus =4;
Bridge E 现在能直接到达downstream side 为4(Secondary Bus),最远的downstream side 为4(Subordinate Bus);
28、软件更新Host/PCI bridge 和 Bridge A、Bridge C 的Subordinate Bus Number 为4;
29、继续以深度优先枚举,读取bus 4、device 0、function 0 的Vendor ID寄存器;
30、读取得到合理的Vendor ID,bus 4、device 0、function 0存在;
31、Header Type 返回b0000_0000,表示为Endpoint,single-function;
32、读取device 的Capability 寄存器,Device/Port Type 为b0000 表示一个Endpoint device;
33、继续以深度优先枚举,返回一级bus 到bus 2,读取下一个device到device 2,发现没有,证明bus 2 的device 全部枚举;
34、枚举软件返回已经bus到bus 0,读取下一个device 到device 1,也就是Bridge B的BDF bus 0、device 1、function 0;
35、跟前面步骤一样,读取Header Type、Capability,更新bus Number为:
Primary Bus =0;Second Bus=5; Subordinate Bus =5;
Bridge B 现在能直接到达downstream side 为5(Secondary Bus),最远的downstream side 为5(Subordinate Bus);
36、软件更新Host/PCI bridge 的Subordinate Bus Number 为5;
37、跟前面一样发现Bridge F,更新bus Number为:
Primary Bus =5;Second Bus=6; Subordinate Bus =6;
Bridge F 现在能直接到达downstream side 为6(Secondary Bus),最远的downstream side 为6(Subordinate Bus);
38、软件更新Host/PCI bridge 和 Bridge B 的Subordinate Bus Number 为6;
39、跟前面一样发现Bridge G,更新bus Number为:
Primary Bus =6;Second Bus=7; Subordinate Bus =7;
Bridge G 现在能直接到达downstream side 为7(Secondary Bus),最远的downstream side 为7(Subordinate Bus);
40、软件更新Host/PCI bridge 和 Bridge B、Bridge F 的Subordinate Bus Number 为7;
41、枚举发现一个Endpoint device,BDF为bus 7、device 0、function 0;
42、跟前面一样发现Bridge H,更新bus Number为:
Primary Bus =6;Second Bus=8; Subordinate Bus =8;
Bridge H 现在能直接到达downstream side 为8(Secondary Bus),最远的downstream side 为8(Subordinate Bus);
43、软件更新Host/PCI bridge 和 Bridge B、Bridge F 的Subordinate Bus Number 为8;
44、发现Bridge J,读取Capability 为PCIe-to-PCI Bridge;
45、Bridge J,更新bus Number为:
Primary Bus =8;Second Bus=9; Subordinate Bus =9;
Bridge J 现在能直接到达downstream side 为9(Secondary Bus),最远的downstream side 为9(Subordinate Bus);
46、软件更新Host/PCI bridge 和 Bridge B、Bridge F、Bridge H 的Subordinate Bus Number 为9;
47、所有bus 9 的device 和 function 完成枚举;
48、跟前面一样发现Bridge I,更新bus Number为:
Primary Bus =6;Second Bus=10; Subordinate Bus =10;
Bridge I 现在能直接到达downstream side 为10(Secondary Bus),最远的downstream side 为10(Subordinate Bus);
49、软件更新Host/PCI bridge 和 Bridge B、Bridge F 的Subordinate Bus Number 为10;
50、发现一个single-function 的device,BDF 为bus 10、device 0、function 0;

posted on 2024-06-23 11:29  向前走向钱看  阅读(475)  评论(0)    收藏  举报