PCIe设备的配置过程

这篇具有很好参考价值的文章主要介绍了PCIe设备的配置过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PCIe设备的配置过程



参考资料:

  • 《PCI Express Technology 3.0》,Mike Jackson, Ravi Budruk; MindShare, Inc.
  • 《PCIe扫盲系列博文》,作者Felix,这是对《PCI Express Technology》的理解与翻译
  • 《PCI EXPRESS体系结构导读 (王齐)》
  • 《PCI Express_ Base Specification Revision 4.0 Version 0.3 ( PDFDrive )》
  • 《NCB-PCI_Express_Base_5.0r1.0-2019-05-22》

一、 PCIe系统硬件结构

下图来自《PCI Express_ Base Specification Revision 4.0 Version 0.3 ( PDFDrive )》,P78。

pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构

二、 PCIe系统软件层次

下图来自《PCI Express Technology 3.0》。

pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构
在软件的角度,我们先关注事务层(Transaction Layer),在事务层传输TLP(Transaction Layer Packet,事务层包)。

我们要关注TLP中怎么表示这些内容:

  • 要做什么?内存读、内存写、IO读、IO写、配置读、配置写?
  • 内存读写/IO读写:哪个地址?
  • 配置读写:哪个"Bus/Device/Function/Register"?
  • 数据?

三、事务层TLP格式

3.1 Posted和Non-Posted

Post的意思是"邮寄"、“投递”。

PCIe有两类事务:

  • Posted:主设备访问目标设备时,主设备发出信号后就不再理会后续过程,也就是"发射后不管"。使用这种方式,在数据未到达目标设备前,主设备就可以结束当前操作,效率更高。适用于"内存写"等场合。
  • Non-Posted:主设备访问目标设备时,主设备发出信号后必须等待后续结果。比如"内存读",必须得到返回的数据,才能结束当前操作。

在PCIe系统中:

  • Posted:内存写
  • Non-Posted:内存读、IO读、IO写、配置读、配置写
  • 对于Non-Posted,使用Split传送方式
    • Split含有:分离
    • 被拆分为两部分,发出请求报文、得到完成报文

3.2 TLP通用格式

下图来自《PCI Express_ Base Specification Revision 4.0 Version 0.3 ( PDFDrive )》。

pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构
pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构

  • 类型:你是读内存还是写内存?读IO还是写IO?读配置还是写配置?
    • 在Header里面有定义
  • 地址:对于内存读写、IO读写,地址保存在Header里
  • Bus/Dev/Function/Regiser:对于配置读写,这些信息保存在Header里
  • 数据:对于内存读、IO读、配置读,先发出请求,再得到数据
    • 分为2个阶段:读请求报文、完成报文
    • 读请求报文:不含数据
    • 完成报文:含数据

3.3 TLP头部

pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构

四. 配置与RC直连的设备

4.1 怎么访问直连的设备

怎么访问下图红圈中的设备:
pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构
RC本身就是一个桥,要去访问跟桥直接相连的设备,用CfgRd0类型的TLP:

  • Fmt和Type取值为0b00, 0b00100,表示:Configuration Read Type 0
  • TLP中设置有"Bus/Device/Funciton/Register"
  • 提问:上图红圈中是设备,怎么知道它自己的Bus号是0,Device分别是0、1、2?
    • 红圈中的设备都是在RC内部,它们的Device号是硬件里写死的(hard-coded)
    • 当这些设备监测到Bus0上的TLP是CfgRd0后,忽略TLP中的Bus,比对TLP中的Device
    • 如果Device吻合,就回应TLP
      pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构

4.2 配置EendPoint

pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构
pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构

五、 配置示例

本节内容参考《PCI Express Technology 3.0》。

5.1 必备知识

5.1.1 PCIe设备的配置寄存器

pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构
PCI/PCIe设备、桥,它们的配置寄存器前面若干字节格式是一样的,可以从里面的"Header Type"分辨:

  • 它是普通设备,还是桥
  • 它是单功能设备,还是多功能设备:所谓功能,就是Function,一个物理设备可以有多个功能,也就有多个逻辑设备
    pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构
    一般的PCI/PCIe设备,它的配置寄存器格式如上上图的"Type 0 Header",在PCIe系统中这类设备被称为Endpoint。

PCI/PCIe桥,它的配置寄存器格式如上上图的"Type 1 Header",

对于PCI/PCIe桥,里面的由三项重要的总线号:

  • Pirmary Bus Number:上游总线号
  • Secondary Bus Number:自己的总线号
  • Subordinate Bus Number:下游总线号的最大数值

这些总线号示例如下:

pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构

5.1.2 Type 0 Configuration Request

如果要配置的设备,就在当前总线上,即目标设备的Bus号等于当前桥的Secondary Bus Number,

那么在当前总线(即Secondary Bus Number)上传输的就是"Type 0 Configuration Request":

  • TLP格式如下图所示
  • 不会穿过桥
    pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构
5.1.3 Type 1 Configuration Request

如果要配置的设备,不在当前总线上,但是在它下面的总线上,即:

  • 目标设备的Bus号大于当前桥的Secondary Bus Number,
  • 目标设备的Bus号小于或等于当前桥的Subordinate Bus Number,

那么在当前总线(即Secondary Bus Number)上传输的就是"Type 1 Configuration Request":

  • TLP格式如下图所示
  • 会穿过桥
  • 到达设备时,跟设备直接连接的桥会把它转换为"Type 0 Configuration Request"

pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构

5.2 配置过程示例

5.2.1 硬件拓扑结构

以下图中的设备的配置过程为例,给大家做示范。
pcie建链过程,PCIE与PCI的前尘往事,服务器,linux,驱动开发,arm开发,架构

5.2.2 配置过程演示

