slab_test/include/sys/pci.h
2026-03-04 07:19:48 +01:00

102 lines
2.6 KiB
C

#include <stdbool.h>
#include <stdint.h>
void pci_init();
typedef struct pci_header_t {
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)) pci_header_t;
typedef struct pci_header_0_t {
pci_header_t header;
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 subsytem_vendor_id;
uint16_t subsystem_id;
uint32_t expansion_rom_base;
uint8_t capabilities_ptr;
uint8_t reserved1;
uint16_t reserved2;
uint32_t reserved3;
uint8_t interrupt_line;
uint8_t interrupt_pin;
uint8_t min_grant;
uint8_t max_latency;
}__attribute((packed)) pci_header_0_t;
typedef struct pci_header_1_t {
pci_header_t header;
uint32_t bar0;
uint32_t bar1;
uint8_t primary_bus_number;
uint8_t secondary_bus_number;
uint8_t subordinate_bus_number;
uint8_t secondary_latency_timer;
uint8_t io_base;
uint8_t io_limit;
uint16_t secondary_status;
uint16_t memory_base;
uint16_t memory_limit;
uint16_t prefetch_base_;
uint16_t prefetch_limit;
uint32_t prefetch_base_upper;
uint32_t prefetch_limit_upper;
uint16_t io_base_upper;
uint16_t io_limit_upper;
uint8_t capability_ptr;
uint8_t reserved1;
uint16_t reserved2;
uint32_t expansion_rom_base;
uint8_t interrupt_line;
uint8_t interrupt_pin;
uint16_t bridge_control;
}__attribute((packed)) pci_header_1_t;
typedef struct pci_header_ahci_t {
pci_header_t header;
uint32_t bar[4];
uint32_t ahci_bar;
uint16_t subsystem_id;
uint16_t subsytem_vendor_id;
uint32_t expansion_rom_base;
uint8_t capabilities_ptr;
uint16_t interrupt_info;
uint8_t min_grant;
uint8_t max_latency;
}__attribute((packed)) pci_header_ahci_t;
/* For internal use */
typedef struct l84_pci_function_return {
bool multi; // If device has multiple functions this is set to 1, else set to 0. If set to 0, functions index 1-7 are ignored
uint64_t func_addr[8];
} l84_pci_function_return;
typedef struct pci_structure {
uint16_t segment;
uint8_t bus;
uint8_t device;
uint64_t func_addr[8];
} pci_structure;
l84_pci_function_return check_device(uint64_t bus, uint64_t device);
uint64_t get_header(uint64_t bus, uint64_t device, uint64_t function);
pci_header_t *pci_find_device(uint64_t class, int subclass);