PCIe configuration 包分析
本文分析默认以EP为几点,不讨论关于RC的内容。本文的重点是配置包(cfgwr,cfgrd)包的分析,分析包的组成,包的作用域以及包的路由方式。开始分析之前,先给出以上的基础知识。
1基础知识
1. pcie包的分类
pcie根据组成,包可分为三种,TLP,DLLP, orderset。本文讨论的配置包为TLP包,由下图可知TLP有header以及数据payload。重点关注header部分。
TLP
DLLP
orderset
2. 配置包作用域
如下图所示,为PCIe的配置空间示意图。前面的256BYTE是必须的,后面的1K-256 BYTE是非必须的,配置空间就像一个清单,把这个设备的,准确说功能块的属性信息,包含id以及各种能力。配置包的操作的空间就是这块区域。
3. 配置包路由方式
根据PCIe的规格可知,枚举是根据深度优先搜索的遍历方法,进行编号。下图很形象的展示了,在整个拓扑结构中,通过BDF就可以确定功能块的位置,BDF即bus number + device number + function number(ARI能力除外)。配置空间是功能块独有的属性,所以用BDF的路由方式,比地址更加方便。
2. cfgwr包分析
1. 基本域分析
由包头的定义可知,更具长度分为3DW和4DW两种,包头的第一BYTE就知道包传输的是哪种类型,cfgwr是3DW,cfgwr为0x44,cfgrd0x04,下午主要讨论0x44这种包。
配置空间没有优先级虚拟等传输特性,所以TC/AT/ATTR必须为0. 因为是3DW,每次操作的数据只有一个DW,所以last BE为0,length为1。
由上文基础知识可知配置空间总共为1KB。必须实现的是256B,所以register number为6为,对应256B, ext_register为4位,总共10位正好对应1KB空间。分析可以访问的地址为
BDF + ext_register + register
2. 作用机制分析
下图颜色有些花,请海涵。对于cfgwr操作,需要有回复的cpl包。这点关于nonposted包的描述请查阅相关文档,本文不再赘述。由上文可知,BDF + ext_register + register可以访问到具体的寄存器。completer为执行操作的主体,所以completer id其实就是BDF,这点用相同颜色表示。为什么还要有tag呢?tag是为了做outstanding的实现,理论上我可以有256个写配置空间的请求在路上,在有应答之前。既然有BDF,为什么还需要requester id呢?想下,在一个拓扑有很多设备,那我的回复信息,应该给谁呢?虽然说PCIe是点对点的传输机制,最起码我要把完成的信息路由回去,这样master才知道配置写的操作已经完成了。
由上文,可以知道PCIe的配置包的工作机理,下面给出了一个包的实现例子,希望本文能让大家对配置包有个基本的认知。