[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [RFC PATCH 3/3] spapr: generate a CAS reset for the XIVE expl
From: |
Cédric Le Goater |
Subject: |
[Qemu-ppc] [RFC PATCH 3/3] spapr: generate a CAS reset for the XIVE exploitation mode |
Date: |
Fri, 8 Sep 2017 16:33:44 +0200 |
When the platform and the guest agree on using the XIVE exploitation
mode for interrupts, the "interrupt-controller" node needs to reflect
the change and the device tree needs an update.
Reseting the guest after the CAS negotiation makes this change
possible, as the device tree is built at reset time. We use the
'ov5_cas' field to check which interrupt model was negotiated before
reset and populate the tree accordingly.
Signed-off-by: Cédric Le Goater <address@hidden>
---
hw/ppc/spapr.c | 6 +++++-
hw/ppc/spapr_hcall.c | 6 ++++++
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 3e3ff1fbc988..be467ab61ad0 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1073,7 +1073,11 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr,
_FDT(fdt_setprop_cell(fdt, 0, "#size-cells", 2));
/* /interrupt controller */
- spapr_dt_xics(xics_max_server_number(), fdt, PHANDLE_XICP);
+ if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) {
+ spapr_dt_xics(xics_max_server_number(), fdt, PHANDLE_XICP);
+ } else {
+ /* populate device tree for XIVE */ ;
+ }
ret = spapr_populate_memory(spapr, fdt);
if (ret < 0) {
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index 92f1e21358b8..ba00b8d3fdd6 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -1613,6 +1613,12 @@ static target_ulong
h_client_architecture_support(PowerPCCPU *cpu,
(spapr_h_cas_compose_response(spapr, args[1], args[2],
ov5_updates) != 0);
}
+
+ /* We need to rebuild the device tree for XIVE, generate a reset */
+ if (!spapr->cas_reboot) {
+ spapr->cas_reboot = spapr_ovec_test(ov5_updates, OV5_XIVE_EXPLOIT);
+ }
+
spapr_ovec_cleanup(ov5_updates);
if (spapr->cas_reboot) {
--
2.13.5