From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Tue, 20 Jul 2021 13:42:08 +0000 Subject: [PATCH 1/2] KVM: PPC: Book3S HV: XIVE: Add a 'flags' field Message-Id: <20210720134209.256133-2-clg@kaod.org> List-Id: References: <20210720134209.256133-1-clg@kaod.org> In-Reply-To: <20210720134209.256133-1-clg@kaod.org> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To: linuxppc-dev@lists.ozlabs.org Cc: Paul Mackerras , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , kvm-ppc@vger.kernel.org Use it to hold platform specific features. P9 DD2 introduced single-escalation support. P10 will add others. Signed-off-by: C=C3=A9dric Le Goater --- arch/powerpc/kvm/book3s_xive.h | 9 ++++++++- arch/powerpc/kvm/book3s_xive.c | 19 ++++++++++--------- arch/powerpc/kvm/book3s_xive_native.c | 12 +++++++----- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/arch/powerpc/kvm/book3s_xive.h b/arch/powerpc/kvm/book3s_xive.h index afe9eeac6d56..73c3cd25093c 100644 --- a/arch/powerpc/kvm/book3s_xive.h +++ b/arch/powerpc/kvm/book3s_xive.h @@ -97,6 +97,8 @@ struct kvmppc_xive_ops { int (*reset_mapped)(struct kvm *kvm, unsigned long guest_irq); }; =20 +#define KVMPPC_XIVE_FLAG_SINGLE_ESCALATION 0x1 + struct kvmppc_xive { struct kvm *kvm; struct kvm_device *dev; @@ -133,7 +135,7 @@ struct kvmppc_xive { u32 q_page_order; =20 /* Flags */ - u8 single_escalation; + u8 flags; =20 /* Number of entries in the VP block */ u32 nr_servers; @@ -308,5 +310,10 @@ void xive_cleanup_single_escalation(struct kvm_vcpu *v= cpu, int kvmppc_xive_compute_vp_id(struct kvmppc_xive *xive, u32 cpu, u32 *vp); int kvmppc_xive_set_nr_servers(struct kvmppc_xive *xive, u64 addr); =20 +static inline bool kvmppc_xive_has_single_escalation(struct kvmppc_xive *x= ive) +{ + return xive->flags & KVMPPC_XIVE_FLAG_SINGLE_ESCALATION; +} + #endif /* CONFIG_KVM_XICS */ #endif /* _KVM_PPC_BOOK3S_XICS_H */ diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c index 8cfab3547494..12f101d74b48 100644 --- a/arch/powerpc/kvm/book3s_xive.c +++ b/arch/powerpc/kvm/book3s_xive.c @@ -363,9 +363,9 @@ static int xive_check_provisioning(struct kvm *kvm, u8 = prio) if (!vcpu->arch.xive_vcpu) continue; rc =3D xive_provision_queue(vcpu, prio); - if (rc =3D 0 && !xive->single_escalation) + if (rc =3D 0 && !kvmppc_xive_has_single_escalation(xive)) kvmppc_xive_attach_escalation(vcpu, prio, - xive->single_escalation); + kvmppc_xive_has_single_escalation(xive)); if (rc) return rc; } @@ -1199,7 +1199,7 @@ void kvmppc_xive_cleanup_vcpu(struct kvm_vcpu *vcpu) /* Free escalations */ for (i =3D 0; i < KVMPPC_XIVE_Q_COUNT; i++) { if (xc->esc_virq[i]) { - if (xc->xive->single_escalation) + if (kvmppc_xive_has_single_escalation(xc->xive)) xive_cleanup_single_escalation(vcpu, xc, xc->esc_virq[i]); free_irq(xc->esc_virq[i], vcpu); @@ -1340,7 +1340,7 @@ int kvmppc_xive_connect_vcpu(struct kvm_device *dev, * Enable the VP first as the single escalation mode will * affect escalation interrupts numbering */ - r =3D xive_native_enable_vp(xc->vp_id, xive->single_escalation); + r =3D xive_native_enable_vp(xc->vp_id, kvmppc_xive_has_single_escalation(= xive)); if (r) { pr_err("Failed to enable VP in OPAL, err %d\n", r); goto bail; @@ -1357,15 +1357,15 @@ int kvmppc_xive_connect_vcpu(struct kvm_device *dev, struct xive_q *q =3D &xc->queues[i]; =20 /* Single escalation, no queue 7 */ - if (i =3D 7 && xive->single_escalation) + if (i =3D 7 && kvmppc_xive_has_single_escalation(xive)) break; =20 /* Is queue already enabled ? Provision it */ if (xive->qmap & (1 << i)) { r =3D xive_provision_queue(vcpu, i); - if (r =3D 0 && !xive->single_escalation) + if (r =3D 0 && !kvmppc_xive_has_single_escalation(xive)) kvmppc_xive_attach_escalation( - vcpu, i, xive->single_escalation); + vcpu, i, kvmppc_xive_has_single_escalation(xive)); if (r) goto bail; } else { @@ -1380,7 +1380,7 @@ int kvmppc_xive_connect_vcpu(struct kvm_device *dev, } =20 /* If not done above, attach priority 0 escalation */ - r =3D kvmppc_xive_attach_escalation(vcpu, 0, xive->single_escalation); + r =3D kvmppc_xive_attach_escalation(vcpu, 0, kvmppc_xive_has_single_escal= ation(xive)); if (r) goto bail; =20 @@ -2135,7 +2135,8 @@ static int kvmppc_xive_create(struct kvm_device *dev,= u32 type) */ xive->nr_servers =3D KVM_MAX_VCPUS; =20 - xive->single_escalation =3D xive_native_has_single_escalation(); + if (xive_native_has_single_escalation()) + xive->flags |=3D KVMPPC_XIVE_FLAG_SINGLE_ESCALATION; =20 kvm->arch.xive =3D xive; return 0; diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3= s_xive_native.c index 573ecaab3597..2abb1358a268 100644 --- a/arch/powerpc/kvm/book3s_xive_native.c +++ b/arch/powerpc/kvm/book3s_xive_native.c @@ -93,7 +93,7 @@ void kvmppc_xive_native_cleanup_vcpu(struct kvm_vcpu *vcp= u) for (i =3D 0; i < KVMPPC_XIVE_Q_COUNT; i++) { /* Free the escalation irq */ if (xc->esc_virq[i]) { - if (xc->xive->single_escalation) + if (kvmppc_xive_has_single_escalation(xc->xive)) xive_cleanup_single_escalation(vcpu, xc, xc->esc_virq[i]); free_irq(xc->esc_virq[i], vcpu); @@ -172,7 +172,7 @@ int kvmppc_xive_native_connect_vcpu(struct kvm_device *= dev, * Enable the VP first as the single escalation mode will * affect escalation interrupts numbering */ - rc =3D xive_native_enable_vp(xc->vp_id, xive->single_escalation); + rc =3D xive_native_enable_vp(xc->vp_id, kvmppc_xive_has_single_escalation= (xive)); if (rc) { pr_err("Failed to enable VP in OPAL: %d\n", rc); goto bail; @@ -693,7 +693,7 @@ static int kvmppc_xive_native_set_queue_config(struct k= vmppc_xive *xive, } =20 rc =3D kvmppc_xive_attach_escalation(vcpu, priority, - xive->single_escalation); + kvmppc_xive_has_single_escalation(xive)); error: if (rc) kvmppc_xive_native_cleanup_queue(vcpu, priority); @@ -820,7 +820,7 @@ static int kvmppc_xive_reset(struct kvmppc_xive *xive) for (prio =3D 0; prio < KVMPPC_XIVE_Q_COUNT; prio++) { =20 /* Single escalation, no queue 7 */ - if (prio =3D 7 && xive->single_escalation) + if (prio =3D 7 && kvmppc_xive_has_single_escalation(xive)) break; =20 if (xc->esc_virq[prio]) { @@ -1111,7 +1111,9 @@ static int kvmppc_xive_native_create(struct kvm_devic= e *dev, u32 type) */ xive->nr_servers =3D KVM_MAX_VCPUS; =20 - xive->single_escalation =3D xive_native_has_single_escalation(); + if (xive_native_has_single_escalation()) + xive->flags |=3D KVMPPC_XIVE_FLAG_SINGLE_ESCALATION; + xive->ops =3D &kvmppc_xive_native_ops; =20 kvm->arch.xive =3D xive; --=20 2.31.1