]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
platform/x86/intel-uncore-freq: Add attributes to show die_id
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Thu, 8 May 2025 23:02:41 +0000 (16:02 -0700)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Thu, 15 May 2025 11:47:27 +0000 (14:47 +0300)
For domains with agents to control cores (compute dies) show matching
Linux CPU die ID. Linux CPU ID is a logical die ID, so this may not match
physical die ID or domain_id. So, a mapping is required to get Linux CPU
die ID. This attribute is only presented when CPUID enumerates die ids.

This attribute can be used by orchestration software like Kubernetes to
target specific dies for uncore frequency control.

Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://lore.kernel.org/r/20250508230250.1186619-5-srinivas.pandruvada@linux.intel.com
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c
drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.h
drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c

index 9bc84962e2d548c334658b709427ad6ea7156699..0f8aea18275b0906f67686c366c8b2711273d29c 100644 (file)
@@ -143,6 +143,8 @@ show_uncore_attr(elc_high_threshold_enable,
                 UNCORE_INDEX_EFF_LAT_CTRL_HIGH_THRESHOLD_ENABLE);
 show_uncore_attr(elc_floor_freq_khz, UNCORE_INDEX_EFF_LAT_CTRL_FREQ);
 
+show_uncore_attr(die_id, UNCORE_INDEX_DIE_ID);
+
 #define show_uncore_data(member_name)                                  \
        static ssize_t show_##member_name(struct kobject *kobj, \
                                           struct kobj_attribute *attr, char *buf)\
@@ -206,6 +208,11 @@ static int create_attr_group(struct uncore_data *data, char *name)
                        init_attribute_ro(agent_types);
                        data->uncore_attrs[index++] = &data->agent_types_kobj_attr.attr;
                }
+               if (topology_max_dies_per_package() > 1 &&
+                   data->agent_type_mask & AGENT_TYPE_CORE) {
+                       init_attribute_ro(die_id);
+                       data->uncore_attrs[index++] = &data->die_id_kobj_attr.attr;
+               }
        }
 
        data->uncore_attrs[index++] = &data->max_freq_khz_kobj_attr.attr;
index a638d2e1e83a7e7970e00b7b1d9704de44497226..70ae11519837ee23c173c91161cfba806580f35d 100644 (file)
@@ -88,7 +88,8 @@ struct uncore_data {
        struct kobj_attribute elc_high_threshold_enable_kobj_attr;
        struct kobj_attribute elc_floor_freq_khz_kobj_attr;
        struct kobj_attribute agent_types_kobj_attr;
-       struct attribute *uncore_attrs[14];
+       struct kobj_attribute die_id_kobj_attr;
+       struct attribute *uncore_attrs[15];
 };
 
 #define UNCORE_DOMAIN_ID_INVALID       -1
@@ -101,6 +102,7 @@ enum uncore_index {
        UNCORE_INDEX_EFF_LAT_CTRL_HIGH_THRESHOLD,
        UNCORE_INDEX_EFF_LAT_CTRL_HIGH_THRESHOLD_ENABLE,
        UNCORE_INDEX_EFF_LAT_CTRL_FREQ,
+       UNCORE_INDEX_DIE_ID,
 };
 
 int uncore_freq_common_init(int (*read)(struct uncore_data *data, unsigned int *value,
index 8ebf6856fa7d88fef6606c527bb7aa73cf3e89ca..1c7b2f2716ca085ce4e9fcd1793d173d3b8bad0f 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/module.h>
 #include <linux/intel_tpmi.h>
 
+#include "../tpmi_power_domains.h"
 #include "uncore-frequency-common.h"
 
 #define        UNCORE_MAJOR_VERSION            0
@@ -49,6 +50,7 @@ struct tpmi_uncore_cluster_info {
        bool root_domain;
        bool elc_supported;
        u8 __iomem *cluster_base;
+       u16 cdie_id;
        struct uncore_data uncore_data;
        struct tpmi_uncore_struct *uncore_root;
 };
@@ -369,6 +371,9 @@ static void uncore_set_agent_type(struct tpmi_uncore_cluster_info *cluster_info)
 /* Callback for sysfs read for TPMI uncore values. Called under mutex locks. */
 static int uncore_read(struct uncore_data *data, unsigned int *value, enum uncore_index index)
 {
+       struct tpmi_uncore_cluster_info *cluster_info;
+       int ret;
+
        switch (index) {
        case UNCORE_INDEX_MIN_FREQ:
        case UNCORE_INDEX_MAX_FREQ:
@@ -383,6 +388,16 @@ static int uncore_read(struct uncore_data *data, unsigned int *value, enum uncor
        case UNCORE_INDEX_EFF_LAT_CTRL_FREQ:
                return read_eff_lat_ctrl(data, value, index);
 
+       case UNCORE_INDEX_DIE_ID:
+               cluster_info = container_of(data, struct tpmi_uncore_cluster_info, uncore_data);
+               ret = tpmi_get_linux_die_id(cluster_info->uncore_data.package_id,
+                                           cluster_info->cdie_id);
+               if (ret < 0)
+                       return ret;
+
+               *value = ret;
+               return 0;
+
        default:
                break;
        }
@@ -432,6 +447,16 @@ static void remove_cluster_entries(struct tpmi_uncore_struct *tpmi_uncore)
        }
 }
 
+static void set_cdie_id(int domain_id, struct tpmi_uncore_cluster_info *cluster_info,
+                      struct intel_tpmi_plat_info *plat_info)
+{
+
+       cluster_info->cdie_id = domain_id;
+
+       if (plat_info->cdie_mask && cluster_info->uncore_data.agent_type_mask & AGENT_TYPE_CORE)
+               cluster_info->cdie_id = domain_id + ffs(plat_info->cdie_mask) - 1;
+}
+
 #define UNCORE_VERSION_MASK                    GENMASK_ULL(7, 0)
 #define UNCORE_LOCAL_FABRIC_CLUSTER_ID_MASK    GENMASK_ULL(15, 8)
 #define UNCORE_CLUSTER_OFF_MASK                        GENMASK_ULL(7, 0)
@@ -579,6 +604,8 @@ static int uncore_probe(struct auxiliary_device *auxdev, const struct auxiliary_
                        cluster_info->uncore_data.domain_id = i;
                        cluster_info->uncore_data.cluster_id = j;
 
+                       set_cdie_id(i, cluster_info, plat_info);
+
                        cluster_info->uncore_root = tpmi_uncore;
 
                        if (TPMI_MINOR_VERSION(pd_info->ufs_header_ver) >= UNCORE_ELC_SUPPORTED_VERSION)
@@ -652,5 +679,6 @@ module_auxiliary_driver(intel_uncore_aux_driver);
 
 MODULE_IMPORT_NS("INTEL_TPMI");
 MODULE_IMPORT_NS("INTEL_UNCORE_FREQUENCY");
+MODULE_IMPORT_NS("INTEL_TPMI_POWER_DOMAIN");
 MODULE_DESCRIPTION("Intel TPMI UFS Driver");
 MODULE_LICENSE("GPL");