From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:41088) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RDzac-0007il-UH for qemu-devel@nongnu.org; Wed, 12 Oct 2011 10:15:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RDzaZ-00032O-Ui for qemu-devel@nongnu.org; Wed, 12 Oct 2011 10:15:22 -0400 Received: from cantor2.suse.de ([195.135.220.15]:52725 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RDzaZ-00031n-Mt for qemu-devel@nongnu.org; Wed, 12 Oct 2011 10:15:19 -0400 Message-ID: <4E95A194.5030608@suse.de> Date: Wed, 12 Oct 2011 16:17:56 +0200 From: Alexander Graf MIME-Version: 1.0 References: <1318307461-9817-1-git-send-email-david@gibson.dropbear.id.au> <1318307461-9817-2-git-send-email-david@gibson.dropbear.id.au> In-Reply-To: <1318307461-9817-2-git-send-email-david@gibson.dropbear.id.au> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 2/2] pseries: Add device tree properties for VMX/VSX and DFP under kvm List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: David Gibson Cc: qemu-devel@nongnu.org On 10/11/2011 06:31 AM, David Gibson wrote: > Sufficiently recent PAPR specifications define properties "ibm,vmx" > and "ibm,dfp" on the CPU node which advertise whether the VMX vector > extensions (or the later VSX version) and/or the Decimal Floating > Point operations from IBM's recent POWER CPUs are available. > > Currently we do not put these in the guest device tree and the guest > kernel will consequently assume they are not available. This is good, > because they are not supported under TCG. VMX is similar enough to > Altivec that it might be trivial to support, but VSX and DFP would > both require significant work to support in TCG. > > However, when running under kvm on a host which supports these > instructions, there's no reason not to let the guest use them. This > patch, therefore, checks for the relevant support on the host CPU > and, if present, advertises them to the guest as well. > > Signed-off-by: David Gibson > --- > hw/spapr.c | 17 +++++++++++++++++ > target-ppc/kvm.c | 10 ++++++++++ > target-ppc/kvm_ppc.h | 12 ++++++++++++ > 3 files changed, 39 insertions(+), 0 deletions(-) > > diff --git a/hw/spapr.c b/hw/spapr.c > index 9a3a1ea..00b9c67 100644 > --- a/hw/spapr.c > +++ b/hw/spapr.c > @@ -186,6 +186,8 @@ static void *spapr_create_fdt_skel(const char *cpu_model, > 0xffffffff, 0xffffffff}; > uint32_t tbfreq = kvm_enabled() ? kvmppc_get_tbfreq() : TIMEBASE_FREQ; > uint32_t cpufreq = kvm_enabled() ? kvmppc_get_clockfreq() : 1000000000; > + uint32_t vmx = kvm_enabled() ? kvmppc_get_vmx() : 0; > + uint32_t dfp = kvm_enabled() ? kvmppc_get_dfp() : 0; This should only happen when the CPU type selected by -cpu also supports VMX or DFP. For now, this is moot as we can't run any non-host CPU in KVM for HV PPC. But looking forward, it certainly makes sense to split it. This is not a nack, but please make sure to implement -cpu host in the near future and default to that for -M pseries. Then we can change this piece here to check for vcpu capabilities and AND them with the host caps. The rest looks good. Alex > > if ((index % smt) != 0) { > continue; > @@ -233,6 +235,21 @@ static void *spapr_create_fdt_skel(const char *cpu_model, > segs, sizeof(segs)))); > } > > + /* Advertise VMX/VSX (vector extensions) if available > + * 0 / no property == no vector extensions > + * 1 == VMX / Altivec available > + * 2 == VSX available */ > + if (vmx) { > + _FDT((fdt_property_cell(fdt, "ibm,vmx", vmx))); > + } > + > + /* Advertise DFP (Decimal Floating Point) if available > + * 0 / no property == no DFP > + * 1 == DFP available */ > + if (dfp) { > + _FDT((fdt_property_cell(fdt, "ibm,dfp", dfp))); > + } > + > _FDT((fdt_end_node(fdt))); > } > > diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c > index 6667b61..6a48eb4 100644 > --- a/target-ppc/kvm.c > +++ b/target-ppc/kvm.c > @@ -694,6 +694,16 @@ uint64_t kvmppc_get_clockfreq(void) > return kvmppc_read_int_cpu_dt("clock-frequency"); > } > > +uint32_t kvmppc_get_vmx(void) > +{ > + return kvmppc_read_int_cpu_dt("ibm,vmx"); > +} > + > +uint32_t kvmppc_get_dfp(void) > +{ > + return kvmppc_read_int_cpu_dt("ibm,dfp"); > +} > + > int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len) > { > uint32_t *hc = (uint32_t*)buf; > diff --git a/target-ppc/kvm_ppc.h b/target-ppc/kvm_ppc.h > index 9e8a7b5..fa131bf 100644 > --- a/target-ppc/kvm_ppc.h > +++ b/target-ppc/kvm_ppc.h > @@ -15,6 +15,8 @@ void kvmppc_init(void); > > uint32_t kvmppc_get_tbfreq(void); > uint64_t kvmppc_get_clockfreq(void); > +uint32_t kvmppc_get_vmx(void); > +uint32_t kvmppc_get_dfp(void); > int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len); > int kvmppc_set_interrupt(CPUState *env, int irq, int level); > void kvmppc_set_papr(CPUState *env); > @@ -35,6 +37,16 @@ static inline uint64_t kvmppc_get_clockfreq(void) > return 0; > } > > +static inline uint32_t kvmppc_get_vmx(void) > +{ > + return 0; > +} > + > +static inline uint32_t kvmppc_get_dfp(void) > +{ > + return 0; > +} > + > static inline int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len) > { > return -1;