public inbox for linux-doc@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs
@ 2026-04-08 16:27 Maciej Wieczor-Retman
  2026-04-08 16:27 ` [PATCH v3 1/2] platform/x86/intel-uncore-freq: Rename instance_id Maciej Wieczor-Retman
  2026-04-08 16:27 ` [PATCH v3 2/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs Maciej Wieczor-Retman
  0 siblings, 2 replies; 5+ messages in thread
From: Maciej Wieczor-Retman @ 2026-04-08 16:27 UTC (permalink / raw)
  To: skhan, ilpo.jarvinen, hansg, corbet, srinivas.pandruvada
  Cc: linux-kernel, platform-driver-x86, linux-doc, m.wieczorretman

--- Motivation

This patchset is about exporting instance ID, a value used to uniquely
identify MMIO blocks in TPMI devices. Userspace tools like "pepc" [1]
can use it for direct MMIO reads or writes.

Currently exported information allows doing this on non-partitioned
systems, but partitioned systems require additional steps to map MMIO
blocks.

[1] https://github.com/intel/pepc

--- Background

* TPMI MMIO organization
For each TPMI device a direct register access is possible through MMIO
mapped blocks, where:
- Each block belongs to a different power domain.
- Each power domain is exposed in sysfs via a domain_id attribute.
- Power domain scope is per-die (either IO dies or compute dies).
- Compute die blocks are ordered first, before IO die blocks in
  MMIO space.

* Domain ID mapping
For compute dies, the mapping is architectural through a CPUID leaf or
via MSR 0x54:
- Compute die IDs directly correspond to CPU die IDs
- CPU die ID can be obtained from MSR 0x54 or recent CPUID leaves
- Example: domain_id equal to 1 applies to all CPUs with die ID 1

* IO die mapping
For IO dies, the relationship is generation/platform specific. It's
generally not recommended to assume any specific IO organization but
uncore sysfs provides an attribute to differentiate die types.

* Partitioning
In partitioned systems multiple TPMI devices exist per package. However
CPUs are still enumerated package-wide and so die IDs (domain_id) are
unique per-package. For example a single partition (single TPMI device)
Granite Rapids might order its dies in the following way:

+---------------------+-----------+
| Die type and number | Domain ID |
+---------------------+-----------+
| Compute die 0	      |         0 |
| Compute die 1       |         1 |
| IO die 0            |         2 |
| IO die 1            |         3 |
+---------------------+-----------+

While a two partition system may be numbered in this way:

+---------------------+-------------+-------------+
| Die type and number |         Domain ID         |
| local in single     +-------------+-------------+
| partition scope     | Partition 0 | Partition 1 |
+---------------------+-------------+-------------+
| Compute die 0	      |           0 |           2 |
| Compute die 1       |           1 |           3 |
| IO die 0            |           4 |           6 |
| IO die 1            |           5 |           7 |
+---------------------+-------------+-------------+

The cd_mask value from the TPMI bus info register can show using a
bitmap which compute dies belong to which partition.

* Instance ID
Partition ID is not an architectural value, meaning there is no CPUID or
MSR to map a CPU to a partition number. Therefore to allow mapping CPUs
to compute dies as well as mapping TPMI registers in MMIO mapped space
two numbers need to be exported:
- domain_id
	- Whether the system is partitioned or not it still allows
	  mapping CPUs to compute die IDs.
- instance_id
	- A per-partition (and hence per-device) physical index to still
	  allow mapping MMIO blocks to both compute and IO dies. On
	  partitioned systems mapping IO dies would be very difficult
	  since they are only indexed after all the compute dies are
	  numbered.

As one can see, on non-partitioned systems the instance ID and domain ID
have the same value. It's only on partitioned systems that both values
are needed to keep all mapping functionality. To better show the
relationship this is how values on a partitioned system can look:

+---------------------+-------------+-------------+-------------+-------------+
| Die type and number |         Domain ID         |        Instance ID        |
| local in single     +-------------+-------------+-------------+-------------+
| partition scope     | Partition 0 | Partition 1 | Partition 0 | Partition 1 |
+---------------------+-------------+-------------+-------------+-------------+
| Compute die 0	      |           0 |           2 |           0 |           0 |
| Compute die 1       |           1 |           3 |           1 |           1 |
| IO die 0            |           4 |           6 |           2 |           2 |
| IO die 1            |           5 |           7 |           3 |           3 |
+---------------------+-------------+-------------+-------------+-------------+

Changes in v3:
- Remove sentence from the cover letter claiming that the motivation was
  to replace doing the same thing through MSRs - that was deprecated and
  it's not available.
- sprintf() -> sysfs_emit() in show_instance_id().
- static -> static inline in set_instance_id().
- Small correction to 2/2 patch message.

Maciej Wieczor-Retman (2):
  platform/x86/intel-uncore-freq: Rename instance_id
  platform/x86/intel-uncore-freq: Expose instance ID in the sysfs

 .../pm/intel_uncore_frequency_scaling.rst        |  7 +++++++
 .../uncore-frequency/uncore-frequency-common.c   | 16 +++++++++++++---
 .../uncore-frequency/uncore-frequency-common.h   |  8 ++++++--
 .../uncore-frequency/uncore-frequency-tpmi.c     | 15 ++++++++++++++-
 4 files changed, 40 insertions(+), 6 deletions(-)

-- 
2.53.0



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v3 1/2] platform/x86/intel-uncore-freq: Rename instance_id
  2026-04-08 16:27 [PATCH v3 0/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs Maciej Wieczor-Retman
@ 2026-04-08 16:27 ` Maciej Wieczor-Retman
  2026-04-22 15:49   ` srinivas pandruvada
  2026-04-08 16:27 ` [PATCH v3 2/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs Maciej Wieczor-Retman
  1 sibling, 1 reply; 5+ messages in thread
From: Maciej Wieczor-Retman @ 2026-04-08 16:27 UTC (permalink / raw)
  To: skhan, ilpo.jarvinen, hansg, corbet, srinivas.pandruvada
  Cc: linux-kernel, platform-driver-x86, linux-doc, m.wieczorretman,
	Maciej Wieczor-Retman

From: Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>

The "instance" word has a specific meaning in TPMI. It is a physical
index related to compute dies and IO dies present on a single TPMI
partition (which is also a single TPMI device). It's used for mapping
MMIO blocks for direct TPMI register access.

The currently used "instance_id" uncore_data struct field is a
sequentially generated value that's used for appending to uncore
directories inside the /sys/devices/system/cpu/intel_uncore_frequency
directory. It has no relation to the physical TPMI elements.

Signed-off-by: Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
Changelog v3:
- Add Srinivas' Acked-by.

Changelog v2:
- Redid the first paragraph to better describe what "instance" is.
- Rename seqname_id to seqnum_id to emphasize it's a sequential number
  not sequential name.

 .../x86/intel/uncore-frequency/uncore-frequency-common.c    | 6 +++---
 .../x86/intel/uncore-frequency/uncore-frequency-common.h    | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c
index 7070c94324e0..25ab511ed8d2 100644
--- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c
+++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c
@@ -268,7 +268,7 @@ int uncore_freq_add_entry(struct uncore_data *data, int cpu)
 		if (ret < 0)
 			goto uncore_unlock;
 
-		data->instance_id = ret;
+		data->seqnum_id = ret;
 		scnprintf(data->name, sizeof(data->name), "uncore%02d", ret);
 	} else {
 		scnprintf(data->name, sizeof(data->name), "package_%02d_die_%02d",
@@ -281,7 +281,7 @@ int uncore_freq_add_entry(struct uncore_data *data, int cpu)
 	ret = create_attr_group(data, data->name);
 	if (ret) {
 		if (data->domain_id != UNCORE_DOMAIN_ID_INVALID)
-			ida_free(&intel_uncore_ida, data->instance_id);
+			ida_free(&intel_uncore_ida, data->seqnum_id);
 	} else {
 		data->control_cpu = cpu;
 		data->valid = true;
@@ -301,7 +301,7 @@ void uncore_freq_remove_die_entry(struct uncore_data *data)
 	data->control_cpu = -1;
 	data->valid = false;
 	if (data->domain_id != UNCORE_DOMAIN_ID_INVALID)
-		ida_free(&intel_uncore_ida, data->instance_id);
+		ida_free(&intel_uncore_ida, data->seqnum_id);
 
 	mutex_unlock(&uncore_lock);
 }
diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.h b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.h
index 0abe850ef54e..0d5fd91ee0aa 100644
--- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.h
+++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.h
@@ -35,7 +35,7 @@
  * @die_id:		Die id for this instance
  * @domain_id:		Power domain id for this instance
  * @cluster_id:		cluster id in a domain
- * @instance_id:	Unique instance id to append to directory name
+ * @seqnum_id:		Unique sequential id to append to directory name
  * @name:		Sysfs entry name for this instance
  * @agent_type_mask:	Bit mask of all hardware agents for this domain
  * @uncore_attr_group:	Attribute group storage
@@ -71,7 +71,7 @@ struct uncore_data {
 	int die_id;
 	int domain_id;
 	int cluster_id;
-	int instance_id;
+	int seqnum_id;
 	char name[32];
 	u16  agent_type_mask;
 
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v3 2/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs
  2026-04-08 16:27 [PATCH v3 0/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs Maciej Wieczor-Retman
  2026-04-08 16:27 ` [PATCH v3 1/2] platform/x86/intel-uncore-freq: Rename instance_id Maciej Wieczor-Retman
@ 2026-04-08 16:27 ` Maciej Wieczor-Retman
  2026-04-22 16:17   ` srinivas pandruvada
  1 sibling, 1 reply; 5+ messages in thread
From: Maciej Wieczor-Retman @ 2026-04-08 16:27 UTC (permalink / raw)
  To: skhan, ilpo.jarvinen, hansg, corbet, srinivas.pandruvada
  Cc: linux-kernel, platform-driver-x86, linux-doc, m.wieczorretman,
	Maciej Wieczor-Retman

From: Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>

Insufficient data is exported to allow direct access to TPMI registers
through MMIO. On non-partitioned systems domain_id can be used both for
mapping CPUs to their compute die IDs and for mapping die indices to
their MMIO memory blocks presented to userspace via TPMI debugfs.
However on partitioned systems the debugfs association doesn't work
anymore. This is due to how TPMI partitioning influences domain_id
calculation. The previous association is lost on partitioned systems in
order to keep using domain_id for mapping CPUs to compute dies.

Expose the instance ID in sysfs that's unique in the scope of one TPMI
partition (and hence one TPMI device). It's a physical index into mapped
MMIO blocks and can be used by userspace to figure out how to directly
access TPMI registers.

Signed-off-by: Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>
---
Changelog v3:
- Change sprintf -> sysfs_emit in show_instance_id().
- Change part of patch message 'MMIO memory blocks mapped' -> 'MMIO
  memory blocks presented to userspace...'
- Change assigning function to static inline.

Changelog v2:
- Redo the patch message.
- Redo the function comment that assigns instance_id.
- Modify the documentation.

 .../pm/intel_uncore_frequency_scaling.rst         |  7 +++++++
 .../uncore-frequency/uncore-frequency-common.c    | 10 ++++++++++
 .../uncore-frequency/uncore-frequency-common.h    |  6 +++++-
 .../uncore-frequency/uncore-frequency-tpmi.c      | 15 ++++++++++++++-
 4 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/Documentation/admin-guide/pm/intel_uncore_frequency_scaling.rst b/Documentation/admin-guide/pm/intel_uncore_frequency_scaling.rst
index d367ba4d744a..b43ad4d5e333 100644
--- a/Documentation/admin-guide/pm/intel_uncore_frequency_scaling.rst
+++ b/Documentation/admin-guide/pm/intel_uncore_frequency_scaling.rst
@@ -88,8 +88,15 @@ and "fabric_cluster_id" in the directory.
 
 Attributes in each directory:
 
+``instance_id``
+	This attribute is used to get die indices in userspace mapped MMIO
+	blocks. Indices are local to a single TPMI partition. Needed for direct
+	TPMI register access.
+
 ``domain_id``
 	This attribute is used to get the power domain id of this instance.
+	Indices are unique in all TPMI partitions on a given CPU package. Can be
+	used to map compute dies to corresponding CPUs.
 
 ``die_id``
 	This attribute is used to get the Linux die id of this instance.
diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c
index 25ab511ed8d2..3b554418a7a3 100644
--- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c
+++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c
@@ -29,6 +29,13 @@ static ssize_t show_domain_id(struct kobject *kobj, struct kobj_attribute *attr,
 	return sysfs_emit(buf, "%u\n", data->domain_id);
 }
 
+static ssize_t show_instance_id(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
+{
+	struct uncore_data *data = container_of(attr, struct uncore_data, instance_id_kobj_attr);
+
+	return sysfs_emit(buf, "%u\n", data->instance_id);
+}
+
 static ssize_t show_fabric_cluster_id(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
 {
 	struct uncore_data *data = container_of(attr, struct uncore_data, fabric_cluster_id_kobj_attr);
@@ -200,6 +207,9 @@ static int create_attr_group(struct uncore_data *data, char *name)
 	if (data->domain_id != UNCORE_DOMAIN_ID_INVALID) {
 		init_attribute_root_ro(domain_id);
 		data->uncore_attrs[index++] = &data->domain_id_kobj_attr.attr;
+		init_attribute_root_ro(instance_id);
+		data->uncore_attrs[index++] = &data->instance_id_kobj_attr.attr;
+
 		init_attribute_root_ro(fabric_cluster_id);
 		data->uncore_attrs[index++] = &data->fabric_cluster_id_kobj_attr.attr;
 		init_attribute_root_ro(package_id);
diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.h b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.h
index 0d5fd91ee0aa..e319448dc1a4 100644
--- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.h
+++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.h
@@ -36,6 +36,7 @@
  * @domain_id:		Power domain id for this instance
  * @cluster_id:		cluster id in a domain
  * @seqnum_id:		Unique sequential id to append to directory name
+ * @instance_id:	Die indices or feature instances for a single TPMI device
  * @name:		Sysfs entry name for this instance
  * @agent_type_mask:	Bit mask of all hardware agents for this domain
  * @uncore_attr_group:	Attribute group storage
@@ -56,6 +57,7 @@
  * @elc_floor_freq_khz_kobj_attr: Storage for kobject attribute elc_floor_freq_khz
  * @agent_types_kobj_attr: Storage for kobject attribute agent_type
  * @die_id_kobj_attr:	Attribute storage for die_id information
+ * @instance_id_kobj_attr: Attribute storage for instance_id value
  * @uncore_attrs:	Attribute storage for group creation
  *
  * This structure is used to encapsulate all data related to uncore sysfs
@@ -72,6 +74,7 @@ struct uncore_data {
 	int domain_id;
 	int cluster_id;
 	int seqnum_id;
+	int instance_id;
 	char name[32];
 	u16  agent_type_mask;
 
@@ -90,7 +93,8 @@ struct uncore_data {
 	struct kobj_attribute elc_floor_freq_khz_kobj_attr;
 	struct kobj_attribute agent_types_kobj_attr;
 	struct kobj_attribute die_id_kobj_attr;
-	struct attribute *uncore_attrs[15];
+	struct kobj_attribute instance_id_kobj_attr;
+	struct attribute *uncore_attrs[16];
 };
 
 #define UNCORE_DOMAIN_ID_INVALID	-1
diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c
index 1237d9570886..32d03bee09a0 100644
--- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c
+++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c
@@ -385,7 +385,19 @@ static u8 io_die_index_next;
 /* Lock to protect io_die_start, io_die_index_next */
 static DEFINE_MUTEX(domain_lock);
 
-static void set_domain_id(int id,  int num_resources,
+static inline void set_instance_id(int id, struct tpmi_uncore_cluster_info *cluster_info)
+{
+	/*
+	 * On non-partitioned systems domain_id can be used for mapping both
+	 * CPUs to compute die IDs and physical die indexes to MMIO mapped
+	 * memory. However on partitioned systems domain_id loses the second
+	 * association. Therefore instance_id should be used for that instead,
+	 * while domain_id should still be used to match CPUs to compute dies.
+	 */
+	cluster_info->uncore_data.instance_id = id;
+}
+
+static void set_domain_id(int id, int num_resources,
 			  struct oobmsm_plat_info *plat_info,
 			  struct tpmi_uncore_cluster_info *cluster_info)
 {
@@ -686,6 +698,7 @@ static int uncore_probe(struct auxiliary_device *auxdev, const struct auxiliary_
 			set_cdie_id(i, cluster_info, plat_info);
 
 			set_domain_id(i, num_resources, plat_info, cluster_info);
+			set_instance_id(i, cluster_info);
 
 			cluster_info->uncore_root = tpmi_uncore;
 
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 1/2] platform/x86/intel-uncore-freq: Rename instance_id
  2026-04-08 16:27 ` [PATCH v3 1/2] platform/x86/intel-uncore-freq: Rename instance_id Maciej Wieczor-Retman
@ 2026-04-22 15:49   ` srinivas pandruvada
  0 siblings, 0 replies; 5+ messages in thread
From: srinivas pandruvada @ 2026-04-22 15:49 UTC (permalink / raw)
  To: Maciej Wieczor-Retman, skhan, ilpo.jarvinen, hansg, corbet
  Cc: linux-kernel, platform-driver-x86, linux-doc,
	Maciej Wieczor-Retman

On Wed, 2026-04-08 at 16:27 +0000, Maciej Wieczor-Retman wrote:
> From: Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>
> 
> The "instance" word has a specific meaning in TPMI. It is a physical
> index related to compute dies and IO dies present on a single TPMI
> partition (which is also a single TPMI device). It's used for mapping
> MMIO blocks for direct TPMI register access.
> 
> The currently used "instance_id" uncore_data struct field is a
> sequentially generated value that's used for appending to uncore
> directories inside the /sys/devices/system/cpu/intel_uncore_frequency
> directory. It has no relation to the physical TPMI elements.
> 

In future, It is always better to say no functional changes as this is
just renaming.

> Signed-off-by: Maciej Wieczor-Retman
> <maciej.wieczor-retman@intel.com>
> Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
> ---
> Changelog v3:
> - Add Srinivas' Acked-by.
> 
> Changelog v2:
> - Redid the first paragraph to better describe what "instance" is.
> - Rename seqname_id to seqnum_id to emphasize it's a sequential
> number
>   not sequential name.
> 
>  .../x86/intel/uncore-frequency/uncore-frequency-common.c    | 6 +++-
> --
>  .../x86/intel/uncore-frequency/uncore-frequency-common.h    | 4 ++--
>  2 files changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-
> frequency-common.c b/drivers/platform/x86/intel/uncore-
> frequency/uncore-frequency-common.c
> index 7070c94324e0..25ab511ed8d2 100644
> --- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-
> common.c
> +++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-
> common.c
> @@ -268,7 +268,7 @@ int uncore_freq_add_entry(struct uncore_data
> *data, int cpu)
>  		if (ret < 0)
>  			goto uncore_unlock;
>  
> -		data->instance_id = ret;
> +		data->seqnum_id = ret;
>  		scnprintf(data->name, sizeof(data->name),
> "uncore%02d", ret);
>  	} else {
>  		scnprintf(data->name, sizeof(data->name),
> "package_%02d_die_%02d",
> @@ -281,7 +281,7 @@ int uncore_freq_add_entry(struct uncore_data
> *data, int cpu)
>  	ret = create_attr_group(data, data->name);
>  	if (ret) {
>  		if (data->domain_id != UNCORE_DOMAIN_ID_INVALID)
> -			ida_free(&intel_uncore_ida, data-
> >instance_id);
> +			ida_free(&intel_uncore_ida, data-
> >seqnum_id);
>  	} else {
>  		data->control_cpu = cpu;
>  		data->valid = true;
> @@ -301,7 +301,7 @@ void uncore_freq_remove_die_entry(struct
> uncore_data *data)
>  	data->control_cpu = -1;
>  	data->valid = false;
>  	if (data->domain_id != UNCORE_DOMAIN_ID_INVALID)
> -		ida_free(&intel_uncore_ida, data->instance_id);
> +		ida_free(&intel_uncore_ida, data->seqnum_id);
>  
>  	mutex_unlock(&uncore_lock);
>  }
> diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-
> frequency-common.h b/drivers/platform/x86/intel/uncore-
> frequency/uncore-frequency-common.h
> index 0abe850ef54e..0d5fd91ee0aa 100644
> --- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-
> common.h
> +++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-
> common.h
> @@ -35,7 +35,7 @@
>   * @die_id:		Die id for this instance
>   * @domain_id:		Power domain id for this instance
>   * @cluster_id:		cluster id in a domain
> - * @instance_id:	Unique instance id to append to directory
> name
> + * @seqnum_id:		Unique sequential id to append to directory
> name
>   * @name:		Sysfs entry name for this instance
>   * @agent_type_mask:	Bit mask of all hardware agents for this
> domain
>   * @uncore_attr_group:	Attribute group storage
> @@ -71,7 +71,7 @@ struct uncore_data {
>  	int die_id;
>  	int domain_id;
>  	int cluster_id;
> -	int instance_id;
> +	int seqnum_id;
>  	char name[32];
>  	u16  agent_type_mask;
>  

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 2/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs
  2026-04-08 16:27 ` [PATCH v3 2/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs Maciej Wieczor-Retman
@ 2026-04-22 16:17   ` srinivas pandruvada
  0 siblings, 0 replies; 5+ messages in thread
From: srinivas pandruvada @ 2026-04-22 16:17 UTC (permalink / raw)
  To: Maciej Wieczor-Retman, skhan, ilpo.jarvinen, hansg, corbet
  Cc: linux-kernel, platform-driver-x86, linux-doc,
	Maciej Wieczor-Retman

On Wed, 2026-04-08 at 16:27 +0000, Maciej Wieczor-Retman wrote:
> From: Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>
> 
> Insufficient data is exported to allow direct access to TPMI
> registers
> through MMIO. On non-partitioned systems domain_id can be used both
> for
> mapping CPUs to their compute die IDs and for mapping die indices to
> their MMIO memory blocks presented to userspace via TPMI debugfs.
> However on partitioned systems the debugfs association doesn't work
> anymore. This is due to how TPMI partitioning influences domain_id
> calculation. The previous association is lost on partitioned systems
> in
> order to keep using domain_id for mapping CPUs to compute dies.
> 
> Expose the instance ID in sysfs that's unique in the scope of one
> TPMI
> partition (and hence one TPMI device). It's a physical index into
> mapped
> MMIO blocks and can be used by userspace to figure out how to
> directly
> access TPMI registers.
> 
> Signed-off-by: Maciej Wieczor-Retman
> <maciej.wieczor-retman@intel.com>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>

> ---
> Changelog v3:
> - Change sprintf -> sysfs_emit in show_instance_id().
> - Change part of patch message 'MMIO memory blocks mapped' -> 'MMIO
>   memory blocks presented to userspace...'
> - Change assigning function to static inline.
> 
> Changelog v2:
> - Redo the patch message.
> - Redo the function comment that assigns instance_id.
> - Modify the documentation.
> 
>  .../pm/intel_uncore_frequency_scaling.rst         |  7 +++++++
>  .../uncore-frequency/uncore-frequency-common.c    | 10 ++++++++++
>  .../uncore-frequency/uncore-frequency-common.h    |  6 +++++-
>  .../uncore-frequency/uncore-frequency-tpmi.c      | 15
> ++++++++++++++-
>  4 files changed, 36 insertions(+), 2 deletions(-)
> 
> diff --git a/Documentation/admin-
> guide/pm/intel_uncore_frequency_scaling.rst b/Documentation/admin-
> guide/pm/intel_uncore_frequency_scaling.rst
> index d367ba4d744a..b43ad4d5e333 100644
> --- a/Documentation/admin-guide/pm/intel_uncore_frequency_scaling.rst
> +++ b/Documentation/admin-guide/pm/intel_uncore_frequency_scaling.rst
> @@ -88,8 +88,15 @@ and "fabric_cluster_id" in the directory.
>  
>  Attributes in each directory:
>  
> +``instance_id``
> +	This attribute is used to get die indices in userspace
> mapped MMIO
> +	blocks. Indices are local to a single TPMI partition. Needed
> for direct
> +	TPMI register access.
> +
>  ``domain_id``
>  	This attribute is used to get the power domain id of this
> instance.
> +	Indices are unique in all TPMI partitions on a given CPU
> package. Can be
> +	used to map compute dies to corresponding CPUs.
>  
>  ``die_id``
>  	This attribute is used to get the Linux die id of this
> instance.
> diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-
> frequency-common.c b/drivers/platform/x86/intel/uncore-
> frequency/uncore-frequency-common.c
> index 25ab511ed8d2..3b554418a7a3 100644
> --- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-
> common.c
> +++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-
> common.c
> @@ -29,6 +29,13 @@ static ssize_t show_domain_id(struct kobject
> *kobj, struct kobj_attribute *attr,
>  	return sysfs_emit(buf, "%u\n", data->domain_id);
>  }
>  
> +static ssize_t show_instance_id(struct kobject *kobj, struct
> kobj_attribute *attr, char *buf)
> +{
> +	struct uncore_data *data = container_of(attr, struct
> uncore_data, instance_id_kobj_attr);
> +
> +	return sysfs_emit(buf, "%u\n", data->instance_id);
> +}
> +
>  static ssize_t show_fabric_cluster_id(struct kobject *kobj, struct
> kobj_attribute *attr, char *buf)
>  {
>  	struct uncore_data *data = container_of(attr, struct
> uncore_data, fabric_cluster_id_kobj_attr);
> @@ -200,6 +207,9 @@ static int create_attr_group(struct uncore_data
> *data, char *name)
>  	if (data->domain_id != UNCORE_DOMAIN_ID_INVALID) {
>  		init_attribute_root_ro(domain_id);
>  		data->uncore_attrs[index++] = &data-
> >domain_id_kobj_attr.attr;
> +		init_attribute_root_ro(instance_id);
> +		data->uncore_attrs[index++] = &data-
> >instance_id_kobj_attr.attr;
> +
>  		init_attribute_root_ro(fabric_cluster_id);
>  		data->uncore_attrs[index++] = &data-
> >fabric_cluster_id_kobj_attr.attr;
>  		init_attribute_root_ro(package_id);
> diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-
> frequency-common.h b/drivers/platform/x86/intel/uncore-
> frequency/uncore-frequency-common.h
> index 0d5fd91ee0aa..e319448dc1a4 100644
> --- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-
> common.h
> +++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-
> common.h
> @@ -36,6 +36,7 @@
>   * @domain_id:		Power domain id for this instance
>   * @cluster_id:		cluster id in a domain
>   * @seqnum_id:		Unique sequential id to append to directory
> name
> + * @instance_id:	Die indices or feature instances for a
> single TPMI device
>   * @name:		Sysfs entry name for this instance
>   * @agent_type_mask:	Bit mask of all hardware agents for this
> domain
>   * @uncore_attr_group:	Attribute group storage
> @@ -56,6 +57,7 @@
>   * @elc_floor_freq_khz_kobj_attr: Storage for kobject attribute
> elc_floor_freq_khz
>   * @agent_types_kobj_attr: Storage for kobject attribute agent_type
>   * @die_id_kobj_attr:	Attribute storage for die_id information
> + * @instance_id_kobj_attr: Attribute storage for instance_id value
>   * @uncore_attrs:	Attribute storage for group creation
>   *
>   * This structure is used to encapsulate all data related to uncore
> sysfs
> @@ -72,6 +74,7 @@ struct uncore_data {
>  	int domain_id;
>  	int cluster_id;
>  	int seqnum_id;
> +	int instance_id;
>  	char name[32];
>  	u16  agent_type_mask;
>  
> @@ -90,7 +93,8 @@ struct uncore_data {
>  	struct kobj_attribute elc_floor_freq_khz_kobj_attr;
>  	struct kobj_attribute agent_types_kobj_attr;
>  	struct kobj_attribute die_id_kobj_attr;
> -	struct attribute *uncore_attrs[15];
> +	struct kobj_attribute instance_id_kobj_attr;
> +	struct attribute *uncore_attrs[16];
>  };
>  
>  #define UNCORE_DOMAIN_ID_INVALID	-1
> diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-
> frequency-tpmi.c b/drivers/platform/x86/intel/uncore-
> frequency/uncore-frequency-tpmi.c
> index 1237d9570886..32d03bee09a0 100644
> --- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-
> tpmi.c
> +++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-
> tpmi.c
> @@ -385,7 +385,19 @@ static u8 io_die_index_next;
>  /* Lock to protect io_die_start, io_die_index_next */
>  static DEFINE_MUTEX(domain_lock);
>  
> -static void set_domain_id(int id,  int num_resources,
> +static inline void set_instance_id(int id, struct
> tpmi_uncore_cluster_info *cluster_info)
> +{
> +	/*
> +	 * On non-partitioned systems domain_id can be used for
> mapping both
> +	 * CPUs to compute die IDs and physical die indexes to MMIO
> mapped
> +	 * memory. However on partitioned systems domain_id loses
> the second
> +	 * association. Therefore instance_id should be used for
> that instead,
> +	 * while domain_id should still be used to match CPUs to
> compute dies.
> +	 */
> +	cluster_info->uncore_data.instance_id = id;
> +}
> +
> +static void set_domain_id(int id, int num_resources,
>  			  struct oobmsm_plat_info *plat_info,
>  			  struct tpmi_uncore_cluster_info
> *cluster_info)
>  {
> @@ -686,6 +698,7 @@ static int uncore_probe(struct auxiliary_device
> *auxdev, const struct auxiliary_
>  			set_cdie_id(i, cluster_info, plat_info);
>  
>  			set_domain_id(i, num_resources, plat_info,
> cluster_info);
> +			set_instance_id(i, cluster_info);
>  
>  			cluster_info->uncore_root = tpmi_uncore;
>  

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-04-22 16:17 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-08 16:27 [PATCH v3 0/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs Maciej Wieczor-Retman
2026-04-08 16:27 ` [PATCH v3 1/2] platform/x86/intel-uncore-freq: Rename instance_id Maciej Wieczor-Retman
2026-04-22 15:49   ` srinivas pandruvada
2026-04-08 16:27 ` [PATCH v3 2/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs Maciej Wieczor-Retman
2026-04-22 16:17   ` srinivas pandruvada

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox