mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 20:58:22 +00:00
pci: msi-x support
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user