✨ 1. VPD是什么?
Vital Product Data (VPD),顾名思义,重要产品数据。VPD记录了FRU(Feild Replaceable Unit,现场可替换单元)设备的部件号、序列号等信息,可以唯一标志系统的软件、硬件,也可以存放系统微指令。VPD提供了一种存储设备性能或故障等信息的机制,软件可以将PCIe设备的性能参数或故障信息回填到VPD中,方便设备使用或调试。
VPD通常存放在EEPROM中,当然其他掉电不掉数据的存储设备也可以。
VPD机制是一种可选的机制,PCIe卡是否支持VPD具体依赖于厂商。从系统层面看,VPD机制的目的是提供或收集系统软硬件等的信息,便于系统所有者或管理员在必要的时候进直接取用。
✨ 2. VPD组成
2.1 VPD Tag
VPD数据类型有两种:Small Resource 和 Large Resource,其格式分别如表1和表2所示。
表1 Small Resource Data类型定义
表2 Large Resource Data类型定义
VPD数据是按照Tag分段的,一般由四段组成,按照先后顺序分别为:
VPD起始Tag(02h),Large Resource类型,标志VPD开始,并提供设备的产品名称;
VPD-R Tag(10h),Large Resource类型,其后为只读类型的关键字信息(一笔或多笔),只读类型关键字信息不可通过软件改写,即便对这些地址的数据进行写覆盖,也不会对该区域数据有任何影响;
VPD-W(11h),Large Resource类型,其后为可读写关键字信息(一笔或多笔),即其后关键字信息是软件可修改的,常用来存放实时的设备性能参数或错误码等信息;
VPD结束Tag(0fh),Small Resource类型,标志VPD的结束,软件在读到End Tag后不必再往后继续读了。
⚠️注意:以上Tag值在使用过程中需要根据 PLUG-PLAY-ISA-1.0a 规范进行转换。
2.2 VPD关键字
2.2.1 VPD关键字格式
如上所述,VPD包含了多组关键字信息,一组关键字信息格式(图1)如下:
关键字信息 = 2B关键字名称 + 1B关键字长度 + nB关键字数据
图1 VPD Format
关键字名称由2B ASCII字符构成,只有PCI-SIG有资格可以定义关键字名称字段,除此以外不允许其他任何个人或组织自行定义VPD关键字名称。
关键字长度指示该关键字数据的byte长度。
关键字数据存放关键字,通用为ASCII字符。
除非另有说明,关键字名称和关键字数据字段均为ASCII字符。这样有一个好处,就是适用面广,不同厂家的计算机都能够支持这种ASCII字符。
举个关键字的例子(表3),某VPD存储了设备序列号,那么其关键字为ASCII符号“SN”,长度为8,数据即序列号为ASCII符“0000194”。
表3 VPD关键字格式举例
2.2.2 VPD关键字分类
VPD关键字按照可读写属性可以分为只读关键字信息和可读写关键字信息。
(1) 只读关键字
只读关键字记录了设备部件号、序列号等信息,是不可修改的。迄今为止,PCI-SIG定义的只读关键字有如下几类(表4):
表4 只读关键字
(2)可读写关键字
可读写关键字记录了设备的性能参数、错误码或其他设备关键信息,是软件可读写的。目前定义的几类可读写VPD关键字如下(表5):
表5 可读写关键字
2.3 完整的VPD举例
✨ 3. VPD能力结构
只有EEPROM等存储设备存储VPD是不够的,还需要相关PCIe组件实现VPD能力结构。PCIe VPD能力结构如图2所示,其中较为关键的有VPD Address Register和Message Address。
VPD Address Register(图3),VPD地址寄存器,其中F字段为VPD读写标志位,0->read,1->write;VPD Address字段用以指明存放VPD信息的地址。
VPD Data Register(图4),VPD数据寄存器,用以存放从VPD设备读回的VPD数据 或 待存放到VPD设备的VPD数据。
图2 VPD Capability Structure
图3 VPD Address Register
图4 VPD Data Register
✨ 4. VPD访问机制
4.1 读VPD
1️⃣ 发送单笔写请求VPD地址寄存器,其中VPD地址寄存器F位置零(表示开始读),然后填入要读取的APD首地址Addr;
2️⃣ 硬件读取VPD存储设备指定地址,待该笔VPD数据(2DW)读取完毕并存放到VPD Data寄存器后,VPD地址寄存器F位被硬件置一(一次读完成);
3️⃣ 软件监测到F位置一(一次读完成)后读取读取VPD Data;
4️⃣ 地址Addr+4,重复1~3,直到读取完整APD信息(检测到VPD End Tag )。
4.2 写VPD
1️⃣ 写VPD数据(长度1DW)到VPD Data寄存器
2️⃣ VPD地址寄存器F位置一(表示开始写),然后填入VPD数据要存放的地址(例如EEPROM地址Addr);
3️⃣ 硬件发送VPD数据到指定地址,并把VPD地址寄存器F位置零(一笔写完成);
4️⃣ 地址Addr+4,填写到VPD数据寄存器中的VPD数据后移2DW,重复1~3,直到写完整APD信息。
⚠️注意:如果硬件启动一次VPD读写(2DW)过程中,软件再次读写了VPD地址或数据,新的数据有可能会覆盖掉待发出的旧数据,导致VPD读写失败,造成不可预测的后果。
📚 参考
PCI Express Base Specification Revision 5.0 Version 1.0 (22 May 2019)
怎么读取PCIe设备的VPD信息?