pci: msi-x support

This commit is contained in:
Matheus
2023-07-19 15:08:51 -03:00
parent 5e85429c5e
commit 1879bfcc20
3 changed files with 85 additions and 8 deletions
+21 -8
View File
@@ -11,7 +11,7 @@
#define PCI_CONFIG_COMMAND 0x4
#define PCI_COMMAND_IO 0x1
#define PCI_COMMAND_MMIO 0x2
#define PCI_COMMAND_IRQ 0x400
#define PCI_COMMAND_IRQDISABLE 0x400
#define PCI_CONFIG_STATUS 0x6
#define PCI_STATUS_HASCAP 0x10
@@ -35,6 +35,13 @@ typedef struct {
int offset;
} pcicap_t;
typedef struct {
uintptr_t address;
size_t length;
bool mmio;
bool prefetchable;
} pcibar_t;
typedef struct pcienum_t {
struct pcienum_t *next;
int bus;
@@ -49,15 +56,18 @@ typedef struct pcienum_t {
int revision;
pcicap_t msi;
pcicap_t msix;
pcibar_t bar[6];
union {
struct {
int bir;
uintmax_t tableoffset;
int pbir;
uintmax_t pboffset;
size_t entrycount;
} msix;
} irq;
} pcienum_t;
typedef struct {
uintptr_t address;
size_t length;
bool mmio;
bool prefetchable;
} pcibar_t;
uint8_t pci_read8(int bus, int device, int function, uint32_t offset);
uint16_t pci_read16(int bus, int device, int function, uint32_t offset);
uint32_t pci_read32(int bus, int device, int function, uint32_t offset);
@@ -69,6 +79,9 @@ int pci_getcapoffset(pcienum_t *e, int cap, int n);
pcibar_t pci_getbar(pcienum_t *e, int bar);
void *pci_mapbar(pcibar_t bar);
void pci_setcommand(pcienum_t *e, int mask, int v);
size_t pci_initmsix(pcienum_t *e);
void pci_msixsetmask(pcienum_t *e, int v);
void pci_msixadd(pcienum_t *e, int msixvec, int vec, int edgetrigger, int deassert);
void pci_init();
#endif
+6
View File
@@ -8,6 +8,7 @@
#include <arch/io.h>
#include <arch/acpi.h>
#include <kernel/pmm.h>
#include <arch/cpu.h>
static size_t mcfgentrycount;
static mcfgentry_t *mcfgentries;
@@ -65,6 +66,11 @@ static void mcfg_write32(int bus, int device, int function, uint32_t offset, uin
*address = value;
}
static uint64_t msiformatmessage(uint32_t *data, int vector, int edgetrigger, int deassert) {
*data = (edgetrigger << 15) | (deassert << 14) | vector;
return 0xfee00000 | (_cpu()->id << 12);
}
static void pci_archinit() {
mcfg_t *mcfg = arch_acpi_findtable("MCFG", 0);
if (mcfg) {