On 10/18/21 03:36, BALATON Zoltan wrote: > Cache the pointer to PCI function 0 (ISA bridge, that this IDE device > has to use for IRQs) in the PCIIDEState and pass that as the opaque > data for the interrupt handler to eliminate both the need to look up > function 0 at every interrupt and also a QOM type cast of the opaque > pointer as that's also expensive (mainly due to qom-debug being > enabled by default). > > Suggested-by: Philippe Mathieu-Daudé <f4...@amsat.org> > Signed-off-by: BALATON Zoltan <bala...@eik.bme.hu> > --- > hw/ide/via.c | 11 ++++++----- > include/hw/ide/pci.h | 1 + > 2 files changed, 7 insertions(+), 5 deletions(-) > > diff --git a/hw/ide/via.c b/hw/ide/via.c > index 82def819c4..30566bc409 100644 > --- a/hw/ide/via.c > +++ b/hw/ide/via.c > @@ -104,15 +104,15 @@ static void bmdma_setup_bar(PCIIDEState *d) > > static void via_ide_set_irq(void *opaque, int n, int level) > { > - PCIDevice *d = PCI_DEVICE(opaque); > + PCIIDEState *d = opaque; > > if (level) { > - d->config[0x70 + n * 8] |= 0x80; > + d->parent_obj.config[0x70 + n * 8] |= 0x80; > } else { > - d->config[0x70 + n * 8] &= ~0x80; > + d->parent_obj.config[0x70 + n * 8] &= ~0x80; > }
Better not to access parent_obj, so I'd rather keep the previous code as it. The rest is OK, thanks. If you don't want to respin I can fix and take via mips-next. > > - via_isa_set_irq(pci_get_function_0(d), 14 + n, level); > + via_isa_set_irq(d->func0, 14 + n, level); > } > > static void via_ide_reset(DeviceState *dev) > @@ -188,7 +188,8 @@ static void via_ide_realize(PCIDevice *dev, Error **errp) > bmdma_setup_bar(d); > pci_register_bar(dev, 4, PCI_BASE_ADDRESS_SPACE_IO, &d->bmdma_bar); > > - qdev_init_gpio_in(ds, via_ide_set_irq, 2); > + d->func0 = pci_get_function_0(dev); > + qdev_init_gpio_in_named_with_opaque(ds, via_ide_set_irq, d, NULL, 2); > for (i = 0; i < 2; i++) { > ide_bus_init(&d->bus[i], sizeof(d->bus[i]), ds, i, 2); > ide_init2(&d->bus[i], qdev_get_gpio_in(ds, i)); > diff --git a/include/hw/ide/pci.h b/include/hw/ide/pci.h > index d8384e1c42..89d14abf95 100644 > --- a/include/hw/ide/pci.h > +++ b/include/hw/ide/pci.h > @@ -50,6 +50,7 @@ struct PCIIDEState { > IDEBus bus[2]; > BMDMAState bmdma[2]; > uint32_t secondary; /* used only for cmd646 */ > + PCIDevice *func0; /* used only by IDE functions of superio chips */ > MemoryRegion bmdma_bar; > MemoryRegion cmd_bar[2]; > MemoryRegion data_bar[2]; >