mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
pci: implement msi masking
Co-authored-by: Matheus <matheusuky@gmail.com>
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user