mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
pci: Add pci_device_route_intx_to_irq
Device assigned on KVM needs to know the mode (enabled/inverted/disabled) and the IRQ number that a given device triggers in the attached interrupt controller. Add a PCI IRQ path discovery function that walks from a given device to the host bridge, and gets this information. For this purpose, a host bridge callback function is introduced: route_intx_to_irq. It is so far only implemented by the PIIX3, other host bridges can be added later on as required. Will be used for KVM PCI device assignment and VFIO. Based on patch by Jan Kiszka, with minor tweaks. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
7cf1b0fd95
commit
3afa9bb488
4 changed files with 51 additions and 0 deletions
|
@ -89,6 +89,7 @@ struct PCII440FXState {
|
|||
#define I440FX_SMRAM 0x72
|
||||
|
||||
static void piix3_set_irq(void *opaque, int pirq, int level);
|
||||
static PCIINTxRoute piix3_route_intx_pin_to_irq(void *opaque, int pci_intx);
|
||||
static void piix3_write_config_xen(PCIDevice *dev,
|
||||
uint32_t address, uint32_t val, int len);
|
||||
|
||||
|
@ -315,6 +316,7 @@ static PCIBus *i440fx_common_init(const char *device_name,
|
|||
pci_create_simple_multifunction(b, -1, true, "PIIX3"));
|
||||
pci_bus_irqs(b, piix3_set_irq, pci_slot_get_pirq, piix3,
|
||||
PIIX_NUM_PIRQS);
|
||||
pci_bus_set_route_irq_fn(b, piix3_route_intx_pin_to_irq);
|
||||
}
|
||||
piix3->pic = pic;
|
||||
*isa_bus = DO_UPCAST(ISABus, qbus,
|
||||
|
@ -386,6 +388,22 @@ static void piix3_set_irq(void *opaque, int pirq, int level)
|
|||
piix3_set_irq_level(piix3, pirq, level);
|
||||
}
|
||||
|
||||
static PCIINTxRoute piix3_route_intx_pin_to_irq(void *opaque, int pin)
|
||||
{
|
||||
PIIX3State *piix3 = opaque;
|
||||
int irq = piix3->dev.config[PIIX_PIRQC + pin];
|
||||
PCIINTxRoute route;
|
||||
|
||||
if (irq < PIIX_NUM_PIC_IRQS) {
|
||||
route.mode = PCI_INTX_ENABLED;
|
||||
route.irq = irq;
|
||||
} else {
|
||||
route.mode = PCI_INTX_DISABLED;
|
||||
route.irq = -1;
|
||||
}
|
||||
return route;
|
||||
}
|
||||
|
||||
/* irq routing is changed. so rebuild bitmap */
|
||||
static void piix3_update_irq_levels(PIIX3State *piix3)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue