x86: Add a function to assign IRQ numbers to PCI device

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>
This commit is contained in:
Bin Meng 2015-04-24 18:10:03 +08:00 committed by Simon Glass
parent 54c6001bba
commit e3e7fa2cd1
2 changed files with 35 additions and 0 deletions

View 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);
}

View 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_ */