Skip to content

Commit

Permalink
KVM: PPC: Book3S HV: Workaround POWER9 DD1.0 bug causing IPB bit loss
Browse files Browse the repository at this point in the history
This adds a workaround for a bug in POWER9 DD1 chips where changing
the CPPR (Current Processor Priority Register) can cause bits in the
IPB (Interrupt Pending Buffer) to get lost.  Thankfully it only
happens when manually manipulating CPPR which is quite rare.  When it
does happen it can cause interrupts to be delayed or lost.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
  • Loading branch information
Benjamin Herrenschmidt authored and Paul Mackerras committed Aug 24, 2017
1 parent bd0fdb1 commit 2c4fb78
Showing 1 changed file with 10 additions and 1 deletion.
11 changes: 10 additions & 1 deletion arch/powerpc/kvm/book3s_xive_template.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,16 @@ static void GLUE(X_PFX,ack_pending)(struct kvmppc_xive_vcpu *xc)
u8 cppr;
u16 ack;

/* XXX DD1 bug workaround: Check PIPR vs. CPPR first ! */
/*
* DD1 bug workaround: If PIPR is less favored than CPPR
* ignore the interrupt or we might incorrectly lose an IPB
* bit.
*/
if (cpu_has_feature(CPU_FTR_POWER9_DD1)) {
u8 pipr = __x_readb(__x_tima + TM_QW1_OS + TM_PIPR);
if (pipr >= xc->hw_cppr)
return;
}

/* Perform the acknowledge OS to register cycle. */
ack = be16_to_cpu(__x_readw(__x_tima + TM_SPC_ACK_OS_REG));
Expand Down

0 comments on commit 2c4fb78

Please sign in to comment.