diff options
author | Paul Mackerras <paulus@ozlabs.org> | 2017-05-11 00:31:59 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@ozlabs.org> | 2017-05-12 01:32:30 -0400 |
commit | 76d837a4c0f905f98088877d780169d7a14a6b29 (patch) | |
tree | 261a1370503e3359216feff47c3e34046cc18f50 | |
parent | 67325e988faea735d663799b6d152b5f4254093c (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/Kconfig | 2 | ||||
-rw-r--r-- | arch/powerpc/kvm/Makefile | 4 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_pr_papr.c | 36 | ||||
-rw-r--r-- | arch/powerpc/kvm/powerpc.c | 4 |
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 |
47 | kvm-objs-$(CONFIG_KVM_E500MC) := $(kvm-e500mc-objs) | 47 | kvm-objs-$(CONFIG_KVM_E500MC) := $(kvm-e500mc-objs) |
48 | 48 | ||
49 | kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HANDLER) := \ | 49 | kvm-book3s_64-builtin-objs-$(CONFIG_SPAPR_TCE_IOMMU) := \ |
50 | book3s_64_vio_hv.o | 50 | book3s_64_vio_hv.o |
51 | 51 | ||
52 | kvm-pr-y := \ | 52 | kvm-pr-y := \ |
@@ -90,11 +90,11 @@ kvm-book3s_64-objs-$(CONFIG_KVM_XICS) += \ | |||
90 | book3s_xics.o | 90 | book3s_xics.o |
91 | 91 | ||
92 | kvm-book3s_64-objs-$(CONFIG_KVM_XIVE) += book3s_xive.o | 92 | kvm-book3s_64-objs-$(CONFIG_KVM_XIVE) += book3s_xive.o |
93 | kvm-book3s_64-objs-$(CONFIG_SPAPR_TCE_IOMMU) += book3s_64_vio.o | ||
93 | 94 | ||
94 | kvm-book3s_64-module-objs := \ | 95 | kvm-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 | ||
265 | static int kvmppc_h_pr_put_tce(struct kvm_vcpu *vcpu) | 265 | static 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 | ||
279 | static int kvmppc_h_pr_logical_ci_load(struct kvm_vcpu *vcpu) | 276 | static 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 | ||
290 | static int kvmppc_h_pr_logical_ci_store(struct kvm_vcpu *vcpu) | 287 | #ifdef CONFIG_SPAPR_TCE_IOMMU |
288 | static 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 */ | ||
334 | static int kvmppc_h_pr_put_tce(struct kvm_vcpu *vcpu) | ||
335 | { | ||
336 | return EMULATE_FAIL; | ||
337 | } | ||
338 | |||
339 | static int kvmppc_h_pr_put_tce_indirect(struct kvm_vcpu *vcpu) | ||
340 | { | ||
341 | return EMULATE_FAIL; | ||
342 | } | ||
343 | |||
344 | static int kvmppc_h_pr_stuff_tce(struct kvm_vcpu *vcpu) | ||
345 | { | ||
346 | return EMULATE_FAIL; | ||
347 | } | ||
348 | #endif /* CONFIG_SPAPR_TCE_IOMMU */ | ||
349 | |||
332 | static int kvmppc_h_pr_xics_hcall(struct kvm_vcpu *vcpu, u32 cmd) | 350 | static 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; |