#ifndef _PCI_H #define _PCI_H #include struct pci_header { uint16_t vendor_id; uint16_t device_id; uint16_t command; uint16_t status; uint8_t revision_id; uint8_t prog_if; uint8_t subclass; uint8_t class_code; uint8_t cache_line_size; uint8_t latency_timer; uint8_t header_type; uint8_t bist; } __attribute__((packed)); struct pci_header_type_0 { uint16_t vendor_id; uint16_t device_id; uint16_t command; uint16_t status; uint8_t revision_id; uint8_t prog_if; uint8_t subclass; uint8_t class_code; uint8_t cache_line_size; uint8_t latency_timer; uint8_t header_type; uint8_t bist; uint32_t bar0; uint32_t bar1; uint32_t bar2; uint32_t bar3; uint32_t bar4; uint32_t bar5; uint32_t cardbus_cis_ptr; uint16_t subsystem_vendor_id; uint16_t subsystem_id; uint32_t expansion_rom_base; uint8_t capabilities_ptr; uint8_t reserved1[3]; uint32_t reserved2; uint8_t interrupt_line; uint8_t interrupt_pin; uint8_t min_grant; uint8_t max_latency; } __attribute__((packed)); uint32_t pci_config_read(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset); void pci_config_write(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset, uint32_t value); void pci_enumerate(void); #endif