SylixOS PCIe开发(二)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2020年12月26日20:22:07 评论 1,789

1. 概述

本篇文章主要介绍不同平台下pci设备配置空间的访问方法,总的来说,pci设备的配置空间有两种访问方式:

  • 配置寄存器访问
  • ECAM访问

2. 配置空间寄存器

SylixOS PCIe开发(二)

pci配置空间寄存器大小为256字节,从0x0~0xff。pcie配置空间大小为4KB,从0x0~0xfff。但是对于一般的设备驱动而言,需要关心的也就是0x0~0x3f这64字节大小的配置空间。

  • 0x0~0x3f:这部分的配置空间是标准的PCI配置空间头,是每个PCI/PCIE设备都必须遵循的。目前一共有3种标准头格式,00是PCI DEVICE头,01是PCI-PCI bridge头,02是Cardbus bridge头。头类型由Header Type寄存器定义。
  • 0x40~0xff:这部分定义PCI扩展功能寄存器。0-3F定义的寄存器是每个PCI设备都必须实现的,而PCI的一些扩展功能,不是每个设备都必须实现的,可以根据自己的需要来实现其中一部分特性。重点注意的是这部分寄存器的组织结构,每一个可选的特性被组织成一个标准的Capability Struct,设备选用的多个Capabilities用链表的方式组织起来,称为Capabilities List。PCIE即在PCI原有的Capabilities当中新增了一种ID,即PCIE Capability Struct。这样可以实现对老的PCI驱动的兼容。
  • 0x100~0xfff:这部分定义PCIE扩展功能寄存器。实现PCIE的可选特性,也是采取Capabilities List结构组织起来的。

3. x86平台配置空间访问方式

3.1 IO方式访问(配置寄存器方式)

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

CONFIG_ADDRESS寄存器的结构如下图所示:

SylixOS PCIe开发(二)

  • Enable位,第31位。该位为1时,对CONFIG_DATA寄存器进行读写时将引发PCI总线的配置周期。
  • Bus Number,第23~16位,为PCI设备的总线号。
  • Device Number,第15~11位,为PCI设备的设备号。
  • Function Number,第10~8位,为PCI设备的功能号。通过此位也能知道为什么一个PCI设备最多有8个逻辑功能了,因为Function Number位只有3位,所以最多有8个功能
  • Register Number,第7~2位,为PCI设备配置空间的寄存器号。

由上述信息可知,x86平台通过I/O方式只能访问0x0~0xff这256字节的配置空间,并不能访问pcie的0x100~0xfff这段扩展配置空间。

3.2 ECAM方式访问

ECAM全称为Enhanced Configuration Access Mechanism,意思为增强的配置访问方式,其实就是MMIO方式访问。在某个平台上要想通过ECAM方式访问配置空间,大致需要经过以下几个步骤的设置:

  • 通过平台相关的寄存器来设置ECAM方式访问的配置空间在存储器域的基地址和总大小
  • 根据bus、dev、func、reg这四个参数来确定要访问的存储器域地址
  • 通过要访问的字节数来确定调用何种接口进行访问,比如单字节、双字节还是四字节。

通过ECAM方式可以访问pci/pcie全部的配置空间,由于规范中规定每个pci/pcie的功能都需要独立的配置空间,所以所有的pci/pcie设备占用的ECAM空间大小为256(总线数)*32(设备数)*8(功能数)*4KB(pcie配置空间大小)=256MB。在实际的嵌入式系统中,一般不会用到这么多的pci/pcie设备,所以ECAM的空间一般情况下不会设置为256MB,典型设置值为十几MB。

在SylixOS下,x86平台的pci/pcie设备是通过I/O方式来访问配置空间的。

4. ppc平台配置空间访问方式

ppc平台一般通过配置寄存器的方式来访问pci/pcie设备的配置空间,通过PEXn_PEX_CONFIG_ADDR和PEXn_PEX_CONFIG_DATA这两个寄存器来访问配置空间。其中n表示不同的控制器,ppc平台和其他平台不一样的地方就是ppc平台有多个pcie控制器,而其他平台一般只有1个。

下图为ppc平台的PEXn_PEX_CONFIG_ADDR寄存器的定义:

SylixOS PCIe开发(二)

各个位域的意义如下:

SylixOS PCIe开发(二)

可以看出,ppc平台通过配置寄存器方式可以访问pcie的全部4KB配置空间,而x86通过配置寄存器方式只能访问256B的空间。由于通过配置寄存器的方式已经能访问所有总线上的设备的全部配置空间了,所以ppc也就不需要再额外提供ECAM方式来访问配置空间。

5. 龙芯平台配置空间访问

龙芯平台配置空间是通过ECAM方式访问,每个设备配置寄存器对应的访问地址相对于ECAM基址的偏移通过下图方式计算:

SylixOS PCIe开发(二)

由上图可以看出,ECAM方式可以访问pcie的全部4KB配置空间。

不同于其他平台的是,龙芯上的ECAM基址有两个,一个是用于访问TYPE0设备的配置空间,一个是用于访问TYPE1设备的配置空间。

6. 飞腾平台配置空间访问

飞腾平台pci设备的配置空间是通过ECAM方式访问,每个设备的配置寄存器访问地址相对于ECAM基址的偏移计算方法如下:

SylixOS PCIe开发(二)

可以看出,飞腾平台的ECAM方式同样可以访问pcie全部的4KB配置空间。

7. ARM平台配置空间访问方式

ARM平台也是通过ECAM方式来访问pci/pcie设备的配置空间的,每个pci/pcie设备配置寄存器的访问地址相对于ECAM基址的偏移的计算方式如下:

SylixOS PCIe开发(二)

图中有一个错误,就是设备号的位域其实应该是[19:15],而不是图中的[19:12]。从图中可以看出,ARM下的ECAM方式同样可以访问pcie设备的全部4KB配置空间。

8. 总结

平台
配置寄存器方式
ECAM方式
访问每个设备配置空间大小
x86
支持
支持
配置寄存器方式:256B
ECAM方式:4KB
ppc
支持
支持
4KB
龙芯
支持
4KB
飞腾
支持
4KB
ARM
支持
4KB

 

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

发表评论

匿名网友 填写信息

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