Device identification, serial numbers, and product information storage
VPD (Vital Product Data) is a standard mechanism for storing and retrieving product identification information such as serial numbers, part numbers, and asset tags from PCIe devices.
VPD enables system management, asset tracking, warranty verification, and RMA processing without physical inspection of the device.
| Offset | Register | Description |
|---|---|---|
| 00h | Capability ID | 03h = VPD |
| 01h | Next Pointer | Next capability offset |
| 02h | VPD Address | Address and Flag bit |
| 04h | VPD Data | 32-bit data register |
VPD Address Register (16 bits):
┌─────────────────────────────────────────────────────────────────┐
│ Bit 15 │ Bit 14:0 │
│ Flag (F) │ VPD Address │
└─────────────────────────────────────────────────────────────────┘
Flag (F):
- Set to 0 by software to initiate read
- Set to 1 by hardware when data ready
- Set to 1 by software to initiate write
- Cleared by hardware when write complete
Software Hardware
│ │
│ 1. Write address to VPD Address │
│ (Flag = 0) │
│ ─────────────────────────────────────►│
│ │
│ 2. Fetch VPD │
│ from ROM │
│ │
│ 3. Poll VPD Address until │
│ Flag = 1 │
│ ◄─────────────────────────────────────│
│ │
│ 4. Read VPD Data register │
│ ◄─────────────────────────────────────│
Software Hardware
│ │
│ 1. Write data to VPD Data register │
│ ─────────────────────────────────────►│
│ │
│ 2. Write address to VPD Address │
│ (Flag = 1) │
│ ─────────────────────────────────────►│
│ │
│ 3. Write VPD │
│ to ROM │
│ │
│ 4. Poll VPD Address until │
│ Flag = 0 │
│ ◄─────────────────────────────────────│
VPD Data Layout:
┌──────────────────────────────────────────────────────────────┐
│ String Identifier Tag │
│ (Product name) │
├──────────────────────────────────────────────────────────────┤
│ VPD-R Tag (Read-Only) │
│ ├── PN: Part Number │
│ ├── EC: Engineering Change │
│ ├── SN: Serial Number │
│ ├── MN: Manufacture ID │
│ └── Vendor-specific fields (V0-V9) │
├──────────────────────────────────────────────────────────────┤
│ VPD-W Tag (Read-Write) │
│ ├── Asset Tag │
│ └── Vendor-specific R/W fields │
├──────────────────────────────────────────────────────────────┤
│ End Tag │
└──────────────────────────────────────────────────────────────┘
| Keyword | Name | R/W |
|---|---|---|
| PN | Part Number | Read-Only |
| EC | Engineering Change Level | Read-Only |
| SN | Serial Number | Read-Only |
| MN | Manufacture ID | Read-Only |
| V0-V9 | Vendor Specific | Read-Only |
| YA | Asset Tag | Read-Write |
| RV | Checksum and Reserved | Read-Only |
| RW | Remaining R/W Area | Read-Write |
Example VPD Contents:
Product Name: "Acme 100GbE Network Adapter"
Read-Only Fields:
├── PN: "ACME-NIC-100G-R2"
├── EC: "A1"
├── SN: "SN123456789ABC"
├── MN: "ACME"
└── V0: "FW:v2.1.5"
Read-Write Fields:
├── YA: "DC-RACK42-SLOT7"
└── RW: [available for user data]
# Using lspci
lspci -vvv -s 03:00.0 | grep -A 20 "Vital Product Data"
# Using sysfs
cat /sys/bus/pci/devices/0000:03:00.0/vpd
# Using ethtool (for network cards)
ethtool -e eth0
# Parsing VPD
hexdump -C /sys/bus/pci/devices/0000:03:00.0/vpd