|
|
9bac43 |
From 384d7ebbde836477e00c19dbe5f68ece3e0fad1e Mon Sep 17 00:00:00 2001
|
|
|
9bac43 |
From: Laurent Vivier <lvivier@redhat.com>
|
|
|
9bac43 |
Date: Mon, 22 Jan 2018 16:48:48 +0100
|
|
|
9bac43 |
Subject: [PATCH 21/21] spapr: fix device tree properties when using
|
|
|
9bac43 |
compatibility mode
|
|
|
9bac43 |
|
|
|
9bac43 |
RH-Author: Laurent Vivier <lvivier@redhat.com>
|
|
|
9bac43 |
Message-id: <20180122164848.20486-1-lvivier@redhat.com>
|
|
|
9bac43 |
Patchwork-id: 78694
|
|
|
9bac43 |
O-Subject: [RHV7.5 qemu-kvm-rhev PATCH v2] spapr: fix device tree properties when using compatibility mode
|
|
|
9bac43 |
Bugzilla: 1535752
|
|
|
9bac43 |
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
|
|
9bac43 |
RH-Acked-by: David Gibson <dgibson@redhat.com>
|
|
|
9bac43 |
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
9bac43 |
|
|
|
9bac43 |
From: Greg Kurz <groug@kaod.org>
|
|
|
9bac43 |
|
|
|
9bac43 |
Commit 51f84465dd98 changed the compatility mode setting logic:
|
|
|
9bac43 |
- machine reset only sets compatibility mode for the boot CPU
|
|
|
9bac43 |
- compatibility mode is set for other CPUs when they are put online
|
|
|
9bac43 |
by the guest with the "start-cpu" RTAS call
|
|
|
9bac43 |
|
|
|
9bac43 |
This causes a regression for machines started with max-compat-cpu:
|
|
|
9bac43 |
the device tree nodes related to secondary CPU cores contain wrong
|
|
|
9bac43 |
"cpu-version" and "ibm,pa-features" values, as shown below.
|
|
|
9bac43 |
|
|
|
9bac43 |
Guest started on a POWER8 host with:
|
|
|
9bac43 |
-smp cores=2 -machine pseries,max-cpu-compat=compat7
|
|
|
9bac43 |
|
|
|
9bac43 |
ibm,pa-features = [18 00 f6 3f c7 c0 80 f0 80 00
|
|
|
9bac43 |
00 00 00 00 00 00 00 00 80 00 80 00 80 00 00 00];
|
|
|
9bac43 |
cpu-version = <0x4d0200>;
|
|
|
9bac43 |
|
|
|
9bac43 |
^^^
|
|
|
9bac43 |
second CPU core
|
|
|
9bac43 |
|
|
|
9bac43 |
ibm,pa-features = <0x600f63f 0xc70080c0>;
|
|
|
9bac43 |
cpu-version = <0xf000003>;
|
|
|
9bac43 |
|
|
|
9bac43 |
^^^
|
|
|
9bac43 |
boot CPU core
|
|
|
9bac43 |
|
|
|
9bac43 |
The second core is advertised in raw POWER8 mode. This happens because
|
|
|
9bac43 |
CAS assumes all CPUs to have the same compatibility mode. Since the
|
|
|
9bac43 |
boot CPU already has the requested compatibility mode, the CAS code
|
|
|
9bac43 |
does not set it for the secondary one, and exposes the bogus device
|
|
|
9bac43 |
tree properties in in the CAS response to the guest.
|
|
|
9bac43 |
|
|
|
9bac43 |
A similar situation is observed when hot-plugging a CPU core. The
|
|
|
9bac43 |
related device tree properties are generated and exposed to guest
|
|
|
9bac43 |
with the "ibm,configure-connector" RTAS before "start-cpu" is called.
|
|
|
9bac43 |
The CPU core is advertised to the guest in raw mode as well.
|
|
|
9bac43 |
|
|
|
9bac43 |
It both cases, it boils down to the fact that "start-cpu" happens too
|
|
|
9bac43 |
late. This can be fixed globally by propagating the compatibility mode
|
|
|
9bac43 |
of the boot CPU to the other CPUs during reset. For this to work, the
|
|
|
9bac43 |
compatibility mode of the boot CPU must be set before the machine code
|
|
|
9bac43 |
actually resets all CPUs.
|
|
|
9bac43 |
|
|
|
9bac43 |
It is not needed to set the compatibility mode in "start-cpu" anymore,
|
|
|
9bac43 |
so the code is dropped.
|
|
|
9bac43 |
|
|
|
9bac43 |
Fixes: 51f84465dd98
|
|
|
9bac43 |
Signed-off-by: Greg Kurz <groug@kaod.org>
|
|
|
9bac43 |
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
|
|
9bac43 |
(cherry picked from commit 9012a53f067a78022947e18050b145c34a3dc599)
|
|
|
9bac43 |
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
|
|
|
9bac43 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
9bac43 |
|
|
|
9bac43 |
Conflicts:
|
|
|
9bac43 |
hw/ppc/spapr_rtas.c
|
|
|
9bac43 |
because of missing commit:
|
|
|
9bac43 |
9a94ee5bb1 "spapr/rtas: disable the decrementer interrupt when a "
|
|
|
9bac43 |
CPU is unplugged"
|
|
|
9bac43 |
---
|
|
|
9bac43 |
hw/ppc/spapr.c | 18 +++++++++---------
|
|
|
9bac43 |
hw/ppc/spapr_cpu_core.c | 7 +++++++
|
|
|
9bac43 |
hw/ppc/spapr_rtas.c | 9 ---------
|
|
|
9bac43 |
3 files changed, 16 insertions(+), 18 deletions(-)
|
|
|
9bac43 |
|
|
|
9bac43 |
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
|
|
|
9bac43 |
index 2bb3b61..4f1ab14 100644
|
|
|
9bac43 |
--- a/hw/ppc/spapr.c
|
|
|
9bac43 |
+++ b/hw/ppc/spapr.c
|
|
|
9bac43 |
@@ -1442,6 +1442,15 @@ static void ppc_spapr_reset(void)
|
|
|
9bac43 |
spapr_setup_hpt_and_vrma(spapr);
|
|
|
9bac43 |
}
|
|
|
9bac43 |
|
|
|
9bac43 |
+ /* if this reset wasn't generated by CAS, we should reset our
|
|
|
9bac43 |
+ * negotiated options and start from scratch */
|
|
|
9bac43 |
+ if (!spapr->cas_reboot) {
|
|
|
9bac43 |
+ spapr_ovec_cleanup(spapr->ov5_cas);
|
|
|
9bac43 |
+ spapr->ov5_cas = spapr_ovec_new();
|
|
|
9bac43 |
+
|
|
|
9bac43 |
+ ppc_set_compat(first_ppc_cpu, spapr->max_compat_pvr, &error_fatal);
|
|
|
9bac43 |
+ }
|
|
|
9bac43 |
+
|
|
|
9bac43 |
qemu_devices_reset();
|
|
|
9bac43 |
|
|
|
9bac43 |
/* DRC reset may cause a device to be unplugged. This will cause troubles
|
|
|
9bac43 |
@@ -1462,15 +1471,6 @@ static void ppc_spapr_reset(void)
|
|
|
9bac43 |
rtas_addr = rtas_limit - RTAS_MAX_SIZE;
|
|
|
9bac43 |
fdt_addr = rtas_addr - FDT_MAX_SIZE;
|
|
|
9bac43 |
|
|
|
9bac43 |
- /* if this reset wasn't generated by CAS, we should reset our
|
|
|
9bac43 |
- * negotiated options and start from scratch */
|
|
|
9bac43 |
- if (!spapr->cas_reboot) {
|
|
|
9bac43 |
- spapr_ovec_cleanup(spapr->ov5_cas);
|
|
|
9bac43 |
- spapr->ov5_cas = spapr_ovec_new();
|
|
|
9bac43 |
-
|
|
|
9bac43 |
- ppc_set_compat(first_ppc_cpu, spapr->max_compat_pvr, &error_fatal);
|
|
|
9bac43 |
- }
|
|
|
9bac43 |
-
|
|
|
9bac43 |
fdt = spapr_build_fdt(spapr, rtas_addr, spapr->rtas_size);
|
|
|
9bac43 |
|
|
|
9bac43 |
spapr_load_rtas(spapr, fdt, rtas_addr);
|
|
|
9bac43 |
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
|
|
|
9bac43 |
index 30c15d5..fbabe49 100644
|
|
|
9bac43 |
--- a/hw/ppc/spapr_cpu_core.c
|
|
|
9bac43 |
+++ b/hw/ppc/spapr_cpu_core.c
|
|
|
9bac43 |
@@ -101,6 +101,13 @@ static void spapr_cpu_reset(void *opaque)
|
|
|
9bac43 |
exit(1);
|
|
|
9bac43 |
}
|
|
|
9bac43 |
}
|
|
|
9bac43 |
+
|
|
|
9bac43 |
+ /* Set compatibility mode to match the boot CPU, which was either set
|
|
|
9bac43 |
+ * by the machine reset code or by CAS. This should never fail.
|
|
|
9bac43 |
+ */
|
|
|
9bac43 |
+ if (cs != first_cpu) {
|
|
|
9bac43 |
+ ppc_set_compat(cpu, POWERPC_CPU(first_cpu)->compat_pvr, &error_abort);
|
|
|
9bac43 |
+ }
|
|
|
9bac43 |
}
|
|
|
9bac43 |
|
|
|
9bac43 |
static void spapr_cpu_destroy(PowerPCCPU *cpu)
|
|
|
9bac43 |
diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
|
|
|
9bac43 |
index 93f09a0..94a2799 100644
|
|
|
9bac43 |
--- a/hw/ppc/spapr_rtas.c
|
|
|
9bac43 |
+++ b/hw/ppc/spapr_rtas.c
|
|
|
9bac43 |
@@ -162,7 +162,6 @@ static void rtas_start_cpu(PowerPCCPU *cpu_, sPAPRMachineState *spapr,
|
|
|
9bac43 |
if (cpu != NULL) {
|
|
|
9bac43 |
CPUState *cs = CPU(cpu);
|
|
|
9bac43 |
CPUPPCState *env = &cpu->env;
|
|
|
9bac43 |
- Error *local_err = NULL;
|
|
|
9bac43 |
|
|
|
9bac43 |
if (!cs->halted) {
|
|
|
9bac43 |
rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
|
|
|
9bac43 |
@@ -174,14 +173,6 @@ static void rtas_start_cpu(PowerPCCPU *cpu_, sPAPRMachineState *spapr,
|
|
|
9bac43 |
* new cpu enters */
|
|
|
9bac43 |
kvm_cpu_synchronize_state(cs);
|
|
|
9bac43 |
|
|
|
9bac43 |
- /* Set compatibility mode to match existing cpus */
|
|
|
9bac43 |
- ppc_set_compat(cpu, POWERPC_CPU(first_cpu)->compat_pvr, &local_err);
|
|
|
9bac43 |
- if (local_err) {
|
|
|
9bac43 |
- error_report_err(local_err);
|
|
|
9bac43 |
- rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
|
|
|
9bac43 |
- return;
|
|
|
9bac43 |
- }
|
|
|
9bac43 |
-
|
|
|
9bac43 |
env->msr = (1ULL << MSR_SF) | (1ULL << MSR_ME);
|
|
|
9bac43 |
env->nip = start;
|
|
|
9bac43 |
env->gpr[3] = r3;
|
|
|
9bac43 |
--
|
|
|
9bac43 |
1.8.3.1
|
|
|
9bac43 |
|