1. 动态映射ECAM空间
我们在《SylixOS PCIe开发(二)》文章中介绍了使用ECAM方式来访问PCI设备的配置空间,这种方式的缺点就是如果想访问所有总线上的设备,一共需要256MB的地址空间,在实际使用中,并不是每个总线上都存在设备,如果按256MB空间来分配的话会造成很大一部分空间的浪费。下面介绍的动态映射ECAM空间的方法就可以解决这个问题,从而达到即能访问各个设备的配置空间又能节省空间的目的。
首先我们来学习ATU寄存器组,ATU(Address Translation Unit)用于建立cpu物理地址和pci地址之间的映射关系,包括两大寄存器组,outbound和inbound寄存器组。outbound寄存器用在rc模式,Inbound寄存器用在ep模式,这里我们只关注rc模式。
用于建立映射要设置的寄存器大致有4种,这里讲解的是简化的版本,具体的寄存器意义参见各个SOC的芯片手册。这4种寄存器如下:
寄存器
|
意义
|
类型寄存器
|
要映射的类型,比如io,mem,参考pcie协议
|
基址寄存器
|
cpu物理地址
|
目标地址寄存器
|
pci地址
|
大小
|
映射的区域大小
|
类型除了io和mem之外,还有cfg0,cfg1用来表示访问设备的配置空间。
当需要动态映射ECAM空间时,表中的cpu物理地址和映射区域大小都是初始化的时候确定的,而且映射区域的大小4KB即可,为什么呢?因为一个BDF所对应的配置空间大小就是4KB,所以映射4KB就能访问一个BDF的全部配置空间了。当访问不同的BDF时,需要根据BDF组合成具体的pci地址,然后填到目标地址寄存器中,这个组合规则不同的芯片不一样,具体参见芯片手册。最后根据当前设备和主桥的关系来决定是发起cfg0还是cfg1访问。
评论