PCI Architecture Overview

Knowledge map về PCI/PCIe enumeration, config space, BAR, resource allocation và PCI I/O Protocol trong firmware.

Cập nhật 4 phút đọc
PCI / ACPI / SMBIOS Terms cover

Khi nói “firmware nhận PCIe device”, thực tế có nhiều lớp chạy nối tiếp nhau: root bridge mô tả phạm vi tài nguyên, PCI Bus Driver scan BDF, đọc config space, probe BAR, cấp resource, tạo handle, rồi driver khác mới bind vào device.

Đây là knowledge map để nối các note PCI lại với nhau.

01 Root

PCI Root Bridge

Mô tả bus range và MMIO/I/O aperture mà platform cho phép.

02 Scan

BDF enumeration

Firmware scan Bus:Device.Function và đọc Vendor ID.

03 Config

Configuration Space

Đọc Class Code, BAR, capability, bridge info.

04 Resource

BAR / Bridge Window

Probe size, cấp MMIO/I/O và bus number.

05 DXE

PCI I/O Protocol

Tạo child handle để DXE driver khác bind.

Từ phần cứng PCIe tới UEFI driver binding.

Bản đồ thành phần

PCI firmware knowledge map

PCI / PCIe Firmware Flow
├─ PCI Root Bridge: bus range, MMIO aperture, ACPI _CRS
├─ BDF: địa chỉ Bus:Device.Function
├─ Configuration Space
│  ├─ Vendor ID / Device ID
│  ├─ Class Code
│  ├─ BAR0 - BAR5
│  └─ Capability list
├─ Resource Allocation
│  ├─ MMIO / I/O BAR
│  ├─ Bridge Window
│  └─ Command Register enable
└─ DXE Layer
   ├─ PCI Bus Driver
   └─ EFI_PCI_IO_PROTOCOL

Debug diary: thiết bị “mất tích”

Khi OS không thấy device, hãy tránh nhảy thẳng tới OS driver. Với PCIe, lỗi có thể nằm ở rất nhiều tầng trước đó.

1

BDF có tồn tại không?

Vendor ID có khác 0xFFFF không?

2

Class Code đúng không?

Device có đang ở đúng mode storage/network/display không?

3

BAR/resource đúng không?

BAR size/base, bridge window và root aperture có nhất quán không?

4

DXE handle có protocol chưa?

PCI Bus Driver đã tạo child handle và install PCI I/O Protocol chưa?

5

OS mô tả có khớp firmware không?

ACPI _CRS/DMAR/MCFG có nhất quán với resource firmware không?

Ví dụ dump nhanh

00:1c.0 PCI bridge: Root Port
  Bus: primary=00 secondary=02 subordinate=02
  Memory behind bridge: 90000000-91ffffff

02:00.0 Non-Volatile memory controller: NVMe SSD
  Vendor ID: 144d
  Device ID: a808
  Class: 010802
  BAR0: 90000000 [size=16K]

Đọc output này, điều cần kiểm tra là: BAR0 của NVMe có nằm trong bridge memory window không, class code có đúng NVMe không, và firmware có expose Block I/O phía trên hay chưa.

Mục Giá trị Ghi chú
Vendor ID = 0xFFFF No response Kiểm tra link, reset, power, bus number.
BAR size bất thường Resource issue Kiểm tra BAR probe hoặc device init.
BAR ngoài bridge window Transaction không forward Bridge window/root aperture sai.
Có PCI I/O nhưng driver không bind Driver binding issue Check Supported(), Class Code, DEPEX.
OS thấy resource conflict Firmware/ACPI mismatch Check _CRS, MCFG, DMAR và allocation.

Checklist tổng quát PCI debug

Blog seeds

  • PCIe Enumeration Explained from Firmware View
  • Why Vendor ID Reads 0xFFFF
  • BAR and MMIO Debugging Guide
  • PCI Resource Allocation and Bridge Window Pitfalls
  • How EDK2 PCI Bus Driver Creates PCI I/O Protocol

Thấy nội dung này hữu ích?

Lưu lại hoặc chia sẻ cho người cũng đang học firmware, BIOS/UEFI và embedded systems.

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.