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.

Cập nhật 15 phút đọc
PCI cover

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 0x000x02, đượ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

01 BDF

Select a BDF

Firmware chọn Bus/Device/Function để đọc config space.

02 VID

Read Vendor ID

Nếu Vendor ID là 0xFFFF, thường bỏ qua function đó.

03 DID

Read Device ID

Nếu Vendor ID hợp lệ, đọc Device ID để nhận diện thiết bị.

04 Class

Read Class Code

Xác định loại device như storage, network, bridge.

05 BAR

Probe BAR

Xác định resource device cần.

06 PciIo

Install PciIo

Tạo controller handle cho function.

07 Driver

Driver matching

DriverBinding Supported dùng ID/class/capability để quyết định support.

Firmware đọc Vendor ID/Device ID rất sớm khi scan BDF.

Ý nghĩa của từng ID

Vendor ID, Device ID và ID liên quan
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.

Vendor ID 0xFFFF thường nói gì?
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;
Driver matching theo Vendor/Device ID
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.

Subsystem ID dùng khi nào?
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ể.

Class Code vs Vendor/Device ID
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.

Khi đọc PCI IDs
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.

Vendor/Device ID trong policy
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 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ó

Instrumentation cho Vendor/Device ID debug
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ì?

PCI ID log reading checklist
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

Nguồn tham khảo public

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ả.

Góp ý

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.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.