void (*write_pcr)(unsigned long, u64);
u64 (*read_pic)(unsigned long);
void (*write_pic)(unsigned long, u64);
+ u64 (*nmi_picl_value)(unsigned int nmi_hz);
};
extern const struct pcr_ops *pcr_ops;
#define PCR_N2_SL1_SHIFT 27
#define PCR_N2_OV1 0x80000000
-extern unsigned int picl_shift;
-
-/* In order to commonize as much of the implementation as
- * possible, we use PICH as our counter. Mostly this is
- * to accommodate Niagara-1 which can only count insn cycles
- * in PICH.
- */
-static inline u64 picl_value(unsigned int nmi_hz)
-{
- u32 delta = local_cpu_data().clock_tick / (nmi_hz << picl_shift);
-
- return ((u64)((0 - delta) & 0xffffffff)) << 32;
-}
-
extern u64 pcr_enable;
extern int pcr_arch_init(void);
__this_cpu_write(alert_counter, 0);
}
if (__get_cpu_var(wd_enabled)) {
- pcr_ops->write_pic(0, picl_value(nmi_hz));
+ pcr_ops->write_pic(0, pcr_ops->nmi_picl_value(nmi_hz));
pcr_ops->write_pcr(0, pcr_enable);
}
atomic_inc(&nmi_active);
pcr_ops->write_pcr(0, PCR_PIC_PRIV);
- pcr_ops->write_pic(0, picl_value(nmi_hz));
+ pcr_ops->write_pic(0, pcr_ops->nmi_picl_value(nmi_hz));
pcr_ops->write_pcr(0, pcr_enable);
}
return;
pcr_ops->write_pcr(0, PCR_PIC_PRIV);
- pcr_ops->write_pic(0, picl_value(nmi_hz));
+ pcr_ops->write_pic(0, pcr_ops->nmi_picl_value(nmi_hz));
pcr_ops->write_pcr(0, pcr_enable);
}
(0xff << PCR_N2_MASK1_SHIFT))
u64 pcr_enable;
-unsigned int picl_shift;
/* Performance counter interrupts run unmasked at PIL level 15.
* Therefore we can't do things like wakeups and other work
"rd %%pic, %%g0" : : "r" (val));
}
+static u64 direct_picl_value(unsigned int nmi_hz)
+{
+ u32 delta = local_cpu_data().clock_tick / nmi_hz;
+
+ return ((u64)((0 - delta) & 0xffffffff)) << 32;
+}
+
static const struct pcr_ops direct_pcr_ops = {
.read_pcr = direct_pcr_read,
.write_pcr = direct_pcr_write,
.read_pic = direct_pic_read,
.write_pic = direct_pic_write,
+ .nmi_picl_value = direct_picl_value,
};
static void n2_pcr_write(unsigned long reg_num, u64 val)
direct_pcr_write(reg_num, val);
}
+static u64 n2_picl_value(unsigned int nmi_hz)
+{
+ u32 delta = local_cpu_data().clock_tick / (nmi_hz << 2);
+
+ return ((u64)((0 - delta) & 0xffffffff)) << 32;
+}
+
static const struct pcr_ops n2_pcr_ops = {
.read_pcr = direct_pcr_read,
.write_pcr = n2_pcr_write,
.read_pic = direct_pic_read,
.write_pic = direct_pic_write,
+ .nmi_picl_value = n2_picl_value,
};
static unsigned long perf_hsvc_group;
case hypervisor:
pcr_ops = &n2_pcr_ops;
pcr_enable = PCR_N2_ENABLE;
- picl_shift = 2;
break;
case cheetah: