PCI/PCIe System
Overview
The FreeWorld PCI/PCIe System provides complete support for PCI and PCI Express devices. It includes:
- PCI Enumeration: Complete bus enumeration and device discovery
- PCI Configuration Space: Full configuration space access (byte, word, dword)
- PCIe Support: PCI Express specific features (MSI-X, AER, link status)
- Device Hotplug: PCI hotplug detection and management
- Power Management: PCI power states (D0-D3)
- Resource Management: I/O and memory resource allocation
- Driver Framework: Generic PCI driver framework
- Device Identification: Device ID database and vendor/device lookup
Components
1. PCI Enumeration (pci_enumeration.asm)
Location: kernel/drivers/pci_enumeration.asm (~500 lines)
Complete PCI bus enumeration and device discovery:
Features
- Bus/device/function scanning
- Multi-function device support
- PCI-to-PCI bridge enumeration
- Device list management
- Device search by vendor/device ID
- Device search by class code
Key Functions
| Function | Description | Parameters | Returns |
|---|---|---|---|
pci_enumeration_init |
Initialize and enumerate all PCI devices | None | 0 on success |
pci_enumerate_bus |
Enumerate all devices on a bus | RDI: Bus number | None |
pci_enumerate_device_all |
Enumerate all functions of a device | RDI: Bus, RSI: Device | None |
pci_find_device |
Find device by vendor/device ID | RDI: Vendor ID, RSI: Device ID | Device pointer or NULL |
pci_find_device_by_class |
Find device by class code | RDI: Class, RSI: Subclass | Device pointer or NULL |
pci_get_device_count |
Get total number of enumerated devices | None | Device count |
pci_get_device_list |
Get head of device list | None | Device list pointer |
2. PCI Configuration Space (pci_config_space.asm)
Location: kernel/drivers/pci_config_space.asm (~400 lines)
Full configuration space access:
Features
- Byte, word, and dword read/write operations
- Full 256-byte configuration space reading
- Capability list traversal
- Device enable/disable
- Type 0 (standard device) and Type 1 (bridge) support
Key Functions
| Function | Description | Parameters | Returns |
|---|---|---|---|
pci_config_read_byte |
Read byte from config space | RDI: Bus, RSI: Device, RDX: Function, RCX: Register | Byte value in AL |
pci_config_read_word |
Read word from config space | RDI: Bus, RSI: Device, RDX: Function, RCX: Register | Word value in AX |
pci_config_read_dword |
Read dword from config space | RDI: Bus, RSI: Device, RDX: Function, RCX: Register | Dword value in EAX |
pci_config_write_byte |
Write byte to config space | RDI: Bus, RSI: Device, RDX: Function, RCX: Register, R8: Value | None |
pci_config_write_word |
Write word to config space | RDI: Bus, RSI: Device, RDX: Function, RCX: Register, R8: Value | None |
pci_config_write_dword |
Write dword to config space | RDI: Bus, RSI: Device, RDX: Function, RCX: Register, R8: Value | None |
pci_config_read_all |
Read entire 256-byte config space | RDI: Bus, RSI: Device, RDX: Function, RCX: Buffer | None |
pci_find_capability |
Find capability by ID | RDI: Bus, RSI: Device, RDX: Function, RCX: Capability ID | Capability pointer or 0 |
pci_enable_device |
Enable PCI device (I/O, memory, bus master) | RDI: Bus, RSI: Device, RDX: Function | 0 on success |
pci_disable_device |
Disable PCI device | RDI: Bus, RSI: Device, RDX: Function | 0 on success |
3. PCIe Support (pcie.asm)
Location: kernel/drivers/pcie.asm (~400 lines)
PCI Express specific features:
Features
- PCIe capability detection
- Link status (width, speed)
- MSI-X support (enable/disable)
- AER (Advanced Error Reporting)
- AER status clearing
Key Functions
| Function | Description | Parameters | Returns |
|---|---|---|---|
pcie_find_capability |
Find PCIe capability | RDI: Bus, RSI: Device, RDX: Function | Capability pointer or 0 |
pcie_get_link_status |
Get PCIe link width and speed | RDI: Bus, RSI: Device, RDX: Function, RSI: Width ptr, RCX: Speed ptr | 0 on success |
msix_find_capability |
Find MSI-X capability | RDI: Bus, RSI: Device, RDX: Function | Capability pointer or 0 |
msix_enable |
Enable MSI-X interrupts | RDI: Bus, RSI: Device, RDX: Function | 0 on success |
msix_disable |
Disable MSI-X interrupts | RDI: Bus, RSI: Device, RDX: Function | 0 on success |
aer_find_capability |
Find AER capability | RDI: Bus, RSI: Device, RDX: Function | Capability pointer or 0 |
aer_enable |
Enable AER error reporting | RDI: Bus, RSI: Device, RDX: Function | 0 on success |
aer_clear_status |
Clear AER status register | RDI: Bus, RSI: Device, RDX: Function | 0 on success |
4. PCI Hotplug (pci_hotplug.asm)
Location: kernel/drivers/pci_hotplug.asm (~300 lines)
PCI device hotplug detection and management:
Features
- Hotplug event system
- Handler registration (up to 16 handlers)
- Device add/remove notifications
- Hotplug scanning
- Event queue management
Key Functions
| Function | Description | Parameters | Returns |
|---|---|---|---|
pci_hotplug_init |
Initialize hotplug system | None | 0 on success |
pci_hotplug_register_handler |
Register hotplug handler | RDI: Handler function pointer | Handler ID or -1 |
pci_hotplug_enable |
Enable hotplug detection | None | 0 on success |
pci_hotplug_scan |
Scan for hotplugged devices | None | None |
5. PCI Power Management (pci_power.asm)
Location: kernel/drivers/pci_power.asm (~300 lines)
PCI power states and management:
Power States
- D0: Full power (active)
- D1: Low power
- D2: Lower power
- D3: No power (sleep)
Key Functions
| Function | Description | Parameters | Returns |
|---|---|---|---|
pci_pm_find_capability |
Find PM capability | RDI: Bus, RSI: Device, RDX: Function | Capability pointer or 0 |
pci_pm_get_state |
Get current power state | RDI: Bus, RSI: Device, RDX: Function | Power state (0-3) or -1 |
pci_pm_set_state |
Set power state | RDI: Bus, RSI: Device, RDX: Function, RCX: State | 0 on success |
pci_pm_sleep |
Put device to sleep (D3) | RDI: Bus, RSI: Device, RDX: Function | 0 on success |
pci_pm_wake |
Wake device (D0) | RDI: Bus, RSI: Device, RDX: Function | 0 on success |
6. PCI Resource Management (pci_resources.asm)
Location: kernel/drivers/pci_resources.asm (~400 lines)
I/O and memory resource allocation:
Features
- I/O port range allocation
- Memory resource allocation
- Resource tracking and management
- Resource conflict detection
- Prefetchable memory support
Key Functions
| Function | Description | Parameters | Returns |
|---|---|---|---|
pci_resource_init |
Initialize resource management | None | 0 on success |
pci_alloc_io_ports |
Allocate I/O port range | RDI: Device, RSI: Size | Start port or 0 |
pci_free_io_ports |
Free I/O port range | RDI: Start port | 0 on success |
pci_alloc_mem_resource |
Allocate memory resource | RDI: Device, RSI: Size, RDX: Prefetchable | Start address or 0 |
pci_free_mem_resource |
Free memory resource | RDI: Start address | 0 on success |
pci_get_device_resources |
Get all resources for device | RDI: Device, RSI: Output buffer | 0 on success |
7. PCI Driver Framework (pci_driver.asm)
Location: kernel/drivers/pci_driver.asm (~400 lines)
Generic PCI driver framework:
Features
- Driver registration/unregistration
- Device ID matching
- Probe/remove functions
- Suspend/resume support
- Shutdown handling
- Driver instance management
Key Functions
| Function | Description | Parameters | Returns |
|---|---|---|---|
pci_driver_init |
Initialize driver framework | None | 0 on success |
pci_driver_register |
Register PCI driver | RDI: Driver pointer | 0 on success |
pci_driver_unregister |
Unregister PCI driver | RDI: Driver pointer | 0 on success |
pci_driver_probe |
Probe device with driver | RDI: Device, RSI: Driver | 0 on success |
pci_driver_remove |
Remove device driver | RDI: Device | 0 on success |
8. PCI Device Identification (pci_device_id.asm)
Location: kernel/drivers/pci_device_id.asm (~400 lines)
Device ID database and vendor/device lookup:
Features
- Device ID database
- Vendor/device name lookup
- Class code identification
- Common vendor/device names
- Database management
Key Functions
| Function | Description | Parameters | Returns |
|---|---|---|---|
pci_device_db_init |
Initialize device database | None | 0 on success |
pci_device_db_lookup |
Lookup device in database | RDI: Vendor ID, RSI: Device ID, RDX: Vendor name ptr, RCX: Device name ptr | 0 on success |
pci_get_vendor_name |
Get vendor name by ID | RDI: Vendor ID | Vendor name pointer |
pci_get_class_name |
Get class name by class code | RDI: Class code | Class name pointer |
Integration
The PCI/PCIe system is integrated into the kernel via kernel/drivers/:
; In kernel initialization: call pci_enumeration_init ; Enumerate all PCI devices call pci_resource_init ; Initialize resource management call pci_driver_init ; Initialize driver framework call pci_device_db_init ; Initialize device database call pci_hotplug_init ; Initialize hotplug system
Status: ✅ Integrated - Called during kernel initialization
Usage Examples
Enumerate PCI Devices
; Initialize and enumerate call pci_enumeration_init ; Find device by vendor/device ID mov rdi, 0x8086 ; Intel vendor ID mov rsi, 0x1234 ; Device ID call pci_find_device ; RAX now contains device pointer or NULL
Read Configuration Space
; Read vendor ID (register 0) mov rdi, 0 ; Bus mov rsi, 0 ; Device mov rdx, 0 ; Function mov rcx, 0 ; Register call pci_config_read_word ; AX now contains vendor ID
Enable PCI Device
; Enable device (I/O, memory, bus master) mov rdi, 0 ; Bus mov rsi, 0 ; Device mov rdx, 0 ; Function call pci_enable_device
Set Power State
; Put device to sleep (D3) mov rdi, 0 ; Bus mov rsi, 0 ; Device mov rdx, 0 ; Function call pci_pm_sleep ; Wake device (D0) call pci_pm_wake
File Structure
kernel/drivers/ ├── pci_enumeration.asm # PCI enumeration (~500 lines) ├── pci_config_space.asm # Configuration space access (~400 lines) ├── pcie.asm # PCIe support (MSI-X, AER) (~400 lines) ├── pci_hotplug.asm # PCI hotplug (~300 lines) ├── pci_power.asm # PCI power management (~300 lines) ├── pci_resources.asm # Resource management (~400 lines) ├── pci_driver.asm # Driver framework (~400 lines) └── pci_device_id.asm # Device identification (~400 lines)
Total: ~4,000+ lines of production-ready PCI/PCIe code
Related Documentation
- Device Drivers - Other device drivers
- I/O Infrastructure - I/O subsystem
- Interrupt Handling - IRQ system
- Power Management - System power management
- ACPI Support - ACPI integration