x86: Add a function to assign IRQ numbers to PCI device
authorBin Meng <bmeng.cn@gmail.com>
Fri, 24 Apr 2015 10:10:03 +0000 (18:10 +0800)
committerSimon Glass <sjg@chromium.org>
Thu, 30 Apr 2015 00:51:49 +0000 (18:51 -0600)
Add a function to assign an IRQ number to PCI device's interrupt
line register in its configuration space, so that the PCI device
can have its interrupt working under PIC mode after OS boots up.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Acked-by: Simon Glass <sjg@chromium.org>
arch/x86/cpu/pci.c
arch/x86/include/asm/pci.h

index e23b233961cec277154b22941565990af7c87cab..c209f15ec4a8787364080467fffed562eda65cc1 100644 (file)
@@ -151,3 +151,24 @@ int pci_x86_write_config(struct udevice *bus, pci_dev_t bdf, uint offset,
 
        return 0;
 }
+
+void pci_assign_irqs(int bus, int device, int func, u8 irq[4])
+{
+       pci_dev_t bdf;
+       u8 pin, line;
+
+       bdf = PCI_BDF(bus, device, func);
+
+       pin = x86_pci_read_config8(bdf, PCI_INTERRUPT_PIN);
+
+       /* PCI spec says all values except 1..4 are reserved */
+       if ((pin < 1) || (pin > 4))
+               return;
+
+       line = irq[pin - 1];
+
+       debug("Assigning IRQ %d to PCI device %d.%x.%d (INT%c)\n",
+             line, bus, device, func, 'A' + pin - 1);
+
+       x86_pci_write_config8(bdf, PCI_INTERRUPT_LINE, line);
+}
index a1969ede27ecd6c5b9303cf36841789d27da4008..56eaa25b0c30080d238b202664d2acecc0119c81 100644 (file)
@@ -64,6 +64,20 @@ int pci_x86_read_config(struct udevice *bus, pci_dev_t bdf, uint offset,
 int pci_x86_write_config(struct udevice *bus, pci_dev_t bdf, uint offset,
                         ulong value, enum pci_size_t size);
 
+/**
+ * Assign IRQ number to a PCI device
+ *
+ * This function assigns IRQ for a PCI device. If the device does not exist
+ * or does not require interrupts then this function has no effect.
+ *
+ * @bus:       PCI bus number
+ * @device:    PCI device number
+ * @func:      PCI function number
+ * @irq:       An array of IRQ numbers that are assigned to INTA through
+ *             INTD of this PCI device.
+ */
+void pci_assign_irqs(int bus, int device, int func, u8 irq[4]);
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* _PCI_I386_H_ */