pci: implement msi masking

Co-authored-by: Matheus <matheusuky@gmail.com>
This commit is contained in:
2026-04-25 16:37:25 -03:00
committed by Matheus
parent 50c4a9f82a
commit 1d1e66fe32
2 changed files with 19 additions and 0 deletions
+1
View File
@@ -92,6 +92,7 @@ void pci_msixsetmask(pcienum_t *e, int v);
void pci_msixadd(pcienum_t *e, int msixvec, int vec, int edgetrigger, int deassert);
size_t pci_initmsi(pcienum_t *e, int requested);
void pci_msisetbase(pcienum_t *e, int base, int edgetrigger, int deassert);
void pci_msisetmask(pcienum_t *e, int vector, int value);
void pci_init();
#define PCI_READ32(e, offset) pci_read32(e->bus, e->device, e->function, offset)
+18
View File
@@ -122,6 +122,7 @@ size_t pci_initmsix(pcienum_t *e) {
#define PCI_MSI_ENABLE 1
#define PCI_MSI_MULTIPLE_MESSAGE_SUPPORT_MASK 0x70
#define PCI_MSI_64BIT (1 << 7)
#define PCI_MSI_PER_VECTOR_MASKING (1 << 8)
size_t pci_initmsi(pcienum_t *e, int requested) {
// TODO maybe initialize mask if applicable?
@@ -160,6 +161,23 @@ void pci_msisetbase(pcienum_t *e, int base, int edgetrigger, int deassert) {
PCI_WRITE16(e, e->msi.offset + dataoffset, data);
}
void pci_msisetmask(pcienum_t *e, int vector, int value) {
uint32_t msgctl = PCI_READ16(e, e->msi.offset + 2);
if (msgctl & PCI_MSI_PER_VECTOR_MASKING) {
uint32_t maskbits = PCI_READ32(e, e->msi.offset + 16);
if (value)
maskbits |= 1 << vector;
else
maskbits &= ~(1 << vector);
PCI_WRITE32(e, e->msi.offset + 16, maskbits);
} else {
printf("pci: tried to mask msi vector without support\n");
}
}
#define BAR_MAP_FLAGS (ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_NOEXEC)
void *pci_mapbar(pcibar_t bar) {