2008-12-16 11:43:58 +01:00
|
|
|
/*
|
|
|
|
* Copyright 2008 IBM Corporation.
|
|
|
|
* Authors: Hollis Blanchard <hollisb@us.ibm.com>
|
|
|
|
*
|
|
|
|
* This work is licensed under the GNU GPL license version 2 or later.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __KVM_PPC_H__
|
|
|
|
#define __KVM_PPC_H__
|
|
|
|
|
2011-09-29 23:39:11 +02:00
|
|
|
#include "memory.h"
|
|
|
|
|
2008-12-16 11:43:58 +01:00
|
|
|
void kvmppc_init(void);
|
|
|
|
|
2011-07-21 02:54:51 +02:00
|
|
|
#ifdef CONFIG_KVM
|
|
|
|
|
2010-02-09 17:37:05 +01:00
|
|
|
uint32_t kvmppc_get_tbfreq(void);
|
2011-07-21 02:29:15 +02:00
|
|
|
uint64_t kvmppc_get_clockfreq(void);
|
pseries: Add device tree properties for VMX/VSX and DFP under kvm
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 <david@gibson.dropbear.id.au>
Signed-off-by: Alexander Graf <agraf@suse.de>
2011-10-10 20:31:01 +02:00
|
|
|
uint32_t kvmppc_get_vmx(void);
|
|
|
|
uint32_t kvmppc_get_dfp(void);
|
2012-03-14 01:38:22 +01:00
|
|
|
int kvmppc_get_hypercall(CPUPPCState *env, uint8_t *buf, int buf_len);
|
|
|
|
int kvmppc_set_interrupt(CPUPPCState *env, int irq, int level);
|
|
|
|
void kvmppc_set_papr(CPUPPCState *env);
|
2011-09-29 23:39:10 +02:00
|
|
|
int kvmppc_smt_threads(void);
|
2011-10-23 19:25:04 +02:00
|
|
|
#ifndef CONFIG_USER_ONLY
|
2011-09-29 23:39:11 +02:00
|
|
|
off_t kvmppc_alloc_rma(const char *name, MemoryRegion *sysmem);
|
2011-09-29 23:39:12 +02:00
|
|
|
void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t window_size, int *pfd);
|
|
|
|
int kvmppc_remove_spapr_tce(void *table, int pfd, uint32_t window_size);
|
2012-09-12 18:57:12 +02:00
|
|
|
int kvmppc_reset_htab(int shift_hint);
|
|
|
|
uint64_t kvmppc_rma_size(uint64_t current_size, unsigned int hash_shift);
|
2011-10-23 19:25:04 +02:00
|
|
|
#endif /* !CONFIG_USER_ONLY */
|
2011-10-13 00:40:32 +02:00
|
|
|
const ppc_def_t *kvmppc_host_cpu_def(void);
|
2012-04-04 07:02:05 +02:00
|
|
|
int kvmppc_fixup_cpu(CPUPPCState *env);
|
2010-08-30 13:49:15 +02:00
|
|
|
|
2011-07-21 02:54:51 +02:00
|
|
|
#else
|
|
|
|
|
|
|
|
static inline uint32_t kvmppc_get_tbfreq(void)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint64_t kvmppc_get_clockfreq(void)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
pseries: Add device tree properties for VMX/VSX and DFP under kvm
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 <david@gibson.dropbear.id.au>
Signed-off-by: Alexander Graf <agraf@suse.de>
2011-10-10 20:31:01 +02:00
|
|
|
static inline uint32_t kvmppc_get_vmx(void)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint32_t kvmppc_get_dfp(void)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-03-14 01:38:22 +01:00
|
|
|
static inline int kvmppc_get_hypercall(CPUPPCState *env, uint8_t *buf, int buf_len)
|
2011-07-21 02:54:51 +02:00
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
ppc64: Rudimentary Support for extra page sizes on server CPUs
More recent Power server chips (i.e. based on the 64 bit hash MMU)
support more than just the traditional 4k and 16M page sizes. This
can get quite complicated, because which page sizes are supported,
which combinations are supported within an MMU segment and how these
page sizes are encoded both in the SLB entry and the hash PTE can vary
depending on the CPU model (they are not specified by the
architecture). In addition the firmware or hypervisor may not permit
use of certain page sizes, for various reasons. Whether various page
sizes are supported on KVM, for example, depends on whether the PR or
HV variant of KVM is in use, and on the page size of the memory
backing the guest's RAM.
This patch adds information to the CPUState and cpu defs to describe
the supported page sizes and encodings. Since TCG does not yet
support any extended page sizes, we just set this to NULL in the
static CPU definitions, expanding this to the default 4k and 16M page
sizes when we initialize the cpu state. When using KVM, however, we
instead determine available page sizes using the new
KVM_PPC_GET_SMMU_INFO call. For old kernels without that call, we use
some defaults, with some guesswork which should do the right thing for
existing HV and PR implementations. The fallback might not be correct
for future versions, but that's ok, because they'll have
KVM_PPC_GET_SMMU_INFO.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Alexander Graf <agraf@suse.de>
2012-06-18 21:56:25 +02:00
|
|
|
static inline int kvmppc_read_segment_page_sizes(uint32_t *prop, int maxcells)
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2012-03-14 01:38:22 +01:00
|
|
|
static inline int kvmppc_set_interrupt(CPUPPCState *env, int irq, int level)
|
2011-07-21 02:54:51 +02:00
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2012-03-14 01:38:22 +01:00
|
|
|
static inline void kvmppc_set_papr(CPUPPCState *env)
|
2011-08-09 17:57:37 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2011-09-29 23:39:10 +02:00
|
|
|
static inline int kvmppc_smt_threads(void)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2011-10-23 19:25:04 +02:00
|
|
|
#ifndef CONFIG_USER_ONLY
|
2011-09-29 23:39:11 +02:00
|
|
|
static inline off_t kvmppc_alloc_rma(const char *name, MemoryRegion *sysmem)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2011-09-29 23:39:12 +02:00
|
|
|
static inline void *kvmppc_create_spapr_tce(uint32_t liobn,
|
|
|
|
uint32_t window_size, int *fd)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int kvmppc_remove_spapr_tce(void *table, int pfd,
|
|
|
|
uint32_t window_size)
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
2012-09-12 18:57:12 +02:00
|
|
|
|
|
|
|
static inline int kvmppc_reset_htab(int shift_hint)
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint64_t kvmppc_rma_size(uint64_t current_size,
|
|
|
|
unsigned int hash_shift)
|
|
|
|
{
|
|
|
|
return ram_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int kvmppc_update_sdr1(CPUPPCState *env)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2011-10-23 19:25:04 +02:00
|
|
|
#endif /* !CONFIG_USER_ONLY */
|
2011-09-29 23:39:12 +02:00
|
|
|
|
2011-10-13 00:40:32 +02:00
|
|
|
static inline const ppc_def_t *kvmppc_host_cpu_def(void)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2012-04-04 07:02:05 +02:00
|
|
|
static inline int kvmppc_fixup_cpu(CPUPPCState *env)
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
2011-07-21 02:54:51 +02:00
|
|
|
#endif
|
|
|
|
|
2011-04-01 06:15:30 +02:00
|
|
|
#ifndef CONFIG_KVM
|
|
|
|
#define kvmppc_eieio() do { } while (0)
|
|
|
|
#else
|
|
|
|
#define kvmppc_eieio() \
|
|
|
|
do { \
|
|
|
|
if (kvm_enabled()) { \
|
|
|
|
asm volatile("eieio" : : : "memory"); \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
#endif
|
|
|
|
|
2010-08-30 13:49:15 +02:00
|
|
|
#ifndef KVM_INTERRUPT_SET
|
|
|
|
#define KVM_INTERRUPT_SET -1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef KVM_INTERRUPT_UNSET
|
|
|
|
#define KVM_INTERRUPT_UNSET -2
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef KVM_INTERRUPT_SET_LEVEL
|
|
|
|
#define KVM_INTERRUPT_SET_LEVEL -3
|
|
|
|
#endif
|
2010-02-09 17:37:05 +01:00
|
|
|
|
2008-12-16 11:43:58 +01:00
|
|
|
#endif /* __KVM_PPC_H__ */
|