summaryrefslogtreecommitdiff
path: root/kernel/drivers/pci.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2023-11-15 02:58:36 +0100
committerAnton Kling <anton@kling.gg>2023-11-15 21:40:13 +0100
commitb775d4e1b626f97364994fd0d60faac9e78932bb (patch)
treed4015aa95e226cf0a1722e12f53e342a7b70f370 /kernel/drivers/pci.c
parente22e493940266e0aa9be2bf58df1821a3539e19b (diff)
PCI: Add interrupt handler functions
Diffstat (limited to 'kernel/drivers/pci.c')
-rw-r--r--kernel/drivers/pci.c18
1 files changed, 18 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;
}