mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 22:51:42 +00:00
KVM: PPC: Book3S PR: Don't include SPAPR TCE code on non-pseries platforms
Commit e91aa8e6ec
("KVM: PPC: Enable IOMMU_API for KVM_BOOK3S_64
permanently", 2017-03-22) enabled the SPAPR TCE code for all 64-bit
Book 3S kernel configurations in order to simplify the code and
reduce #ifdefs. However, 64-bit Book 3S PPC platforms other than
pseries and powernv don't implement the necessary IOMMU callbacks,
leading to build failures like the following (for a pasemi config):
scripts/kconfig/conf --silentoldconfig Kconfig
warning: (KVM_BOOK3S_64) selects SPAPR_TCE_IOMMU which has unmet direct dependencies (IOMMU_SUPPORT && (PPC_POWERNV || PPC_PSERIES))
...
CC [M] arch/powerpc/kvm/book3s_64_vio.o
/home/paulus/kernel/kvm/arch/powerpc/kvm/book3s_64_vio.c: In function ‘kvmppc_clear_tce’:
/home/paulus/kernel/kvm/arch/powerpc/kvm/book3s_64_vio.c:363:2: error: implicit declaration of function ‘iommu_tce_xchg’ [-Werror=implicit-function-declaration]
iommu_tce_xchg(tbl, entry, &hpa, &dir);
^
To fix this, we make the inclusion of the SPAPR TCE support, and the
code that uses it in book3s_vio.c and book3s_vio_hv.c, depend on
the inclusion of support for the pseries and/or powernv platforms.
This means that when running a 'pseries' guest on those platforms,
the guest won't have in-kernel acceleration of the PAPR TCE hypercalls,
but at least now they compile.
Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
This commit is contained in:
parent
67325e988f
commit
76d837a4c0
@ -67,7 +67,7 @@ config KVM_BOOK3S_64
|
|||||||
select KVM_BOOK3S_64_HANDLER
|
select KVM_BOOK3S_64_HANDLER
|
||||||
select KVM
|
select KVM
|
||||||
select KVM_BOOK3S_PR_POSSIBLE if !KVM_BOOK3S_HV_POSSIBLE
|
select KVM_BOOK3S_PR_POSSIBLE if !KVM_BOOK3S_HV_POSSIBLE
|
||||||
select SPAPR_TCE_IOMMU if IOMMU_SUPPORT
|
select SPAPR_TCE_IOMMU if IOMMU_SUPPORT && (PPC_SERIES || PPC_POWERNV)
|
||||||
---help---
|
---help---
|
||||||
Support running unmodified book3s_64 and book3s_32 guest kernels
|
Support running unmodified book3s_64 and book3s_32 guest kernels
|
||||||
in virtual machines on book3s_64 host processors.
|
in virtual machines on book3s_64 host processors.
|
||||||
|
@ -46,7 +46,7 @@ kvm-e500mc-objs := \
|
|||||||
e500_emulate.o
|
e500_emulate.o
|
||||||
kvm-objs-$(CONFIG_KVM_E500MC) := $(kvm-e500mc-objs)
|
kvm-objs-$(CONFIG_KVM_E500MC) := $(kvm-e500mc-objs)
|
||||||
|
|
||||||
kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HANDLER) := \
|
kvm-book3s_64-builtin-objs-$(CONFIG_SPAPR_TCE_IOMMU) := \
|
||||||
book3s_64_vio_hv.o
|
book3s_64_vio_hv.o
|
||||||
|
|
||||||
kvm-pr-y := \
|
kvm-pr-y := \
|
||||||
@ -90,11 +90,11 @@ kvm-book3s_64-objs-$(CONFIG_KVM_XICS) += \
|
|||||||
book3s_xics.o
|
book3s_xics.o
|
||||||
|
|
||||||
kvm-book3s_64-objs-$(CONFIG_KVM_XIVE) += book3s_xive.o
|
kvm-book3s_64-objs-$(CONFIG_KVM_XIVE) += book3s_xive.o
|
||||||
|
kvm-book3s_64-objs-$(CONFIG_SPAPR_TCE_IOMMU) += book3s_64_vio.o
|
||||||
|
|
||||||
kvm-book3s_64-module-objs := \
|
kvm-book3s_64-module-objs := \
|
||||||
$(common-objs-y) \
|
$(common-objs-y) \
|
||||||
book3s.o \
|
book3s.o \
|
||||||
book3s_64_vio.o \
|
|
||||||
book3s_rtas.o \
|
book3s_rtas.o \
|
||||||
$(kvm-book3s_64-objs-y)
|
$(kvm-book3s_64-objs-y)
|
||||||
|
|
||||||
|
@ -262,20 +262,6 @@ static int kvmppc_h_pr_protect(struct kvm_vcpu *vcpu)
|
|||||||
return EMULATE_DONE;
|
return EMULATE_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int kvmppc_h_pr_put_tce(struct kvm_vcpu *vcpu)
|
|
||||||
{
|
|
||||||
unsigned long liobn = kvmppc_get_gpr(vcpu, 4);
|
|
||||||
unsigned long ioba = kvmppc_get_gpr(vcpu, 5);
|
|
||||||
unsigned long tce = kvmppc_get_gpr(vcpu, 6);
|
|
||||||
long rc;
|
|
||||||
|
|
||||||
rc = kvmppc_h_put_tce(vcpu, liobn, ioba, tce);
|
|
||||||
if (rc == H_TOO_HARD)
|
|
||||||
return EMULATE_FAIL;
|
|
||||||
kvmppc_set_gpr(vcpu, 3, rc);
|
|
||||||
return EMULATE_DONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int kvmppc_h_pr_logical_ci_load(struct kvm_vcpu *vcpu)
|
static int kvmppc_h_pr_logical_ci_load(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
long rc;
|
long rc;
|
||||||
@ -298,6 +284,21 @@ static int kvmppc_h_pr_logical_ci_store(struct kvm_vcpu *vcpu)
|
|||||||
return EMULATE_DONE;
|
return EMULATE_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPAPR_TCE_IOMMU
|
||||||
|
static int kvmppc_h_pr_put_tce(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
unsigned long liobn = kvmppc_get_gpr(vcpu, 4);
|
||||||
|
unsigned long ioba = kvmppc_get_gpr(vcpu, 5);
|
||||||
|
unsigned long tce = kvmppc_get_gpr(vcpu, 6);
|
||||||
|
long rc;
|
||||||
|
|
||||||
|
rc = kvmppc_h_put_tce(vcpu, liobn, ioba, tce);
|
||||||
|
if (rc == H_TOO_HARD)
|
||||||
|
return EMULATE_FAIL;
|
||||||
|
kvmppc_set_gpr(vcpu, 3, rc);
|
||||||
|
return EMULATE_DONE;
|
||||||
|
}
|
||||||
|
|
||||||
static int kvmppc_h_pr_put_tce_indirect(struct kvm_vcpu *vcpu)
|
static int kvmppc_h_pr_put_tce_indirect(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
unsigned long liobn = kvmppc_get_gpr(vcpu, 4);
|
unsigned long liobn = kvmppc_get_gpr(vcpu, 4);
|
||||||
@ -329,6 +330,23 @@ static int kvmppc_h_pr_stuff_tce(struct kvm_vcpu *vcpu)
|
|||||||
return EMULATE_DONE;
|
return EMULATE_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else /* CONFIG_SPAPR_TCE_IOMMU */
|
||||||
|
static int kvmppc_h_pr_put_tce(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
return EMULATE_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int kvmppc_h_pr_put_tce_indirect(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
return EMULATE_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int kvmppc_h_pr_stuff_tce(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
return EMULATE_FAIL;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_SPAPR_TCE_IOMMU */
|
||||||
|
|
||||||
static int kvmppc_h_pr_xics_hcall(struct kvm_vcpu *vcpu, u32 cmd)
|
static int kvmppc_h_pr_xics_hcall(struct kvm_vcpu *vcpu, u32 cmd)
|
||||||
{
|
{
|
||||||
long rc = kvmppc_xics_hcall(vcpu, cmd);
|
long rc = kvmppc_xics_hcall(vcpu, cmd);
|
||||||
|
@ -1749,7 +1749,7 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
|||||||
r = kvm_vm_ioctl_enable_cap(kvm, &cap);
|
r = kvm_vm_ioctl_enable_cap(kvm, &cap);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_PPC_BOOK3S_64
|
#ifdef CONFIG_SPAPR_TCE_IOMMU
|
||||||
case KVM_CREATE_SPAPR_TCE_64: {
|
case KVM_CREATE_SPAPR_TCE_64: {
|
||||||
struct kvm_create_spapr_tce_64 create_tce_64;
|
struct kvm_create_spapr_tce_64 create_tce_64;
|
||||||
|
|
||||||
@ -1780,6 +1780,8 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
|||||||
r = kvm_vm_ioctl_create_spapr_tce(kvm, &create_tce_64);
|
r = kvm_vm_ioctl_create_spapr_tce(kvm, &create_tce_64);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_PPC_BOOK3S_64
|
||||||
case KVM_PPC_GET_SMMU_INFO: {
|
case KVM_PPC_GET_SMMU_INFO: {
|
||||||
struct kvm_ppc_smmu_info info;
|
struct kvm_ppc_smmu_info info;
|
||||||
struct kvm *kvm = filp->private_data;
|
struct kvm *kvm = filp->private_data;
|
||||||
|
Loading…
Reference in New Issue
Block a user