logo资料库

PCI设备BAR空间的初始化.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
3.1 PCI设备BAR空间的初始化
3.1.1 存储器地址与PCI总线地址的转换
3.1.2 PCI设备BAR寄存器和PCI桥Base、Limit寄存器的初始化
3.1 PCI 设备 BAR 空间的初始化 (2011-05-12 15:22:01) 转载 标签: 分类: 浅谈 PCIe 体系结构 杂谈 在 PCI Agent 设备进行数据传送之前,系统软件需要初始化 PCI Agent 设备 的 BAR0~5 寄存器和 PCI 桥的 Base、Limit 寄存器。系统软件使用 DFS 算法对 PCI 总线进行遍历时,完成这些寄存器的初始化,即分配这些设备在 PCI 总线域的地 址空间。当这些寄存器初始化完毕后,PCI 设备可以使用 PCI 总线地址进行数据 传递。 值得注意的是,PCI Agent 设备的 BAR0~5 寄存器和 PCI 桥的 Base 寄存器保 存的地址都是 PCI 总线地址。而这些地址在处理器系统的存储器域中具有映像, 如果一个 PCI 设备的 BAR 空间在存储器域中没有映像,处理器将不能访问该 PCI 设备的 BAR 空间。 如上文所述,处理器通过 HOST 主桥将 PCI 总线域与存储器域隔离。当处理 器访问 PCI 设备的地址空间时,需要首先访问该设备在存储器域中的地址空间, 并通过 HOST 主桥将这个存储器域的地址空间转换为 PCI 总线域的地址空间之后, 再使用 PCI 总线事务将数据发送到指定的 PCI 设备中。 PCI 设备访问存储器域的地址空间,即进行 DMA 操作时,也是首先访问该存 储器地址空间所对应的 PCI 总线地址空间,之后通过 HOST 主桥将这个 PCI 总线 地址空间转换为存储器地址空间,再由 DDR 控制器对存储器进行读写访问。 不同的处理器系统采用不同的机制实现存储器域和 PCI 总线域的转换。如 PowerPC 处理器使用 Outbound 寄存器组实现存储器域到 PCI 总线域间的转换, 并使用 Inbound 寄存器组实现 PCI 总线域到存储器域间的转换。 而 x86 处理器没有这种地址空间域的转换机制,因此从 PCI 设备的角度上看, PCI 设备可以直接访问存储器地址;从处理器的角度上看,处理器可以直接访问 PCI 总线地址空间。但是读者需要注意,在 x86 处理器的 HOST 主桥中仍然有存 储器域与 PCI 总线域这个概念。只是在 x86 处理器的 HOST 主桥中,存储器域的 存储器地址与 PCI 总线地址相等,这种“简单相等”也是一种映射关系。 3.1.1 存储器地址与 PCI 总线地址的转换
下文根据 PowerPC 和 x86 处理器的主桥,抽象出一个虚拟的 HOST 主桥,并 以此为例讲述 PCI Agent 设备之间,以及 PCI Agent 设备与主存储器间的数据传 送过程。 我们假设在一个 32 位处理器中,其存储器域的 0xF000-0000~0xF7FF-FFFF(共 128MB)这段物理地址空间与 PCI 总线的地址空间 存在映射关系。 当处理器访问这段存储器地址空间时,HOST 主桥将会认领这个存储器访问, 并将这个存储器访问使用的物理地址空间转换为 PCI 总线地址空间,并与 0x7000-0000~0x77FF-FFFF 这段 PCI 总线地址空间对应。 为简化起见,我们假定在存储器域中只映射了 PCI 设备的存储器地址空间, 而不映射 PCI 设备的 I/O 地址空间。而 PCI 设备的 BAR 空间使用 0x7000-0000~0x77FF-FFFF 这段 PCI 总线域的存储器地址空间。 在这个 HOST 主桥中,存储器域与 PCI 总线域的对应关系如图 3- 1 所示。 当 PCI 设备使用 DMA 机制,访问存储器域地址空间时,处理器系统同样需要 将存储器域的地址空间反向映射到 PCI 总线地址空间。假设在一个处理器系统 中,如果主存储器大小为 2GB,其在存储器域的地址范围为 0x0000-0000~0x7FFF-FFFF,而这段地址在 PCI 总线域中对应的“PCI 总线地址 空间”为 0x8000-0000~0xFFFF-FFFF。
因此 PCI 设备进行 DMA 操作时,必须使用 0x8000-0000~0xFFFF-FFFF 这段 PCI 总线域的地址,HOST 主桥才能认领这个 PCI 总线事务,并将这个总线事务使用 的 PCI 总线地址转换为存储器地址,并与 0x0000-0000~0x7FFF-FFFF 这段存储器 区域进行数据传递。 在一个实际的处理器系统中,很少有系统软件采用这样的方法,实现存储器 域与 PCI 总线域之间的映射,“简单相等”还是最常用的映射方法。本章采用图 3- 1 的映射关系,虽然增加了映射复杂度,却便于读者深入理解存储器域到 PCI 总线域之间的映射关系。下文将以这种映射关系为例,详细讲述 PCI 设备 BAR0~5 寄存器的初始化。 3.1.2 PCI 设备 BAR 寄存器和 PCI 桥 Base、Limit 寄存器的初始化 PCI 桥的 Base、Limit 寄存器保存“该桥所管理的 PCI 子树”的存储器或者 I/O 空间的基地址和长度。值得注意的是,PCI 桥也是 PCI 总线上的一个设备, 在其配置空间中也有 BAR 寄存器,本节不对 PCI 桥 BAR 寄存器进行说明,因为在 多数情况下透明桥并不使用其内部的 BAR 寄存器。下文以图 3- 2 所示的处理器 系统为例说明上述寄存器的初始化过程,该处理器系统使用的存储器域与 PCI 总线域的映射关系如图 3- 1 所示。
在 PCI 设备的 BAR 寄存器中,包含该设备使用的 PCI 总线域的地址范围。在 PCI 设备的配置空间中共有 6 个 BAR 寄存器,因此一个 PCI 设备最多可以使用 6 组 32 位的 PCI 总线地址空间,或者 3 组 64 位的 PCI 总线地址空间。这些 BAR 空间可以保存 PCI 总线域的存储器地址空间或者 I/O 地址空间,目前多数 PCI 设备仅使用存储器地址空间。而在通常情况下,一个 PCI 设备使用 2 到 3 个 BAR 寄存器就足够了。 为简化起见,我们首先假定在图 3- 2 中所示的 PCI 总线树中,所有 PCI Agent 设备只使用了 BAR0 寄存器,其申请的数据空间大小为 16M 字节(即 0x1000000 字节)而且不可预读,而且 PCI 桥不占用 PCI 总线地址空间,即 PCI 桥不含有 BAR 空间。并且假定当前 HOST 主桥已经完成了对 PCI 总线树的编号。 根据以上假设,系统软件该 PCI 总线树的遍历过程如下所示。 (1) 系统软件根据 DFS 算法,系统软件率先寻找到第一组 PCI 设备,分别 为 PCI 设备 31 和 PCI 设备 321[1],并根据这两个 PCI 设备需要的 PCI 空 间大小,从 PCI 总线地址空间中(0x7000-0000~0x77FF-FFFF)为这两个 PCI 设备的 BAR0 寄存器分配基地址,分别为 0x7000-0000 和 0x7100-0000。 (2) 当系统软件完成 PCI 总线 3 下所有设备的 BAR 空间的分配后,将初始 化 PCI 桥 3 的配置空间。这个桥片的 Memory Base 寄存器保存其下所有 PCI 设备使用的“PCI 总线域地址空间的基地址”,而 Memory Limit 寄 存器保存其下 PCI 设备使用的“PCI 总线域地址空间的大小”。系统软 件将 Memory Base 寄存器赋值为 0x7000-0000,而将 Memory Limit 寄存 器赋值为 0x200-0000。 (3) 系统软件回朔到 PCI 总线 2,并找到 PCI 总线 2 上的 PCI 设备 21,并 将 PCI 设备 21 的 BAR0 寄存器赋值为 0x7200-0000。 (4) 完成 PCI 总线 2 的遍历后,系统软件初始化 PCI 桥 2 的配置寄存器, 将 Memory Base 寄存器赋值为 0x7000-0000,Memory Limit 寄存器赋值 为 0x300-0000。 (5) 系统软件回朔到 PCI 总线 1,并找到 PCI 设备 11,并将这个设备的 BAR0 寄存器赋值为 0x7300-0000。并将 PCI 桥 1 的 Memory Base 寄存器赋值 为 0x7000-0000,Memory Limit 寄存器赋值为 0x400-0000。 (6) 系统软件回朔到 PCI 总线 0,并在这条总线上发现另外一个 PCI 桥, 即 PCI 桥 4。并使用 DFS 算法继续遍历 PCI 桥 4。首先系统软件将遍历 PCI 总线 4,并发现 PCI 设备 41 和 PCI 设备 42,并将这两个 PCI 设备的 BAR0 寄存器分别赋值为 0x7400-0000 和 0x7500-0000。
(7) 系统软件初始化 PCI 桥 4 的配置寄存器,将 Memory Base 寄存器赋值 为 0x7400-0000,Memory Limit 寄存器赋值为 0x200-0000。系统软件再 次回到 PCI 总线 0,这一次系统软件没有发现新的 PCI 桥,于是将初始 化这条总线上的所有 PCI 设备。 (8) PCI 总线 0 上只有一个 PCI 设备,PCI 设备 01。系统软件将这个设备 的 BAR0 寄存器赋值为 0x7600-0000,并结束整个 DFS 遍历过程。 2[1] HOST 主桥下的第一个桥片是 PCI 桥片 1,PCI 桥片 1 下的第一个桥片是 PCI 桥片 2,而 PCI 桥片 2 下的第一个桥片是 PCI 桥片 3,因而第一组 PCI 设备 为 PCI 总线 3 下的 PCI 设备。不同的系统软件查找第一组 PCI 设备的方法不同, Linux 认为第一组 PCI 设备为 PCI 总线 0 下的 PCI 设备。
分享到:
收藏