当前位置: 首页 > news >正文

PCIe 枚举设备 学习

一 PCIe 拓扑结构

PCIE拓扑结构

二 PCIe 配置空间

2.1 标准空间配置头 64bytes

配置空间的头部有两种类型,Type0与Type1,分别给非桥设备(Endpoint),和桥设备(Root和Switch端口中的P2P桥)来使用,配置头部的对比如下图所示。
在这里插入图片描述
bar0
bar1
bar2
bar3
bar4
bar5
expansion rom base address

PCIe中只有Root才可以发起配置空间读写请求,并且我们知道Root的每个端口中都包含有一个P2P桥。当Root发起配置空间读写请求时,相应的桥首先检查请求的BDF中的Bus号是否与自己的下一级总线号(Secondary Bus Number)相等,如果相等,则先将Type1转换为Type0,然后发给下一级(即Endpoint)。如果不相等,但是在自己的下一级总线号(Secondary Bus Number)和最后一级总线号(Subordinate Bus Number)之间,则直接将Type1型请求发送给下一级。如果还是不相等,则该桥认为这一请求和自己没什么关系,则忽略该请求。

注:Root最先发送的配置请求一定是Type1型的。非桥设备(Endpoint)会直接忽略Type1型的配置请求。

2.1.1 type0 字段解读

2.1.2 type1 字段解读

2.2 PCIe 配置空间 100bytes

2.3 PCIe扩展扩展空间 436 bytes

AER(56bytes)
sriov(60bytes)
ARI
TPH
ACS
PSAID

2.4 ep、bridge

Type0与Type1,分别给非桥设备(Endpoint),和桥设备(Root和Switch端口中的P2P桥)来使用

2.4.1 ep

Type0给非桥设备(Endpoint),配置空间有6个bar地址。

2.4.2 bridge

Type1给桥设备(Root和Switch端口中的P2P桥)来使用。

2.4.3 dsp ( Downstream port)、usp (Upstream Port)

下游传输 (Downstream)
Root Complex (RC) 端口:只有Downstream Ports,所有数据从RC流出是"下游",流入是"上游";
Switch 端口:1个Upstream Port:连接上级设备(RC或其他Switch);N个Downstream Ports:连接下级设备(EP或其他Switch);内部实现虚拟PCI-to-PCI桥接
Endpoint (EP) 端口:只有Upstream Port

2.5 PCIE switch、multi-host

三 TLP报文格式

Configuration Requests、IO Requests、Memory Requests、completion

3.1 TLP报文

3.1.1 header 前一字节fmt格式

低一位 表示:是3DW,还是4DW
低第二位 表示: 是否携带数据
fmt 取值

3.1.2 header 前一字节type格式

配置0 、配置1 指的是 PCIE配置空间 type0 (ep)还是type1(switch)
| TLP 类型 | fmt | type | 描述
配置读写 ~type取值
完成报文~type取值存储器读写~type取值

  • 配置空间 读写请求:设备枚举、配置和状态查询
  • 存储器 读写请求:数据传输,访问的是通过BAR(Base Address Register) 映射到系统内存空间的地址
  • I/O 读写请求:

3.1.3配置读、写 报文字段

config 报文字段
字段含义

1st DW BE(First Double Word Byte Enable)作用:用于指示事务层数据包中第一个双字(Double Word,4个字节)内的哪些字节是有效的。PCIe总线以双字为单位进行数据传输,该字段通过位掩码的形式来标记有效字节。
取值含义:它是一个4位的字段,每一位对应**第一个双字中的一个字节**。例如,当该字段值为0xF(二进制为1111)时,表示第一个双字的全部4个字节都是有效的;若值为0x1(二进制为0001),则表示只有第一个双字的最低字节是有效的。在配置请求等操作中,它帮助接收方准确识别数据的有效部分,避免处理无效数据。
Last DW BE(Last Double Word Byte Enable)作用:与1st DW BE类似,不过它是用于指示事务层数据包中**最后一个双字**内的有效字节情况。同样使用位掩码来确定最后一个双字中哪些字节包含有效数据。取值含义:也是4位字段。如你提供的截图所说,在配置请求的数据长度最大为1DW(一个双字)的特殊情况下,Last DW BE为0。一般情况下,根据实际数据在最后一个双字中的有效字节范围来设置相应位。比如最后一个双字只有前两个字节有效,那么该字段值可能为0x3(二进制0011)。Ext Register Number
Register Number :重要

3.1.4 完成报文格式

完成报文 字段完成报文~字段解读
接下里的四字节 用于 读到的数据带回。

3.2 TLP交互

深入解析PCIe地址空间与寄存器机制:从地址映射到TLP生成的完整流程
CPU访问一个地址,导致PCIe控制器发出TLP。TLP里含有PCIe地址、其他信息。

3.2.1 配置读

3.2.2 配置写

写请求的核心是“执行命令”,而非“获取信息”。它的目标是修改设备的配置寄存器。

(1)bar寄存器字段

