Skip to content

PCI

struct pci_device {
uint8_t bus;
uint8_t device;
uint8_t function;
uint16_t vendor_id;
uint16_t device_id;
uint8_t class_code;
uint8_t subclass;
uint8_t prog_if;
uint8_t revision;
};
struct pci_driver {
char *name;
uint8_t class_code;
uint8_t subclass;
uint8_t prog_if;
uint16_t vendor_id;
void (*initialize)(uint8_t, uint8_t, uint8_t, struct pci_device *);
};
union pci_command_reg {
uint16_t value;
struct {
uint16_t io_space;
uint16_t memory_space;
uint16_t bus_master;
uint16_t special_cycles;
uint16_t mem_write_inv;
uint16_t vga_snoop;
uint16_t parity_error;
uint16_t reserved0;
uint16_t serr_enable;
uint16_t fast_back;
uint16_t interrupt_disable;
uint16_t reserved1;
};
};
struct pci_msix_table_entry {
uint32_t msg_addr_low;
uint32_t msg_addr_high;
uint32_t msg_data;
uint32_t vector_ctrl;
};
struct pci_msix_cap {
uint8_t cap_id;
uint8_t next_ptr;
uint16_t msg_ctl;
uint32_t table_offset_bir;
uint32_t pba_offset_bir;
};
uint16_t pci_read_config16(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset);
uint8_t pci_read_config8(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset);
void pci_write_config16(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset, uint16_t value);
uint32_t pci_config_address(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset);
uint32_t pci_read(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset);
uint16_t pci_read_word(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset);
uint8_t pci_read_byte(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset);
void pci_write(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset, uint32_t value);
void pci_write_word(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset, uint16_t value);
void pci_write_byte(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset, uint8_t value);
#define PCI_CLASS_MASS_STORAGE 0x01
#define PCI_SUBCLASS_NVM 0x08
#define PCI_PROGIF_NVME 0x02
#define PCI_DEV_REGISTER(n, cc, sc, pi, vi, init) \ static struct pci_driver pci_device_##n __attribute__(( \ section(".kernel_pci_devices"), used)) = {.name = #n, \ .class_code = cc, \ .subclass = sc, \ .prog_if = pi, \ .vendor_id = vi, \ .initialize = init};
#define PCI_BAR0 0x10
#define PCI_BAR1 0x14
#define PCI_BAR2 0x18
#define PCI_BAR3 0x1C
#define PCI_BAR4 0x20
#define PCI_BAR5 0x24
#define PCI_CAP_PTR 0x34
#define PCI_CAP_ID_MSIX 0x11
#define PCI_CONFIG_ADDRESS 0xCF8
#define PCI_CONFIG_DATA 0xCFC
#define PCI_INTERRUPT_LINE 0x3C
#define PCI_PROG_IF 0x09
#define pci_log(log_level, fmt, ...) \ log(LOG_SITE(pci), LOG_HANDLE(pci), log_level, fmt, ##__VA_ARGS__)