伤心客 发表于 2025-4-6 15:34:33

PCIe设置、Rd Cmd的trace分析SQ/CQ/DB

默认前置知识已经了解PCIe相关功能
PCIe

Configuration Space

设置空间内部包罗基址寄存器。设备申请的地址空间,用于host和device之间的通讯,实际映射到设备内部Reg或内存。
CPU要访问某PCIe设备空间,只必要访问对应的内存地址空间。RC检查该内存地址,如果是某设备空间映射,则触发TLP访问
协议具体字段设置和初始化流程可以参考
https://blog.csdn.net/relax33/article/details/128182253
PCIe RequesterID和设置空间剖析:
RequesterID格式

Requester ID 是 PCIe 事件(TLP 包)的源头标识符,由 Bus Number + Device Number + Function Number 组成,共 16 bits
Trace 中的应用:在 TLP 包头的 Requester ID 字段中标识事件发起者(如 SSD 控制器、网卡)
   Function Number (0-7)
Device Number (0-31)
Bus Number (0-255)

例如 01:00.0 表示:
- Bus 1
- Device 0
- Function 0
在完成事件(Completion TLP)中,Requester ID 用于路由返回数据到精确的发起者。
在 Trace 中看到 Requester ID 02:15.3,可通过设置空间找到对应的 Vendor ID/Device ID,确认是 SSD 控制器还是其他设备。
设置空间


[*]每个PCIe功能都有独立的设置空间
[*]标准设置空间为256字节
[*]扩展设置空间为4KB
[*]用于设备设置和控制
[*]设置空间访问方式:内存映射访问(MMIO)
Device Type0体现Device:
https://i-blog.csdnimg.cn/direct/334d2727f40144efb2f359b10160ef7f.png
偏移名称位宽形貌0x00Vendor ID16b厂商 ID(如 Intel: 0x8086, Samsung: 0x144D)0x02Device ID16b设备型号标识符(由厂商定义)0x08Class Code24b设备类别(高8位为基类,如 0x01=大容量存储,0x02=网络控制器)0x0CHeader Type8b设置头范例(Bit 7=1 体现多功能设备,Bits 6:0=范例,如 0x00=Endpoint)0x10~0x24BAR0~BAR532b/64b基地址寄存器,定义设备内存或 I/O 空间的映射0x3CInterrupt Line8b停止线(传统 PIC/APIC 停止路由)0x3DInterrupt Pin8b停止引脚(INTA~INTD) BAR (Base Address Register)

host分配体系物理地址,写入BAR寄存器,建立地址映射关系。PCIe设备的内部空间大小、属性 都写在BAR Reg中,Host软件读取这些BAR Reg并分配对应空间,将内存基地址写回BAR
BAR0~BAR5: 6个32位寄存器
- 定义设备所需的内存空间或IO空间
- 85700004的含义: 1000 0101 0111 0000 0000 0000 0000 0100
* 最低位0:表示Memory Space
* 位=00:32位地址
* 位:基地址
常见BAR用途:


[*]BAR0:通常是设备寄存器空间
[*]BAR1:大概是扩展内存空间,如MSI-X表、DMA缓冲区
[*]BAR2-5:根据设备需求分配,例如BAR2大概用于 SR-IOV 虚拟功能(VF)的资源设置。
Eg. TLP 写操纵:Host 写入 BAR0 + 0x1000(SQ 门铃),通知 SSD 有新命令提交。
trace

从PCIe协议分析仪 教程拿了一张图
可以说明如何抓取trace
https://i-blog.csdnimg.cn/direct/93fdf6d62afd48dba407cd44a137a538.png
NVMe Rd Cmd

step1:Host写命令到SQ
先发一个SQE指定OPC、SQID、CQID、CID,Data(总传输数据量),MPTR,PRP,SLBA,NLB等参数。D2H
step2:写SQ Tail DB
再睁开,是H2D的一个MWr TLP。IO SQT,写尾指针表明新entry added
step3:SSD通过MRd TLP发去host取指再返回CplD
16DW的指令是读存储哀求,必须对方发回响应。
SSD发的TLP哀求中PRP指向SQID对应的SQ当前head指向的内存地址,从这里取指(SQ的地址从哪里来?- BAR中属性相关Reg)
ASQ - OPC、FUSE等
step4:SSD实行命令 读取对应数据传回主机
根据SQ中的PRP,写入的Host内存地址(dst addr),举行MWr TLP传输。PRP地址有偏移,还要根据RCB和MPS,切分传输TLP包的数量,保证每次传输都是RCB对齐。
step5:SSD向主机的CQ返回
向IO CQ写入完成命令状态。
SQHD:head。当CQE创建时就更新(?)
当Host在处置惩罚CQE时,Controller的SQ Head指针实际值大概已经超过(更新)了CQE中指示的值
step6:停止告知host处置惩罚CQ
MSI-X停止方式。MWr TLP方式通知,停止信息1DW(全零?)
Address是?
step7:主机处置惩罚CQ
通过MWr TLP写controller端CQ的head指针
(都是MWr TLP但是方向不同,D2H=upstream, H2D=downstream)
——————
由于是根据另一台设备抓取trace的总结,没有对应图,图例可以参考下面链接
PCIe TLP trace分析具体(参考SSD Fans)
感爱好可以进一步看TLP字段,RCB等设置
https://blog.csdn.net/qq_41186941/article/details/123217551
后续TODO:LSSTM的状态流转对应trace
LSSTM剖析

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: PCIe设置、Rd Cmd的trace分析SQ/CQ/DB