]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86,fs/resctrl: Fill in details of events for performance and energy GUIDs
authorTony Luck <tony.luck@intel.com>
Wed, 17 Dec 2025 17:21:04 +0000 (09:21 -0800)
committerBorislav Petkov (AMD) <bp@alien8.de>
Fri, 9 Jan 2026 15:37:07 +0000 (16:37 +0100)
The telemetry event aggregators of the Intel Clearwater Forest CPU support two
RMID-based feature types: "energy" with GUID 0x26696143¹, and "perf" with
GUID 0x26557651².

The event counter offsets in an aggregator's MMIO space are arranged in groups
for each RMID.

E.g., the "energy" counters for GUID 0x26696143 are arranged like this:

  MMIO offset:0x0000 Counter for RMID 0 PMT_EVENT_ENERGY
  MMIO offset:0x0008 Counter for RMID 0 PMT_EVENT_ACTIVITY
  MMIO offset:0x0010 Counter for RMID 1 PMT_EVENT_ENERGY
  MMIO offset:0x0018 Counter for RMID 1 PMT_EVENT_ACTIVITY
  ...
  MMIO offset:0x23F0 Counter for RMID 575 PMT_EVENT_ENERGY
  MMIO offset:0x23F8 Counter for RMID 575 PMT_EVENT_ACTIVITY

After all counters there are three status registers that provide indications
of how many times an aggregator was unable to process event counts, the time
stamp for the most recent loss of data, and the time stamp of the most recent
successful update.

  MMIO offset:0x2400 AGG_DATA_LOSS_COUNT
  MMIO offset:0x2408 AGG_DATA_LOSS_TIMESTAMP
  MMIO offset:0x2410 LAST_UPDATE_TIMESTAMP

Define event_group structures for both of these aggregator types and define
the events tracked by the aggregators in the file system code.

PMT_EVENT_ENERGY and PMT_EVENT_ACTIVITY are produced in fixed point format.
File system code must output as floating point values.

  ¹https://github.com/intel/Intel-PMT/blob/main/xml/CWF/OOBMSM/RMID-ENERGY/cwf_aggregator.xml
  ²https://github.com/intel/Intel-PMT/blob/main/xml/CWF/OOBMSM/RMID-PERF/cwf_aggregator.xml

  [ bp: Massage commit message. ]

Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Link: https://lore.kernel.org/20251217172121.12030-1-tony.luck@intel.com
arch/x86/kernel/cpu/resctrl/intel_aet.c
fs/resctrl/monitor.c
include/linux/resctrl_types.h

index 404564739befe2ca63247bf0800b8ddd2b6f454d..8e042b530c914d5942a57624961b94fff4e3a6d4 100644 (file)
 
 #define pr_fmt(fmt)   "resctrl: " fmt
 
+#include <linux/compiler_types.h>
 #include <linux/err.h>
 #include <linux/init.h>
 #include <linux/intel_pmt_features.h>
 #include <linux/intel_vsec.h>
 #include <linux/resctrl.h>
+#include <linux/resctrl_types.h>
 #include <linux/stddef.h>
+#include <linux/types.h>
 
 #include "internal.h"
 
+/**
+ * struct pmt_event - Telemetry event.
+ * @id:                Resctrl event id.
+ * @idx:       Counter index within each per-RMID block of counters.
+ * @bin_bits:  Zero for integer valued events, else number bits in fraction
+ *             part of fixed-point.
+ */
+struct pmt_event {
+       enum resctrl_event_id   id;
+       unsigned int            idx;
+       unsigned int            bin_bits;
+};
+
+#define EVT(_id, _idx, _bits) { .id = _id, .idx = _idx, .bin_bits = _bits }
+
 /**
  * struct event_group - Events with the same feature type ("energy" or "perf") and GUID.
  * @pfname:            PMT feature name ("energy" or "perf") of this event group.
  *                     data for all telemetry regions of type @pfname.
  *                     Valid if the system supports the event group,
  *                     NULL otherwise.
+ * @guid:              Unique number per XML description file.
+ * @mmio_size:         Number of bytes of MMIO registers for this group.
+ * @num_events:                Number of events in this group.
+ * @evts:              Array of event descriptors.
  */
 struct event_group {
        /* Data fields for additional structures to manage this group. */
        const char                      *pfname;
        struct pmt_feature_group        *pfg;
+
+       /* Remaining fields initialized from XML file. */
+       u32                             guid;
+       size_t                          mmio_size;
+       unsigned int                    num_events;
+       struct pmt_event                evts[] __counted_by(num_events);
+};
+
+#define XML_MMIO_SIZE(num_rmids, num_events, num_extra_status) \
+                     (((num_rmids) * (num_events) + (num_extra_status)) * sizeof(u64))
+
+/*
+ * Link: https://github.com/intel/Intel-PMT/blob/main/xml/CWF/OOBMSM/RMID-ENERGY/cwf_aggregator.xml
+ */
+static struct event_group energy_0x26696143 = {
+       .pfname         = "energy",
+       .guid           = 0x26696143,
+       .mmio_size      = XML_MMIO_SIZE(576, 2, 3),
+       .num_events     = 2,
+       .evts           = {
+               EVT(PMT_EVENT_ENERGY, 0, 18),
+               EVT(PMT_EVENT_ACTIVITY, 1, 18),
+       }
+};
+
+/*
+ * Link: https://github.com/intel/Intel-PMT/blob/main/xml/CWF/OOBMSM/RMID-PERF/cwf_aggregator.xml
+ */
+static struct event_group perf_0x26557651 = {
+       .pfname         = "perf",
+       .guid           = 0x26557651,
+       .mmio_size      = XML_MMIO_SIZE(576, 7, 3),
+       .num_events     = 7,
+       .evts           = {
+               EVT(PMT_EVENT_STALLS_LLC_HIT, 0, 0),
+               EVT(PMT_EVENT_C1_RES, 1, 0),
+               EVT(PMT_EVENT_UNHALTED_CORE_CYCLES, 2, 0),
+               EVT(PMT_EVENT_STALLS_LLC_MISS, 3, 0),
+               EVT(PMT_EVENT_AUTO_C6_RES, 4, 0),
+               EVT(PMT_EVENT_UNHALTED_REF_CYCLES, 5, 0),
+               EVT(PMT_EVENT_UOPS_RETIRED, 6, 0),
+       }
 };
 
 static struct event_group *known_event_groups[] = {
+       &energy_0x26696143,
+       &perf_0x26557651,
 };
 
 #define for_each_event_group(_peg)                                             \