下文中BDF表示Bus,Device,Function,用这三个数值来表示设备。

  1. 软件设置Host/PCI Bridge的Secondary Bus Number为0,Subordinate Bus Number为255(先设置为最大,后面再改)。
  2. 从Bus 0开始扫描:先尝试读到BDF(0,0,0)设备的Vendor ID,如果不成功表示没有这个设备,就尝试下一个设备BDF(0,1,0)。一个桥下最多可以直接连接32个设备,所以会尝试32次:Device号从0到31。注意:在Host/PCI Bridge中,这些设备的Device号是硬件写死的。
  3. 步骤2读取BDF(0,0,0)设备(即使图中的A)时,发现它的Header Type是01h,表示它是一个桥、单功能设备
  4. 发现了设备A是一个桥,配置它:
    • Primary Bus Number Register = 0:它的上游总线是Bus 0
    • Secondary Bus Number Register = 1:从它发出的总线是Bus 1
    • Subordinate Bus Number Register = 255:先设置为最大,后面再改
  5. 因为发现了桥A,执行"深度优先"的配置过程:先去枚举A下面的设备,再回来枚举跟A同级的B
  6. 软件读取BDF(1,0,0)设备(就是设备C)的Vendor ID,成功得到Vendor ID,表示这个设备存在。
  7. 它的Header Type是01h,表示这是一个桥、单功能设备。
  8. 配置桥C:
    • Primary Bus Number Register = 1:它的上游总线是Bus 1
    • Secondary Bus Number Register = 2:从它发出的总线是Bus 2
    • Subordinate Bus Number Register = 255:先设置为最大,后面再改
  9. 继续从桥C执行"深度优先"的配置过程,枚举Bus 2下的设备,从BDF(2,0,0)开始
  10. 读取BDF(2,0,0)设备(就是设备D)的Vendor ID,成功得到Vendor ID,表示这个设备存在。
  11. 它的Header Type是01h,表示这是一个桥、单功能设备。
  12. 配置桥D:
    • Primary Bus Number Register = 2:它的上游总线是Bus 2
    • Secondary Bus Number Register = 3:从它发出的总线是Bus 3
    • Subordinate Bus Number Register = 255:先设置为最大,后面再改
  13. 继续从桥D执行"深度优先"的配置过程,枚举Bus 2下的设备,从BDF(3,0,0)开始
  14. 读取BDF(3,0,0)设备的Vendor ID,成功得到Vendor ID,表示这个设备存在。
  15. 它的Header Type是80h,表示这是一个Endpoing、多功能设备。
  16. 软件枚举这个设备的所有8个功能,发现它有Function0、1
  17. 软件继续枚举Bus 3上其他设备(Device号1~31),没发现更多设备
  18. 现在已经扫描完桥D即Bus 3下的所有设备,它下面没有桥,所以桥D的Subordinate Bus Number等于3。扫描完Bus 3后,回退到上一级Bus 2,继续扫描其他设备,从BDF(2,1,0)开始,就是开始扫描设备E。
  19. 读取BDF(2,1,0)设备(就是设备E)的Vendor ID,成功得到Vendor ID,表示这个设备存在。
  20. 它的Header Type是01h,表示这是一个桥、单功能设备。
  21. 配置桥E:
    • Primary Bus Number Register = 2:它的上游总线是Bus 2
    • Secondary Bus Number Register = 4:从它发出的总线是Bus 4
    • Subordinate Bus Number Register = 255:先设置为最大,后面再改
  22. 继续从桥D执行"深度优先"的配置过程,枚举Bus 4下的设备,从BDF(4,0,0)开始
  23. 读取BDF(4,0,0)设备的Vendor ID,成功得到Vendor ID,表示这个设备存在。
  24. 它的Header Type是00h,表示这是一个Endpoing、单功能设备。
  25. 软件继续枚举Bus 4上其他设备(Device号1~31),没发现更多设备
  26. 已经枚举完设备E即Bus 4下的所有设备了,更新设备E的Subordinate Bus Number为4。然后继续扫描设备E的同级设备:Bus=2,Device从2到31,发现Bus 2上没有这些设备。
  27. 软件更新设备C即Bus 2的桥,把它的Subordinate Bus Number设置为4。然后继续扫描设备C的同级设备:Bus=1,Device从1到31,发现Bus 1上没有这些设备。
  28. 软件更新设备A即Bus 1的桥,把它的Subordinate Bus Number设置为4。然后继续扫描设备A的同级设备:Bus=0,Device从1到31,发现Bus 0上的设备B。
  29. 配置桥B:
    • Primary Bus Number Register = 0:它的上游总线是Bus 0
    • Secondary Bus Number Register = 5:从它发出的总线是Bus 5
    • Subordinate Bus Number Register = 255:先设置为最大,后面再改
  30. 再从桥B开始,执行"深度优先"的配置过程。

致谢

以上笔记源自韦东山老师的视频课程,感谢韦老师,韦老师是嵌入式培训界一股清流,为嵌入式linux开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!

在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬!文章来源地址https://www.toymoban.com/news/detail-655324.html


