|
@@ -705,6 +705,31 @@ static int p4_validate_raw_event(struct perf_event *event)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void p4_hw_watchdog_set_attr(struct perf_event_attr *wd_attr)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Watchdog ticks are special on Netburst, we use
|
|
|
+ * that named "non-sleeping" ticks as recommended
|
|
|
+ * by Intel SDM Vol3b.
|
|
|
+ */
|
|
|
+ WARN_ON_ONCE(wd_attr->type != PERF_TYPE_HARDWARE ||
|
|
|
+ wd_attr->config != PERF_COUNT_HW_CPU_CYCLES);
|
|
|
+
|
|
|
+ wd_attr->type = PERF_TYPE_RAW;
|
|
|
+ wd_attr->config =
|
|
|
+ p4_config_pack_escr(P4_ESCR_EVENT(P4_EVENT_EXECUTION_EVENT) |
|
|
|
+ P4_ESCR_EMASK_BIT(P4_EVENT_EXECUTION_EVENT, NBOGUS0) |
|
|
|
+ P4_ESCR_EMASK_BIT(P4_EVENT_EXECUTION_EVENT, NBOGUS1) |
|
|
|
+ P4_ESCR_EMASK_BIT(P4_EVENT_EXECUTION_EVENT, NBOGUS2) |
|
|
|
+ P4_ESCR_EMASK_BIT(P4_EVENT_EXECUTION_EVENT, NBOGUS3) |
|
|
|
+ P4_ESCR_EMASK_BIT(P4_EVENT_EXECUTION_EVENT, BOGUS0) |
|
|
|
+ P4_ESCR_EMASK_BIT(P4_EVENT_EXECUTION_EVENT, BOGUS1) |
|
|
|
+ P4_ESCR_EMASK_BIT(P4_EVENT_EXECUTION_EVENT, BOGUS2) |
|
|
|
+ P4_ESCR_EMASK_BIT(P4_EVENT_EXECUTION_EVENT, BOGUS3)) |
|
|
|
+ p4_config_pack_cccr(P4_CCCR_THRESHOLD(15) | P4_CCCR_COMPLEMENT |
|
|
|
+ P4_CCCR_COMPARE);
|
|
|
+}
|
|
|
+
|
|
|
static int p4_hw_config(struct perf_event *event)
|
|
|
{
|
|
|
int cpu = get_cpu();
|
|
@@ -1179,6 +1204,7 @@ static __initconst const struct x86_pmu p4_pmu = {
|
|
|
.cntval_bits = ARCH_P4_CNTRVAL_BITS,
|
|
|
.cntval_mask = ARCH_P4_CNTRVAL_MASK,
|
|
|
.max_period = (1ULL << (ARCH_P4_CNTRVAL_BITS - 1)) - 1,
|
|
|
+ .hw_watchdog_set_attr = p4_hw_watchdog_set_attr,
|
|
|
.hw_config = p4_hw_config,
|
|
|
.schedule_events = p4_pmu_schedule_events,
|
|
|
/*
|