Vendor ID và Device ID trong PCIe là gì?
Giải thích Vendor ID và Device ID trong PCIe: nhận diện thiết bị, config space, driver matching, subsystem ID và debug device/driver sai.
Bạn thấy PCI device xuất hiện ở 02:00.0. Vendor ID không phải 0xFFFF, vậy thiết bị có response. Nhưng driver của bạn vẫn không bind. Trong Supported(), bạn đọc Vendor ID/Device ID rồi return EFI_UNSUPPORTED. OS thì lại dùng driver khác. Lúc này câu hỏi không còn là “device có tồn tại không”, mà là device này thật sự là ai và driver match theo tiêu chí nào.
Vendor ID và Device ID là cặp ID nền tảng để nhận diện PCI/PCIe function.
Nói ngắn gọn: Vendor ID là mã nhà sản xuất được PCI-SIG cấp, Device ID là mã thiết bị do vendor định nghĩa. Hai giá trị này nằm trong PCI Configuration Space tại offset 0x00 và 0x02, được firmware, OS và driver dùng để nhận diện thiết bị, match driver, debug enumeration và phân biệt các biến thể phần cứng.
Vendor ID và Device ID nằm ở đâu?
Vendor ID và Device ID trong PCI Configuration Space
PCI Function: Segment:Bus:Device.Function
└─ Configuration Space
├─ Offset 0x00: Vendor ID
├─ Offset 0x02: Device ID
├─ Offset 0x04: Command Register
├─ Offset 0x06: Status Register
├─ Offset 0x08: Revision ID
├─ Offset 0x09: Class Code
├─ Offset 0x0E: Header Type
├─ Offset 0x10: BAR0
└─ Offset 0x2C/0x2E: Subsystem Vendor/Device ID Firmware đọc Vendor ID trước để biết BDF đó có device response hay không. Nếu đọc ra 0xFFFF, thường coi như không có function hợp lệ tại BDF đó.
Vendor/Device ID trong enumeration flow
Select a BDF
Firmware chọn Bus/Device/Function để đọc config space.
Read Vendor ID
Nếu Vendor ID là 0xFFFF, thường bỏ qua function đó.
Read Device ID
Nếu Vendor ID hợp lệ, đọc Device ID để nhận diện thiết bị.
Read Class Code
Xác định loại device như storage, network, bridge.
Probe BAR
Xác định resource device cần.
Install PciIo
Tạo controller handle cho function.
Driver matching
DriverBinding Supported dùng ID/class/capability để quyết định support.
Ý nghĩa của từng ID
| ID | Ý nghĩa | Dùng để làm gì |
|---|---|---|
| Vendor ID | Mã nhà sản xuất PCI | Nhận diện vendor, kiểm tra function tồn tại |
| Device ID | Mã thiết bị do vendor định nghĩa | Match driver, phân biệt chip/device |
| Revision ID | Revision silicon/device | Workaround theo stepping/revision |
| Class Code | Loại chức năng của device | Generic class driver matching |
| Subsystem Vendor ID | Vendor của board/subsystem | Phân biệt board/OEM |
| Subsystem Device ID | ID subsystem/board/SKU | Driver quirk theo model |
| Programming Interface | Chi tiết interface trong class | AHCI/NVMe/XHCI style matching |
| Capability IDs | Tính năng PCI/MSI/MSI-X/PCIe | Driver enable feature |
Vendor ID 0xFFFF
0xFFFF là giá trị đặc biệt khi đọc Vendor ID. Nó thường nghĩa là config read không có device response.
| Case | Ý nghĩa có thể | Debug |
|---|---|---|
| Không có device tại BDF | BDF empty | Scan BDF khác |
| Bus chưa được assign | Bridge secondary/subordinate sai | Dump bridge bus registers |
| PCIe link down | Endpoint không response | Check link status |
| Device chưa power/reset ready | Timing/power issue | Check power sequence |
| Function không tồn tại | Multi-function scan sai | Check header type bit 7 |
| Config access sai | ECAM/MMCONFIG/base sai | Dùng PciRootBridgeIo test |
| Policy hide device | Firmware disable root port/device | Check BIOS setup/policy |
| Hotplug empty | Slot không present | Check hotplug presence state |
Vendor ID/Device ID và driver matching
UEFI PCI driver thường đọc Vendor ID/Device ID trong Supported() để quyết định có support controller này không.
PCI_TYPE00 Pci;Status = PciIo->Pci.Read ( PciIo, EfiPciIoWidthUint32, 0, sizeof (Pci) / sizeof (UINT32), &Pci );if (Pci.Hdr.VendorId == MY_VENDOR_ID && Pci.Hdr.DeviceId == MY_DEVICE_ID) { return EFI_SUCCESS;}return EFI_UNSUPPORTED;| Matching kiểu | Ưu điểm | Rủi ro |
|---|---|---|
| Vendor ID only | Rộng, dễ bắt nhiều device cùng vendor | Dễ match nhầm device |
| Vendor + Device ID | Chính xác hơn | Có thể thiếu SKU/subsystem khác |
| Class Code | Generic driver cho một class | Cần handle nhiều vendor/device khác nhau |
| Subsystem ID | Phân biệt board/OEM | Quá chặt làm driver không bind |
| Revision ID | Workaround theo stepping | Hardcode revision gây miss device mới |
| Capability-based | Check feature thật | Phức tạp hơn |
| Device Path/topology | Match slot/path cụ thể | Topology thay đổi có thể break |
| Hybrid | ID + class + capability | Cần thiết kế rõ policy |
Subsystem Vendor ID và Subsystem Device ID
Subsystem ID giúp phân biệt cùng một chip nhưng khác board hoặc OEM design.
| Tình huống | Vì sao cần Subsystem ID | Ví dụ debug |
|---|---|---|
| Cùng chip nhiều board | Device ID giống nhưng wiring khác | Board A cần GPIO quirk |
| OEM-specific device | Vendor chip giống nhưng firmware khác | Driver chỉ support OEM SKU |
| Add-in card | Board vendor khác silicon vendor | Subsystem Vendor ID khác Vendor ID |
| Driver quirk | Enable/disable feature theo board | Revision + subsystem matching |
| POS/embedded platform | Cùng controller nhưng routing khác | Port mapping khác |
| OS driver database | Match theo PCI IDs list | Driver bind sai nếu subsystem không xét |
| Firmware policy | Enable feature theo SKU | Setup option chọn sai |
| Debug nhầm device | Vendor/Device same nhưng subsystem khác | Log subsystem để phân biệt |
Class Code vs Vendor/Device ID
Class Code mô tả loại chức năng của device, còn Vendor/Device ID mô tả identity cụ thể.
| Khía cạnh | Vendor/Device ID | Class Code |
|---|---|---|
| Mục tiêu | Nhận diện device cụ thể | Nhận diện loại chức năng |
| Ai định nghĩa | Vendor ID do PCI-SIG cấp, Device ID do vendor định nghĩa | PCI class code chuẩn hóa |
| Driver cụ thể | Thường dùng cho vendor driver | Có thể dùng thêm |
| Generic driver | Không đủ rộng | Rất hữu ích |
| Ví dụ | Intel vendor + một Device ID | Mass Storage / NVMe |
| Debug | Biết device là chip nào | Biết nó thuộc loại gì |
| Rủi ro | Quá cụ thể | Quá rộng nếu device có quirk |
| Cách dùng tốt | Kết hợp ID, class, capability | Kết hợp với ID/capability |
Vendor/Device ID và PCI database
Trong debug, bạn có thể tra PCI IDs database hoặc source driver để biết ID đó thuộc device nào. Nhưng trong firmware, đừng dựa vào tên marketing quá nhiều, hãy dựa vào config fields thật.
| Thông tin | Có ích | Cẩn thận |
|---|---|---|
| Vendor name | Biết vendor | Vendor name không đủ để match driver |
| Device name | Biết chip/model gần đúng | Tên database có thể generic hoặc outdated |
| Subsystem name | Phân biệt board | Không phải mọi device có entry rõ |
| Revision | Workaround stepping | Không tự suy ra feature chỉ từ revision |
| Class | Generic function | Class có thể bị firmware/device set lạ |
| Capabilities | Feature thật | Cần đọc capability list |
| Driver source | Biết ID table | Driver có thể match thêm condition |
| Firmware log | Source of truth trên board hiện tại | Đừng chỉ dựa database ngoài |
Vendor/Device ID và spoofing/policy
Trong firmware/security context, Vendor ID/Device ID là thông tin device tự expose qua config space. Nó hữu ích nhưng không phải trust anchor tuyệt đối.
| Vấn đề | Ý nghĩa | Policy tốt hơn |
|---|---|---|
| Device tự report ID | Không phải bằng chứng trust tuyệt đối | Kết hợp topology/IOMMU/security policy |
| Hotplug | Device lạ có thể xuất hiện | Hotplug authorization |
| Option ROM | Device có thể mang OpROM | Image authentication |
| DMA | Device có Bus Master có thể DMA | IOMMU/DMAR policy |
| Same ID different board | Subsystem/quirk khác | Check subsystem/capability |
| Firmware setup | Allow/deny theo device | Không chỉ match Vendor ID |
| Debug tool | Write config theo ID | Validate BDF + IDs trước write |
| Production | Policy phải rõ threat model | Không trust ID đơn lẻ |
Debug Diary: Driver không bind vì Device ID khác
Triệu chứng:
Supported() đọc Vendor ID đúng
Device ID không nằm trong list
return EFI_UNSUPPORTED
Checklist Device ID mismatch
Debug Diary: Driver bind nhầm device
Triệu chứng:
Supported() trả EFI_SUCCESS
Start() fail vì BAR/capability không như kỳ vọng
Checklist driver bind nhầm
Debug Diary: Vendor ID 0xFFFF sau reset
Triệu chứng:
Cold boot thấy device
Sau reset hoặc S3 resume đọc Vendor ID = 0xFFFF
Checklist 0xFFFF sau reset/resume
Debug Diary: Subsystem ID khác trên hai board
Triệu chứng:
Cùng Vendor/Device ID
Board A driver chạy
Board B driver không bind hoặc chạy sai
Checklist Subsystem ID khác
Debug Diary: ID đọc sai do offset/width
Triệu chứng:
Vendor ID/Device ID log ra giá trị lạ
Hoặc Vendor ID và Device ID bị đảo/sai
Checklist đọc ID sai
Anti-pattern khi dùng Vendor/Device ID
| Anti-pattern | Vì sao sai | Cách sửa |
|---|---|---|
| Match chỉ Vendor ID | Dễ bind nhầm device | Match Device ID/class/capability |
| Match quá chặt subsystem | Miss SKU hợp lệ | Thiết kế support matrix rõ |
| Bỏ qua 0xFFFF | Có thể đọc device không tồn tại | Check Vendor ID trước |
| Không log Device ID | Debug support table khó | Log đầy đủ ID fields |
| Dùng ID làm trust tuyệt đối | Device tự report ID | Kết hợp policy/IOMMU/topology |
| Hardcode ID không document | Khó maintain | Comment source/datasheet/reference |
| Không check capability | ID giống nhưng feature khác | Read capability list |
| Đọc sai width/offset | Match sai | Dùng struct/helper chuẩn |
Instrumentation nên có
| Vị trí | Nên log | Mục tiêu |
|---|---|---|
| PCI scan | BDF + Vendor ID + Device ID | Biết function tồn tại và identity |
| Driver Supported | ID fields + match reason | Debug bind/reject |
| Driver Start | ID + Revision + Subsystem | Debug quirk/init |
| Config dump | First 64 bytes config space | Debug offset/width |
| Capability scan | Capability IDs | Verify feature |
| Subsystem log | Subsystem Vendor/Device | Board/SKU debug |
| Class code log | Base/Subclass/ProgIF | Generic matching |
| Good/bad diff | ID/revision/subsystem diff | Regression |
| OS compare | UEFI ID vs OS ID | Handoff/OS driver debug |
| Policy log | Allowed/blocked reason | Security/setup debug |
Vendor/Device ID debug playbook
Vendor/Device ID debug playbook
Security checklist
Security checklist cho PCI IDs
Khi đọc log ID nên tìm gì?
| Cần hiểu | Tìm trong log | Câu hỏi |
|---|---|---|
| BDF | Segment:Bus:Device.Function | Đọc đúng function không? |
| Vendor ID | Offset 0x00 | Có phải 0xFFFF không? |
| Device ID | Offset 0x02 | Có trong support table không? |
| Revision ID | Offset 0x08 | Có cần workaround không? |
| Class Code | Offset 0x09-0x0B | Driver generic/class match không? |
| Subsystem ID | Offset 0x2C/0x2E | Board/SKU có khác không? |
| Header Type | Offset 0x0E | Endpoint/bridge/multifunction? |
| Capabilities | Capability list | Feature cần thiết có không? |
| Supported status | EFI_SUCCESS/UNSUPPORTED | Reject vì field nào? |
| OS compare | lspci/Device Manager | OS thấy cùng ID không? |
Câu hỏi tự kiểm tra
Tự kiểm tra sau khi đọc note này
Blog seeds
- Vendor ID và Device ID trong PCIe là gì?
- Vendor ID 0xFFFF khi đọc PCI config nghĩa là gì?
- UEFI PCI driver match thiết bị bằng Vendor/Device ID thế nào?
- Subsystem ID trong PCI dùng để debug board/SKU
- Driver bind nhầm device vì match Vendor ID quá rộng
Bài liên quan
- PCI/PCIe Architecture Overview
- BDF trong PCIe là gì?
- Class Code trong PCI là gì?
- PCI Configuration Space là gì?
- BAR trong PCIe là gì?
- PCI I/O Protocol là gì?
- PCI Bus Driver là gì?
- Driver Binding Flow là gì?
- EFI Unsupported
- EFI Not Found
Nguồn tham khảo public
- PCI-SIG Specifications
- UEFI Specification
- UEFI Platform Initialization Specification
- Tianocore EDK II
- EDK II Driver Writer’s Guide
Bài viết này hữu ích với bạn?
Bạn có thể chia sẻ cho người đang học firmware, BIOS/UEFI, embedded systems hoặc ủng hộ tác giả.
Nội dung liên quan
Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.
Class Code trong PCI là gì?
Giải thích PCI Class Code: Base Class, Subclass, Prog IF, generic driver matching, storage/network/bridge class và debug driver bind sai.
BAR trong PCIe là gì?
Giải thích BAR trong PCIe: Base Address Register, MMIO/I/O BAR, 32-bit/64-bit BAR, prefetchable, sizing, resource allocation và debug MMIO fail.
BDF trong PCIe là gì?
Giải thích BDF trong PCIe: Bus Device Function, địa chỉ thiết bị, enumeration, bridge bus number, multi-function device và debug device mất.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.