[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [PATCH v3 05/12] spapr: Add ibm, processor-radix-AP-encod
From: |
Sam Bobroff |
Subject: |
Re: [Qemu-ppc] [PATCH v3 05/12] spapr: Add ibm, processor-radix-AP-encodings to the device tree |
Date: |
Tue, 14 Mar 2017 16:38:30 +1100 |
User-agent: |
Mutt/1.5.23 (2014-03-12) |
On Fri, Mar 03, 2017 at 02:37:52PM +1100, David Gibson wrote:
> On Thu, Mar 02, 2017 at 04:39:00PM +1100, Sam Bobroff wrote:
> > Use the new ioctl, KVM_PPC_GET_RMMU_INFO, to fetch radix MMU
> > information from KVM and present the page encodings in the device tree
> > under ibm,processor-radix-AP-encodings. This provides page size
> > information to the guest which is necessary for it to use radix mode.
> >
> > Signed-off-by: Sam Bobroff <address@hidden>
> > ---
> > hw/ppc/spapr.c | 12 ++++++++++++
> > include/sysemu/kvm.h | 1 +
> > target/ppc/cpu-qom.h | 1 +
> > target/ppc/cpu.h | 4 ++++
> > target/ppc/kvm.c | 27 +++++++++++++++++++++++++++
> > 5 files changed, 45 insertions(+)
> >
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index bad45b4a82..d154fa2112 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -427,6 +427,8 @@ static void spapr_populate_cpu_dt(CPUState *cs, void
> > *fdt, int offset,
> > sPAPRDRConnector *drc;
> > sPAPRDRConnectorClass *drck;
> > int drc_index;
> > + uint32_t radix_AP_encodings[PPC_PAGE_SIZES_MAX_SZ];
> > + int i;
> >
> > drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, index);
> > if (drc) {
> > @@ -512,6 +514,16 @@ static void spapr_populate_cpu_dt(CPUState *cs, void
> > *fdt, int offset,
> > _FDT(spapr_fixup_cpu_numa_dt(fdt, offset, cs));
> >
> > _FDT(spapr_fixup_cpu_smt_dt(fdt, offset, cpu, compat_smt));
> > +
> > + if (pcc->radix_page_info) {
> > + for (i = 0; i < pcc->radix_page_info->count; i++) {
> > + radix_AP_encodings[i] =
> > cpu_to_be32(pcc->radix_page_info->entries[i]);
> > + }
> > + _FDT((fdt_setprop(fdt, offset, "ibm,processor-radix-AP-encodings",
> > + radix_AP_encodings,
> > + pcc->radix_page_info->count *
> > + sizeof(radix_AP_encodings[0]))));
> > + }
> > }
> >
> > static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState
> > *spapr)
> > diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
> > index 3045ee7678..01a8db1180 100644
> > --- a/include/sysemu/kvm.h
> > +++ b/include/sysemu/kvm.h
> > @@ -526,5 +526,6 @@ int kvm_set_one_reg(CPUState *cs, uint64_t id, void
> > *source);
> > * Returns: 0 on success, or a negative errno on failure.
> > */
> > int kvm_get_one_reg(CPUState *cs, uint64_t id, void *target);
> > +struct ppc_radix_page_info *kvm_get_radix_page_info(void);
> > int kvm_get_max_memslots(void);
> > #endif
> > diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h
> > index 81500e5748..d0cf6ca2a9 100644
> > --- a/target/ppc/cpu-qom.h
> > +++ b/target/ppc/cpu-qom.h
> > @@ -197,6 +197,7 @@ typedef struct PowerPCCPUClass {
> > int bfd_mach;
> > uint32_t l1_dcache_size, l1_icache_size;
> > const struct ppc_segment_page_sizes *sps;
> > + struct ppc_radix_page_info *radix_page_info;
> > void (*init_proc)(CPUPPCState *env);
> > int (*check_pow)(CPUPPCState *env);
> > int (*handle_mmu_fault)(PowerPCCPU *cpu, vaddr eaddr, int rwx, int
> > mmu_idx);
> > diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
> > index 71a198e939..b3ef0d38ad 100644
> > --- a/target/ppc/cpu.h
> > +++ b/target/ppc/cpu.h
> > @@ -929,6 +929,10 @@ struct ppc_segment_page_sizes {
> > struct ppc_one_seg_page_size sps[PPC_PAGE_SIZES_MAX_SZ];
> > };
> >
> > +struct ppc_radix_page_info {
> > + uint32_t count;
> > + uint32_t entries[PPC_PAGE_SIZES_MAX_SZ];
> > +};
> >
> >
> > /*****************************************************************************/
> > /* The whole PowerPC CPU context */
> > diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> > index 38ce6c2e6c..ee330d8993 100644
> > --- a/target/ppc/kvm.c
> > +++ b/target/ppc/kvm.c
> > @@ -48,6 +48,7 @@
> > #if defined(TARGET_PPC64)
> > #include "hw/ppc/spapr_cpu_core.h"
> > #endif
> > +#include "sysemu/kvm_int.h"
> >
> > //#define DEBUG_KVM
> >
> > @@ -329,6 +330,30 @@ static void kvm_get_smmu_info(PowerPCCPU *cpu, struct
> > kvm_ppc_smmu_info *info)
> > kvm_get_fallback_smmu_info(cpu, info);
> > }
> >
> > +struct ppc_radix_page_info *kvm_get_radix_page_info(void)
> > +{
> > + KVMState *s = KVM_STATE(current_machine->accelerator);
> > + struct ppc_radix_page_info *radix_page_info;
> > + struct kvm_ppc_rmmu_info rmmu_info;
> > + int i;
> > +
> > + if (!kvm_check_extension(s, KVM_CAP_PPC_MMU_RADIX)) {
> > + return NULL;
> > + }
> > + if (kvm_vm_ioctl(s, KVM_PPC_GET_RMMU_INFO, &rmmu_info)) {
> > + return NULL;
> > + }
> > + radix_page_info = g_malloc0(sizeof(*radix_page_info));
> > + radix_page_info->count = 0;
> > + for (i = 0; i < PPC_PAGE_SIZES_MAX_SZ; i++) {
> > + if (rmmu_info.ap_encodings[i]) {
> > + radix_page_info->entries[i] = rmmu_info.ap_encodings[i];
> > + radix_page_info->count++;
> > + }
> > + }
> > + return radix_page_info;
> > +}
> > +
> > static long gethugepagesize(const char *mem_path)
> > {
> > struct statfs fs;
> > @@ -2379,6 +2404,8 @@ static void kvmppc_host_cpu_class_init(ObjectClass
> > *oc, void *data)
> > pcc->l1_icache_size = icache_size;
> > }
> >
> > + pcc->radix_page_info = kvm_enabled() ? kvm_get_radix_page_info() :
> > NULL;
>
> This isn't quite right. If KVM is not enabled, you should leave the
> radix page info as it is. For now that will be NULL, but once TCG
> radix is implemented, the base cpu type, from which the host cpu class
> is copied, should have information here.
Right. I'll do as you suggest.
> > +
> > /* Reason: kvmppc_host_cpu_initfn() dies when !kvm_enabled() */
> > dc->cannot_destroy_with_object_finalize_yet = true;
> > }
>
> --
> David Gibson | I'll have my music baroque, and my code
> david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_
> _other_
> | _way_ _around_!
> http://www.ozlabs.org/~dgibson
[Qemu-ppc] [PATCH v3 06/12] target-ppc: support KVM_CAP_PPC_MMU_RADIX, KVM_CAP_PPC_MMU_HASH_V3, Sam Bobroff, 2017/03/02
[Qemu-ppc] [PATCH v3 10/12] spapr: move spapr_populate_pa_features(), Sam Bobroff, 2017/03/02