[PATCH v3 0/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs

Maciej Wieczor-Retman posted 2 patches 2 months ago
.../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(-)
[PATCH v3 0/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs
Posted by Maciej Wieczor-Retman 2 months ago
--- 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
Re: [PATCH v3 0/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs
Posted by Ilpo Järvinen 1 month, 1 week ago
On Wed, 08 Apr 2026 16:27:40 +0000, Maciej Wieczor-Retman wrote:

> --- 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.
> 
> [...]


Thank you for your contribution, it has been applied to my local
review-ilpo-next branch. Note it will show up in the public
platform-drivers-x86/review-ilpo-next branch only once I've pushed my
local branch there, which might take a while.

The list of commits applied:
[1/2] platform/x86/intel-uncore-freq: Rename instance_id
      commit: d8e484a452ca195b7c099373f3c7901bd405b623
[2/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs
      commit: 6cf1c1e9f21ba2e44e05e691d5241290c7d6c41a

--
 i.
Re: [PATCH v3 0/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs
Posted by Maciej Wieczor-Retman 1 month, 1 week ago
On 2026-05-06 at 16:54:23 +0300, Ilpo Järvinen wrote:
>On Wed, 08 Apr 2026 16:27:40 +0000, Maciej Wieczor-Retman wrote:
>
>> --- 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.
>>
>> [...]
>
>
>Thank you for your contribution, it has been applied to my local
>review-ilpo-next branch. Note it will show up in the public
>platform-drivers-x86/review-ilpo-next branch only once I've pushed my
>local branch there, which might take a while.
>
>The list of commits applied:
>[1/2] platform/x86/intel-uncore-freq: Rename instance_id
>      commit: d8e484a452ca195b7c099373f3c7901bd405b623
>[2/2] platform/x86/intel-uncore-freq: Expose instance ID in the sysfs
>      commit: 6cf1c1e9f21ba2e44e05e691d5241290c7d6c41a
>
>--
> i.
>

Thanks! :)

-- 
Kind regards
Maciej Wieczór-Retman