aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2017-09-06 01:20:55 -0400
committerPaul Mackerras <paulus@ozlabs.org>2017-09-12 02:02:07 -0400
commitd222af072380c4470295c07d84ecb15f4937e365 (patch)
tree10fae9caad0faf7928465d2d7cffd892dfc5ce4d
parent5f54c8b2d4fad95d1f8ecbe023ebe6038e6d3760 (diff)
KVM: PPC: Book3S HV: Don't access XIVE PIPR register using byte accesses
The XIVE interrupt controller on POWER9 machines doesn't support byte accesses to any register in the thread management area other than the CPPR (current processor priority register). In particular, when reading the PIPR (pending interrupt priority register), we need to do a 32-bit or 64-bit load. Cc: stable@vger.kernel.org # v4.13 Fixes: 2c4fb78f78b6 ("KVM: PPC: Book3S HV: Workaround POWER9 DD1.0 bug causing IPB bit loss") Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
-rw-r--r--arch/powerpc/kvm/book3s_hv_rm_xive.c1
-rw-r--r--arch/powerpc/kvm/book3s_xive.c1
-rw-r--r--arch/powerpc/kvm/book3s_xive_template.c7
3 files changed, 4 insertions, 5 deletions
diff --git a/arch/powerpc/kvm/book3s_hv_rm_xive.c b/arch/powerpc/kvm/book3s_hv_rm_xive.c
index abf5f01b6eb1..5b81a807d742 100644
--- a/arch/powerpc/kvm/book3s_hv_rm_xive.c
+++ b/arch/powerpc/kvm/book3s_hv_rm_xive.c
@@ -38,7 +38,6 @@ static inline void __iomem *get_tima_phys(void)
38#define __x_tima get_tima_phys() 38#define __x_tima get_tima_phys()
39#define __x_eoi_page(xd) ((void __iomem *)((xd)->eoi_page)) 39#define __x_eoi_page(xd) ((void __iomem *)((xd)->eoi_page))
40#define __x_trig_page(xd) ((void __iomem *)((xd)->trig_page)) 40#define __x_trig_page(xd) ((void __iomem *)((xd)->trig_page))
41#define __x_readb __raw_rm_readb
42#define __x_writeb __raw_rm_writeb 41#define __x_writeb __raw_rm_writeb
43#define __x_readw __raw_rm_readw 42#define __x_readw __raw_rm_readw
44#define __x_readq __raw_rm_readq 43#define __x_readq __raw_rm_readq
diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c
index 08b200a0bbce..13304622ab1c 100644
--- a/arch/powerpc/kvm/book3s_xive.c
+++ b/arch/powerpc/kvm/book3s_xive.c
@@ -48,7 +48,6 @@
48#define __x_tima xive_tima 48#define __x_tima xive_tima
49#define __x_eoi_page(xd) ((void __iomem *)((xd)->eoi_mmio)) 49#define __x_eoi_page(xd) ((void __iomem *)((xd)->eoi_mmio))
50#define __x_trig_page(xd) ((void __iomem *)((xd)->trig_mmio)) 50#define __x_trig_page(xd) ((void __iomem *)((xd)->trig_mmio))
51#define __x_readb __raw_readb
52#define __x_writeb __raw_writeb 51#define __x_writeb __raw_writeb
53#define __x_readw __raw_readw 52#define __x_readw __raw_readw
54#define __x_readq __raw_readq 53#define __x_readq __raw_readq
diff --git a/arch/powerpc/kvm/book3s_xive_template.c b/arch/powerpc/kvm/book3s_xive_template.c
index d1ed2c41b5d2..c7a5deadd1cc 100644
--- a/arch/powerpc/kvm/book3s_xive_template.c
+++ b/arch/powerpc/kvm/book3s_xive_template.c
@@ -28,7 +28,8 @@ static void GLUE(X_PFX,ack_pending)(struct kvmppc_xive_vcpu *xc)
28 * bit. 28 * bit.
29 */ 29 */
30 if (cpu_has_feature(CPU_FTR_POWER9_DD1)) { 30 if (cpu_has_feature(CPU_FTR_POWER9_DD1)) {
31 u8 pipr = __x_readb(__x_tima + TM_QW1_OS + TM_PIPR); 31 __be64 qw1 = __x_readq(__x_tima + TM_QW1_OS);
32 u8 pipr = be64_to_cpu(qw1) & 0xff;
32 if (pipr >= xc->hw_cppr) 33 if (pipr >= xc->hw_cppr)
33 return; 34 return;
34 } 35 }
@@ -336,7 +337,6 @@ X_STATIC unsigned long GLUE(X_PFX,h_ipoll)(struct kvm_vcpu *vcpu, unsigned long
336 struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu; 337 struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
337 u8 pending = xc->pending; 338 u8 pending = xc->pending;
338 u32 hirq; 339 u32 hirq;
339 u8 pipr;
340 340
341 pr_devel("H_IPOLL(server=%ld)\n", server); 341 pr_devel("H_IPOLL(server=%ld)\n", server);
342 342
@@ -353,7 +353,8 @@ X_STATIC unsigned long GLUE(X_PFX,h_ipoll)(struct kvm_vcpu *vcpu, unsigned long
353 pending = 0xff; 353 pending = 0xff;
354 } else { 354 } else {
355 /* Grab pending interrupt if any */ 355 /* Grab pending interrupt if any */
356 pipr = __x_readb(__x_tima + TM_QW1_OS + TM_PIPR); 356 __be64 qw1 = __x_readq(__x_tima + TM_QW1_OS);
357 u8 pipr = be64_to_cpu(qw1) & 0xff;
357 if (pipr < 8) 358 if (pipr < 8)
358 pending |= 1 << pipr; 359 pending |= 1 << pipr;
359 } 360 }