From 58c749b9ba0e5d0aeb42989ca862cd9c6ee31f03 Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 14 May 2026 14:34:14 -0300 Subject: [PATCH] pci: fix msi --- kernel-src/io/pci.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/kernel-src/io/pci.c b/kernel-src/io/pci.c index a75c62b1..4be9c75f 100644 --- a/kernel-src/io/pci.c +++ b/kernel-src/io/pci.c @@ -131,7 +131,7 @@ size_t pci_initmsi(pcienum_t *e, int requested) { return 0; uint16_t msgctl = PCI_READ16(e, e->msi.offset + 2); - msgctl |= PCI_MSI_ENABLE; + msgctl &= ~PCI_MSI_ENABLE; msgctl &= ~(PCI_MSI_MULTIPLE_MESSAGE_SUPPORT_MASK); // no multiple message support PCI_WRITE16(e, e->msi.offset + 2, msgctl); @@ -159,22 +159,25 @@ void pci_msisetbase(pcienum_t *e, int base, int edgetrigger, int deassert) { // data PCI_WRITE16(e, e->msi.offset + dataoffset, data); + + uint16_t msgctl = PCI_READ16(e, e->msi.offset + 2); + PCI_WRITE16(e, e->msi.offset + 2, msgctl | PCI_MSI_ENABLE); } 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); + bool is64bit = msgctl & PCI_MSI_64BIT; + int maskoffset = e->msi.offset + (is64bit ? 16 : 12); + uint32_t maskbits = PCI_READ32(e, maskoffset); 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"); + PCI_WRITE32(e, maskoffset, maskbits); } }