#pragma once #include "stdint.h" #define PCI_CONFIG_ADDRESS 0xCF8 #define PCI_CONFIG_DATA 0xCFC typedef struct pci_device { uint8_t bus; uint8_t slot; uint8_t func; uint16_t vendor_id; uint16_t device_id; uint8_t class_code; uint8_t subclass; uint8_t prog_if; uint8_t header_type; } pci_device_t; typedef struct gpu_info { uint16_t vendor_id; uint16_t device_id; uint8_t bus; uint8_t slot; uint8_t func; uint32_t vram_mb; char vendor_name[32]; char model_name[64]; } gpu_info_t; #ifdef __cplusplus extern "C" { #endif uint32_t pci_read_config_dword(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset); void pci_write_config_dword(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset, uint32_t val); uint16_t pci_get_vendor_id(uint8_t bus, uint8_t slot, uint8_t func); uint16_t pci_get_device_id(uint8_t bus, uint8_t slot, uint8_t func); uint32_t pci_get_bar_size(uint8_t bus, uint8_t slot, uint8_t func, uint8_t bar_idx); const char *pci_class_to_string(uint8_t class_code, uint8_t subclass); const char *pci_vendor_to_string(uint16_t vendor_id); int pci_detect_gpu(gpu_info_t *out_gpu); typedef void (*pci_scan_callback_t)(const pci_device_t *dev); void pci_scan_bus(pci_scan_callback_t callback); #ifdef __cplusplus } #endif