PCIE 基址寄存器BAR概念梳理

时间:2024-03-17 09:53:17

1、BAR概述

1.1 板卡读写访问PC

如果板卡向 PC 发送TLP 包,例如 MWr 包,那很好理解,地址信息就是PC 的物理地址(注意这里说的是物理地址);如果是 MRd 包,那 PC 收到后回复一个完成包,板卡从完成包分析出数据即得到 MRd 读取地址的数据。

1.2 PC读写访问板卡

那PC 如何读写板卡的数据呢?简单的解释, PC 启动是, BIOS 探测所有的外设。对 PCIe( PCI)设备来说, BIOS 检测到板卡有多少个 BAR 空间,每个空间有多大,然后对应为这些 BAR 空间分配地址。对 PC 设备来说,它能“看”到 PCIe 板卡的空间只有 BAR 空间,也就只能访问这些 BAR 空间。也就是说,板卡可以发送合法的PCIe TLP 包,并得到 PC 端的相应;但是 PC 端访问板卡被局限在 BAR 空间。

简单来说,PC机想操作PCIE设备的内存空间,只能通过bar空间来进行操作。PC机只能看见bar空间(忽略地址起始和开始),PCIE核通过检测不同的地址来判断要进行task1还是task2。

PCIE 基址寄存器BAR概念梳理

 

BAR中硬编码的比特包括请求类型、请求大小和是否可以把目标设备认为是可预取的。

Type0 Header中BAR寄存器数据位宽D是32位,寄存器高位是可以配置的,配置之后可以表示设备的起始地址;寄存器值中间一些数据位是不可操作的,用于表示请求的地址大小范围;低几位是操作类型等信息位。

在PCIE IP Core配置过程中,会有BAR地址相关配置。可以设置BAR的大小,该值对应下图Type0 Header中BAR32位寄存器不可操作位的个数。

BAR部分低比特位是不可以被软件操作的,只有其高比特位才可以被软件操作。而这些不可操作的低比特决定了当前BAR支持的操作类型和可申请的地址空间的大小。

PCIE 基址寄存器BAR概念梳理

PCIE 基址寄存器BAR概念梳理

2、BAR配置过程

  1. 通过cfg write request向BAR地址写入全1。
  2. 通过cfg read request读取BAR。
  3. 根据读取的BAR值进行如下判断BAR的请求大小、请求类型等,然后配置软件执行写(类型0)以编程起始地址,即对BAR寄存器的高位编程设备的起始地址。

3、BAR地址范围与TLP包地址对应关系

TLP地址字段和BAR空间地址的关系:

TLP就能根据地址被路由到对应设备的BAR空间中去。比如说现在有一个mem read request,如果路由地址(地址信息包含在TLP中)是0x71000000,而有一个设备func0的mem空间范围是0x70000000~0x80000000,那么这个TLP就会被这个func处理。从func0的0x71000000对应的地址读取相应数据。

存储器地址和TLP地址字段的关系:

 

 

 

参考文献

作者 博文
1、ABCamus PCIe实践之路:BAR空间和TLP
2、 PCI Express 系统体系结构标准教材
3、Felix PCIe扫盲——基地址寄存器(BAR)详解