PCIe学习笔记(二)-------2.2 PCI Header(BAR大小、MEM与IO范围、总线号)
目录1,PCI Header2,BAR(Base Address Register)2.1,BAR的属性2.1.1,MEM BAR2.1.2,IO BAR2.2,BAR的大小3,MEM地址与IO地址范围3.1,prefetchable memory range3.2,non-prefetchable memory range3.3,IO Range4,总线号1,PCI HeaderPCIe配置空间
目录
3.2,non-prefetchable memory range
1,PCI Header
PCIe配置空间中前64 Byte为PCI Header,分为Type0 和Type1两种类型。如下图所示,两种头类型的寄存器存在一定区别,下面将介绍TLP路由过程中比较重要的几组寄存器。
2,BAR(Base Address Register)
上图中的<1表示的寄存器即是BAR,type1类型的头共有两个BAR(BAR0,BAR1),type0类型的头共有6个BAR(BAR0 ~ BAR5)。BAR的大小由PCIe设备厂商在出厂前就已经设好,软件通过一定的操作可以读出BAR的大小。BAR和TLP的地址路由相关。
2.1,BAR的属性
BAR寄存器的bit[0] 可以用来表示BAR是作为IO映射还是作为MEM映射。两种BAR的属性比特不完成相同。
2.1.1,MEM BAR
bit[0] : 0表示为MEM类型的BAR
bit[2:1] : 2'b00表示为32bit 的BAR,2’b10表示为64bit BAR
bit[3] : 1:prefetchable 0:non-prefetchable
当BAR为64bit 的MEM BAR时,两个相连的BAR组成一个64bit BAR。下图中两个相邻的BAR(BAR N 和 BAR N+1)则表示prefectchable 64bit MEM BAR
2.1.2,IO BAR
bit[0] : 为1代表IO BAR
bit[1] : reserved,但读的时候必须返回1‘b0
2.2,BAR的大小
BAR的大小在设备出厂时就已经设定好了,通过设置BAR寄存器中不可写的比特位来决定BAR的大小。以type0 的BAR来进行说明。
(1)未进行任何操作的BAR0
(2)向BAR0的每个bit进行写1’b1操作,然后读取BAR0的值。
发现BAR0为prefetchable 32bit MEM BAR。由于BAR0寄存器的低20bit(bit[19:0])都是不可写的,所以回读出来发现写成1的的最低比特是bit[20],那么该BAR的大小就是2^20 = 1MB
(3)配置BAR0的起始地址。图中配置为0x10000000。
所以BAR0表示的BAR区间范围为:0x10000000 ~ 0x10000000 + 1MB
3,MEM地址与IO地址范围
文首的图中<2的寄存器表示了MEM地址与IO地址的范围,这些和TLP包的地址路由相关。下面将介绍寄存器是如何表示地址范围的。
3.1,prefetchable memory range
可预取的MEM地址通过base 和 limit 来确定。支持32bit 或者 64bit寻址模式。32bit寻址时,DW10,DW11将无效。下图为64bit的prefetchable memory的地址区间的一个示例。
Base寄存器:共16bit。高12bit 为0x800,代表32bit地址的高12bit。后面默认补上00000,则表示的32bit地址为 0x80000000。
低 4bit 为0x1,表示为64bit 寻址模式,则该Base表示的32bit地址和Base Upper寄存器一起组成64bit地址。为0x0时表示32bit 寻址模式。
Base Upper寄存器:共32bit。代表可预取Memory空间64bit寻址时的高32bit Base地址。图中为0x00000001
则表示的Base地址为 0x0000_00001_8000_0000
Limit寄存器:共16bit。高12bit为 0xFFF,代表32bit地址的高12bit。后面默认补上FFFFF,则表示的32bit地址为 0xFFFFFFFF
低 4bit 为0x1,表示为64bit 寻址模式,则该Limit表示的32bit地址和Limit Upper寄存器一起组成64bit地址。为0x0时表示32bit 寻址模式。
Limit Upper寄存器:共32bit。代表可预取Memory空间64bit寻址时的高32bit Limit地址。图中为0x00000002
则表示的Limit地址为0x0000_0002_FFFF_FFFF
可预取的Memory范围为: 0x0000_00001_8000_0000 ~ 0x0000_0002_FFFF_FFFF
3.2,non-prefetchable memory range
不可预取的memory地址只能在32bit内寻址,范围由Base和Limit来决定(DW8)。以下图为例说明。
Memory Base:共16bit。高12bit 为0x121,代表32bit地址的高12bit。后面默认补上00000,则表示的32bit地址为 0x12100000。
低4bit 必须为0x0
Memory Limit:共16bit。高12bit 为0x122,代表32bit地址的高12bit。后面默认补上FFFFF,则表示的32bit地址为 0x122FFFFF。
低4bit 必须为0x0
不可预取的Memory范围为: 0x1210_0000 ~ 0x122F_FFFF。
3.3,IO Range
IO范围也是由Base和Limit寄存器来控制的。IO地址空间可以在16bit地址间寻址,也可以在32bit地址空间寻址。以下图进行说明。
IO Base:共8bit。高4bit 为0x2,代表16bit地址的高4bit。后面默认补上00000,则表示的16bit地址为 0x2000。
低4bit 为0x1,代表为32bit寻址,其中高16bit在Upper Base寄存器中。为0x0,则代表16bit 寻址。
Base Upper:共16bit。代表IO地址空间32bit寻址时的高16bit Base地址。图中为0x0000。
IO Base地址为:0x0000_2000
IO Limit:共8bit。高4bit 为0x4,代表16bit地址的高4bit。后面默认补上FFFF,则表示的16bit地址为 0x4FFFF。
低4bit 为0x1,代表为32bit寻址,其中高16bit在Upper Limit寄存器中。为0x0,则代表16bit 寻址。
Limit Upper:共16bit,代表IO地址空间32bit寻址时的高16bit Limit地址。图中为0x0000。
IO Limit地址为:0x0000_4FFFF
则IO地址空间范围为:0x0000_2000 ~ 0x0000_4FFF
4,总线号
在type1的PCI Header中有一些寄存器记录了当前Function的总线号。它们是文首图中的<3这类的寄存器。这些寄存器主要用于TLP包的ID路由。
Primary Bus Number:代表朝向RC方向的PCI 总线号。
Secondary Bus Number:代表下游链路的PCI 总线号。
Subordinate Bus Number:代表了下游端口上最高(大)的总线号。当没有接桥的时候,二级总线号和从属总线号是一样的值。
RC port上的丛属总线号可以表示这条PCIe拓扑结构上连接了多少个Type1 的function(包含RC自己的port)。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)