PCIe Base 和 Limit 寄存器

1. 基础知识

当 PCIe Function 的 BAR(Base Address Register)被 RC 进行配置之后,它就知道了自己被分配的地址段是多少。当 PCIe Function 收到一个 TLP 之后,会将该 TLP 访问的地址与自己的 BAR 中配置的地址段进行匹配,如果能匹配上,则进行处理。

对于 RC 或者 Switch,必须要知道它们的下游端口(Downstream Port)连接的设备所占用的地址空间在哪个区段。只有这样,当 RC 或者 Switch 收到 TLP 之后,才能决定要不要把这个 TLP 转发到下游端口。

RC 或者 Switch 的配置空间中都包含 Type 1 Header,格式如下:
在这里插入图片描述
Type 1 Header 中的 xxx Base 寄存器和 xxx Limit 寄存器存放的就是下游端口的设备所在的地址区段,分为三个类别:

  • Prefetchable Memory Space(P-MMIO)
  • Non-Prefetchable Memory Space(NP-MMIO)
  • IO Space(IO)

为了便于理解,后续的讨论我们都会基于下图所示的例子(记为“例1”):
在这里插入图片描述
从上图可以看出,Switch 的 Port B 连接了一个 PCIe Endpoint,该 Endpoint BAR 配置如下:

  • BAR0:NP-MMIO 类型,地址范围 0xF900_0000 ~ 0xF900_0FFF,共 4 KB。
  • BAR1-2:P-MMIO 类型,地址范围 0x2_4000_0000 ~ 0x2_43FF_FFFF,共 4 MB。
  • BAR3:IO 类型,地址范围 0x4000 ~ 0x40FF,共 256 Bytes。

2. Prefetchable Range(P-MMIO)

Type 1 headers 包含两对 Prefetchable Memory 相关的寄存器,分别是:

  • Prefetchable Memory Base & Limit Registers
  • Prefetchable Memory Base & Limit Upper 32 Bits Registers

从命名就可以看出,Prefetchable Memory Base & Limit Registers 用于保存 Prefetchable Memory 相关的低 32 位信息,而 Prefetchable Memory Base & Limit Upper 32 Bits Registers 用于保存 Prefetchable Memory 的高 32 位信息。

按照 例1 的场景,Switch Port B 所连接的 PCIe Endpoint 包含 4MB 的 P-MMIO 类型空间 (0x2_4000_0000 ~ 0x2_43FF_FFFF),因此需要将 Switch 的 Prefetchable Memory Base & Limit Registers 和 Prefetchable Memory Base & Limit Upper 32 Bits Registers 做如下配置:
在这里插入图片描述
首先,Prefetchable Memory Base Register 和 Prefetchable Memory Base Limit 的 bit[3:0] 的值是 0001,表明 该 switch 支持 64-bit 配置。注意,该区域是只读的。

第二,提取 P-MMIO 的起始地址的 bit[63:20],将 bit[63:32] 填入 Prefetchable Memory Base Upper 32 Bits Register,将 bit[31:20] 填入 Prefetchable Memory Base Register 的 bit[15:4]。P-MMIO 起始地址的 bit[19:0] 是不会被用到的,默认会认为 bit[19:0] 全部都是 0,也就是说,默认 P-MMIO 的地址空间是 1MB 地址对齐的。

第三,提取 P-MMIO 的结束地址的 bit[63:20],将 bit[63:32] 填入 Prefetchable Memory Limit Upper 32 Bits Register,将 bit[31:20] 填入 Prefetchable Memory Limit Register 的 bit[15:4]。P-MMIO 结束地址的 bit[19:0] 是不会被用到的,默认会认为 bit[19:0] = 0xF_FFFF。

3. Non-Prefetchable Range(NP-MMIO)

NP-MMIO 仅支持 32-bit 地址,所以只需要一对寄存器:Non-Prefetchable Memory Base & Limit Registers。

