目录

1,PCI Header

2,BAR(Base Address Register)

2.1,BAR的属性

2.1.1,MEM BAR

2.1.2,IO BAR

2.2,BAR的大小 

3,MEM地址与IO地址范围

3.1,prefetchable memory range

3.2,non-prefetchable memory range

3.3,IO Range

4,总线号


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)。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