return;
 
                idx = INTEL_PMC_IDX_FIXED_SLOTS;
+
+               if (event->attr.config1 & INTEL_TD_CFG_METRIC_CLEAR)
+                       bits |= INTEL_FIXED_3_METRICS_CLEAR;
        }
 
        intel_set_masks(event, idx);
         * is used in a metrics group, it too cannot support sampling.
         */
        if (intel_pmu_has_cap(event, PERF_CAP_METRICS_IDX) && is_topdown_event(event)) {
-               if (event->attr.config1 || event->attr.config2)
+               /* The metrics_clear can only be set for the slots event */
+               if (event->attr.config1 &&
+                   (!is_slots_event(event) || (event->attr.config1 & ~INTEL_TD_CFG_METRIC_CLEAR)))
+                       return -EINVAL;
+
+               if (event->attr.config2)
                        return -EINVAL;
 
                /*
 PMU_FORMAT_ATTR(in_tx_cp, "config:33"  );
 PMU_FORMAT_ATTR(eq,    "config:36"     ); /* v6 + */
 
+PMU_FORMAT_ATTR(metrics_clear, "config1:0"); /* PERF_CAPABILITIES.RDPMC_METRICS_CLEAR */
+
 static ssize_t umask2_show(struct device *dev,
                           struct device_attribute *attr,
                           char *page)
 static struct attribute *format_evtsel_ext_attrs[] = {
        &format_attr_umask2.attr,
        &format_attr_eq.attr,
+       &format_attr_metrics_clear.attr,
        NULL
 };
 
        if (i == 1)
                return (mask & ARCH_PERFMON_EVENTSEL_EQ) ? attr->mode : 0;
 
+       /* PERF_CAPABILITIES.RDPMC_METRICS_CLEAR */
+       if (i == 2) {
+               union perf_capabilities intel_cap = hybrid(dev_get_drvdata(dev), intel_cap);
+
+               return intel_cap.rdpmc_metrics_clear ? attr->mode : 0;
+       }
+
        return 0;
 }
 
 
 #define INTEL_FIXED_0_USER                             (1ULL << 1)
 #define INTEL_FIXED_0_ANYTHREAD                        (1ULL << 2)
 #define INTEL_FIXED_0_ENABLE_PMI                       (1ULL << 3)
+#define INTEL_FIXED_3_METRICS_CLEAR                    (1ULL << 2)
 
 #define HSW_IN_TX                                      (1ULL << 32)
 #define HSW_IN_TX_CHECKPOINTED                         (1ULL << 33)
 #define INTEL_TD_METRIC_MAX                    INTEL_TD_METRIC_MEM_BOUND
 #define INTEL_TD_METRIC_NUM                    8
 
+#define INTEL_TD_CFG_METRIC_CLEAR_BIT          0
+#define INTEL_TD_CFG_METRIC_CLEAR              BIT_ULL(INTEL_TD_CFG_METRIC_CLEAR_BIT)
+
 static inline bool is_metric_idx(int idx)
 {
        return (unsigned)(idx - INTEL_PMC_IDX_METRIC_BASE) < INTEL_TD_METRIC_NUM;