按照 例1 的场景,Switch Port B 所连接的 PCIe Endpoint 包含 4KB 的 NP-MMIO 类型空间 (0xF900_0000 ~ 0xF900_0FFF),因此需要将 Switch 的 Non-Prefetchable Memory Base & Limit Registers 做如下配置:
在这里插入图片描述
首先,Non-Prefetchable Memory Base & Limit Registers 的 bit[3:0] 都是 0,表明支持 32-bit 配置。注意,该区域是只读的。

第二,将 NP-MMIO 地址范围的起始地址的 bit[31:20] 填入 Non-Prefetchable Memory Base Registers 的 bit[15:4]。起始地址的 bit[19:0] 不会被使用,默认为 0,即 NP-MMIO Base 地址默认是 1MB 对齐的。

第三,将 NP-MMIO 地址范围的结束地址的 bit[31:20] 填入 Non-Prefetchable Memory Limit Registers 的 bit[15:4]。结束地址的 bit[19:0] 不会被使用,默认为 0xF_FFFF。

这里有个比较有意思的地方,Switch Port B 下面的 PCIe Endpoint 其实只使用了 4KB 的 NP-MMIO 地址段(0xF900_0000 - 0xF900_0FFF),但是 Non-Prefetchable Memory Base & Limit Registers 的配置中,只使用了起始地址和结束地址的 bit[31:20]。因此,Switch Port B 实际分配的 NP-MMIO 地址空间是 0xF900_0000 - 0xF90F_FFFF,共 1024 KB。这样,实际上造成了 1020 KB 的地址空间浪费,但也没啥办法。

4. IO Range

IO 类型也需要两对寄存器:

  • IO Base/Limit Registers
  • IO Base/Limit Upper 16
    Bits Registers

从命名可以看出,IO Base/Limit Upper 16
Bits Registers 用来保存高 16 位地址信息。

按照 例1 的场景,Switch Port B 所连接的 PCIe Endpoint 包含 256 Bytes 的 IO 资源(0x4000 ~ 0x40FF),需要进行的配置如下:
在这里插入图片描述

首先,IO Base/Limit Registers 的 bit[3:0] 为 0,表明该 switch 支持 16-bit 配置。因此,IO Base/Limit Upper 16Bits Registers 为 0。

第二,将 IO 地址段的起始地址的 bit[15:12] 填入 IO Base Register 的 bit[7:4]。起始地址的 bit[11:0] 不会被使用,默认按 0 处理,即 IO Base 地址按照 4KB 对齐。

第三,将 IO 地址段的结束地址的 bit[15:12] 填入 IO Limit Register 的 bit[7:4]。结束地址的 bit[11:0] 不会被使用,默认按照 bit[11:0] = 0xFFF 处理。

这里和 NP-MMIO 一样,也存在资源浪费的情况。PCIe Endpoint 实际使用的地址段为 0x4000 - 0x40FF,但配置 IO Base/Limit Register 时,能分配的最小区段是 4KB,所以多分配的 (4KB- 256 Bytes) 是被浪费的。

5. Unused Base and Limit Registers

有些时候,并不会同时用到 P-MMIO、NP-MMIO、IO 三种地址空间。实际上,PCIe 协议并不建议 IO 地址空间。

当某种类型的地址空间没有被 Endpoint 使用时,它所对应的 Switch 的 Base 和 Limit 该怎么配置?没办法它们配置成全 0,因为 Base 的低地址位总是0s,而 Limit 的低地址为总是 Fs,在把 Base 和 Limit 的其他位设置为 0 的时候,Base 和 Limit 的低地址位就会构成有效的地址段。因此,在这种情况下,需要把 Base 寄存器配置成比 Limit 寄存器更高的地址。例如,IO 地址空间未被使用时,可以把对应的 Base 设置为 F0h,Limit 设置为 00h。鉴于 Base 高于 Limit,此时 Switch 就会察觉到这一个非法的配置,继而认为 IO 地址段并未被使用。

参考资料:
[1] Mike Jackson & Ravi Budruk,PCI Express Technology,Page 136 - 144

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值