24 if (ctrl & (1 << 7)) {
37 __asm__
volatile(
"mfence" :::
"memory");
39 (ctrl & ~(0x70)) | 1);
58 LOG2_INFO(
"MSIX",
"enabled, ctrl=0x%x", ctrl);
59 pci_write16(pci_bus, pci_dev, pci_func,
cap + 0x2, ctrl & ~(1 << 15));
65 auto table_size = (ctrl & 0x7FF) + 1;
66 LOG2_INFO(
"MSIX",
"Table size : %d", table_size);
68 auto selected_bar =
pci->bar[bir].address +
offset;
76 for (
int i = 0; i < table_size; i++) {
77 msix_table[i * 4 + 0] =
79 msix_table[i * 4 + 1] = 0;
80 msix_table[i * 4 + 2] = (
vector & 0xFF);
81 msix_table[i * 4 + 3] =
87 __asm__
volatile(
"mfence" :::
"memory");
91 (ctrl | (1 << 15)) & ~(1 << 14));
100 auto cap_ptr =
pci->capability_ptr;
105 while (cap_ptr != 0 && cap_ptr >= 0x40 && cap_ptr <= 0xFF) {
112 if (cap_id == 0x05) {
122 auto cap_ptr =
pci->capability_ptr;
127 while (cap_ptr != 0 && cap_ptr >= 0x40 && cap_ptr <= 0xFF) {
134 if (cap_id == 0x11) {
uint16_t pci_cap_find_msi(struct ioforge_pci_device *pci)
void pci_enable_msi(struct ioforge_pci_device *pci, uint8_t vector, uint8_t cpu, uint16_t cap)
uintptr_t pci_enable_msix(struct ioforge_pci_device *pci, uint8_t vector, uint8_t cpu, uint16_t cap)
uint16_t pci_cap_find_msix(struct ioforge_pci_device *pci)
struct ioforge_pci_device pci
void pci_write16(uint8_t bus, uint8_t dev, uint8_t func, uint16_t off, uint16_t val)
void pci_write32(uint8_t bus, uint8_t dev, uint8_t func, uint16_t off, uint32_t val)
uint16_t pci_read16(uint8_t bus, uint8_t dev, uint8_t func, uint16_t off)
uint8_t pci_read8(uint8_t bus, uint8_t dev, uint8_t func, uint16_t off)
uint32_t pci_read32(uint8_t bus, uint8_t dev, uint8_t func, uint16_t off)
#define LOG2_INFO(mod, fmt,...)