On 10/18/21 11:51, BALATON Zoltan wrote:
> On Mon, 18 Oct 2021, Philippe Mathieu-Daudé wrote:
>> 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.
> 
> Why not? If it's OK to access other fields why not parent_obj? That
> avoids the QOM cast PCI_DEVICE(opaque) or PCI_DEVICE(d) after this
> patch. We know it's a PCIIDEState and has PCIDevice parent_obj field
> because we set the opaque pointer when adding this callback so I think
> this works and is the less expensive way. But feel free to change it any
> way you like and use it that way. I'd keep it as it is.

My understanding of QOM is we shouldn't access internal states that
way, because 1/ this makes object refactors harder and 2/ this is
not the style/example we want in the codebase, but it doesn't seem
documented, so Cc'ing Markus/Eduardo for confirmation.

> 
> Reagards,
> BALATON Zoltan
> 
>>> -    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];
>>>
>>
>>

Reply via email to