mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
pseries: Rework irq assignment to avoid carrying qemu_irqs around
Currently, the interfaces in the pseries machine code for assignment and setup of interrupts pass around qemu_irq objects. That was done in an attempt not to be too closely linked to the specific XICS interrupt controller. However interactions with the device tree setup made that attempt rather futile, and XICS is part of the PAPR spec anyway, so this really just meant we had to carry both the qemu_irq pointers and the XICS irq numbers around. This mess will just get worse when we add upcoming PCI MSI support, since that will require tracking a bunch more interrupt. Therefore, this patch reworks the spapr code to just use XICS irq numbers (roughly equivalent to GSIs on x86) and only retrieve the qemu_irq pointers from the XICS code when we need them (a trivial lookup). This is a reworked and generalized version of an earlier spapr_pci specific patch from Alexey Kardashevskiy. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: David Gibson <david@gibson.dropbear.id.au> [agraf: fix checkpath warning] Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
c9f709d2e7
commit
a307d59434
10 changed files with 50 additions and 42 deletions
|
@ -49,7 +49,7 @@
|
|||
#endif
|
||||
|
||||
static Property spapr_vio_props[] = {
|
||||
DEFINE_PROP_UINT32("irq", VIOsPAPRDevice, vio_irq_num, 0), \
|
||||
DEFINE_PROP_UINT32("irq", VIOsPAPRDevice, irq, 0), \
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
@ -132,8 +132,8 @@ static int vio_make_devnode(VIOsPAPRDevice *dev,
|
|||
}
|
||||
}
|
||||
|
||||
if (dev->qirq) {
|
||||
uint32_t ints_prop[] = {cpu_to_be32(dev->vio_irq_num), 0};
|
||||
if (dev->irq) {
|
||||
uint32_t ints_prop[] = {cpu_to_be32(dev->irq), 0};
|
||||
|
||||
ret = fdt_setprop(fdt, node_off, "interrupts", ints_prop,
|
||||
sizeof(ints_prop));
|
||||
|
@ -306,7 +306,7 @@ int spapr_vio_send_crq(VIOsPAPRDevice *dev, uint8_t *crq)
|
|||
dev->crq.qnext = (dev->crq.qnext + 16) % dev->crq.qsize;
|
||||
|
||||
if (dev->signal_state & 1) {
|
||||
qemu_irq_pulse(dev->qirq);
|
||||
qemu_irq_pulse(spapr_vio_qirq(dev));
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -459,8 +459,8 @@ static int spapr_vio_busdev_init(DeviceState *qdev)
|
|||
dev->qdev.id = id;
|
||||
}
|
||||
|
||||
dev->qirq = spapr_allocate_msi(dev->vio_irq_num, &dev->vio_irq_num);
|
||||
if (!dev->qirq) {
|
||||
dev->irq = spapr_allocate_msi(dev->irq);
|
||||
if (!dev->irq) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue