SylixOS PCIe开发(四)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2020年12月26日20:28:02 评论 1,228

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访问。

gewenbin
  • 本文由 发表于 2020年12月26日20:28:02
  • 转载请务必保留本文链接:http://www.databusworld.cn/9886.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: