3.4 了解下PCI实现配置机制的BDF


这是剖析PCIE协议的第15篇文章

内容简介

2024-01-01

    全文共871字,阅读大约需要4分钟,本文主要介绍有:

1、为啥要有Type00和01两种配置请求

2、CFG_ADDR信息转换为Type01

3、CFG_ADDR信息转换为Type00

主机BDF相关的概念,并先简单的理解下主机是如何访问设备的配置空间的


    上一节从理论上讲述了PCI是如何遍历PCI总线树的,这一节就要从实际实现上来阐述了。

01

CFG_ADDR和CFG_DATA

    与PCI设备配置相关的寄存器由CFG_ADDR、CFG_DATA和INT_ACK寄存器组成。CFG_ADDR和CFG_DATA用来访问PCI设备的配置空间,INT_ACK寄存器访问挂接在PCI总线上的中断控制器的中断向量,这个就先不说了,等放在后面的PCIE相关章节。这一节就首先看CFG_ADDR和CFG_DATA。

    如下图所示,CFG_ADDR(Address Port)的映射地址是0XCFC到0XCFF,CFG_DATA的映射地址是0XCF8到0XCFB,均是占用4字节,不同设备地址可能不一样,这不重要。如果对地址映射这个概念感到模糊的话,可看该文的解释。理论上讲给这两个寄存器写数就可以访问PCI的配置空间。如下图是16BM大小,那么这个大小是怎么来的呢?这就引出了BDF的概念。


02

BDF等字段的介绍

    CFG_ADDR寄存器内容是其实就是我们索引的目标设备,实现方式是采用BDF这样的方法,也就是所谓的ID路由。PCI设备的ID号主要由总线号(Bus Number)、设备号(Device Number)和功能号(Function Number)组成,如下图所示。

1

Enable bit

    第31bit,是一个使能位,置为 1 时,系统可以通过 CFG_ADDR 和 CFG_DATA 寄存器的组合,访问 PCI 设备的特定配置寄存器,以获取设备的信息、状态,或进行配置。置为 1 时就不允许了,算是一种保护机制。

2

Bus Number

    第23~16位,指定要访问的PCI设备所在的总线号,也就是上一节所提到的,总共7位,也就是可以容纳128个总线。

3

Device Number

    第15~11位,指定要访问的PCI设备的设备号,一共可以记录32个,实际上一条总线挂载10来个就不错了,挂多了负载太大,

4

Function Number

第11~8位,指定要访问的PCI设备的功能号,一共设备可以支持8最多8个功能。这要是在第二章所提到的

5

Register Number

    第7~2位指定要访问的PCI设备的指定功能的寄存器号,每个PCI设备都有一组配置数据,由于PCI是以32bit为单位,所以每次只能读取32bit,这个字段就是确定读取哪个32bit,所以6bit可以访问256个字节的配置空间。

    根据BDF等所占位宽我们可以得知,一个PCI域最多可以包括256个Bus,每个总线最多32个设备,每个设备最多8个功能模块,每个功能模块的配置空间是256KB,所以总配置空间为256*32*8*256 = 16,777,216KB = 16MB。也就是"Data Port"和Address Port的寻址范围。

    综上,使用 CFG_ADDR 和 CFG_DATA 寄存器的基本步骤:

1、设置要访问的总线号、设备号、功能号和寄存器号到 CFG_ADDR 寄存器的相应字段。

2、将 Enable Bit 设置为 1,启用 CFG_DATA 寄存器的访问。

3、使用 CFG_DATA 寄存器进行读取或写入配置空间寄存器的操作。

4、根据需要,将 Enable Bit 设置为 0,禁用 CFG_DATA 寄存器的访问。

    另外补充一句,PCI设备的读写是有专门的信号线控制,叫做C/BE,一共4bit,可以表示不同的事务类型,例如=10,是配置读,=7是配置写。

欢迎关注公众号点击【资料下载】领取相关资料







快来扫描下方二维码关注公众号,领取站内所有相关资料,所有哦~

有建议、有需求、有疑问、联系我

<