到了这里,关于PCIe设备的配置过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【PCIE体系结构五】PCIE配置和地址空间

    👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容  参考书籍: PCI_Express体系结构导读、 深入浅出SSD:固态存储核心技术、原理与实战 目录 概述 EP的配置空间 switch的配置空间         每个PCIe设备都有这样一段空间,

    2023年04月14日
    浏览(94)
  • 查询PCIE设备的VID,DID,SVID,SDID

    1、查询PCIE设备的VID,DID,SVID,SDID ( Vendor ID、 Device ID、Subsystem Vendor ID、Subsystem Device ID ) lspci -s 3e:00.0 -xxxvvv 红框1为VID (8086) 红框2为DID(37cc) 红框3为SVID(8086) 红框4为SDID(0000) 可以在Linux系统的/usr/share/hwdata/pci.ids文件中找对应的设备信息(该文件也可以自行更新到最新版

    2024年02月09日
    浏览(102)
  • 【Microsemi PolarFire】PCIe学习笔记(一)——PCIe IP核配置

    根据对GUI的输入生成参考时钟,PCIESS系统的参考时钟使用差分HCSL/LVDS。 根据PCIe时钟架构,有以下三种参考时钟可供选择:收发端共享同一个参考时钟、收发端采用独立的参考时钟、仅发送端需要参考时钟(适用于PCIe 2.0以上)。 考虑到系统稳定性,这里使用同源的PCIe插槽提

    2024年02月08日
    浏览(35)
  • 关于xilinx使用PCIE实现FPGA的部分重配置实现(MCAP)

    平台:vivado21018.3 芯片:xcku115-flva1517-2-i (active) 本文官方文档:Xilinx_Answer_64761_Ultrascale_Devices 本文驱动下载地址:64761 - Bitstream Loading across the PCI Express Link in UltraScale and UltraScale+ Devices for Tandem PCIe and Partial Reconfiguration (xilinx.com) 本文参考:Xilinx基于PCIE的部分重配置实现(一)

    2024年02月01日
    浏览(64)
  • 【PCIE体系结构三】PCIE的硬件拓扑结构和逻辑层次结构

    👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容  目录  PCIE总线结构 PCI总线结构组成  HOST主桥  PCI总线  PCI设备  HOST处理器  PCI负载  PCIE体系结构组成  RC  Endpoint  Switch  PCIE层次结构 事务层 数据链路层 物理层 参考

    2024年02月10日
    浏览(46)
  • PCIE学习笔记:PCIE-PHY功能描述之什么是PMA/PCS?

    PMA和PCS模块用于处理PHY packets。 PMA : Physical Medium Attachment PMA在串行通道上接收和传输高速串行数据,串行化/去串行化、时钟数据恢复等功能,以及连续时间线性均衡器(CTLE)、判决反馈均衡器(DFE)和传输均衡等模拟前端功能。。 PCS : Physical Coding Sublayer PCS充当PMA和PCIe控制

    2024年02月11日
    浏览(54)
  • 海思芯片pcie启动——pcie_mcc驱动框架的booter程序分析

    (1)源码目录:pcie_mcc/multi_boot/example/boot_test.c; (2)调用命令:./booter start_device; (3)booter程序的作用:在主片将pcie启动相关的驱动加载完成后,调用booter来引导从片pcie启动; (1)调用pcie启动相关驱动,知道当前pcie接口连接了多少个从片; (2)先传输uboot的前80KB数据到36A的内部RAM中

    2024年02月06日
    浏览(76)
  • FPGA PCIe 软核的实现——扒一扒复旦微、国微PCIe软核的实现

    近来复旦微、国微等厂家相继推出了可以兼容XILINX PCIe硬核的PCIe软核,销售也到所里来推广了一下,领导交代让抽自己的时间试用研究一下,看项目中用不用的起来。 读研的时候就接触过,PCIE协议非常非常复杂,要实现非常非常困难,稍微看过一些协议,看球不懂,真给这

    2024年02月16日
    浏览(151)
  • 【PCIE】基于PCIE4C的数据传输(一)——PC访问FPGA

    PCIE4C   PCIE4C是Ultrascale+系列开始引入的硬核,它是PCIE4硬核的延续,在功能上增加了对PCIe4.0协议的支持,由于PCIe报文采用高速串行传输,到达FPGA后首先经过GT转换为低速并行数据,之后由PCIE4C进行进一步处理,得到便于用户使用的AXI-Stream形式的报文。 为了便于使用,Xil

    2024年04月08日
    浏览(54)
  • FPGA实现的PCIe2.0与PCIe1.0 NVMe IP性能测试

    NVMe协议固态硬盘的速度随所使用的PCIe协议不同而不同。NVMe固态硬盘在PCIe Gen2、Gen3、Gen4条件下,理论有效带宽分别为2GB/s、3.938GB/s、7.877GB/s。目前,基于PCIe Gen5的NVMe SSD在2023年已发布,其理论有效带宽为17.754GB/s。 在之前的帖子中,我们介绍了一个在PCIe3.0协议下的基于FPGA

    2024年04月14日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包