|
|
76daa3 |
From cae70bb94adb235e8143c9deea7bd28e90bc5b1c Mon Sep 17 00:00:00 2001
|
|
|
76daa3 |
From: David Gibson <dgibson@redhat.com>
|
|
|
76daa3 |
Date: Thu, 27 Apr 2017 02:15:52 +0200
|
|
|
76daa3 |
Subject: [PATCH 17/23] spapr: Add ibm, processor-radix-AP-encodings to the
|
|
|
76daa3 |
device tree
|
|
|
76daa3 |
|
|
|
76daa3 |
RH-Author: David Gibson <dgibson@redhat.com>
|
|
|
76daa3 |
Message-id: <20170427021558.4884-2-dgibson@redhat.com>
|
|
|
76daa3 |
Patchwork-id: 74915
|
|
|
76daa3 |
O-Subject: [Pegas-1.0 qemu-kvm-rhev PATCH 1/7] spapr: Add ibm, processor-radix-AP-encodings to the device tree
|
|
|
76daa3 |
Bugzilla: 1368786
|
|
|
76daa3 |
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
From: Sam Bobroff <sam.bobroff@au1.ibm.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
Use the new ioctl, KVM_PPC_GET_RMMU_INFO, to fetch radix MMU
|
|
|
76daa3 |
information from KVM and present the page encodings in the device tree
|
|
|
76daa3 |
under ibm,processor-radix-AP-encodings. This provides page size
|
|
|
76daa3 |
information to the guest which is necessary for it to use radix mode.
|
|
|
76daa3 |
|
|
|
76daa3 |
Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
|
|
|
76daa3 |
[dwg: Compile fix for 32-bit targets, style nit fix]
|
|
|
76daa3 |
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
|
|
76daa3 |
|
|
|
76daa3 |
(cherry picked from commit c64abd1f9c732f58181d0a46a0da72168759e77b)
|
|
|
76daa3 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
Conflicts:
|
|
|
76daa3 |
target/ppc/kvm.c
|
|
|
76daa3 |
|
|
|
76daa3 |
Simple contextual conflicts.
|
|
|
76daa3 |
|
|
|
76daa3 |
Siged-off-by: David Gibson <dgibson@redhat.com>
|
|
|
76daa3 |
---
|
|
|
76daa3 |
hw/ppc/spapr.c | 13 +++++++++++++
|
|
|
76daa3 |
include/sysemu/kvm.h | 1 +
|
|
|
76daa3 |
target/ppc/cpu-qom.h | 1 +
|
|
|
76daa3 |
target/ppc/cpu.h | 4 ++++
|
|
|
76daa3 |
target/ppc/kvm.c | 29 +++++++++++++++++++++++++++++
|
|
|
76daa3 |
5 files changed, 48 insertions(+)
|
|
|
76daa3 |
|
|
|
76daa3 |
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
|
|
|
76daa3 |
index 51766af..6995c7a 100644
|
|
|
76daa3 |
--- a/hw/ppc/spapr.c
|
|
|
76daa3 |
+++ b/hw/ppc/spapr.c
|
|
|
76daa3 |
@@ -459,6 +459,8 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
|
|
|
76daa3 |
sPAPRDRConnector *drc;
|
|
|
76daa3 |
sPAPRDRConnectorClass *drck;
|
|
|
76daa3 |
int drc_index;
|
|
|
76daa3 |
+ uint32_t radix_AP_encodings[PPC_PAGE_SIZES_MAX_SZ];
|
|
|
76daa3 |
+ int i;
|
|
|
76daa3 |
|
|
|
76daa3 |
drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, index);
|
|
|
76daa3 |
if (drc) {
|
|
|
76daa3 |
@@ -544,6 +546,17 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
|
|
|
76daa3 |
_FDT(spapr_fixup_cpu_numa_dt(fdt, offset, cs));
|
|
|
76daa3 |
|
|
|
76daa3 |
_FDT(spapr_fixup_cpu_smt_dt(fdt, offset, cpu, compat_smt));
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ if (pcc->radix_page_info) {
|
|
|
76daa3 |
+ for (i = 0; i < pcc->radix_page_info->count; i++) {
|
|
|
76daa3 |
+ radix_AP_encodings[i] =
|
|
|
76daa3 |
+ cpu_to_be32(pcc->radix_page_info->entries[i]);
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+ _FDT((fdt_setprop(fdt, offset, "ibm,processor-radix-AP-encodings",
|
|
|
76daa3 |
+ radix_AP_encodings,
|
|
|
76daa3 |
+ pcc->radix_page_info->count *
|
|
|
76daa3 |
+ sizeof(radix_AP_encodings[0]))));
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState *spapr)
|
|
|
76daa3 |
diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
|
|
|
76daa3 |
index 24281fc..5cc83f2 100644
|
|
|
76daa3 |
--- a/include/sysemu/kvm.h
|
|
|
76daa3 |
+++ b/include/sysemu/kvm.h
|
|
|
76daa3 |
@@ -527,5 +527,6 @@ int kvm_set_one_reg(CPUState *cs, uint64_t id, void *source);
|
|
|
76daa3 |
* Returns: 0 on success, or a negative errno on failure.
|
|
|
76daa3 |
*/
|
|
|
76daa3 |
int kvm_get_one_reg(CPUState *cs, uint64_t id, void *target);
|
|
|
76daa3 |
+struct ppc_radix_page_info *kvm_get_radix_page_info(void);
|
|
|
76daa3 |
int kvm_get_max_memslots(void);
|
|
|
76daa3 |
#endif
|
|
|
76daa3 |
diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h
|
|
|
76daa3 |
index 81500e5..d0cf6ca 100644
|
|
|
76daa3 |
--- a/target/ppc/cpu-qom.h
|
|
|
76daa3 |
+++ b/target/ppc/cpu-qom.h
|
|
|
76daa3 |
@@ -197,6 +197,7 @@ typedef struct PowerPCCPUClass {
|
|
|
76daa3 |
int bfd_mach;
|
|
|
76daa3 |
uint32_t l1_dcache_size, l1_icache_size;
|
|
|
76daa3 |
const struct ppc_segment_page_sizes *sps;
|
|
|
76daa3 |
+ struct ppc_radix_page_info *radix_page_info;
|
|
|
76daa3 |
void (*init_proc)(CPUPPCState *env);
|
|
|
76daa3 |
int (*check_pow)(CPUPPCState *env);
|
|
|
76daa3 |
int (*handle_mmu_fault)(PowerPCCPU *cpu, vaddr eaddr, int rwx, int mmu_idx);
|
|
|
76daa3 |
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
|
|
|
76daa3 |
index 5ee33b3..cacdd0a 100644
|
|
|
76daa3 |
--- a/target/ppc/cpu.h
|
|
|
76daa3 |
+++ b/target/ppc/cpu.h
|
|
|
76daa3 |
@@ -943,6 +943,10 @@ struct ppc_segment_page_sizes {
|
|
|
76daa3 |
struct ppc_one_seg_page_size sps[PPC_PAGE_SIZES_MAX_SZ];
|
|
|
76daa3 |
};
|
|
|
76daa3 |
|
|
|
76daa3 |
+struct ppc_radix_page_info {
|
|
|
76daa3 |
+ uint32_t count;
|
|
|
76daa3 |
+ uint32_t entries[PPC_PAGE_SIZES_MAX_SZ];
|
|
|
76daa3 |
+};
|
|
|
76daa3 |
|
|
|
76daa3 |
/*****************************************************************************/
|
|
|
76daa3 |
/* The whole PowerPC CPU context */
|
|
|
76daa3 |
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
|
|
|
76daa3 |
index 031d31f..9c355ce 100644
|
|
|
76daa3 |
--- a/target/ppc/kvm.c
|
|
|
76daa3 |
+++ b/target/ppc/kvm.c
|
|
|
76daa3 |
@@ -49,6 +49,7 @@
|
|
|
76daa3 |
#if defined(TARGET_PPC64)
|
|
|
76daa3 |
#include "hw/ppc/spapr_cpu_core.h"
|
|
|
76daa3 |
#endif
|
|
|
76daa3 |
+#include "sysemu/kvm_int.h"
|
|
|
76daa3 |
|
|
|
76daa3 |
//#define DEBUG_KVM
|
|
|
76daa3 |
|
|
|
76daa3 |
@@ -332,6 +333,30 @@ static void kvm_get_smmu_info(PowerPCCPU *cpu, struct kvm_ppc_smmu_info *info)
|
|
|
76daa3 |
kvm_get_fallback_smmu_info(cpu, info);
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
+struct ppc_radix_page_info *kvm_get_radix_page_info(void)
|
|
|
76daa3 |
+{
|
|
|
76daa3 |
+ KVMState *s = KVM_STATE(current_machine->accelerator);
|
|
|
76daa3 |
+ struct ppc_radix_page_info *radix_page_info;
|
|
|
76daa3 |
+ struct kvm_ppc_rmmu_info rmmu_info;
|
|
|
76daa3 |
+ int i;
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ if (!kvm_check_extension(s, KVM_CAP_PPC_MMU_RADIX)) {
|
|
|
76daa3 |
+ return NULL;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+ if (kvm_vm_ioctl(s, KVM_PPC_GET_RMMU_INFO, &rmmu_info)) {
|
|
|
76daa3 |
+ return NULL;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+ radix_page_info = g_malloc0(sizeof(*radix_page_info));
|
|
|
76daa3 |
+ radix_page_info->count = 0;
|
|
|
76daa3 |
+ for (i = 0; i < PPC_PAGE_SIZES_MAX_SZ; i++) {
|
|
|
76daa3 |
+ if (rmmu_info.ap_encodings[i]) {
|
|
|
76daa3 |
+ radix_page_info->entries[i] = rmmu_info.ap_encodings[i];
|
|
|
76daa3 |
+ radix_page_info->count++;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+ return radix_page_info;
|
|
|
76daa3 |
+}
|
|
|
76daa3 |
+
|
|
|
76daa3 |
static bool kvm_valid_page_size(uint32_t flags, long rampgsize, uint32_t shift)
|
|
|
76daa3 |
{
|
|
|
76daa3 |
if (!(flags & KVM_PPC_PAGE_SIZES_REAL)) {
|
|
|
76daa3 |
@@ -2308,6 +2333,10 @@ static void kvmppc_host_cpu_class_init(ObjectClass *oc, void *data)
|
|
|
76daa3 |
|
|
|
76daa3 |
/* Reason: kvmppc_host_cpu_initfn() dies when !kvm_enabled() */
|
|
|
76daa3 |
dc->cannot_destroy_with_object_finalize_yet = true;
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+#if defined(TARGET_PPC64)
|
|
|
76daa3 |
+ pcc->radix_page_info = kvm_get_radix_page_info();
|
|
|
76daa3 |
+#endif /* defined(TARGET_PPC64) */
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
bool kvmppc_has_cap_epr(void)
|
|
|
76daa3 |
--
|
|
|
76daa3 |
1.8.3.1
|
|
|
76daa3 |
|