On Fri, 18 Oct 2019 at 16:07, Damien Hedde <damien.he...@greensocs.com> wrote: > > In qdev_set_parent_bus(), when changing the parent bus of a > realized device, if the source and destination buses are not in the > same reset state, some adaptation are required. This patch adds
"adaptations" > needed call to resettable_change_parent() to make sure a device reset > state stays coherent with its parent bus. > > The addition is a no-op if: > 1. the device being parented is not realized. > 2. the device is realized, but both buses are not under reset. > > Case 2 means that as long as qdev_set_parent_bus() is called > during the machine realization procedure (which is before the > machine reset so nothing is in reset), it is a no op. > > There are 49 call sites of qdev_set_parent_bus(). All but one fall > into the no-op case: > + 28 calls related to virtio (in hw/{s390x,display,virtio}/ > {vhost,virtio}-xxx.c) to set a _vdev_/_vgpu_ composing device > parent bus just before realizing the _vdev_/_vgpu_. > + hw/qdev.c: when creating a device in qdev_try_create() > + hw/sysbus.c: when initializing a device in the sysbus > + hw/display/virtio-gpu-pci.c: before realizing VirtIOGPUPCIBase/vgpu > + hw/display/virtio-vga.c: before realizing VirtIOVGABase/vgpu > + hw/i386/amd_iommu.c: before realizing AMDVIState/pci > + hw/misc/auxbus.c: when creating an AUXBus > + hw/misc/auxbus.c: when creating an AUXBus child > + hw/misc/macio/macio.c: when initializing a MACIOState child > + hw/misc/macio/macio.c: before realizing NewWorldMacIOState/pmu > + hw/misc/macio/macio.c: before realizing NewWorldMacIOState/cuda > + hw/pci-host/designware.c: before realizing DesignwarePCIEHost/root > + hw/pci-host/gpex.c: before realizing GPEXHost/root > + hw/pci-host/prep.c: when initializaing PREPPCIState/pci_dev > + hw/pci-host/q35.c: before realizing Q35PCIHost/mch > + hw/pci-host/versatile.c: when initializing PCIVPBState/pci_dev > + hw/pci-host/xilinx-pcie.c: before realizing XilinxPCIEHost/root > + hw/s390x/event-facility.c: when creating SCLPEventFacility/ > TYPE_SCLP_QUIESCE > + hw/s390x/event-facility.c: ditto with SCLPEventFacility/ > TYPE_SCLP_CPU_HOTPLUG > + hw/s390x/sclp.c: Not trivial because it is called on a SLCPDevice > just after realizing it. Ok because at this point the destination > bus (sysbus) is not in reset; the realize step is before the > machine reset. > + hw/sd/core.c: Not OK. Used in sdbus_reparent_card(). See below. > + hw/ssi/ssi.c: Used to put spi slave on spi bus and connect the cs > line in ssi_auto_connect_slave(). Ok because this function is only > used in realize step in hw/ssi/aspeed_smc.ci, hw/ssi/imx_spi.c, > hw/ssi/mss-spi.c, hw/ssi/xilinx_spi.c and hw/ssi/xilinx_spips.c. > + hw/xen/xen-legacy-backend.c: when creating a XenLegacyDevice device > + qdev-monitor.c: in device hotplug creation procedure before realize This is a really useful analysis to have in the commit message; thanks! (Side note: I wonder if the sclp.c case could be reordered so it realizes the device after parenting it? Anyway, not something to worry about now.) > Note that this commit alone will have no effect, right now there is no > use of resettable API to reset anything. So a bus will never be tagged > as in-reset by this same API. > > The one place where side-effect will occurs is in hw/sd/core.c in > sdbus_reparent_card(). This function is only used in the raspi machines, > including during the sysbus reset procedure. This case will be fixed by > a following commit before globally enabling resettable API for sysbus > reset. > > Signed-off-by: Damien Hedde <damien.he...@greensocs.com> Reviewed-by: Peter Maydell <peter.mayd...@linaro.org> thanks -- PMM