diff options
author | Anton Kling <anton@kling.gg> | 2023-11-15 02:58:36 +0100 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2023-11-15 21:40:13 +0100 |
commit | b775d4e1b626f97364994fd0d60faac9e78932bb (patch) | |
tree | d4015aa95e226cf0a1722e12f53e342a7b70f370 /kernel/drivers | |
parent | e22e493940266e0aa9be2bf58df1821a3539e19b (diff) |
PCI: Add interrupt handler functions
Diffstat (limited to 'kernel/drivers')
-rw-r--r-- | kernel/drivers/pci.c | 18 | ||||
-rw-r--r-- | kernel/drivers/pci.h | 2 |
2 files changed, 20 insertions, 0 deletions
diff --git a/kernel/drivers/pci.c b/kernel/drivers/pci.c index 362d5c3..7484a41 100644 --- a/kernel/drivers/pci.c +++ b/kernel/drivers/pci.c @@ -135,6 +135,24 @@ int pci_populate_device_struct(u16 vendor, u16 device, return 0; } +void pci_enable_interrupts(const struct PCI_DEVICE *device) { + u32 register1 = pci_config_read32(device, 0, 0x4); + u8 current_interrupt = (register1 >> 10) & 1; + if (current_interrupt) { + kprintf("PCI: Interrrupt already enabled\n"); + } + register1 |= (1 << 10); + pci_config_write32(device, 0, 0x4, register1); +} + +void pci_set_interrupt_line(const struct PCI_DEVICE *device, + u8 interrupt_line) { + u32 register1 = pci_config_read32(device, 0, 0x3C); + register1 &= ~(0xFF); + register1 |= interrupt_line; + pci_config_write32(device, 0, 0x3C, register1); +} + u8 pci_get_interrupt_line(const struct PCI_DEVICE *device) { return pci_config_read32(device, 0, 0x3C) & 0xFF; } diff --git a/kernel/drivers/pci.h b/kernel/drivers/pci.h index 3378c8b..274e950 100644 --- a/kernel/drivers/pci.h +++ b/kernel/drivers/pci.h @@ -33,4 +33,6 @@ int pci_populate_device_struct(u16 vendor, u16 device, u8 pci_devices_by_id(u8 class_id, u8 subclass_id, struct PCI_DEVICE *pci_device); +void pci_enable_interrupts(const struct PCI_DEVICE *device); u8 pci_get_interrupt_line(const struct PCI_DEVICE *device); +void pci_set_interrupt_line(const struct PCI_DEVICE *device, u8 interrupt_line); |