Message ID | 20200528110444.20456-4-armbru@redhat.com |
---|---|
State | New |
Headers | show |
Series | Fixes around device realization | expand |
On 5/28/20 1:04 PM, Markus Armbruster wrote: > pxa2xx_mmci_init() creates a "pxa2xx-mmci" device, but neglects to > realize it. Affects machines akita, borzoi, connex, mainstone, spitz, > terrier, tosa, verdex, and z2. > > In theory, a device becomes real only on realize. In practice, the > transition from unreal to real is a fuzzy one. The work to make a > device real can be spread between realize methods (fine), > instance_init methods (wrong), and board code wiring up the device > (fine as long as it effectively happens on realize). Depending on > what exactly is done where, a device can work even when we neglect > to realize it. > > This one appears to work. Nevertheless, it's a clear misuse of the > interface. Even when it works today (more or less by chance), it can > break tomorrow. > > Fix by realizing it right away. Visible in "info qom-tree"; here's > the change for akita: > > /machine (akita-machine) > [...] > /unattached (container) > [...] > + /device[5] (pxa2xx-mmci) > + /pxa2xx-mmci[0] (qemu:memory-region) > + /sd-bus (pxa2xx-mmci-bus) > [rest of device[*] renumbered...] > > Fixes: 7a9468c92517e19037bfe2272f64f5dadaf9db15 > Cc: Andrzej Zaborowski <balrogg@gmail.com> > Cc: Peter Maydell <peter.maydell@linaro.org> > Cc: qemu-arm@nongnu.org > Signed-off-by: Markus Armbruster <armbru@redhat.com> > Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> > --- > hw/sd/pxa2xx_mmci.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/hw/sd/pxa2xx_mmci.c b/hw/sd/pxa2xx_mmci.c > index f9c50ddda5..c32df1b8f9 100644 > --- a/hw/sd/pxa2xx_mmci.c > +++ b/hw/sd/pxa2xx_mmci.c > @@ -492,6 +492,7 @@ PXA2xxMMCIState *pxa2xx_mmci_init(MemoryRegion *sysmem, > sysbus_connect_irq(sbd, 0, irq); > qdev_connect_gpio_out_named(dev, "rx-dma", 0, rx_dma); > qdev_connect_gpio_out_named(dev, "tx-dma", 0, tx_dma); > + qdev_init_nofail(dev); > > /* Create and plug in the sd card */ > carddev = qdev_create(qdev_get_child_bus(dev, "sd-bus"), TYPE_SD_CARD); >
diff --git a/hw/sd/pxa2xx_mmci.c b/hw/sd/pxa2xx_mmci.c index f9c50ddda5..c32df1b8f9 100644 --- a/hw/sd/pxa2xx_mmci.c +++ b/hw/sd/pxa2xx_mmci.c @@ -492,6 +492,7 @@ PXA2xxMMCIState *pxa2xx_mmci_init(MemoryRegion *sysmem, sysbus_connect_irq(sbd, 0, irq); qdev_connect_gpio_out_named(dev, "rx-dma", 0, rx_dma); qdev_connect_gpio_out_named(dev, "tx-dma", 0, tx_dma); + qdev_init_nofail(dev); /* Create and plug in the sd card */ carddev = qdev_create(qdev_get_child_bus(dev, "sd-bus"), TYPE_SD_CARD);