qemu-ppc
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]