Message ID | 20230521111534.207973-3-shentey@gmail.com |
---|---|
State | New |
Headers | show |
Series | VIA and general PCI IDE cleanup | expand |
On Sun, 21 May 2023, Bernhard Beschow wrote: > Resolves circular depencency between IDE function and south bridge. > > Signed-off-by: Bernhard Beschow <shentey@gmail.com> > Reviewed-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> > --- > hw/ide/via.c | 6 ++++-- > hw/isa/vt82c686.c | 5 +++++ > 2 files changed, 9 insertions(+), 2 deletions(-) > > diff --git a/hw/ide/via.c b/hw/ide/via.c > index 177baea9a7..0caae52276 100644 > --- a/hw/ide/via.c > +++ b/hw/ide/via.c > @@ -31,6 +31,7 @@ > #include "sysemu/dma.h" > #include "hw/isa/vt82c686.h" > #include "hw/ide/pci.h" > +#include "hw/irq.h" > #include "trace.h" > > static uint64_t bmdma_read(void *opaque, hwaddr addr, > @@ -104,7 +105,8 @@ 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 *s = opaque; > + PCIDevice *d = PCI_DEVICE(s); These are the same structure so can be cast into each other but for consistency it's better to also change qdev_init_gpio_in(ds, via_ide_set_irq, ARRAY_SIZE(d->bus)); to pass the PCIIDEState so d instead of ds in via_ide_realize(). Regards, BALATON Zoltan > if (level) { > d->config[0x70 + n * 8] |= 0x80; > @@ -112,7 +114,7 @@ static void via_ide_set_irq(void *opaque, int n, int level) > d->config[0x70 + n * 8] &= ~0x80; > } > > - via_isa_set_irq(pci_get_function_0(d), 14 + n, level); > + qemu_set_irq(s->isa_irq[n], level); > } > > static void via_ide_reset(DeviceState *dev) > diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c > index ca89119ce0..8016c71315 100644 > --- a/hw/isa/vt82c686.c > +++ b/hw/isa/vt82c686.c > @@ -692,6 +692,10 @@ static void via_isa_realize(PCIDevice *d, Error **errp) > if (!qdev_realize(DEVICE(&s->ide), BUS(pci_bus), errp)) { > return; > } > + for (i = 0; i < 2; i++) { > + qdev_connect_gpio_out_named(DEVICE(&s->ide), "isa-irq", i, > + s->isa_irqs_in[14 + i]); > + } > > /* Functions 2-3: USB Ports */ > for (i = 0; i < ARRAY_SIZE(s->uhci); i++) { > @@ -814,6 +818,7 @@ static void vt8231_isa_reset(DeviceState *dev) > PCI_COMMAND_MASTER | PCI_COMMAND_SPECIAL); > pci_set_word(pci_conf + PCI_STATUS, PCI_STATUS_DEVSEL_MEDIUM); > > + pci_conf[0x4c] = 0x04; /* IDE interrupt Routing */ > pci_conf[0x58] = 0x40; /* Miscellaneous Control 0 */ > pci_conf[0x67] = 0x08; /* Fast IR Config */ > pci_conf[0x6b] = 0x01; /* Fast IR I/O Base */ >
On Sun, 21 May 2023, BALATON Zoltan wrote: > On Sun, 21 May 2023, Bernhard Beschow wrote: >> Resolves circular depencency between IDE function and south bridge. >> >> Signed-off-by: Bernhard Beschow <shentey@gmail.com> >> Reviewed-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> >> --- >> hw/ide/via.c | 6 ++++-- >> hw/isa/vt82c686.c | 5 +++++ >> 2 files changed, 9 insertions(+), 2 deletions(-) >> >> diff --git a/hw/ide/via.c b/hw/ide/via.c >> index 177baea9a7..0caae52276 100644 >> --- a/hw/ide/via.c >> +++ b/hw/ide/via.c >> @@ -31,6 +31,7 @@ >> #include "sysemu/dma.h" >> #include "hw/isa/vt82c686.h" >> #include "hw/ide/pci.h" >> +#include "hw/irq.h" >> #include "trace.h" >> >> static uint64_t bmdma_read(void *opaque, hwaddr addr, >> @@ -104,7 +105,8 @@ 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 *s = opaque; >> + PCIDevice *d = PCI_DEVICE(s); > > These are the same structure so can be cast into each other but for > consistency it's better to also change > > qdev_init_gpio_in(ds, via_ide_set_irq, ARRAY_SIZE(d->bus)); > > to pass the PCIIDEState so d instead of ds in via_ide_realize(). Ignore this. That function takes a DeviceState and seems no separate argument for the opaque pointer so no change is needed. Regards, BALATON Zoltan
diff --git a/hw/ide/via.c b/hw/ide/via.c index 177baea9a7..0caae52276 100644 --- a/hw/ide/via.c +++ b/hw/ide/via.c @@ -31,6 +31,7 @@ #include "sysemu/dma.h" #include "hw/isa/vt82c686.h" #include "hw/ide/pci.h" +#include "hw/irq.h" #include "trace.h" static uint64_t bmdma_read(void *opaque, hwaddr addr, @@ -104,7 +105,8 @@ 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 *s = opaque; + PCIDevice *d = PCI_DEVICE(s); if (level) { d->config[0x70 + n * 8] |= 0x80; @@ -112,7 +114,7 @@ static void via_ide_set_irq(void *opaque, int n, int level) d->config[0x70 + n * 8] &= ~0x80; } - via_isa_set_irq(pci_get_function_0(d), 14 + n, level); + qemu_set_irq(s->isa_irq[n], level); } static void via_ide_reset(DeviceState *dev) diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c index ca89119ce0..8016c71315 100644 --- a/hw/isa/vt82c686.c +++ b/hw/isa/vt82c686.c @@ -692,6 +692,10 @@ static void via_isa_realize(PCIDevice *d, Error **errp) if (!qdev_realize(DEVICE(&s->ide), BUS(pci_bus), errp)) { return; } + for (i = 0; i < 2; i++) { + qdev_connect_gpio_out_named(DEVICE(&s->ide), "isa-irq", i, + s->isa_irqs_in[14 + i]); + } /* Functions 2-3: USB Ports */ for (i = 0; i < ARRAY_SIZE(s->uhci); i++) { @@ -814,6 +818,7 @@ static void vt8231_isa_reset(DeviceState *dev) PCI_COMMAND_MASTER | PCI_COMMAND_SPECIAL); pci_set_word(pci_conf + PCI_STATUS, PCI_STATUS_DEVSEL_MEDIUM); + pci_conf[0x4c] = 0x04; /* IDE interrupt Routing */ pci_conf[0x58] = 0x40; /* Miscellaneous Control 0 */ pci_conf[0x67] = 0x08; /* Fast IR Config */ pci_conf[0x6b] = 0x01; /* Fast IR I/O Base */