index 844cf6875f60747bd89ae664af451cadd3101848..9729acacdc1979b9b26321f487510bdcfbc03405 100644 (file)
@@ -965,27 +965,32 @@ out_unlock:
        mutex_unlock(&rdtgroup_mutex);
 }
 
+#define MON_EVENT(_eventid, _name, _res, _fp)  \
+       [_eventid] = {                          \
+       .name                   = _name,        \
+       .evtid                  = _eventid,     \
+       .rid                    = _res,         \
+       .is_floating_point      = _fp,          \
+}
+
 /*
  * All available events. Architecture code marks the ones that
  * are supported by a system using resctrl_enable_mon_event()
  * to set .enabled.
  */
 struct mon_evt mon_event_all[QOS_NUM_EVENTS] = {
-       [QOS_L3_OCCUP_EVENT_ID] = {
-               .name   = "llc_occupancy",
-               .evtid  = QOS_L3_OCCUP_EVENT_ID,
-               .rid    = RDT_RESOURCE_L3,
-       },
-       [QOS_L3_MBM_TOTAL_EVENT_ID] = {
-               .name   = "mbm_total_bytes",
-               .evtid  = QOS_L3_MBM_TOTAL_EVENT_ID,
-               .rid    = RDT_RESOURCE_L3,
-       },
-       [QOS_L3_MBM_LOCAL_EVENT_ID] = {
-               .name   = "mbm_local_bytes",
-               .evtid  = QOS_L3_MBM_LOCAL_EVENT_ID,
-               .rid    = RDT_RESOURCE_L3,
-       },
+       MON_EVENT(QOS_L3_OCCUP_EVENT_ID,                "llc_occupancy",        RDT_RESOURCE_L3,        false),
+       MON_EVENT(QOS_L3_MBM_TOTAL_EVENT_ID,            "mbm_total_bytes",      RDT_RESOURCE_L3,        false),
+       MON_EVENT(QOS_L3_MBM_LOCAL_EVENT_ID,            "mbm_local_bytes",      RDT_RESOURCE_L3,        false),
+       MON_EVENT(PMT_EVENT_ENERGY,                     "core_energy",          RDT_RESOURCE_PERF_PKG,  true),
+       MON_EVENT(PMT_EVENT_ACTIVITY,                   "activity",             RDT_RESOURCE_PERF_PKG,  true),
+       MON_EVENT(PMT_EVENT_STALLS_LLC_HIT,             "stalls_llc_hit",       RDT_RESOURCE_PERF_PKG,  false),
+       MON_EVENT(PMT_EVENT_C1_RES,                     "c1_res",               RDT_RESOURCE_PERF_PKG,  false),
+       MON_EVENT(PMT_EVENT_UNHALTED_CORE_CYCLES,       "unhalted_core_cycles", RDT_RESOURCE_PERF_PKG,  false),
+       MON_EVENT(PMT_EVENT_STALLS_LLC_MISS,            "stalls_llc_miss",      RDT_RESOURCE_PERF_PKG,  false),
+       MON_EVENT(PMT_EVENT_AUTO_C6_RES,                "c6_res",               RDT_RESOURCE_PERF_PKG,  false),
+       MON_EVENT(PMT_EVENT_UNHALTED_REF_CYCLES,        "unhalted_ref_cycles",  RDT_RESOURCE_PERF_PKG,  false),
+       MON_EVENT(PMT_EVENT_UOPS_RETIRED,               "uops_retired",         RDT_RESOURCE_PERF_PKG,  false),
 };
 
 void resctrl_enable_mon_event(enum resctrl_event_id eventid, bool any_cpu, unsigned int binary_bits)
index acfe07860b346c00518cc394b5b4d6d20703295b..a5f56faa18d22ff5d86eaa2bd5d9712a94c8eb9b 100644 (file)
@@ -50,6 +50,17 @@ enum resctrl_event_id {
        QOS_L3_MBM_TOTAL_EVENT_ID       = 0x02,
        QOS_L3_MBM_LOCAL_EVENT_ID       = 0x03,
 
+       /* Intel Telemetry Events */
+       PMT_EVENT_ENERGY,
+       PMT_EVENT_ACTIVITY,
+       PMT_EVENT_STALLS_LLC_HIT,
+       PMT_EVENT_C1_RES,
+       PMT_EVENT_UNHALTED_CORE_CYCLES,
+       PMT_EVENT_STALLS_LLC_MISS,
+       PMT_EVENT_AUTO_C6_RES,
+       PMT_EVENT_UNHALTED_REF_CYCLES,
+       PMT_EVENT_UOPS_RETIRED,
+
        /* Must be the last */
        QOS_NUM_EVENTS,
 };