The XIVE exploitation interrupt mode will be enabled for newer machines and disabled for older ones. Also provide a command line machine option to switch XIVE off on newer machines if needed.
Signed-off-by: Cédric Le Goater <c...@kaod.org> --- hw/intc/spapr_xive.c | 10 ++++++---- hw/ppc/spapr.c | 35 +++++++++++++++++++++++++++++++++++ include/hw/ppc/spapr.h | 1 + 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c index 38e1f569ea82..bf30edc87bee 100644 --- a/hw/intc/spapr_xive.c +++ b/hw/intc/spapr_xive.c @@ -756,8 +756,9 @@ static const VMStateDescription vmstate_spapr_xive_ive = { static bool vmstate_spapr_xive_needed(void *opaque) { - /* TODO check machine XIVE support */ - return true; + sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine()); + + return spapr->xive_exploitation; } static const VMStateDescription vmstate_spapr_xive = { @@ -885,8 +886,9 @@ static const VMStateDescription vmstate_spapr_xive_nvt_eq = { static bool vmstate_spapr_xive_nvt_needed(void *opaque) { - /* TODO check machine XIVE support */ - return true; + sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine()); + + return spapr->xive_exploitation; } static const VMStateDescription vmstate_spapr_xive_nvt = { diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 306875e12320..b5b9e7f1b3b6 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2820,6 +2820,29 @@ static void spapr_set_vsmt(Object *obj, Visitor *v, const char *name, visit_type_uint32(v, name, (uint32_t *)opaque, errp); } +static bool spapr_get_xive_exploitation(Object *obj, Error **errp) +{ + sPAPRMachineState *spapr = SPAPR_MACHINE(obj); + + return spapr->xive_exploitation; +} + +static void spapr_set_xive_exploitation(Object *obj, bool value, + Error **errp) +{ + sPAPRMachineState *spapr = SPAPR_MACHINE(obj); + + if (value) { + /* Don't let older machines activate XIVE */ + if (!spapr->xive_exploitation) { + error_setg(errp, "\"xive-exploitation\" option can not be " + "switched on"); + } + } else { + spapr->xive_exploitation = false; + } +} + static void spapr_machine_initfn(Object *obj) { sPAPRMachineState *spapr = SPAPR_MACHINE(obj); @@ -2855,6 +2878,15 @@ static void spapr_machine_initfn(Object *obj) object_property_set_description(obj, "vsmt", "Virtual SMT: KVM behaves as if this were" " the host's SMT mode", &error_abort); + + spapr->xive_exploitation = true; + object_property_add_bool(obj, "xive-exploitation", + spapr_get_xive_exploitation, + spapr_set_xive_exploitation, + NULL); + object_property_set_description(obj, "xive-exploitation", + "XIVE exploitation mode POWER9", + NULL); } static void spapr_machine_finalizefn(Object *obj) @@ -3890,7 +3922,10 @@ DEFINE_SPAPR_MACHINE(2_12, "2.12", true); static void spapr_machine_2_11_instance_options(MachineState *machine) { + sPAPRMachineState *spapr = SPAPR_MACHINE(machine); + spapr_machine_2_12_instance_options(machine); + spapr->xive_exploitation = false; } static void spapr_machine_2_11_class_options(MachineClass *mc) diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 14757b805e84..1d6d2c690d7f 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -127,6 +127,7 @@ struct sPAPRMachineState { MemoryHotplugState hotplug_memory; const char *icp_type; + bool xive_exploitation; }; #define H_SUCCESS 0 -- 2.13.6