sylixos pci 驱动踩坑记录

1、关于IO空间 memory空间 配置空间

1.1、配置空间:

就是配置PCI设备的寄存器集合。PCI总线规范定义的配置空间总长度为256个字节,配置信息按一定的顺序和大小依次存放。前64个字节的配置空间称为配置头,对于所有的设备都一样,配置头的主要功能是用来识别设备、定义主机访问PCI卡的方式(I/O访问或者存储器访问,还有中断信息)。其余的192个字节称为本地配置空间,主要定义卡上局部总线的特性、本地空间基地址及范围等。

一般我们需要关心配置空间中配置头的信息。配置头寄存器信息如下:

       

  • Base Address Register0~5寄存器,该组寄存器简称为BAR寄存器,BAR寄存器保存PCI设备使用的地址空间的基地址,注意,该基地址是指PCI设备的PCI总线地址,并不是在CPU地址空间中的地址。其中每一个设备最多可以有6个基地址空间,但多数设备不会使用这么多组地址空间。

         在PCI设备复位之后,BAR寄存器存放PCI设备需要使用的基址空间大小,这段空间可以是IO空间,也可以是存储器空间。系统软件对PCI总线进行配置时,首先获得BAR寄存器中的初始化信息,之后根据处理器系统的配置,将合理的基地址写入相应的BAR寄存器中。系统软件还可以使用该寄存器,获得PCI设备使用的BAR空间的长度,其方法是向BAR寄存器写入0xFFFF-FFFF,之后再读取该寄存器。

        处理器访问PCI设备的BAR空间时,需要使用BAR寄存器提供的基地址。值得注意的是,处理器使用的是CPU地址空间的地址,而BAR寄存器存放的是PCI总线地址。因此处理器系统需要将PCI总线地址转换为CPU地址空间的地址。在许多处理器系统中,如Alpha和PowerPC处理器系统,PCI总线地址与CPU地址空间地址并不相等。但是在x86系统中,这两个地址的值是一样的,也就是它们之间的关系是一一映射的。但是,即使这两个地址的值是一样的,也需要明白这两个地址是不同地址空间中的地址。同时这个CPU地址空间的地址表示的是物理地址,需要使用ioremap这类接口映射为虚拟地址后,才能被驱动或内核使用。

        处理器访问PCI设备的BAR空间时,需要使用BAR寄存器提供的基地址。值得注意的是,处理器使用存储器域的地址,而BAR寄存器存放PCI总线域的地址。因此处理器系统并不能直接使用“BAR寄存器+偏移”的方式访问PCI设备的寄存器空间,而需要将PCI总线域的地址转换为存储器域的地址。

        如果x86处理器系统使能了IOMMU后,这两个地址也并不一定相等,因此处理器系统直接使用这个PCI总线域的物理地址,并不能确保访问PCI设备的BAR空间的正确性。除此之外在sylixos系统中,ioremap函数的输入参数为存储器域的物理地址,而不能使用PCI总线域的物理地址。

        因此在编写SylixOS系统的设备驱动程序时,需要使用bar的物理地址,然后再经过ioremap函数将物理地址转换为“存储器域”的虚拟地址。
 

        在x86处理器的北桥中,有两个端口寄存器,分别为CONFIG_ADDRESS和CONFIG_DATA寄存器,其地址为0xCF8和0xCFC。x86处理器使用这两个IO端口来访问PCI设备的配置空间。PCI总线规范也以这两个寄存器为例,说明处理器如何访问PCI设备的配置空间。其中CONFIG_ADDRESS寄存器存放PCI设备的ID号,而CONFIG_DATA寄存器存放进行配置读写的数据。

        当x86处理器对CONFIG_DATA寄存器进行IO读写访问(也就是通过IN/OUT指令访问此端口地址),且CONFIG_ADDR寄存器的Enable位为1时,HOST主桥将这个IO读写访问转换为PCI配置读写总线事务,然后发送到PCI总线上,PCI总线根据保存在CONFIG_ADDR寄存器中的ID号,将PCI配置读写请求发送到指定PCI设备的指定配置空间寄存器中。如下图所示:

1.2、 PCI设备的存储器地址空间(又叫做Memory空间资源)

        PCI设备的存储器地址空间是指PCI地址空间映射在CPU地址空间中的一段地址范围,这段地址范围可能是一个PCI设备的相关控制寄存器集合(注意,这里的寄存器和配置空间中的寄存器是两种不同的寄存器,比如显卡中进行2D和3D渲染的寄存器),或者是PCI设备的存储空间,如显存。在x86处理器系统中,PCI设备的存储器地址空间是被一一映射到CPU地址空间的,这样CPU就能像访问内存那样使用MOV指令访问PCI设备的控制寄存器和存储空间了,如下图所示:

        下面这张图从地址空间分布角度反映了这种情况:

1.3、 PCI设备的IO地址空间(IO资源)

        PCI设备的IO地址空间是指PCI设备中映射到x86处理器端口地址空间中的寄存器集合。访问这些寄存器需要使用IN/OUT指令。如下图所示:

        这些IO寄存器控制的是PCI设备上的一些外设,如显卡上的风扇,如下图:

2、关于中断:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值