aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@ozlabs.org>2017-05-11 00:31:59 -0400
committerPaul Mackerras <paulus@ozlabs.org>2017-05-12 01:32:30 -0400
commit76d837a4c0f905f98088877d780169d7a14a6b29 (patch)
tree261a1370503e3359216feff47c3e34046cc18f50
parent67325e988faea735d663799b6d152b5f4254093c (diff)
KVM: PPC: Book3S PR: Don't include SPAPR TCE code on non-pseries platforms
Commit e91aa8e6ecd5 ("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>
-rw-r--r--arch/powerpc/kvm/Kconfig2
-rw-r--r--arch/powerpc/kvm/Makefile4
-rw-r--r--arch/powerpc/kvm/book3s_pr_papr.c36
-rw-r--r--arch/powerpc/kvm/powerpc.c4
4 files changed, 33 insertions, 13 deletions
diff --git a/arch/powerpc/kvm/Kconfig b/arch/powerpc/kvm/Kconfig
index 24de532c1736..0c52cb5d43f5 100644
--- a/arch/powerpc/kvm/Kconfig
+++ b/arch/powerpc/kvm/Kconfig
@@ -67,7 +67,7 @@ config KVM_BOOK3S_64
67 select KVM_BOOK3S_64_HANDLER 67 select KVM_BOOK3S_64_HANDLER
68 select KVM 68 select KVM
69 select KVM_BOOK3S_PR_POSSIBLE if !KVM_BOOK3S_HV_POSSIBLE 69 select KVM_BOOK3S_PR_POSSIBLE if !KVM_BOOK3S_HV_POSSIBLE
70 select SPAPR_TCE_IOMMU if IOMMU_SUPPORT 70 select SPAPR_TCE_IOMMU if IOMMU_SUPPORT && (PPC_SERIES || PPC_POWERNV)
71 ---help--- 71 ---help---
72 Support running unmodified book3s_64 and book3s_32 guest kernels 72 Support running unmodified book3s_64 and book3s_32 guest kernels
73 in virtual machines on book3s_64 host processors. 73 in virtual machines on book3s_64 host processors.
diff --git a/arch/powerpc/kvm/Makefile b/arch/powerpc/kvm/Makefile
index d91a2604c496..381a6ec0ff3b 100644
--- a/arch/powerpc/kvm/Makefile
+++ b/arch/powerpc/kvm/Makefile
@@ -46,7 +46,7 @@ kvm-e500mc-objs := \
46 e500_emulate.o 46 e500_emulate.o
47kvm-objs-$(CONFIG_KVM_E500MC) := $(kvm-e500mc-objs) 47kvm-objs-$(CONFIG_KVM_E500MC) := $(kvm-e500mc-objs)
48 48
49kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HANDLER) := \ 49kvm-book3s_64-builtin-objs-$(CONFIG_SPAPR_TCE_IOMMU) := \
50 book3s_64_vio_hv.o 50 book3s_64_vio_hv.o
51 51
52kvm-pr-y := \ 52kvm-pr-y := \
@@ -90,11 +90,11 @@ kvm-book3s_64-objs-$(CONFIG_KVM_XICS) += \
90 book3s_xics.o 90 book3s_xics.o
91 91
92kvm-book3s_64-objs-$(CONFIG_KVM_XIVE) += book3s_xive.o 92kvm-book3s_64-objs-$(CONFIG_KVM_XIVE) += book3s_xive.o
93kvm-book3s_64-objs-$(CONFIG_SPAPR_TCE_IOMMU) += book3s_64_vio.o
93 94
94kvm-book3s_64-module-objs := \ 95kvm-book3s_64-module-objs := \
95 $(common-objs-y) \ 96 $(common-objs-y) \
96 book3s.o \ 97 book3s.o \
97 book3s_64_vio.o \
98 book3s_rtas.o \ 98 book3s_rtas.o \
99 $(kvm-book3s_64-objs-y) 99 $(kvm-book3s_64-objs-y)
100 100
diff --git a/arch/powerpc/kvm/book3s_pr_papr.c b/arch/powerpc/kvm/book3s_pr_papr.c
index a04384adece7..8a4205fa774f 100644
--- a/arch/powerpc/kvm/book3s_pr_papr.c
+++ b/arch/powerpc/kvm/book3s_pr_papr.c
@@ -262,36 +262,37 @@ static int kvmppc_h_pr_protect(struct kvm_vcpu *vcpu)
262 return EMULATE_DONE; 262 return EMULATE_DONE;
263} 263}
264 264
265static int kvmppc_h_pr_put_tce(struct kvm_vcpu *vcpu) 265static int kvmppc_h_pr_logical_ci_load(struct kvm_vcpu *vcpu)
266{ 266{
267 unsigned long liobn = kvmppc_get_gpr(vcpu, 4);
268 unsigned long ioba = kvmppc_get_gpr(vcpu, 5);
269 unsigned long tce = kvmppc_get_gpr(vcpu, 6);
270 long rc; 267 long rc;
271 268
272 rc = kvmppc_h_put_tce(vcpu, liobn, ioba, tce); 269 rc = kvmppc_h_logical_ci_load(vcpu);
273 if (rc == H_TOO_HARD) 270 if (rc == H_TOO_HARD)
274 return EMULATE_FAIL; 271 return EMULATE_FAIL;
275 kvmppc_set_gpr(vcpu, 3, rc); 272 kvmppc_set_gpr(vcpu, 3, rc);
276 return EMULATE_DONE; 273 return EMULATE_DONE;
277} 274}
278 275
279static int kvmppc_h_pr_logical_ci_load(struct kvm_vcpu *vcpu) 276static int kvmppc_h_pr_logical_ci_store(struct kvm_vcpu *vcpu)
280{ 277{
281 long rc; 278 long rc;
282 279
283 rc = kvmppc_h_logical_ci_load(vcpu); 280 rc = kvmppc_h_logical_ci_store(vcpu);
284 if (rc == H_TOO_HARD) 281 if (rc == H_TOO_HARD)
285 return EMULATE_FAIL; 282 return EMULATE_FAIL;
286 kvmppc_set_gpr(vcpu, 3, rc); 283 kvmppc_set_gpr(vcpu, 3, rc);
287 return EMULATE_DONE; 284 return EMULATE_DONE;
288} 285}
289 286
290static int kvmppc_h_pr_logical_ci_store(struct kvm_vcpu *vcpu) 287#ifdef CONFIG_SPAPR_TCE_IOMMU
288static int kvmppc_h_pr_put_tce(struct kvm_vcpu *vcpu)
291{ 289{
290 unsigned long liobn = kvmppc_get_gpr(vcpu, 4);
291 unsigned long ioba = kvmppc_get_gpr(vcpu, 5);
292 unsigned long tce = kvmppc_get_gpr(vcpu, 6);
292 long rc; 293 long rc;
293 294
294 rc = kvmppc_h_logical_ci_store(vcpu); 295 rc = kvmppc_h_put_tce(vcpu, liobn, ioba, tce);
295 if (rc == H_TOO_HARD) 296 if (rc == H_TOO_HARD)
296 return EMULATE_FAIL; 297 return EMULATE_FAIL;
297 kvmppc_set_gpr(vcpu, 3, rc); 298 kvmppc_set_gpr(vcpu, 3, rc);
@@ -329,6 +330,23 @@ static int kvmppc_h_pr_stuff_tce(struct kvm_vcpu *vcpu)
329 return EMULATE_DONE; 330 return EMULATE_DONE;
330} 331}
331 332
333#else /* CONFIG_SPAPR_TCE_IOMMU */
334static int kvmppc_h_pr_put_tce(struct kvm_vcpu *vcpu)
335{
336 return EMULATE_FAIL;
337}
338
339static int kvmppc_h_pr_put_tce_indirect(struct kvm_vcpu *vcpu)
340{
341 return EMULATE_FAIL;
342}
343
344static int kvmppc_h_pr_stuff_tce(struct kvm_vcpu *vcpu)
345{
346 return EMULATE_FAIL;
347}
348#endif /* CONFIG_SPAPR_TCE_IOMMU */
349
332static int kvmppc_h_pr_xics_hcall(struct kvm_vcpu *vcpu, u32 cmd) 350static int kvmppc_h_pr_xics_hcall(struct kvm_vcpu *vcpu, u32 cmd)
333{ 351{
334 long rc = kvmppc_xics_hcall(vcpu, cmd); 352 long rc = kvmppc_xics_hcall(vcpu, cmd);
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index f7cf2cd564ef..7f71ab5fcad1 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -1749,7 +1749,7 @@ long kvm_arch_vm_ioctl(struct file *filp,
1749 r = kvm_vm_ioctl_enable_cap(kvm, &cap); 1749 r = kvm_vm_ioctl_enable_cap(kvm, &cap);
1750 break; 1750 break;
1751 } 1751 }
1752#ifdef CONFIG_PPC_BOOK3S_64 1752#ifdef CONFIG_SPAPR_TCE_IOMMU
1753 case KVM_CREATE_SPAPR_TCE_64: { 1753 case KVM_CREATE_SPAPR_TCE_64: {
1754 struct kvm_create_spapr_tce_64 create_tce_64; 1754 struct kvm_create_spapr_tce_64 create_tce_64;
1755 1755
@@ -1780,6 +1780,8 @@ long kvm_arch_vm_ioctl(struct file *filp,
1780 r = kvm_vm_ioctl_create_spapr_tce(kvm, &create_tce_64); 1780 r = kvm_vm_ioctl_create_spapr_tce(kvm, &create_tce_64);
1781 goto out; 1781 goto out;
1782 } 1782 }
1783#endif
1784#ifdef CONFIG_PPC_BOOK3S_64
1783 case KVM_PPC_GET_SMMU_INFO: { 1785 case KVM_PPC_GET_SMMU_INFO: {
1784 struct kvm_ppc_smmu_info info; 1786 struct kvm_ppc_smmu_info info;
1785 struct kvm *kvm = filp->private_data; 1787 struct kvm *kvm = filp->private_data;