**注意:**Type 0报头有6个bar可用(每个bar的大小为32位);有memory bar 、I/O memory. 即bar 寄存器 会指示该该地址映射的空间是哪种访问(memory 访问、I/O访问)

memory bar

  • bit0:表示设备寄存器是映射到memory(0)还是IO(1)空间。
  • bit2:1: 在base adress register for Memory 中0表示32位地址空间,1表示64位地址空间。
  • bit4~31:用来表示设备需要占用的地址空间大小。
  • 针对bit4~31,某些位为只读,且0来表示需要的地址空间大小,比如一个PCI设备需要占用1MB的地址空间,那么这个BAR就需要实现高12bit是可读写的,而20-4bit是只读且为0。
    BAR(Base Address Register)详解
    在这里插入图片描述
(2)bar空间作用及配置过程(确定地址范围和类型)
  • 选择用 IO映射 还是 内存映射 方式来访问一个地址,完全是由CPU的硬件设计决定的;即 访问某块 寄存器时 使用的函数不一样;以及 访问 哪个地址段 —PCIE设备必须为系统软件提供一种方法来确定设备的地址空间需求,这种需求就是是通过**配置空间头部中的Base Address register (BAR)**实现的。

  • IO映射
    普通内存读写指令,高,可直接用C指针操作

  • 内存映射

  • 地址空间大小的计算方法如下:
    BAR配置过程
    a.向BAR寄存器写全1
    b.读回寄存器里面的值,然后clear 上图中特殊编码的值,(IO 中bit0,bit1, memory中bit0-3)。
    c.对读回来的值取反,加一就得到了该设备需要占用的地址内存空间。

    在这里插入图片描述
    其中,当系统软件向 BAR 写入地址空间的起始地址时,这个地址是在主机的地址映射体系中为 PCIe 设备分配的地址,用于主机访问该设备的相关内存区域。主机通过这个地址来访问 PCIe 设备映射到主机地址空间的内存区域。

multi-host 模式下:

(3)TLP配置写流程

四 lspci 命令行解读

lspci 命令用于显示连接到 PCI 总线的所有设备
-v ,lspci 会显示所有设备的各种子系统和内存地址、中断请求(IRQ)编号和一些其他功能信息。
1
2

五 软件模拟dsp

六 软件模拟ep

注意:
(1)PCIe协议规定,配置读请求必须至少请求 1DW 的数据。4字节
(2)DW 是 Double Word 的缩写。
(3)在x86架构和PCIe协议中,一个 Word 通常指 16位。2个字符即2个byte,=16bit
(4)一个 Double Word 就是 32位,即 4个字节。
  • host 上电时,bios会去(总线扫描、设备发现、配置空间读取、BAR设置、中断分配)枚举pcie总线设备 ,这时会生成TLP报文去交互。(是host 操作系统启动时自主发送TLP)。

  • 软件模拟了bridge、pf、vf,逻辑内部处理TLP报文时
    →可以自己内部处理,
    →可以转发到软件,软件进行处理
    有一个开关,即某个配置控制,可以让逻辑自己处理或者选择软件处理。

    目前软件实现只支持Configuration Requests。 不处理IO Requests、Memory Requests。

    最后lspci 枚举成功后,会有更多device设备。

    • 在整个调试过程,目标为 (1) 枚举成功,(2)pf驱动注册成功
http://www.dtcms.com/a/512187.html

相关文章:

  • Linux外设驱动模块加载底层原理深度剖析
  • NAS文件远程同步攻略:群晖CloudSync进阶,告别U盘拷贝时代!
  • 关于网站建设请示校园二手交易网站值得做吗
  • 【C语言实战(39)】C语言排序算法实战:冒泡、选择与插入的对决
  • spark组件-spark core(批处理)-rdd血缘
  • 8 款企业微信 SCRM 工具功能对比分析
  • 手机网站建设的方法推广运营平台
  • stack、queue与priority_queue的用法解析与模拟实现
  • 【C++基本功】OOA OOD OOP面向对象彻底详解
  • 切换/获取root权限
  • 爬虫 beautifulSoup 方法
  • 深入BERT内核:用数学解密掩码语言模型的工作原理
  • 在webos中,在桌面上添加应用
  • 【Spring Security】授权(一)
  • 数据结构八大排序:快速排序-挖坑法(递归与非递归)及其优化
  • Docker 中卷、容器、镜像的区别
  • 学习React-21-受控组件非受控组件
  • 银行测试学习计划
  • 电商自建站中企动力网站建设公司
  • 怎么搜 织梦的网站唐山海港经济开发区人才网
  • Qt打包工具Enigma Virtual Box
  • 【同步/异步 日志系统】--- 介绍
  • 【软考备考】 数据与文件的加解密种类详解和使用场景
  • GitLab 版本控制与管理指南
  • Python动态方法调用全解:从字符串到执行的艺术
  • Blender入门学习03
  • 网站建设龙兵科技嘉兴网站建设网站建设
  • html代码下载网站怎么优化关键词
  • Kafka面试精讲 Day 27:监控告警与故障排查
  • C++ ABI:编译报错之:gcc 4.8.1 切 gcc 6.1.0