qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2] hw/ppc/pegasos2: Fix IRQ routing from pci.0


From: Nicholas Piggin
Subject: Re: [PATCH v2] hw/ppc/pegasos2: Fix IRQ routing from pci.0
Date: Mon, 25 Nov 2024 23:03:34 +1000

On Sat Nov 16, 2024 at 2:01 AM AEST, BALATON Zoltan wrote:
> On Sat, 2 Nov 2024, BALATON Zoltan wrote:
> > The MV64361 has two PCI buses one of which is used for AGP on
> > PegasosII. So far we only emulated the PCI bus on pci.1 but some
> > graphics cards are only recognised by some guests when connected to
> > pci.0 corresponding to the AGP port. So far the interrupts were not
> > routed from pci.0 so this patch fixes that allowing the use of both
> > PCI buses. On real board only INTA and INTB are connected for AGP but
> > to avoid surprises we connect all 4 PCI interrupt lines so pci.0 can
> > be used for all PCI cards as well.
>
> Ping? As this is a bug fix it's still not too late to merge I think.

I missed it, sorry.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>

>
> Regards,
> BALATON Zoltan
>
> > Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> > ---
> > hw/pci-host/mv64361.c |  1 +
> > hw/ppc/pegasos2.c     | 30 +++++++++++++++++++++++++++++-
> > 2 files changed, 30 insertions(+), 1 deletion(-)
> >
> > diff --git a/hw/pci-host/mv64361.c b/hw/pci-host/mv64361.c
> > index 1036d8600d..421c287eb0 100644
> > --- a/hw/pci-host/mv64361.c
> > +++ b/hw/pci-host/mv64361.c
> > @@ -95,6 +95,7 @@ static void mv64361_pcihost_realize(DeviceState *dev, 
> > Error **errp)
> >                                    &s->mem, &s->io, 0, 4, TYPE_PCI_BUS);
> >     g_free(name);
> >     pci_create_simple(h->bus, 0, TYPE_MV64361_PCI_BRIDGE);
> > +    qdev_init_gpio_out(dev, s->irq, ARRAY_SIZE(s->irq));
> > }
> >
> > static Property mv64361_pcihost_props[] = {
> > diff --git a/hw/ppc/pegasos2.c b/hw/ppc/pegasos2.c
> > index 8ff4a00c34..16abeaac82 100644
> > --- a/hw/ppc/pegasos2.c
> > +++ b/hw/ppc/pegasos2.c
> > @@ -14,6 +14,7 @@
> > #include "hw/sysbus.h"
> > #include "hw/pci/pci_host.h"
> > #include "hw/irq.h"
> > +#include "hw/or-irq.h"
> > #include "hw/pci-host/mv64361.h"
> > #include "hw/isa/vt82c686.h"
> > #include "hw/ide/pci.h"
> > @@ -73,8 +74,11 @@ OBJECT_DECLARE_TYPE(Pegasos2MachineState, MachineClass, 
> > PEGASOS2_MACHINE)
> >
> > struct Pegasos2MachineState {
> >     MachineState parent_obj;
> > +
> >     PowerPCCPU *cpu;
> >     DeviceState *mv;
> > +    IRQState pci_irqs[PCI_NUM_PINS];
> > +    OrIRQState orirq[PCI_NUM_PINS];
> >     qemu_irq mv_pirq[PCI_NUM_PINS];
> >     qemu_irq via_pirq[PCI_NUM_PINS];
> >     Vof *vof;
> > @@ -177,7 +181,6 @@ static void pegasos2_init(MachineState *machine)
> >         pm->mv_pirq[i] = qdev_get_gpio_in_named(pm->mv, "gpp", 12 + i);
> >     }
> >     pci_bus = mv64361_get_pci_bus(pm->mv, 1);
> > -    pci_bus_irqs(pci_bus, pegasos2_pci_irq, pm, PCI_NUM_PINS);
> >
> >     /* VIA VT8231 South Bridge (multifunction PCI device) */
> >     via = OBJECT(pci_new_multifunction(PCI_DEVFN(12, 0), TYPE_VT8231_ISA));
> > @@ -209,6 +212,31 @@ static void pegasos2_init(MachineState *machine)
> >     /* other PC hardware */
> >     pci_vga_init(pci_bus);
> >
> > +    /* PCI interrupt routing: lines from pci.0 and pci.1 are ORed */
> > +    for (int h = 0; h < 2; h++) {
> > +        DeviceState *pd;
> > +        g_autofree const char *pn = g_strdup_printf("pcihost%d", h);
> > +
> > +        pd = DEVICE(object_resolve_path_component(OBJECT(pm->mv), pn));
> > +        assert(pd);
> > +        for (i = 0; i < PCI_NUM_PINS; i++) {
> > +            OrIRQState *ori = &pm->orirq[i];
> > +
> > +            if (h == 0) {
> > +                g_autofree const char *n = 
> > g_strdup_printf("pci-orirq[%d]", i);
> > +
> > +                object_initialize_child_with_props(OBJECT(pm), n,
> > +                                                   ori, sizeof(*ori),
> > +                                                   TYPE_OR_IRQ, 
> > &error_fatal,
> > +                                                   "num-lines", "2", NULL);
> > +                qdev_realize(DEVICE(ori), NULL, &error_fatal);
> > +                qemu_init_irq(&pm->pci_irqs[i], pegasos2_pci_irq, pm, i);
> > +                qdev_connect_gpio_out(DEVICE(ori), 0, &pm->pci_irqs[i]);
> > +            }
> > +            qdev_connect_gpio_out(pd, i, qdev_get_gpio_in(DEVICE(ori), h));
> > +        }
> > +    }
> > +
> >     if (machine->kernel_filename) {
> >         sz = load_elf(machine->kernel_filename, NULL, NULL, NULL,
> >                       &pm->kernel_entry, &pm->kernel_addr, NULL, NULL, 1,
> >




reply via email to

[Prev in Thread] Current Thread [Next in Thread]