[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v5 00/16] spapr: add support for pci hotplug
From: |
Michael Roth |
Subject: |
[Qemu-devel] [PATCH v5 00/16] spapr: add support for pci hotplug |
Date: |
Mon, 16 Feb 2015 08:10:42 -0600 |
These patches are based on ppc-next, and can also be obtained from:
https://github.com/mdroth/qemu/commits/spapr-hotplug-pci-v5
v5:
* short version:
- addressed, to my knowledge, all outstanding review comments
from v4
- fixed a number of issues which were made apparent when doing
rapid device plug/unplug
- allow for a device to be configured/unconfigured/configured
reliably without ever being unplugged in between
- implemented queueing of RTAS events, and suppression of subsequent
unplug events when 1 is already in-flight for a device/DRC.
- simplified spapr_drc_populate_dt() and 'reg'/'assigned-addresses'
population code to clearer.
- fixed OF device node properties in accordance with PCI-OF
binding spec
- better error-checking/reporting in hotplug path
* rebased/retested on ppc-next (2015-02-16)
* added support for multiple queued/in-flight EPOW/HP RTAS events
* grammar/typo fixes for documentation (David)
* fixed bug in drc->set_allocation_state() actually sets allocation
state rather than indicator state (David)
* ensured all macro expressions were wrapped in parenthesis (David)
* dropped drc->get_id() in favor of direct access to drc->id (David)
* renamed prop_name to name to avoid naming inconsistencies in
drc->configure_connector() (David)
* added an assert to ensure QEMU-side users of configure_connector_common()
never reach an error condition (David)
* rtas-event-scan stub replaced with a functional implementation
* ensured unsupported sensor types always result in RTAS_OUT_NOT_SUPPORTED
as opposed to RTAS_OUT_PARAM_ERROR (David)
* ensured all rtas arg/return counts are validated prior to access (David)
* validate power domain is live-insertion/-1 in
rtas-{get,set}-power-level (David)
* simplified rtas_set_indicator() logic (David)
* moved RTAS_SENSOR_TYPE_* macros to spapr.h (David)
* modified drc->dr_entity_sense() to report UNUSABLE if the device
is logical/non-PCI and the allocation state is UNUSABLE (Bharata)
* refactored spapr_drc_populate_dt() to avoid having a separate loop to
gather DRC fields into a temporary data structure prior to generating
OF array properties (David)
* added an Object *owner fields to spapr_drc_populate_dt() to allow limiting
of OF DRC/slot descriptions to specific PHBs (David)
* ensure true/false are used in place of 1/0 (David)
* make naming of hotplug/unplug hooks clearer (David)
* re-worked 'reg'/'assigned-address' OF property population to
avoid potential buffer-overrun and make it easier to understand
the purpose of individual fields. also added documentation to
further clarify logic (David)
* fixed boolean OF device properties to be
present-but-empty/not-present rather than storing corresponding device
register bits (David)
* fixed subsystem-id/subsystem-vendor-id OF properties to only be present when
non-zero
* use actual bus num in place of phb index for 'reg'/'assigned-address' fields
and DRC indexes
v4:
* added documentation for sPAPR-based hotplug (Alexey)
* reworked DR Connectors to be QOM devices, where sensor/indicator
states are accessed via RTAS via object methods and also exposed
via composition tree for introspection via qom-get/qom-fuse.
attached devices are managed via state transitions handled by
the DRC device (Alex)
* DRC-related constants now defined in seperate header file,
implemented as enum types where applicable
* removed stub implementations of sensors that were not relevant
to dynamic-reconfiguration. we now return "not implemented"
if a guest attempts to access them via rtas-get-sensor or
rtas-set-indicator-state
* added DRC reset hooks to complete unplug for devices awaiting
additional action from the guest before removal
* incorporated endian fixes from Bharata and tested on ppc64le
(Alex/Bharata)
* used rtas_{ld,st} helpers in place of cpu_physical_memory_map
for configure-connector implementation (Alex)
* used b_* helper macros for properties related to OF PCI Binding
(Alexey)
* added dynamic-reconfiguration option to spapr-pci-host-bridge to
enable/disable PCI hotplug for child bus
* added pseries-2.3 machine and compat code to disable PCI hotplug by
default for older machine types (Alex)
* removed OF properties and DRC instances related to hotplugging of
PHBs. this is not a prereq for PCI hotplug and will be handled as
a separate series
* moved generation of boot-time devices properties to common helper
that can be re-used for memory, cpu, and phb. (Bharata)
* re-organized patches so that pci, memory, cpu, phb should base
cleanly on common set of patches implementing core DRC functionality
(Bharata)
* moved PCI 0-address fix to separate series (Alex)
v3:
* dropped emulation of firmware-managed BAR allocation. this will be
introduced via a follow-up series via a -machine flag and tied to
a separate hotplug event to avoid a race condition with guest vs.
"firmware"-managed BAR allocation, in conjunction with required
fixes to rpaphp hotplug kernel module to utilize this mode.
* moved drc_table into sPAPREnvironment (Alexey)
* moved INDICATOR_* constants and friends into spapr_pci.c (Alexey)
* use prefixes for global types (DrcEntry/ConfigureConnectorState) (Alexey)
* updated for new hotplug interface (Alexey)
* fixed get-power-level to report current power-level rather than
desired (Alexey)
* rebased to latest ppc-next
v2:
* re-ordered patches to fix build bisectability (Alexey)
* replaced g_warning with DPRINTF in RTAS calls for guest errors (Alexey)
* replaced g_warning with fprintf for qemu errors (Alexey)
* updated RTAS calls to use pre-existing error/success macros (Alexey)
* replaced DR_*/SENSOR_* macros with INDICATOR_* for set-indicator/
get-sensor-state (Alexey)
OVERVIEW
These patches add support for PCI hotplug for SPAPR guests. We advertise
each PHB as DR-capable (as defined by PAPR 13.5/13.6) with 32 hotpluggable
PCI slots per PHB, which models a standard PCI expansion device for Power
machines where the DRC name/loc-code/index for each slot are generated
based on bus/slot number.
This is compatible with existing guest kernel's via the rpaphp hotplug
module, and existing userspace tools such as drmgr/librtas/rtas_errd for
managing devices.
NOTES / ADDITIONAL DEPENDENCIES
This series relies on v1.2.19 or later of powerppc-utils (drmgr, rtas_errd,
ppc64-diag, and librtas components, specificially), which will automate
guest-side hotplug setup in response to an EPOW event emitted by QEMU. For
guests with older versions of powerpc-utils, a manual workaround must be
used (documented below).
Note that this relies on a patch to core PCI code which allows for the
use of a 0-address IO BAR for PCI devices. Without this patch, the first
hotplugged device will likely fail. This patch will be handled separately,
but is included in the in the development tree below for testing:
https://github.com/mdroth/qemu/commits/spapr-hotplug-pci
PATCH LAYOUT
Patches
1 Documentation for sPAPR Dynamic-Reconfiguration/hotplug
2 Initial implementation for sPAPRDRConnector device
3-7 Guest RTAS calls to interact with DRC devices
8-9 Introduce RTAS events for signalling hotplug operations
to guest, using existing infrastructure of
EPOW/check-exception events
10 DRC helper code to populate DT descriptions of present DRC
devices
11 spapr-host-bridge option to selectively enable PCI hotplug/DR
on a PHB-by-PHB basis
12-16 PCI-specific hotplug hooks and DRC creation to enable PCI
hotplug and hotplug events
USAGE
For guests with powerpc-utils 1.2.19+:
hotplug:
qemu:
device_add e1000,id=slot0
unplug:
qemu:
device_del slot0
For guests with powerpc-utils prior to 1.2.19:
hotplug:
qemu:
device_add e1000,id=slot0
guest:
drmgr -c pci -s "C0" -n -a
echo 1 >/sys/bus/pci/rescan
unplug:
guest:
drmgr -c pci -s "C0" -n -r
echo 1 >/sys/bus/pci/devices/0000:00:00.0/remove
qemu:
device_del slot0
docs/specs/ppc-spapr-hotplug.txt | 287
+++++++++++++++++++++++++++++++++++++++++++++++++++
hw/pci/pci.c | 2 +-
hw/ppc/Makefile.objs | 2 +-
hw/ppc/spapr.c | 8 +-
hw/ppc/spapr_drc.c | 736
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
hw/ppc/spapr_events.c | 328
+++++++++++++++++++++++++++++++++++++++++++++++++---------
hw/ppc/spapr_pci.c | 414
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
hw/ppc/spapr_rtas.c | 262
++++++++++++++++++++++++++++++++++++++++++++++
include/hw/pci-host/spapr.h | 1 +
include/hw/pci/pci.h | 1 +
include/hw/ppc/spapr.h | 28 ++++-
include/hw/ppc/spapr_drc.h | 207 +++++++++++++++++++++++++++++++++++++
12 files changed, 2200 insertions(+), 76 deletions(-)
- [Qemu-devel] [PATCH v5 00/16] spapr: add support for pci hotplug,
Michael Roth <=
- [Qemu-devel] [PATCH v5 09/16] spapr_events: event-scan RTAS interface, Michael Roth, 2015/02/16
- [Qemu-devel] [PATCH v5 10/16] spapr_drc: add spapr_drc_populate_dt(), Michael Roth, 2015/02/16
- [Qemu-devel] [PATCH v5 13/16] spapr_pci: populate DRC dt entries for PHBs, Michael Roth, 2015/02/16
- [Qemu-devel] [PATCH v5 11/16] spapr_pci: add dynamic-reconfiguration option for spapr-pci-host-bridge, Michael Roth, 2015/02/16
- [Qemu-devel] [PATCH v5 12/16] spapr_pci: create DRConnectors for each PCI slot during PHB realize, Michael Roth, 2015/02/16
- [Qemu-devel] [PATCH v5 16/16] spapr_pci: emit hotplug add/remove events during hotplug, Michael Roth, 2015/02/16
- [Qemu-devel] [PATCH v5 14/16] pci: make pci_bar useable outside pci.c, Michael Roth, 2015/02/16
- [Qemu-devel] [PATCH v5 03/16] spapr_rtas: add get/set-power-level RTAS interfaces, Michael Roth, 2015/02/16
- [Qemu-devel] [PATCH v5 15/16] spapr_pci: enable basic hotplug operations, Michael Roth, 2015/02/16
- [Qemu-devel] [PATCH v5 04/16] spapr_rtas: add set-indicator RTAS interface, Michael Roth, 2015/02/16