[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH v2 00/12] Multi-phase reset
From: |
Damien Hedde |
Subject: |
[Qemu-devel] [RFC PATCH v2 00/12] Multi-phase reset |
Date: |
Tue, 4 Jun 2019 18:25:14 +0200 |
Hi all,
Here's the second version of the multi-phase reset proposal patches.
# DESCRIPTION
Basically the reset procedure is split in 3 parts:
INIT PHASE: Reset the object internal state, put a resetting flag and do the
same for the reset subtree. No side effect on other devices to guarantee
that, in a reset domain, everything get initialized first. This corresponds
mostly to what is currently done in the device/bus reset method.
HOLD PHASE: This phase allows to control a reset with a IO. When a IO control
reset procedure based on the IO level (not edge), we may need to assert
the reset, wait some time, and finally de-assert the reset. The consequence
is that such a device can stay in a "resetting state" and may need to show
this state to other devices through its outputs. For example, a clock
controller will typically shutdown its clocks when it is in resetting state.
EXIT PHASE: This phase sets outputs to state after reset. For a clock controller
it starts the clocks. It also clears the "resetting" flag. A device should
not react to inputs until this flag has been cleared. During this phase,
outputs are propagated.
The Resettable interface is detailed in the added doc in patch 7.
# CHANGE SINCE V1
The series now focus only on the Resettable interface (no more ResetDomain).
Proposed changed have been applied:
- reset_count getter/modifier methods
- a foreach_child method
This last method allows some flexibility on what is the hierarchy of reset.
There is some discussion ongoing about this point. Althought the series does
not aim to modify the qdev/qbus-centric reset behavior, it is not fixed. An
object specialization can override it.
# RESET DEPRECATION
There is 3 changes in the current way of handling reset (for users or
developers of Devices)
1. qdev/qbus_reset_all
Theses functions are deprecated by this series and should be replaced by
direct call to device_reset or bus_reset. There is only a few existing calls
so I can probably replace them all and delete the original functions.
2. old's device_reset
There is a few call to this function, I renamed it *device_legacy_reset* to
handle the transition. This function allowed to reset only a given device
(and not its eventual qbus subtree). This behavior is not possible with
the Resettable interface. At first glance it seemed that it is used only on
device having no sub-buses so we could just use the new device_reset.
But I need to look at them more closely to be sure. If this behavior is really
needed (but why would we not reset children ?), it's possible to do a specific
function for Device to to 3-phases reset without the children.
3. DeviceClass's reset and BusClass's methods
This is the major change. The method is deprecated because reset methods are
now located in the interface class. In the series, I make the init phase
redirect to the original reset method of DeviceClass (or BusClass). There a
lot of use of the method and transitioning to 3-phases only reset will need
some work.
# MIGRATION
Bus reset state migration is right now not handled.
Regarding "migration-during-reset should Just Work, without necessarily
needing any specific changes for a device". The included patch define a vmsd
subsection which must to be added to every device main vmsd structure for
migration-during-reset of theses devices to work. I tried to find a way to
avoid that but really don't see how to achieve that.
So in the current state of this series, migration can only be supported for
leaf device (in term of qdev/qbus) where we add the subsection.
I'm not sure the migration is the problem here. I doubt a device will
support staying in reset state (which is a new feature) without manual
intervention. So migration of this unsupported state without any specific
change may not be a real asset.
The series is organised as follow:
- Patch 1 adds Resettable interface
- Patches 2 and 3 rename device_reset function by device_legacy_reset to
prepare
the transition.
- Patches 4 to 6 make the changes in Device and Bus classes.
- Patches 7 add some doc
- Patches 8 to 12 modify the xilinx_zynq to add 3-phases reset support in the
uart and the slcr (the reset controller).
Thank you for your feedback,
Damien
Damien Hedde (12):
Create Resettable QOM interface
add device_legacy_reset function to do the transition with
device_reset
replace all occurences of device_reset by device_legacy_reset
make Device and Bus Resettable
Add function to control reset with gpio inputs
add vmstate description for device reset state
add doc about Resettable interface
hw/misc/zynq_slcr: use standard register definition
convert cadence_uart to 3-phases reset
Convert zynq's slcr to 3-phases reset
Add uart reset support in zynq_slcr
Connect the uart reset gpios in the zynq platform
docs/devel/reset.txt | 151 +++++++++
hw/arm/xilinx_zynq.c | 14 +-
hw/audio/intel-hda.c | 2 +-
hw/char/cadence_uart.c | 81 ++++-
hw/core/Makefile.objs | 2 +
hw/core/bus.c | 60 ++++
hw/core/qdev-vmstate.c | 34 +++
hw/core/qdev.c | 124 +++++++-
hw/core/resettable.c | 121 ++++++++
hw/hyperv/hyperv.c | 2 +-
hw/i386/pc.c | 2 +-
hw/ide/microdrive.c | 8 +-
hw/intc/spapr_xive.c | 2 +-
hw/misc/zynq_slcr.c | 543 ++++++++++++++++++---------------
hw/ppc/pnv_psi.c | 2 +-
hw/ppc/spapr_pci.c | 2 +-
hw/ppc/spapr_vio.c | 2 +-
hw/s390x/s390-pci-inst.c | 2 +-
hw/scsi/vmw_pvscsi.c | 2 +-
hw/sd/omap_mmc.c | 2 +-
hw/sd/pl181.c | 2 +-
include/hw/char/cadence_uart.h | 10 +-
include/hw/qdev-core.h | 112 ++++++-
include/hw/resettable.h | 104 +++++++
tests/Makefile.include | 1 +
25 files changed, 1105 insertions(+), 282 deletions(-)
create mode 100644 docs/devel/reset.txt
create mode 100644 hw/core/qdev-vmstate.c
create mode 100644 hw/core/resettable.c
create mode 100644 include/hw/resettable.h
--
2.21.0
- [Qemu-devel] [RFC PATCH v2 00/12] Multi-phase reset,
Damien Hedde <=
- [Qemu-devel] [RFC PATCH v2 02/12] add device_legacy_reset function to do the transition with device_reset, Damien Hedde, 2019/06/04
- [Qemu-devel] [RFC PATCH v2 03/12] replace all occurences of device_reset by device_legacy_reset, Damien Hedde, 2019/06/04
- [Qemu-devel] [RFC PATCH v2 06/12] add vmstate description for device reset state, Damien Hedde, 2019/06/04
- [Qemu-devel] [RFC PATCH v2 10/12] Convert zynq's slcr to 3-phases reset, Damien Hedde, 2019/06/04
- [Qemu-devel] [RFC PATCH v2 01/12] Create Resettable QOM interface, Damien Hedde, 2019/06/04
- [Qemu-devel] [RFC PATCH v2 04/12] make Device and Bus Resettable, Damien Hedde, 2019/06/04
- [Qemu-devel] [RFC PATCH v2 08/12] hw/misc/zynq_slcr: use standard register definition, Damien Hedde, 2019/06/04
- [Qemu-devel] [RFC PATCH v2 05/12] Add function to control reset with gpio inputs, Damien Hedde, 2019/06/04
- [Qemu-devel] [RFC PATCH v2 09/12] convert cadence_uart to 3-phases reset, Damien Hedde, 2019/06/04
- [Qemu-devel] [RFC PATCH v2 07/12] add doc about Resettable interface, Damien Hedde, 2019/06/04