--- a/usr/src/uts/sun4v/pcbe/niagara2_pcbe.c Fri Mar 26 15:39:18 2010 -0700
+++ b/usr/src/uts/sun4v/pcbe/niagara2_pcbe.c Fri Mar 26 16:54:05 2010 -0700
@@ -105,6 +105,9 @@
extern uint64_t ultra_gettick(void);
extern char cpu_module_name[];
+#define L2_dmiss_ld_event 0x320
+int pcbe_l2dmiss_ovtrap_enable = 0;
+
pcbe_ops_t ni2_pcbe_ops = {
PCBE_VER_1,
CPC_CAP_OVERFLOW_INTERRUPT | CPC_CAP_OVERFLOW_PRECISE,
@@ -669,6 +672,19 @@
if (pic0->pcbe_flags & CPC_COUNT_SAMPLE_MODE)
pcr |= (1ull << CPC_PCR_SAMPLE_MODE_SHIFT);
#endif
+
+ if (pcbe_l2dmiss_ovtrap_enable == 0) {
+ /*
+ * SW workaround for HW Erratum 108.
+ * Disable overflow interrupts when L2_dmiss_ld event is
+ * selected.
+ */
+ if ((pic0->pcbe_evsel & L2_dmiss_ld_event) == L2_dmiss_ld_event)
+ toe &= ~CPC_PCR_TOE0;
+
+ if ((pic1->pcbe_evsel & L2_dmiss_ld_event) == L2_dmiss_ld_event)
+ toe &= ~CPC_PCR_TOE1;
+ }
pcr |= toe;
DTRACE_PROBE1(niagara2__setpcr, uint64_t, pcr);