summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/drivers/pci.c18
-rw-r--r--kernel/drivers/pci.h2
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);