Skip to content

Commit 76d837a

Browse files
committed
KVM: PPC: Book3S PR: Don't include SPAPR TCE code on non-pseries platforms
Commit e91aa8e ("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 <[email protected]> Signed-off-by: Paul Mackerras <[email protected]>
1 parent 67325e9 commit 76d837a

File tree

4 files changed

+33
-13
lines changed

4 files changed

+33
-13
lines changed

arch/powerpc/kvm/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ config KVM_BOOK3S_64
6767
select KVM_BOOK3S_64_HANDLER
6868
select KVM
6969
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)
7171
---help---
7272
Support running unmodified book3s_64 and book3s_32 guest kernels
7373
in virtual machines on book3s_64 host processors.

arch/powerpc/kvm/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ kvm-e500mc-objs := \
4646
e500_emulate.o
4747
kvm-objs-$(CONFIG_KVM_E500MC) := $(kvm-e500mc-objs)
4848

49-
kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HANDLER) := \
49+
kvm-book3s_64-builtin-objs-$(CONFIG_SPAPR_TCE_IOMMU) := \
5050
book3s_64_vio_hv.o
5151

5252
kvm-pr-y := \
@@ -90,11 +90,11 @@ kvm-book3s_64-objs-$(CONFIG_KVM_XICS) += \
9090
book3s_xics.o
9191

9292
kvm-book3s_64-objs-$(CONFIG_KVM_XIVE) += book3s_xive.o
93+
kvm-book3s_64-objs-$(CONFIG_SPAPR_TCE_IOMMU) += book3s_64_vio.o
9394

9495
kvm-book3s_64-module-objs := \
9596
$(common-objs-y) \
9697
book3s.o \
97-
book3s_64_vio.o \
9898
book3s_rtas.o \
9999
$(kvm-book3s_64-objs-y)
100100

arch/powerpc/kvm/book3s_pr_papr.c

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -262,36 +262,37 @@ static int kvmppc_h_pr_protect(struct kvm_vcpu *vcpu)
262262
return EMULATE_DONE;
263263
}
264264

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)
266266
{
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);
270267
long rc;
271268

272-
rc = kvmppc_h_put_tce(vcpu, liobn, ioba, tce);
269+
rc = kvmppc_h_logical_ci_load(vcpu);
273270
if (rc == H_TOO_HARD)
274271
return EMULATE_FAIL;
275272
kvmppc_set_gpr(vcpu, 3, rc);
276273
return EMULATE_DONE;
277274
}
278275

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)
280277
{
281278
long rc;
282279

283-
rc = kvmppc_h_logical_ci_load(vcpu);
280+
rc = kvmppc_h_logical_ci_store(vcpu);
284281
if (rc == H_TOO_HARD)
285282
return EMULATE_FAIL;
286283
kvmppc_set_gpr(vcpu, 3, rc);
287284
return EMULATE_DONE;
288285
}
289286

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)
291289
{
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);
292293
long rc;
293294

294-
rc = kvmppc_h_logical_ci_store(vcpu);
295+
rc = kvmppc_h_put_tce(vcpu, liobn, ioba, tce);
295296
if (rc == H_TOO_HARD)
296297
return EMULATE_FAIL;
297298
kvmppc_set_gpr(vcpu, 3, rc);
@@ -329,6 +330,23 @@ static int kvmppc_h_pr_stuff_tce(struct kvm_vcpu *vcpu)
329330
return EMULATE_DONE;
330331
}
331332

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+
332350
static int kvmppc_h_pr_xics_hcall(struct kvm_vcpu *vcpu, u32 cmd)
333351
{
334352
long rc = kvmppc_xics_hcall(vcpu, cmd);

arch/powerpc/kvm/powerpc.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1749,7 +1749,7 @@ long kvm_arch_vm_ioctl(struct file *filp,
17491749
r = kvm_vm_ioctl_enable_cap(kvm, &cap);
17501750
break;
17511751
}
1752-
#ifdef CONFIG_PPC_BOOK3S_64
1752+
#ifdef CONFIG_SPAPR_TCE_IOMMU
17531753
case KVM_CREATE_SPAPR_TCE_64: {
17541754
struct kvm_create_spapr_tce_64 create_tce_64;
17551755

@@ -1780,6 +1780,8 @@ long kvm_arch_vm_ioctl(struct file *filp,
17801780
r = kvm_vm_ioctl_create_spapr_tce(kvm, &create_tce_64);
17811781
goto out;
17821782
}
1783+
#endif
1784+
#ifdef CONFIG_PPC_BOOK3S_64
17831785
case KVM_PPC_GET_SMMU_INFO: {
17841786
struct kvm_ppc_smmu_info info;
17851787
struct kvm *kvm = filp->private_data;

0 commit comments

Comments
 (0)