#ifndef PCI_H #define PCI_H #include #include "port.h" #include "interrupts.h" #include "driver.h" typedef struct { uint16_t vendor_id; uint16_t device_id; uint8_t class_id; uint8_t subclass_id; uint8_t interface_id; uint8_t revision_id; uint32_t port_base; } pci_device_descriptor_t; typedef struct { port32_t command_port; port32_t data_port; } pci_controller_t; typedef enum { BASE_ADDRESS_REGISTER_TYPE_IO, BASE_ADDRESS_REGISTER_TYPE_MEMORY_MAPPED } pci_base_address_register_type_t; typedef struct { pci_base_address_register_type_t type; bool prefetchable; uint8_t *addr; uint32_t *size; } pci_base_address_register_t; void pci_controller_init( pci_controller_t *controller ); uint16_t pci_controller_read( pci_controller_t *controller, uint16_t bus, uint16_t device, uint16_t function, uint32_t offset ); void pci_controller_write( pci_controller_t *controller, uint16_t bus, uint16_t device, uint16_t function, uint32_t offset, uint32_t data ); void pci_controller_scan_and_register( pci_controller_t *controller, driver_manager_t *driver_manager, interrupt_t *interrupt, void *context ); void pci_device_descriptor_init( pci_device_descriptor_t *descriptor, pci_controller_t *controller, uint16_t bus, uint16_t device, uint16_t function ); void pci_base_address_register_init( pci_base_address_register_t *base_address_register, pci_controller_t *controller, uint16_t bus, uint16_t device, uint16_t function, uint16_t bar ); driver_t *pci_device_get_driver( pci_device_descriptor_t *descriptor, interrupt_t *interrupt, void *context ); #endif // PCI_H