* [PATCH v4 0/2] ACPI: CPPC: Add CPPC v4 support (ACPI 6.6)
@ 2026-05-27 19:46 Sumit Gupta
2026-05-27 19:46 ` [PATCH v4 1/2] ACPI: CPPC: Add support for CPPC v4 Sumit Gupta
2026-05-27 19:46 ` [PATCH v4 2/2] ACPI: CPPC: Add ospm_nominal_perf support Sumit Gupta
0 siblings, 2 replies; 12+ messages in thread
From: Sumit Gupta @ 2026-05-27 19:46 UTC (permalink / raw)
To: rafael, viresh.kumar, lenb, pierre.gondois, zhenglifeng1,
zhanjie9, mario.limonciello, saket.dumbre, linux-acpi,
linux-kernel, linux-pm, acpica-devel
Cc: treding, jonathanh, vsethi, ksitaraman, sanjayc, mochs, bbasu,
sumitg
Add initial kernel support for CPPC v4 (ACPI 6.6, Section 8.4.6),
which extends the _CPC package from 23 to 25 entries with two
optional fields:
- OSPM Nominal Performance (8.4.6.1.2.6): register used by OSPM
to tell the platform what it considers nominal. The platform
classifies performance above this as boost and below as
throttle for power/thermal decisions.
- Resource Priority (8.4.6.1.2.7): Package of Resource Priority
Register Descriptor sub-packages. Full parsing is not yet
implemented; such entries are marked as unsupported.
Patch 1: Add v4 _CPC parsing - validate the 25-entry layout,
restrict the Resource Priority package fallback to that slot
only, and mark the two new registers optional.
Patch 2: Add per-policy sysfs attribute ospm_nominal_freq (kHz)
under cpufreq. Writes are converted to perf and applied to every
CPU in policy->cpus.
---
v3[3] -> v4:
- Patch 2:
- Add a bool cpu_data->ospm_nominal_perf_set to distinguish an
unwritten cache from a valid perf=0 write.
- Switch freq_khz to unsigned int and use kstrtouint().
- Add rollback in store_ospm_nominal_freq() to restore the previous
cached value on a partial multi-CPU write failure.
v2[2] -> v3:
- Patch 1:
- Accept ACPI_TYPE_PACKAGE only at RESOURCE_PRIORITY; abort otherwise.
- Added Reviewed-by from Pierre Gondois.
- Patch 2:
- Sysfs moved from per-CPU acpi_cppc to per-policy cpufreq.
- Read ospm_nominal_freq sysfs input in kHz and convert to perf.
- Cached ospm_nominal_perf moved from cpc_desc to cppc_cpudata.
- Validate input against [Lowest Performance, Nominal Performance]
in cppc_set_ospm_nominal_perf().
- Dropped unconditional init in cppc_cpufreq_cpu_init().
- Remove to skip write if cache matches in cppc_set_ospm_nominal_perf.
- Early -ENODEV return when no CPC descriptor.
- Added ABI documentation at
Documentation/ABI/testing/sysfs-devices-system-cpu.
v1[1] -> v2:
- Patch 1: Added Reviewed-by from Mario Limonciello.
- Patch 2:
- Make ospm_nominal_perf sysfs read-write; cache last write in
cpc_desc and skip redundant register writes.
- Validate input in cppc_set_ospm_nominal_perf.
Sumit Gupta (2):
ACPI: CPPC: Add support for CPPC v4
ACPI: CPPC: Add ospm_nominal_perf support
.../ABI/testing/sysfs-devices-system-cpu | 17 ++++++
drivers/acpi/cppc_acpi.c | 58 ++++++++++++++++--
drivers/cpufreq/cppc_cpufreq.c | 60 +++++++++++++++++++
include/acpi/cppc_acpi.h | 20 ++++++-
4 files changed, 147 insertions(+), 8 deletions(-)
[1] https://lore.kernel.org/lkml/20260427051823.280419-1-sumitg@nvidia.com/
[2] https://lore.kernel.org/lkml/20260430142430.755437-1-sumitg@nvidia.com/
[3] https://lore.kernel.org/lkml/20260514194822.1841748-1-sumitg@nvidia.com/
--
2.34.1
^ permalink raw reply [flat|nested] 12+ messages in thread* [PATCH v4 1/2] ACPI: CPPC: Add support for CPPC v4 2026-05-27 19:46 [PATCH v4 0/2] ACPI: CPPC: Add CPPC v4 support (ACPI 6.6) Sumit Gupta @ 2026-05-27 19:46 ` Sumit Gupta 2026-06-01 17:35 ` Rafael J. Wysocki 2026-05-27 19:46 ` [PATCH v4 2/2] ACPI: CPPC: Add ospm_nominal_perf support Sumit Gupta 1 sibling, 1 reply; 12+ messages in thread From: Sumit Gupta @ 2026-05-27 19:46 UTC (permalink / raw) To: rafael, viresh.kumar, lenb, pierre.gondois, zhenglifeng1, zhanjie9, mario.limonciello, saket.dumbre, linux-acpi, linux-kernel, linux-pm, acpica-devel Cc: treding, jonathanh, vsethi, ksitaraman, sanjayc, mochs, bbasu, sumitg, Mario Limonciello CPPC v4 (ACPI 6.6, Section 8.4.6) adds two optional entries to the _CPC package: 1. OSPM Nominal Performance (8.4.6.1.2.6): A write-only register that lets OSPM inform the platform what it considers nominal performance. The platform classifies performance above this level as boost and below as throttle for its power/thermal decisions. 2. Resource Priority (8.4.6.1.2.7): A Package of Resource Priority Register Descriptor sub-packages that allow OSPM to set relative priority among processors for shared resources (boost, throttle, L2/L3 cache, memory bandwidth). Parsing the full structure is not yet supported; such entries are marked as unsupported. Add v4 _CPC table parsing (25 entries) and update REG_OPTIONAL to mark the two new registers as optional. Signed-off-by: Sumit Gupta <sumitg@nvidia.com> Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org> Reviewed-by: Pierre Gondois <pierre.gondois@arm.com> --- drivers/acpi/cppc_acpi.c | 23 +++++++++++++++++------ include/acpi/cppc_acpi.h | 8 ++++++-- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c index f370be8715ae..c76cfafa3589 100644 --- a/drivers/acpi/cppc_acpi.c +++ b/drivers/acpi/cppc_acpi.c @@ -134,7 +134,7 @@ static DEFINE_PER_CPU(struct cpc_desc *, cpc_desc_ptr); * cpc_regs[] with the corresponding index. 0 means mandatory and 1 * means optional. */ -#define REG_OPTIONAL (0x1FC7D0) +#define REG_OPTIONAL (0x7FC7D0) /* * Use the index of the register in per-cpu cpc_regs[] to check if @@ -751,18 +751,19 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) /* * Disregard _CPC if the number of entries in the return package is not * as expected, but support future revisions being proper supersets of - * the v3 and only causing more entries to be returned by _CPC. + * the v4 and only causing more entries to be returned by _CPC. */ if ((cpc_rev == CPPC_V2_REV && num_ent != CPPC_V2_NUM_ENT) || (cpc_rev == CPPC_V3_REV && num_ent != CPPC_V3_NUM_ENT) || - (cpc_rev > CPPC_V3_REV && num_ent <= CPPC_V3_NUM_ENT)) { + (cpc_rev == CPPC_V4_REV && num_ent != CPPC_V4_NUM_ENT) || + (cpc_rev > CPPC_V4_REV && num_ent <= CPPC_V4_NUM_ENT)) { pr_debug("Unexpected number of _CPC return package entries (%d) for CPU:%d\n", num_ent, pr->id); goto out_free; } - if (cpc_rev > CPPC_V3_REV) { - num_ent = CPPC_V3_NUM_ENT; - cpc_rev = CPPC_V3_REV; + if (cpc_rev > CPPC_V4_REV) { + num_ent = CPPC_V4_NUM_ENT; + cpc_rev = CPPC_V4_REV; } cpc_ptr->num_entries = num_ent; @@ -845,6 +846,16 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) cpc_ptr->cpc_regs[i-2].type = ACPI_TYPE_BUFFER; memcpy(&cpc_ptr->cpc_regs[i-2].cpc_entry.reg, gas_t, sizeof(*gas_t)); + } else if (cpc_obj->type == ACPI_TYPE_PACKAGE && (i - 2) == RESOURCE_PRIORITY) { + /* + * ACPI 6.6, s8.4.6.1.2.7 defines Resource Priority as a + * Package of Resource Priority Register Descriptor sub-packages. + * Parsing the full structure is not yet supported. + * Mark the register as unsupported for now. + */ + pr_debug("CPU:%d Resource Priority not supported\n", pr->id); + cpc_ptr->cpc_regs[i-2].type = ACPI_TYPE_INTEGER; + cpc_ptr->cpc_regs[i-2].cpc_entry.int_value = 0; } else { pr_debug("Invalid entry type (%d) in _CPC for CPU:%d\n", i, pr->id); diff --git a/include/acpi/cppc_acpi.h b/include/acpi/cppc_acpi.h index ee8352830c32..9b18fb9aab7c 100644 --- a/include/acpi/cppc_acpi.h +++ b/include/acpi/cppc_acpi.h @@ -17,16 +17,18 @@ #include <acpi/pcc.h> #include <acpi/processor.h> -/* CPPCv2 and CPPCv3 support */ +/* CPPCv2, CPPCv3 and CPPCv4 support */ #define CPPC_V2_REV 2 #define CPPC_V3_REV 3 +#define CPPC_V4_REV 4 #define CPPC_V2_NUM_ENT 21 #define CPPC_V3_NUM_ENT 23 +#define CPPC_V4_NUM_ENT 25 #define PCC_CMD_COMPLETE_MASK (1 << 0) #define PCC_ERROR_MASK (1 << 2) -#define MAX_CPC_REG_ENT 21 +#define MAX_CPC_REG_ENT 23 /* CPPC specific PCC commands. */ #define CMD_READ 0 @@ -110,6 +112,8 @@ enum cppc_regs { REFERENCE_PERF, LOWEST_FREQ, NOMINAL_FREQ, + OSPM_NOMINAL_PERF, + RESOURCE_PRIORITY, }; /* -- 2.34.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v4 1/2] ACPI: CPPC: Add support for CPPC v4 2026-05-27 19:46 ` [PATCH v4 1/2] ACPI: CPPC: Add support for CPPC v4 Sumit Gupta @ 2026-06-01 17:35 ` Rafael J. Wysocki 2026-06-01 18:01 ` Sumit Gupta 0 siblings, 1 reply; 12+ messages in thread From: Rafael J. Wysocki @ 2026-06-01 17:35 UTC (permalink / raw) To: Sumit Gupta Cc: rafael, viresh.kumar, pierre.gondois, zhenglifeng1, zhanjie9, mario.limonciello, saket.dumbre, linux-acpi, linux-kernel, linux-pm, acpica-devel, treding, jonathanh, vsethi, ksitaraman, sanjayc, mochs, bbasu, Mario Limonciello On Wed, May 27, 2026 at 9:47 PM Sumit Gupta <sumitg@nvidia.com> wrote: > > CPPC v4 (ACPI 6.6, Section 8.4.6) adds two optional entries to the > _CPC package: > > 1. OSPM Nominal Performance (8.4.6.1.2.6): A write-only register that > lets OSPM inform the platform what it considers nominal performance. > The platform classifies performance above this level as boost and > below as throttle for its power/thermal decisions. > > 2. Resource Priority (8.4.6.1.2.7): A Package of Resource Priority > Register Descriptor sub-packages that allow OSPM to set relative > priority among processors for shared resources (boost, throttle, > L2/L3 cache, memory bandwidth). Parsing the full structure is not > yet supported; such entries are marked as unsupported. > > Add v4 _CPC table parsing (25 entries) and update REG_OPTIONAL to > mark the two new registers as optional. > > Signed-off-by: Sumit Gupta <sumitg@nvidia.com> > Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org> > Reviewed-by: Pierre Gondois <pierre.gondois@arm.com> This patch is good to go AFAICS, while there are still comments on the second one in the series. Do you want me to apply this one separately? > --- > drivers/acpi/cppc_acpi.c | 23 +++++++++++++++++------ > include/acpi/cppc_acpi.h | 8 ++++++-- > 2 files changed, 23 insertions(+), 8 deletions(-) > > diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c > index f370be8715ae..c76cfafa3589 100644 > --- a/drivers/acpi/cppc_acpi.c > +++ b/drivers/acpi/cppc_acpi.c > @@ -134,7 +134,7 @@ static DEFINE_PER_CPU(struct cpc_desc *, cpc_desc_ptr); > * cpc_regs[] with the corresponding index. 0 means mandatory and 1 > * means optional. > */ > -#define REG_OPTIONAL (0x1FC7D0) > +#define REG_OPTIONAL (0x7FC7D0) > > /* > * Use the index of the register in per-cpu cpc_regs[] to check if > @@ -751,18 +751,19 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) > /* > * Disregard _CPC if the number of entries in the return package is not > * as expected, but support future revisions being proper supersets of > - * the v3 and only causing more entries to be returned by _CPC. > + * the v4 and only causing more entries to be returned by _CPC. > */ > if ((cpc_rev == CPPC_V2_REV && num_ent != CPPC_V2_NUM_ENT) || > (cpc_rev == CPPC_V3_REV && num_ent != CPPC_V3_NUM_ENT) || > - (cpc_rev > CPPC_V3_REV && num_ent <= CPPC_V3_NUM_ENT)) { > + (cpc_rev == CPPC_V4_REV && num_ent != CPPC_V4_NUM_ENT) || > + (cpc_rev > CPPC_V4_REV && num_ent <= CPPC_V4_NUM_ENT)) { > pr_debug("Unexpected number of _CPC return package entries (%d) for CPU:%d\n", > num_ent, pr->id); > goto out_free; > } > - if (cpc_rev > CPPC_V3_REV) { > - num_ent = CPPC_V3_NUM_ENT; > - cpc_rev = CPPC_V3_REV; > + if (cpc_rev > CPPC_V4_REV) { > + num_ent = CPPC_V4_NUM_ENT; > + cpc_rev = CPPC_V4_REV; > } > > cpc_ptr->num_entries = num_ent; > @@ -845,6 +846,16 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) > > cpc_ptr->cpc_regs[i-2].type = ACPI_TYPE_BUFFER; > memcpy(&cpc_ptr->cpc_regs[i-2].cpc_entry.reg, gas_t, sizeof(*gas_t)); > + } else if (cpc_obj->type == ACPI_TYPE_PACKAGE && (i - 2) == RESOURCE_PRIORITY) { > + /* > + * ACPI 6.6, s8.4.6.1.2.7 defines Resource Priority as a > + * Package of Resource Priority Register Descriptor sub-packages. > + * Parsing the full structure is not yet supported. > + * Mark the register as unsupported for now. > + */ > + pr_debug("CPU:%d Resource Priority not supported\n", pr->id); > + cpc_ptr->cpc_regs[i-2].type = ACPI_TYPE_INTEGER; > + cpc_ptr->cpc_regs[i-2].cpc_entry.int_value = 0; > } else { > pr_debug("Invalid entry type (%d) in _CPC for CPU:%d\n", > i, pr->id); > diff --git a/include/acpi/cppc_acpi.h b/include/acpi/cppc_acpi.h > index ee8352830c32..9b18fb9aab7c 100644 > --- a/include/acpi/cppc_acpi.h > +++ b/include/acpi/cppc_acpi.h > @@ -17,16 +17,18 @@ > #include <acpi/pcc.h> > #include <acpi/processor.h> > > -/* CPPCv2 and CPPCv3 support */ > +/* CPPCv2, CPPCv3 and CPPCv4 support */ > #define CPPC_V2_REV 2 > #define CPPC_V3_REV 3 > +#define CPPC_V4_REV 4 > #define CPPC_V2_NUM_ENT 21 > #define CPPC_V3_NUM_ENT 23 > +#define CPPC_V4_NUM_ENT 25 > > #define PCC_CMD_COMPLETE_MASK (1 << 0) > #define PCC_ERROR_MASK (1 << 2) > > -#define MAX_CPC_REG_ENT 21 > +#define MAX_CPC_REG_ENT 23 > > /* CPPC specific PCC commands. */ > #define CMD_READ 0 > @@ -110,6 +112,8 @@ enum cppc_regs { > REFERENCE_PERF, > LOWEST_FREQ, > NOMINAL_FREQ, > + OSPM_NOMINAL_PERF, > + RESOURCE_PRIORITY, > }; > > /* > -- > 2.34.1 > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 1/2] ACPI: CPPC: Add support for CPPC v4 2026-06-01 17:35 ` Rafael J. Wysocki @ 2026-06-01 18:01 ` Sumit Gupta 2026-06-01 18:11 ` Rafael J. Wysocki 0 siblings, 1 reply; 12+ messages in thread From: Sumit Gupta @ 2026-06-01 18:01 UTC (permalink / raw) To: Rafael J. Wysocki Cc: viresh.kumar, pierre.gondois, zhenglifeng1, zhanjie9, mario.limonciello, saket.dumbre, linux-acpi, linux-kernel, linux-pm, acpica-devel, treding, jonathanh, vsethi, ksitaraman, sanjayc, mochs, bbasu, Mario Limonciello Hi Rafael, On 01/06/26 23:05, Rafael J. Wysocki wrote: > External email: Use caution opening links or attachments > > > On Wed, May 27, 2026 at 9:47 PM Sumit Gupta <sumitg@nvidia.com> wrote: >> CPPC v4 (ACPI 6.6, Section 8.4.6) adds two optional entries to the >> _CPC package: >> >> 1. OSPM Nominal Performance (8.4.6.1.2.6): A write-only register that >> lets OSPM inform the platform what it considers nominal performance. >> The platform classifies performance above this level as boost and >> below as throttle for its power/thermal decisions. >> >> 2. Resource Priority (8.4.6.1.2.7): A Package of Resource Priority >> Register Descriptor sub-packages that allow OSPM to set relative >> priority among processors for shared resources (boost, throttle, >> L2/L3 cache, memory bandwidth). Parsing the full structure is not >> yet supported; such entries are marked as unsupported. >> >> Add v4 _CPC table parsing (25 entries) and update REG_OPTIONAL to >> mark the two new registers as optional. >> >> Signed-off-by: Sumit Gupta <sumitg@nvidia.com> >> Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org> >> Reviewed-by: Pierre Gondois <pierre.gondois@arm.com> > This patch is good to go AFAICS, while there are still comments on the > second one in the series. > > Do you want me to apply this one separately? Yes please. Patch 1 is independent of patch 2. I will send patch 2 separately as a v5 after addressing the review comments. Thank you, Sumit Gupta > >> --- >> drivers/acpi/cppc_acpi.c | 23 +++++++++++++++++------ >> include/acpi/cppc_acpi.h | 8 ++++++-- >> 2 files changed, 23 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c >> index f370be8715ae..c76cfafa3589 100644 >> --- a/drivers/acpi/cppc_acpi.c >> +++ b/drivers/acpi/cppc_acpi.c >> @@ -134,7 +134,7 @@ static DEFINE_PER_CPU(struct cpc_desc *, cpc_desc_ptr); >> * cpc_regs[] with the corresponding index. 0 means mandatory and 1 >> * means optional. >> */ >> -#define REG_OPTIONAL (0x1FC7D0) >> +#define REG_OPTIONAL (0x7FC7D0) >> >> /* >> * Use the index of the register in per-cpu cpc_regs[] to check if >> @@ -751,18 +751,19 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) >> /* >> * Disregard _CPC if the number of entries in the return package is not >> * as expected, but support future revisions being proper supersets of >> - * the v3 and only causing more entries to be returned by _CPC. >> + * the v4 and only causing more entries to be returned by _CPC. >> */ >> if ((cpc_rev == CPPC_V2_REV && num_ent != CPPC_V2_NUM_ENT) || >> (cpc_rev == CPPC_V3_REV && num_ent != CPPC_V3_NUM_ENT) || >> - (cpc_rev > CPPC_V3_REV && num_ent <= CPPC_V3_NUM_ENT)) { >> + (cpc_rev == CPPC_V4_REV && num_ent != CPPC_V4_NUM_ENT) || >> + (cpc_rev > CPPC_V4_REV && num_ent <= CPPC_V4_NUM_ENT)) { >> pr_debug("Unexpected number of _CPC return package entries (%d) for CPU:%d\n", >> num_ent, pr->id); >> goto out_free; >> } >> - if (cpc_rev > CPPC_V3_REV) { >> - num_ent = CPPC_V3_NUM_ENT; >> - cpc_rev = CPPC_V3_REV; >> + if (cpc_rev > CPPC_V4_REV) { >> + num_ent = CPPC_V4_NUM_ENT; >> + cpc_rev = CPPC_V4_REV; >> } >> >> cpc_ptr->num_entries = num_ent; >> @@ -845,6 +846,16 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) >> >> cpc_ptr->cpc_regs[i-2].type = ACPI_TYPE_BUFFER; >> memcpy(&cpc_ptr->cpc_regs[i-2].cpc_entry.reg, gas_t, sizeof(*gas_t)); >> + } else if (cpc_obj->type == ACPI_TYPE_PACKAGE && (i - 2) == RESOURCE_PRIORITY) { >> + /* >> + * ACPI 6.6, s8.4.6.1.2.7 defines Resource Priority as a >> + * Package of Resource Priority Register Descriptor sub-packages. >> + * Parsing the full structure is not yet supported. >> + * Mark the register as unsupported for now. >> + */ >> + pr_debug("CPU:%d Resource Priority not supported\n", pr->id); >> + cpc_ptr->cpc_regs[i-2].type = ACPI_TYPE_INTEGER; >> + cpc_ptr->cpc_regs[i-2].cpc_entry.int_value = 0; >> } else { >> pr_debug("Invalid entry type (%d) in _CPC for CPU:%d\n", >> i, pr->id); >> diff --git a/include/acpi/cppc_acpi.h b/include/acpi/cppc_acpi.h >> index ee8352830c32..9b18fb9aab7c 100644 >> --- a/include/acpi/cppc_acpi.h >> +++ b/include/acpi/cppc_acpi.h >> @@ -17,16 +17,18 @@ >> #include <acpi/pcc.h> >> #include <acpi/processor.h> >> >> -/* CPPCv2 and CPPCv3 support */ >> +/* CPPCv2, CPPCv3 and CPPCv4 support */ >> #define CPPC_V2_REV 2 >> #define CPPC_V3_REV 3 >> +#define CPPC_V4_REV 4 >> #define CPPC_V2_NUM_ENT 21 >> #define CPPC_V3_NUM_ENT 23 >> +#define CPPC_V4_NUM_ENT 25 >> >> #define PCC_CMD_COMPLETE_MASK (1 << 0) >> #define PCC_ERROR_MASK (1 << 2) >> >> -#define MAX_CPC_REG_ENT 21 >> +#define MAX_CPC_REG_ENT 23 >> >> /* CPPC specific PCC commands. */ >> #define CMD_READ 0 >> @@ -110,6 +112,8 @@ enum cppc_regs { >> REFERENCE_PERF, >> LOWEST_FREQ, >> NOMINAL_FREQ, >> + OSPM_NOMINAL_PERF, >> + RESOURCE_PRIORITY, >> }; >> >> /* >> -- >> 2.34.1 >> ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 1/2] ACPI: CPPC: Add support for CPPC v4 2026-06-01 18:01 ` Sumit Gupta @ 2026-06-01 18:11 ` Rafael J. Wysocki 0 siblings, 0 replies; 12+ messages in thread From: Rafael J. Wysocki @ 2026-06-01 18:11 UTC (permalink / raw) To: Sumit Gupta Cc: Rafael J. Wysocki, viresh.kumar, pierre.gondois, zhenglifeng1, zhanjie9, mario.limonciello, saket.dumbre, linux-acpi, linux-kernel, linux-pm, acpica-devel, treding, jonathanh, vsethi, ksitaraman, sanjayc, mochs, bbasu, Mario Limonciello On Mon, Jun 1, 2026 at 8:02 PM Sumit Gupta <sumitg@nvidia.com> wrote: > > Hi Rafael, > > > On 01/06/26 23:05, Rafael J. Wysocki wrote: > > External email: Use caution opening links or attachments > > > > > > On Wed, May 27, 2026 at 9:47 PM Sumit Gupta <sumitg@nvidia.com> wrote: > >> CPPC v4 (ACPI 6.6, Section 8.4.6) adds two optional entries to the > >> _CPC package: > >> > >> 1. OSPM Nominal Performance (8.4.6.1.2.6): A write-only register that > >> lets OSPM inform the platform what it considers nominal performance. > >> The platform classifies performance above this level as boost and > >> below as throttle for its power/thermal decisions. > >> > >> 2. Resource Priority (8.4.6.1.2.7): A Package of Resource Priority > >> Register Descriptor sub-packages that allow OSPM to set relative > >> priority among processors for shared resources (boost, throttle, > >> L2/L3 cache, memory bandwidth). Parsing the full structure is not > >> yet supported; such entries are marked as unsupported. > >> > >> Add v4 _CPC table parsing (25 entries) and update REG_OPTIONAL to > >> mark the two new registers as optional. > >> > >> Signed-off-by: Sumit Gupta <sumitg@nvidia.com> > >> Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org> > >> Reviewed-by: Pierre Gondois <pierre.gondois@arm.com> > > This patch is good to go AFAICS, while there are still comments on the > > second one in the series. > > > > Do you want me to apply this one separately? > > Yes please. Patch 1 is independent of patch 2. > I will send patch 2 separately as a v5 after addressing the > review comments. Applied as 7.2 material, thanks! ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 2/2] ACPI: CPPC: Add ospm_nominal_perf support 2026-05-27 19:46 [PATCH v4 0/2] ACPI: CPPC: Add CPPC v4 support (ACPI 6.6) Sumit Gupta 2026-05-27 19:46 ` [PATCH v4 1/2] ACPI: CPPC: Add support for CPPC v4 Sumit Gupta @ 2026-05-27 19:46 ` Sumit Gupta 2026-05-28 12:12 ` Pierre Gondois ` (2 more replies) 1 sibling, 3 replies; 12+ messages in thread From: Sumit Gupta @ 2026-05-27 19:46 UTC (permalink / raw) To: rafael, viresh.kumar, lenb, pierre.gondois, zhenglifeng1, zhanjie9, mario.limonciello, saket.dumbre, linux-acpi, linux-kernel, linux-pm, acpica-devel Cc: treding, jonathanh, vsethi, ksitaraman, sanjayc, mochs, bbasu, sumitg Expose the OSPM Nominal Performance register (ACPI 6.6, Section 8.4.6.1.2.6), which conveys the desired nominal performance level at which the platform may run. Unlike the existing read-only Nominal Performance register, it is writable and lets OSPM request a lower nominal level than the platform-reported nominal. The platform classifies performance above this level as boosted and below as throttled for its power/thermal decisions. It is exposed as a per-policy cpufreq sysfs attribute in kHz, to match the cpufreq sysfs unit convention: /sys/devices/system/cpu/cpufreq/policyN/ospm_nominal_freq The attribute is documented in Documentation/ABI/testing/sysfs-devices-system-cpu. Writes are converted to perf via cppc_khz_to_perf(), validated against [Lowest Performance, Nominal Performance], and applied to every CPU in policy->cpus. The register is write-only; the kernel caches the last written value in struct cppc_cpudata for sysfs readback (returns 0 until userspace writes a value). Signed-off-by: Sumit Gupta <sumitg@nvidia.com> --- .../ABI/testing/sysfs-devices-system-cpu | 17 ++++++ drivers/acpi/cppc_acpi.c | 35 +++++++++++ drivers/cpufreq/cppc_cpufreq.c | 60 +++++++++++++++++++ include/acpi/cppc_acpi.h | 12 ++++ 4 files changed, 124 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu index 82d10d556cc8..ac1bf1b89ac4 100644 --- a/Documentation/ABI/testing/sysfs-devices-system-cpu +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu @@ -346,6 +346,23 @@ Description: Performance Limited This file is only present if the cppc-cpufreq driver is in use. +What: /sys/devices/system/cpu/cpuX/cpufreq/ospm_nominal_freq +Date: May 2026 +Contact: linux-pm@vger.kernel.org +Description: OSPM Nominal Performance (kHz) + + OSPM uses this attribute to request a nominal performance + level lower than the platform-reported nominal. The + platform treats performance above this level as boost + and below as throttle for power and thermal decisions. + + Read returns the last written value in kHz, or 0 if no + value has been written. Write a kHz value in the range + [lowest_freq, nominal_freq]. + + This file is only present if the cppc-cpufreq driver is + in use. + What: /sys/devices/system/cpu/cpu*/cache/index3/cache_disable_{0,1} Date: August 2008 KernelVersion: 2.6.27 diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c index c76cfafa3589..ad6ece16c30d 100644 --- a/drivers/acpi/cppc_acpi.c +++ b/drivers/acpi/cppc_acpi.c @@ -1682,6 +1682,41 @@ int cppc_set_epp(int cpu, u64 epp_val) } EXPORT_SYMBOL_GPL(cppc_set_epp); +/** + * cppc_set_ospm_nominal_perf() - Write OSPM Nominal Performance register. + * @cpu: CPU on which to write register. + * @ospm_nominal_perf: Value to write to the OSPM Nominal Performance register. + * + * OSPM Nominal Performance conveys the desired nominal performance level + * at which the platform may run. Per ACPI 6.6, s8.4.6.1.2.6, the value + * must lie within [Lowest Performance, Nominal Performance] and may be + * set independently of Minimum, Maximum and Desired performance. + * + * Return: 0 on success or negative error code. + */ +int cppc_set_ospm_nominal_perf(int cpu, u64 ospm_nominal_perf) +{ + struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpu); + struct cppc_perf_caps caps; + int ret; + + if (!cpc_desc) { + pr_debug("No CPC descriptor for CPU:%d\n", cpu); + return -ENODEV; + } + + ret = cppc_get_perf_caps(cpu, &caps); + if (ret) + return ret; + + if (ospm_nominal_perf < caps.lowest_perf || + ospm_nominal_perf > caps.nominal_perf) + return -EINVAL; + + return cppc_set_reg_val(cpu, OSPM_NOMINAL_PERF, ospm_nominal_perf); +} +EXPORT_SYMBOL_GPL(cppc_set_ospm_nominal_perf); + /** * cppc_get_auto_act_window() - Read autonomous activity window register. * @cpu: CPU from which to read register. diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c index 15a728dea911..5c54af1655b5 100644 --- a/drivers/cpufreq/cppc_cpufreq.c +++ b/drivers/cpufreq/cppc_cpufreq.c @@ -1139,11 +1139,70 @@ static int cppc_get_perf_limited_filtered(int cpu, u64 *perf_limited) CPPC_CPUFREQ_ATTR_RW_U64(perf_limited, cppc_get_perf_limited_filtered, cppc_set_perf_limited) +static ssize_t show_ospm_nominal_freq(struct cpufreq_policy *policy, char *buf) +{ + struct cppc_cpudata *cpu_data = policy->driver_data; + unsigned int freq_khz; + + if (!cpu_data->ospm_nominal_perf_set) + return sysfs_emit(buf, "0\n"); + + freq_khz = cppc_perf_to_khz(&cpu_data->perf_caps, + cpu_data->ospm_nominal_perf); + return sysfs_emit(buf, "%u\n", freq_khz); +} + +static ssize_t store_ospm_nominal_freq(struct cpufreq_policy *policy, + const char *buf, size_t count) +{ + struct cppc_cpudata *cpu_data = policy->driver_data; + bool prev_set = cpu_data->ospm_nominal_perf_set; + u32 prev_perf = cpu_data->ospm_nominal_perf; + unsigned int sib, freq_khz, failing_cpu = 0; + u32 perf; + int ret; + + ret = kstrtouint(buf, 0, &freq_khz); + if (ret) + return ret; + + perf = cppc_khz_to_perf(&cpu_data->perf_caps, freq_khz); + + for_each_cpu(sib, policy->cpus) { + ret = cppc_set_ospm_nominal_perf(sib, perf); + if (ret) { + failing_cpu = sib; + goto rollback; + } + } + + cpu_data->ospm_nominal_perf = perf; + cpu_data->ospm_nominal_perf_set = true; + return count; + +rollback: + /* + * Restore the previous value on siblings already updated. + * for_each_cpu() iterates in CPU-id order, so siblings before + * @failing_cpu were updated successfully. Skip restore when + * there is no prior known-good value (first-ever write failed). + */ + if (prev_set) { + for_each_cpu(sib, policy->cpus) { + if (sib == failing_cpu) + break; + cppc_set_ospm_nominal_perf(sib, prev_perf); + } + } + return ret; +} + cpufreq_freq_attr_ro(freqdomain_cpus); cpufreq_freq_attr_rw(auto_select); cpufreq_freq_attr_rw(auto_act_window); cpufreq_freq_attr_rw(energy_performance_preference_val); cpufreq_freq_attr_rw(perf_limited); +cpufreq_freq_attr_rw(ospm_nominal_freq); static struct freq_attr *cppc_cpufreq_attr[] = { &freqdomain_cpus, @@ -1151,6 +1210,7 @@ static struct freq_attr *cppc_cpufreq_attr[] = { &auto_act_window, &energy_performance_preference_val, &perf_limited, + &ospm_nominal_freq, NULL, }; diff --git a/include/acpi/cppc_acpi.h b/include/acpi/cppc_acpi.h index 9b18fb9aab7c..14c6d5d0ac12 100644 --- a/include/acpi/cppc_acpi.h +++ b/include/acpi/cppc_acpi.h @@ -154,6 +154,13 @@ struct cppc_cpudata { struct cppc_perf_fb_ctrs perf_fb_ctrs; unsigned int shared_type; cpumask_var_t shared_cpu_map; + /* + * Cached OSPM Nominal Performance value (write-only register). + * ospm_nominal_perf_set is true once userspace has written, so an + * unwritten cache is distinguishable from a valid 0 perf write. + */ + u32 ospm_nominal_perf; + bool ospm_nominal_perf_set; }; #ifdef CONFIG_ACPI_CPPC_LIB @@ -181,6 +188,7 @@ extern int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val); extern int cppc_get_epp_perf(int cpunum, u64 *epp_perf); extern int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable); extern int cppc_set_epp(int cpu, u64 epp_val); +extern int cppc_set_ospm_nominal_perf(int cpu, u64 ospm_nominal_perf); extern int cppc_get_auto_act_window(int cpu, u64 *auto_act_window); extern int cppc_set_auto_act_window(int cpu, u64 auto_act_window); extern int cppc_get_auto_sel(int cpu, bool *enable); @@ -267,6 +275,10 @@ static inline int cppc_set_epp(int cpu, u64 epp_val) { return -EOPNOTSUPP; } +static inline int cppc_set_ospm_nominal_perf(int cpu, u64 ospm_nominal_perf) +{ + return -EOPNOTSUPP; +} static inline int cppc_get_auto_act_window(int cpu, u64 *auto_act_window) { return -EOPNOTSUPP; -- 2.34.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v4 2/2] ACPI: CPPC: Add ospm_nominal_perf support 2026-05-27 19:46 ` [PATCH v4 2/2] ACPI: CPPC: Add ospm_nominal_perf support Sumit Gupta @ 2026-05-28 12:12 ` Pierre Gondois 2026-06-09 7:47 ` Sumit Gupta 2026-05-29 13:12 ` Christian Loehle 2026-06-01 17:37 ` Rafael J. Wysocki 2 siblings, 1 reply; 12+ messages in thread From: Pierre Gondois @ 2026-05-28 12:12 UTC (permalink / raw) To: Sumit Gupta, rafael, viresh.kumar, lenb, zhenglifeng1, zhanjie9, mario.limonciello, saket.dumbre, linux-acpi, linux-kernel, linux-pm, acpica-devel Cc: treding, jonathanh, vsethi, ksitaraman, sanjayc, mochs, bbasu Hello Sumit, On 5/27/26 21:46, Sumit Gupta wrote: > Expose the OSPM Nominal Performance register (ACPI 6.6, Section > 8.4.6.1.2.6), which conveys the desired nominal performance level > at which the platform may run. Unlike the existing read-only > Nominal Performance register, it is writable and lets OSPM > request a lower nominal level than the platform-reported nominal. > The platform classifies performance above this level as boosted > and below as throttled for its power/thermal decisions. > > It is exposed as a per-policy cpufreq sysfs attribute in kHz, to > match the cpufreq sysfs unit convention: > > /sys/devices/system/cpu/cpufreq/policyN/ospm_nominal_freq > > The attribute is documented in > Documentation/ABI/testing/sysfs-devices-system-cpu. > > Writes are converted to perf via cppc_khz_to_perf(), validated > against [Lowest Performance, Nominal Performance], and applied to > every CPU in policy->cpus. > > The register is write-only; the kernel caches the last written > value in struct cppc_cpudata for sysfs readback (returns 0 until > userspace writes a value). > > Signed-off-by: Sumit Gupta <sumitg@nvidia.com> > --- > .../ABI/testing/sysfs-devices-system-cpu | 17 ++++++ > drivers/acpi/cppc_acpi.c | 35 +++++++++++ > drivers/cpufreq/cppc_cpufreq.c | 60 +++++++++++++++++++ > include/acpi/cppc_acpi.h | 12 ++++ > 4 files changed, 124 insertions(+) > > diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu > index 82d10d556cc8..ac1bf1b89ac4 100644 > --- a/Documentation/ABI/testing/sysfs-devices-system-cpu > +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu > @@ -346,6 +346,23 @@ Description: Performance Limited > > This file is only present if the cppc-cpufreq driver is in use. > > +What: /sys/devices/system/cpu/cpuX/cpufreq/ospm_nominal_freq > +Date: May 2026 > +Contact: linux-pm@vger.kernel.org > +Description: OSPM Nominal Performance (kHz) > + > + OSPM uses this attribute to request a nominal performance > + level lower than the platform-reported nominal. The > + platform treats performance above this level as boost > + and below as throttle for power and thermal decisions. > + > + Read returns the last written value in kHz, or 0 if no > + value has been written. Write a kHz value in the range > + [lowest_freq, nominal_freq]. > + > + This file is only present if the cppc-cpufreq driver is > + in use. > + > What: /sys/devices/system/cpu/cpu*/cache/index3/cache_disable_{0,1} > Date: August 2008 > KernelVersion: 2.6.27 > diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c > index c76cfafa3589..ad6ece16c30d 100644 > --- a/drivers/acpi/cppc_acpi.c > +++ b/drivers/acpi/cppc_acpi.c > @@ -1682,6 +1682,41 @@ int cppc_set_epp(int cpu, u64 epp_val) > } > EXPORT_SYMBOL_GPL(cppc_set_epp); > > +/** > + * cppc_set_ospm_nominal_perf() - Write OSPM Nominal Performance register. > + * @cpu: CPU on which to write register. > + * @ospm_nominal_perf: Value to write to the OSPM Nominal Performance register. > + * > + * OSPM Nominal Performance conveys the desired nominal performance level > + * at which the platform may run. Per ACPI 6.6, s8.4.6.1.2.6, the value > + * must lie within [Lowest Performance, Nominal Performance] and may be > + * set independently of Minimum, Maximum and Desired performance. > + * > + * Return: 0 on success or negative error code. > + */ > +int cppc_set_ospm_nominal_perf(int cpu, u64 ospm_nominal_perf) > +{ > + struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpu); > + struct cppc_perf_caps caps; > + int ret; > + > + if (!cpc_desc) { > + pr_debug("No CPC descriptor for CPU:%d\n", cpu); > + return -ENODEV; > + } > + > + ret = cppc_get_perf_caps(cpu, &caps); > + if (ret) > + return ret; > + > + if (ospm_nominal_perf < caps.lowest_perf || > + ospm_nominal_perf > caps.nominal_perf) > + return -EINVAL; > + > + return cppc_set_reg_val(cpu, OSPM_NOMINAL_PERF, ospm_nominal_perf); > +} > +EXPORT_SYMBOL_GPL(cppc_set_ospm_nominal_perf); > + > /** > * cppc_get_auto_act_window() - Read autonomous activity window register. > * @cpu: CPU from which to read register. > diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c > index 15a728dea911..5c54af1655b5 100644 > --- a/drivers/cpufreq/cppc_cpufreq.c > +++ b/drivers/cpufreq/cppc_cpufreq.c > @@ -1139,11 +1139,70 @@ static int cppc_get_perf_limited_filtered(int cpu, u64 *perf_limited) > CPPC_CPUFREQ_ATTR_RW_U64(perf_limited, cppc_get_perf_limited_filtered, > cppc_set_perf_limited) > > +static ssize_t show_ospm_nominal_freq(struct cpufreq_policy *policy, char *buf) > +{ > + struct cppc_cpudata *cpu_data = policy->driver_data; > + unsigned int freq_khz; > + > + if (!cpu_data->ospm_nominal_perf_set) > + return sysfs_emit(buf, "0\n"); The questions on v3 might be more relevant, but for instance here, the ospm_nominal_perf value is not 0, the hardware register might contain any value. So reading the register might be more meaningful than returning 0. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 2/2] ACPI: CPPC: Add ospm_nominal_perf support 2026-05-28 12:12 ` Pierre Gondois @ 2026-06-09 7:47 ` Sumit Gupta 0 siblings, 0 replies; 12+ messages in thread From: Sumit Gupta @ 2026-06-09 7:47 UTC (permalink / raw) To: Pierre Gondois, rafael, viresh.kumar, lenb, zhenglifeng1, zhanjie9, mario.limonciello, saket.dumbre, linux-acpi, linux-kernel, linux-pm, acpica-devel Cc: treding, jonathanh, vsethi, ksitaraman, sanjayc, mochs, bbasu, sumitg On 28/05/26 17:42, Pierre Gondois wrote: > External email: Use caution opening links or attachments > > > Hello Sumit, > > On 5/27/26 21:46, Sumit Gupta wrote: >> Expose the OSPM Nominal Performance register (ACPI 6.6, Section >> 8.4.6.1.2.6), which conveys the desired nominal performance level >> at which the platform may run. Unlike the existing read-only >> Nominal Performance register, it is writable and lets OSPM >> request a lower nominal level than the platform-reported nominal. >> The platform classifies performance above this level as boosted >> and below as throttled for its power/thermal decisions. >> >> It is exposed as a per-policy cpufreq sysfs attribute in kHz, to >> match the cpufreq sysfs unit convention: >> >> /sys/devices/system/cpu/cpufreq/policyN/ospm_nominal_freq >> >> The attribute is documented in >> Documentation/ABI/testing/sysfs-devices-system-cpu. >> >> Writes are converted to perf via cppc_khz_to_perf(), validated >> against [Lowest Performance, Nominal Performance], and applied to >> every CPU in policy->cpus. >> >> The register is write-only; the kernel caches the last written >> value in struct cppc_cpudata for sysfs readback (returns 0 until >> userspace writes a value). >> >> Signed-off-by: Sumit Gupta <sumitg@nvidia.com> >> --- >> .../ABI/testing/sysfs-devices-system-cpu | 17 ++++++ >> drivers/acpi/cppc_acpi.c | 35 +++++++++++ >> drivers/cpufreq/cppc_cpufreq.c | 60 +++++++++++++++++++ >> include/acpi/cppc_acpi.h | 12 ++++ >> 4 files changed, 124 insertions(+) >> >> diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu >> b/Documentation/ABI/testing/sysfs-devices-system-cpu >> index 82d10d556cc8..ac1bf1b89ac4 100644 >> --- a/Documentation/ABI/testing/sysfs-devices-system-cpu >> +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu >> @@ -346,6 +346,23 @@ Description: Performance Limited >> >> This file is only present if the cppc-cpufreq driver is >> in use. >> >> +What: /sys/devices/system/cpu/cpuX/cpufreq/ospm_nominal_freq >> +Date: May 2026 >> +Contact: linux-pm@vger.kernel.org >> +Description: OSPM Nominal Performance (kHz) >> + >> + OSPM uses this attribute to request a nominal performance >> + level lower than the platform-reported nominal. The >> + platform treats performance above this level as boost >> + and below as throttle for power and thermal decisions. >> + >> + Read returns the last written value in kHz, or 0 if no >> + value has been written. Write a kHz value in the range >> + [lowest_freq, nominal_freq]. >> + >> + This file is only present if the cppc-cpufreq driver is >> + in use. >> + >> What: /sys/devices/system/cpu/cpu*/cache/index3/cache_disable_{0,1} >> Date: August 2008 >> KernelVersion: 2.6.27 >> diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c >> index c76cfafa3589..ad6ece16c30d 100644 >> --- a/drivers/acpi/cppc_acpi.c >> +++ b/drivers/acpi/cppc_acpi.c >> @@ -1682,6 +1682,41 @@ int cppc_set_epp(int cpu, u64 epp_val) >> } >> EXPORT_SYMBOL_GPL(cppc_set_epp); >> >> +/** >> + * cppc_set_ospm_nominal_perf() - Write OSPM Nominal Performance >> register. >> + * @cpu: CPU on which to write register. >> + * @ospm_nominal_perf: Value to write to the OSPM Nominal >> Performance register. >> + * >> + * OSPM Nominal Performance conveys the desired nominal performance >> level >> + * at which the platform may run. Per ACPI 6.6, s8.4.6.1.2.6, the value >> + * must lie within [Lowest Performance, Nominal Performance] and may be >> + * set independently of Minimum, Maximum and Desired performance. >> + * >> + * Return: 0 on success or negative error code. >> + */ >> +int cppc_set_ospm_nominal_perf(int cpu, u64 ospm_nominal_perf) >> +{ >> + struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpu); >> + struct cppc_perf_caps caps; >> + int ret; >> + >> + if (!cpc_desc) { >> + pr_debug("No CPC descriptor for CPU:%d\n", cpu); >> + return -ENODEV; >> + } >> + >> + ret = cppc_get_perf_caps(cpu, &caps); >> + if (ret) >> + return ret; >> + >> + if (ospm_nominal_perf < caps.lowest_perf || >> + ospm_nominal_perf > caps.nominal_perf) >> + return -EINVAL; >> + >> + return cppc_set_reg_val(cpu, OSPM_NOMINAL_PERF, >> ospm_nominal_perf); >> +} >> +EXPORT_SYMBOL_GPL(cppc_set_ospm_nominal_perf); >> + >> /** >> * cppc_get_auto_act_window() - Read autonomous activity window >> register. >> * @cpu: CPU from which to read register. >> diff --git a/drivers/cpufreq/cppc_cpufreq.c >> b/drivers/cpufreq/cppc_cpufreq.c >> index 15a728dea911..5c54af1655b5 100644 >> --- a/drivers/cpufreq/cppc_cpufreq.c >> +++ b/drivers/cpufreq/cppc_cpufreq.c >> @@ -1139,11 +1139,70 @@ static int cppc_get_perf_limited_filtered(int >> cpu, u64 *perf_limited) >> CPPC_CPUFREQ_ATTR_RW_U64(perf_limited, cppc_get_perf_limited_filtered, >> cppc_set_perf_limited) >> >> +static ssize_t show_ospm_nominal_freq(struct cpufreq_policy *policy, >> char *buf) >> +{ >> + struct cppc_cpudata *cpu_data = policy->driver_data; >> + unsigned int freq_khz; >> + >> + if (!cpu_data->ospm_nominal_perf_set) >> + return sysfs_emit(buf, "0\n"); > > The questions on v3 might be more relevant, > but for instance here, the ospm_nominal_perf value is not 0, > the hardware register might contain any value. > > So reading the register might be more meaningful than > returning 0. > > Agreed. In v5, reading the register instead of caching: - Added cppc_get_ospm_nominal_perf(). - show_ospm_nominal_freq() now returns the current register value, or "<unsupported>" on -EOPNOTSUPP. - Dropped the cpu_data->ospm_nominal_perf cache and the ospm_nominal_perf_set bool entirely. This also follows your earlier point that being write-only doesn't mean we can't read it (cppc_get_desired_perf() being the precedent). Thank you, Sumit Gupta ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 2/2] ACPI: CPPC: Add ospm_nominal_perf support 2026-05-27 19:46 ` [PATCH v4 2/2] ACPI: CPPC: Add ospm_nominal_perf support Sumit Gupta 2026-05-28 12:12 ` Pierre Gondois @ 2026-05-29 13:12 ` Christian Loehle 2026-06-09 7:37 ` Sumit Gupta 2026-06-01 17:37 ` Rafael J. Wysocki 2 siblings, 1 reply; 12+ messages in thread From: Christian Loehle @ 2026-05-29 13:12 UTC (permalink / raw) To: Sumit Gupta, rafael, viresh.kumar, lenb, pierre.gondois, zhenglifeng1, zhanjie9, mario.limonciello, saket.dumbre, linux-acpi, linux-kernel, linux-pm, acpica-devel Cc: treding, jonathanh, vsethi, ksitaraman, sanjayc, mochs, bbasu On 5/27/26 20:46, Sumit Gupta wrote: > Expose the OSPM Nominal Performance register (ACPI 6.6, Section > 8.4.6.1.2.6), which conveys the desired nominal performance level > at which the platform may run. Unlike the existing read-only > Nominal Performance register, it is writable and lets OSPM > request a lower nominal level than the platform-reported nominal. > The platform classifies performance above this level as boosted > and below as throttled for its power/thermal decisions. > > It is exposed as a per-policy cpufreq sysfs attribute in kHz, to > match the cpufreq sysfs unit convention: > > /sys/devices/system/cpu/cpufreq/policyN/ospm_nominal_freq > > The attribute is documented in > Documentation/ABI/testing/sysfs-devices-system-cpu. > > Writes are converted to perf via cppc_khz_to_perf(), validated > against [Lowest Performance, Nominal Performance], and applied to > every CPU in policy->cpus. > > The register is write-only; the kernel caches the last written > value in struct cppc_cpudata for sysfs readback (returns 0 until > userspace writes a value). > > Signed-off-by: Sumit Gupta <sumitg@nvidia.com> > --- > .../ABI/testing/sysfs-devices-system-cpu | 17 ++++++ > drivers/acpi/cppc_acpi.c | 35 +++++++++++ > drivers/cpufreq/cppc_cpufreq.c | 60 +++++++++++++++++++ > include/acpi/cppc_acpi.h | 12 ++++ > 4 files changed, 124 insertions(+) > > diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu > index 82d10d556cc8..ac1bf1b89ac4 100644 > --- a/Documentation/ABI/testing/sysfs-devices-system-cpu > +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu > @@ -346,6 +346,23 @@ Description: Performance Limited > > This file is only present if the cppc-cpufreq driver is in use. > > +What: /sys/devices/system/cpu/cpuX/cpufreq/ospm_nominal_freq > +Date: May 2026 > +Contact: linux-pm@vger.kernel.org > +Description: OSPM Nominal Performance (kHz) > + > + OSPM uses this attribute to request a nominal performance > + level lower than the platform-reported nominal. The > + platform treats performance above this level as boost > + and below as throttle for power and thermal decisions. > + > + Read returns the last written value in kHz, or 0 if no > + value has been written. Write a kHz value in the range > + [lowest_freq, nominal_freq]. > + > + This file is only present if the cppc-cpufreq driver is > + in use. > + Given that this value, based also on firmware behavior, can create vast asymmetries between CPUs, which the scheduler would be unaware of I wonder if this warrants a similar disclaimer like intel_pstate carries for their per-CPU EPP: https://www.kernel.org/doc/html/v7.0/admin-guide/pm/intel_pstate.html#energy-vs-performance-hints "[Note that tasks may by migrated from one CPU to another by the scheduler’s load-balancing algorithm and if different energy vs performance hints are set for those CPUs, that may lead to undesirable outcomes. To avoid such issues it is better to set the same energy vs performance hint for all CPUs or to pin every task potentially sensitive to them to a specific CPU.]" ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 2/2] ACPI: CPPC: Add ospm_nominal_perf support 2026-05-29 13:12 ` Christian Loehle @ 2026-06-09 7:37 ` Sumit Gupta 0 siblings, 0 replies; 12+ messages in thread From: Sumit Gupta @ 2026-06-09 7:37 UTC (permalink / raw) To: Christian Loehle, rafael, viresh.kumar, lenb, pierre.gondois, zhenglifeng1, zhanjie9, mario.limonciello, saket.dumbre, linux-acpi, linux-kernel, linux-pm, acpica-devel Cc: treding, jonathanh, vsethi, ksitaraman, sanjayc, mochs, bbasu, sumitg On 29/05/26 18:42, Christian Loehle wrote: > External email: Use caution opening links or attachments > > > On 5/27/26 20:46, Sumit Gupta wrote: >> Expose the OSPM Nominal Performance register (ACPI 6.6, Section >> 8.4.6.1.2.6), which conveys the desired nominal performance level >> at which the platform may run. Unlike the existing read-only >> Nominal Performance register, it is writable and lets OSPM >> request a lower nominal level than the platform-reported nominal. >> The platform classifies performance above this level as boosted >> and below as throttled for its power/thermal decisions. >> >> It is exposed as a per-policy cpufreq sysfs attribute in kHz, to >> match the cpufreq sysfs unit convention: >> >> /sys/devices/system/cpu/cpufreq/policyN/ospm_nominal_freq >> >> The attribute is documented in >> Documentation/ABI/testing/sysfs-devices-system-cpu. >> >> Writes are converted to perf via cppc_khz_to_perf(), validated >> against [Lowest Performance, Nominal Performance], and applied to >> every CPU in policy->cpus. >> >> The register is write-only; the kernel caches the last written >> value in struct cppc_cpudata for sysfs readback (returns 0 until >> userspace writes a value). >> >> Signed-off-by: Sumit Gupta <sumitg@nvidia.com> >> --- >> .../ABI/testing/sysfs-devices-system-cpu | 17 ++++++ >> drivers/acpi/cppc_acpi.c | 35 +++++++++++ >> drivers/cpufreq/cppc_cpufreq.c | 60 +++++++++++++++++++ >> include/acpi/cppc_acpi.h | 12 ++++ >> 4 files changed, 124 insertions(+) >> >> diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu >> index 82d10d556cc8..ac1bf1b89ac4 100644 >> --- a/Documentation/ABI/testing/sysfs-devices-system-cpu >> +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu >> @@ -346,6 +346,23 @@ Description: Performance Limited >> >> This file is only present if the cppc-cpufreq driver is in use. >> >> +What: /sys/devices/system/cpu/cpuX/cpufreq/ospm_nominal_freq >> +Date: May 2026 >> +Contact: linux-pm@vger.kernel.org >> +Description: OSPM Nominal Performance (kHz) >> + >> + OSPM uses this attribute to request a nominal performance >> + level lower than the platform-reported nominal. The >> + platform treats performance above this level as boost >> + and below as throttle for power and thermal decisions. >> + >> + Read returns the last written value in kHz, or 0 if no >> + value has been written. Write a kHz value in the range >> + [lowest_freq, nominal_freq]. >> + >> + This file is only present if the cppc-cpufreq driver is >> + in use. >> + > Given that this value, based also on firmware behavior, can create vast asymmetries > between CPUs, which the scheduler would be unaware of I wonder if this warrants > a similar disclaimer like intel_pstate carries for their per-CPU EPP: > https://www.kernel.org/doc/html/v7.0/admin-guide/pm/intel_pstate.html#energy-vs-performance-hints > > "[Note that tasks may by migrated from one CPU to another by the scheduler’s load-balancing algorithm and if different energy vs performance hints are set for those CPUs, that may lead to undesirable outcomes. To avoid such issues it is better to set the same energy vs performance hint for all CPUs or to pin every task potentially sensitive to them to a specific CPU.]" Good point. In v5 added below to the sysfs ABI doc, modeled on similar note: Note that tasks may be migrated from one CPU to another by the scheduler's load-balancing algorithm, and if different OSPM Nominal Performance values are set for those CPUs, that may lead to undesirable outcomes. To avoid such issues it is better to set the same value across all policies, or to pin every potentially sensitive task to a specific CPU. Thank you, Sumit Gupta ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 2/2] ACPI: CPPC: Add ospm_nominal_perf support 2026-05-27 19:46 ` [PATCH v4 2/2] ACPI: CPPC: Add ospm_nominal_perf support Sumit Gupta 2026-05-28 12:12 ` Pierre Gondois 2026-05-29 13:12 ` Christian Loehle @ 2026-06-01 17:37 ` Rafael J. Wysocki 2026-06-09 9:59 ` Sumit Gupta 2 siblings, 1 reply; 12+ messages in thread From: Rafael J. Wysocki @ 2026-06-01 17:37 UTC (permalink / raw) To: Sumit Gupta Cc: rafael, viresh.kumar, lenb, pierre.gondois, zhenglifeng1, zhanjie9, mario.limonciello, saket.dumbre, linux-acpi, linux-kernel, linux-pm, acpica-devel, treding, jonathanh, vsethi, ksitaraman, sanjayc, mochs, bbasu On Wed, May 27, 2026 at 9:47 PM Sumit Gupta <sumitg@nvidia.com> wrote: > > Expose the OSPM Nominal Performance register (ACPI 6.6, Section > 8.4.6.1.2.6), which conveys the desired nominal performance level > at which the platform may run. Unlike the existing read-only > Nominal Performance register, it is writable and lets OSPM > request a lower nominal level than the platform-reported nominal. > The platform classifies performance above this level as boosted > and below as throttled for its power/thermal decisions. > > It is exposed as a per-policy cpufreq sysfs attribute in kHz, to > match the cpufreq sysfs unit convention: > > /sys/devices/system/cpu/cpufreq/policyN/ospm_nominal_freq > > The attribute is documented in > Documentation/ABI/testing/sysfs-devices-system-cpu. > > Writes are converted to perf via cppc_khz_to_perf(), validated > against [Lowest Performance, Nominal Performance], and applied to > every CPU in policy->cpus. > > The register is write-only; the kernel caches the last written > value in struct cppc_cpudata for sysfs readback (returns 0 until > userspace writes a value). > > Signed-off-by: Sumit Gupta <sumitg@nvidia.com> There is some sashiko.dev feedback on this one that is valid AFAICS: https://sashiko.dev/#/patchset/20260527194626.185286-1-sumitg%40nvidia.com > --- > .../ABI/testing/sysfs-devices-system-cpu | 17 ++++++ > drivers/acpi/cppc_acpi.c | 35 +++++++++++ > drivers/cpufreq/cppc_cpufreq.c | 60 +++++++++++++++++++ > include/acpi/cppc_acpi.h | 12 ++++ > 4 files changed, 124 insertions(+) > > diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu > index 82d10d556cc8..ac1bf1b89ac4 100644 > --- a/Documentation/ABI/testing/sysfs-devices-system-cpu > +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu > @@ -346,6 +346,23 @@ Description: Performance Limited > > This file is only present if the cppc-cpufreq driver is in use. > > +What: /sys/devices/system/cpu/cpuX/cpufreq/ospm_nominal_freq > +Date: May 2026 > +Contact: linux-pm@vger.kernel.org > +Description: OSPM Nominal Performance (kHz) > + > + OSPM uses this attribute to request a nominal performance > + level lower than the platform-reported nominal. The > + platform treats performance above this level as boost > + and below as throttle for power and thermal decisions. > + > + Read returns the last written value in kHz, or 0 if no > + value has been written. Write a kHz value in the range > + [lowest_freq, nominal_freq]. > + > + This file is only present if the cppc-cpufreq driver is > + in use. > + > What: /sys/devices/system/cpu/cpu*/cache/index3/cache_disable_{0,1} > Date: August 2008 > KernelVersion: 2.6.27 > diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c > index c76cfafa3589..ad6ece16c30d 100644 > --- a/drivers/acpi/cppc_acpi.c > +++ b/drivers/acpi/cppc_acpi.c > @@ -1682,6 +1682,41 @@ int cppc_set_epp(int cpu, u64 epp_val) > } > EXPORT_SYMBOL_GPL(cppc_set_epp); > > +/** > + * cppc_set_ospm_nominal_perf() - Write OSPM Nominal Performance register. > + * @cpu: CPU on which to write register. > + * @ospm_nominal_perf: Value to write to the OSPM Nominal Performance register. > + * > + * OSPM Nominal Performance conveys the desired nominal performance level > + * at which the platform may run. Per ACPI 6.6, s8.4.6.1.2.6, the value > + * must lie within [Lowest Performance, Nominal Performance] and may be > + * set independently of Minimum, Maximum and Desired performance. > + * > + * Return: 0 on success or negative error code. > + */ > +int cppc_set_ospm_nominal_perf(int cpu, u64 ospm_nominal_perf) > +{ > + struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpu); > + struct cppc_perf_caps caps; > + int ret; > + > + if (!cpc_desc) { > + pr_debug("No CPC descriptor for CPU:%d\n", cpu); > + return -ENODEV; > + } > + > + ret = cppc_get_perf_caps(cpu, &caps); > + if (ret) > + return ret; > + > + if (ospm_nominal_perf < caps.lowest_perf || > + ospm_nominal_perf > caps.nominal_perf) > + return -EINVAL; > + > + return cppc_set_reg_val(cpu, OSPM_NOMINAL_PERF, ospm_nominal_perf); > +} > +EXPORT_SYMBOL_GPL(cppc_set_ospm_nominal_perf); > + > /** > * cppc_get_auto_act_window() - Read autonomous activity window register. > * @cpu: CPU from which to read register. > diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c > index 15a728dea911..5c54af1655b5 100644 > --- a/drivers/cpufreq/cppc_cpufreq.c > +++ b/drivers/cpufreq/cppc_cpufreq.c > @@ -1139,11 +1139,70 @@ static int cppc_get_perf_limited_filtered(int cpu, u64 *perf_limited) > CPPC_CPUFREQ_ATTR_RW_U64(perf_limited, cppc_get_perf_limited_filtered, > cppc_set_perf_limited) > > +static ssize_t show_ospm_nominal_freq(struct cpufreq_policy *policy, char *buf) > +{ > + struct cppc_cpudata *cpu_data = policy->driver_data; > + unsigned int freq_khz; > + > + if (!cpu_data->ospm_nominal_perf_set) > + return sysfs_emit(buf, "0\n"); > + > + freq_khz = cppc_perf_to_khz(&cpu_data->perf_caps, > + cpu_data->ospm_nominal_perf); > + return sysfs_emit(buf, "%u\n", freq_khz); > +} > + > +static ssize_t store_ospm_nominal_freq(struct cpufreq_policy *policy, > + const char *buf, size_t count) > +{ > + struct cppc_cpudata *cpu_data = policy->driver_data; > + bool prev_set = cpu_data->ospm_nominal_perf_set; > + u32 prev_perf = cpu_data->ospm_nominal_perf; > + unsigned int sib, freq_khz, failing_cpu = 0; > + u32 perf; > + int ret; > + > + ret = kstrtouint(buf, 0, &freq_khz); > + if (ret) > + return ret; > + > + perf = cppc_khz_to_perf(&cpu_data->perf_caps, freq_khz); > + > + for_each_cpu(sib, policy->cpus) { > + ret = cppc_set_ospm_nominal_perf(sib, perf); > + if (ret) { > + failing_cpu = sib; > + goto rollback; > + } > + } > + > + cpu_data->ospm_nominal_perf = perf; > + cpu_data->ospm_nominal_perf_set = true; > + return count; > + > +rollback: > + /* > + * Restore the previous value on siblings already updated. > + * for_each_cpu() iterates in CPU-id order, so siblings before > + * @failing_cpu were updated successfully. Skip restore when > + * there is no prior known-good value (first-ever write failed). > + */ > + if (prev_set) { > + for_each_cpu(sib, policy->cpus) { > + if (sib == failing_cpu) > + break; > + cppc_set_ospm_nominal_perf(sib, prev_perf); > + } > + } > + return ret; > +} > + > cpufreq_freq_attr_ro(freqdomain_cpus); > cpufreq_freq_attr_rw(auto_select); > cpufreq_freq_attr_rw(auto_act_window); > cpufreq_freq_attr_rw(energy_performance_preference_val); > cpufreq_freq_attr_rw(perf_limited); > +cpufreq_freq_attr_rw(ospm_nominal_freq); > > static struct freq_attr *cppc_cpufreq_attr[] = { > &freqdomain_cpus, > @@ -1151,6 +1210,7 @@ static struct freq_attr *cppc_cpufreq_attr[] = { > &auto_act_window, > &energy_performance_preference_val, > &perf_limited, > + &ospm_nominal_freq, > NULL, > }; > > diff --git a/include/acpi/cppc_acpi.h b/include/acpi/cppc_acpi.h > index 9b18fb9aab7c..14c6d5d0ac12 100644 > --- a/include/acpi/cppc_acpi.h > +++ b/include/acpi/cppc_acpi.h > @@ -154,6 +154,13 @@ struct cppc_cpudata { > struct cppc_perf_fb_ctrs perf_fb_ctrs; > unsigned int shared_type; > cpumask_var_t shared_cpu_map; > + /* > + * Cached OSPM Nominal Performance value (write-only register). > + * ospm_nominal_perf_set is true once userspace has written, so an > + * unwritten cache is distinguishable from a valid 0 perf write. > + */ > + u32 ospm_nominal_perf; > + bool ospm_nominal_perf_set; > }; > > #ifdef CONFIG_ACPI_CPPC_LIB > @@ -181,6 +188,7 @@ extern int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val); > extern int cppc_get_epp_perf(int cpunum, u64 *epp_perf); > extern int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable); > extern int cppc_set_epp(int cpu, u64 epp_val); > +extern int cppc_set_ospm_nominal_perf(int cpu, u64 ospm_nominal_perf); > extern int cppc_get_auto_act_window(int cpu, u64 *auto_act_window); > extern int cppc_set_auto_act_window(int cpu, u64 auto_act_window); > extern int cppc_get_auto_sel(int cpu, bool *enable); > @@ -267,6 +275,10 @@ static inline int cppc_set_epp(int cpu, u64 epp_val) > { > return -EOPNOTSUPP; > } > +static inline int cppc_set_ospm_nominal_perf(int cpu, u64 ospm_nominal_perf) > +{ > + return -EOPNOTSUPP; > +} > static inline int cppc_get_auto_act_window(int cpu, u64 *auto_act_window) > { > return -EOPNOTSUPP; > -- > 2.34.1 > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 2/2] ACPI: CPPC: Add ospm_nominal_perf support 2026-06-01 17:37 ` Rafael J. Wysocki @ 2026-06-09 9:59 ` Sumit Gupta 0 siblings, 0 replies; 12+ messages in thread From: Sumit Gupta @ 2026-06-09 9:59 UTC (permalink / raw) To: Rafael J. Wysocki Cc: viresh.kumar, lenb, pierre.gondois, zhenglifeng1, zhanjie9, mario.limonciello, saket.dumbre, linux-acpi, linux-kernel, linux-pm, acpica-devel, treding, jonathanh, vsethi, ksitaraman, sanjayc, mochs, bbasu, sumitg On 01/06/26 23:07, Rafael J. Wysocki wrote: > External email: Use caution opening links or attachments > > > On Wed, May 27, 2026 at 9:47 PM Sumit Gupta <sumitg@nvidia.com> wrote: >> Expose the OSPM Nominal Performance register (ACPI 6.6, Section >> 8.4.6.1.2.6), which conveys the desired nominal performance level >> at which the platform may run. Unlike the existing read-only >> Nominal Performance register, it is writable and lets OSPM >> request a lower nominal level than the platform-reported nominal. >> The platform classifies performance above this level as boosted >> and below as throttled for its power/thermal decisions. >> >> It is exposed as a per-policy cpufreq sysfs attribute in kHz, to >> match the cpufreq sysfs unit convention: >> >> /sys/devices/system/cpu/cpufreq/policyN/ospm_nominal_freq >> >> The attribute is documented in >> Documentation/ABI/testing/sysfs-devices-system-cpu. >> >> Writes are converted to perf via cppc_khz_to_perf(), validated >> against [Lowest Performance, Nominal Performance], and applied to >> every CPU in policy->cpus. >> >> The register is write-only; the kernel caches the last written >> value in struct cppc_cpudata for sysfs readback (returns 0 until >> userspace writes a value). >> >> Signed-off-by: Sumit Gupta <sumitg@nvidia.com> > There is some sashiko.dev feedback on this one that is valid AFAICS: > > https://sashiko.dev/#/patchset/20260527194626.185286-1-sumitg%40nvidia.com Thanks for sharing. Will address all four in v5. > Could this validation reject valid frequencies on systems with CPPC > favored cores? 1. In v5, moved the range check into store_ospm_nominal_freq() in cppc_cpufreq.c, where it uses the same cpu_data->perf_caps as the kHz->perf conversion. OSPM Nominal is treated as a single per-policy value. It's validated once against the policy caps and applied to all CPUs in policy->cpus. This avoids validating against a sibling's separately-read caps. > When the platform's ACPI _CPC table does not support this register, > will this unconditionally return '0' instead of an error like > -EOPNOTSUPP? 2. In v5, added cppc_get_ospm_nominal_perf() and dropped the cached value. show() now reads the register and returns "<unsupported>" on -EOPNOTSUPP. > Are newly onlined CPUs missing this cached ospm_nominal_perf value? 3. show() now reads the register directly and not cached value, so it always reflects true per-CPU state. > Does skipping this rollback loop when prev_set is false leave the CPUs > in a desynchronized state? In v5, the cache and ospm_nominal_perf_set bool are removed and show() reads the register, so a partial write is no longer hidden. sysfs shows the real per-CPU value, not '0'). store() reads the current value before writing and restores it on already updated CPUs if a sibling write fails, so there is no first write skip. Thank you, Sumit Gupta .... ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2026-06-09 9:59 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-05-27 19:46 [PATCH v4 0/2] ACPI: CPPC: Add CPPC v4 support (ACPI 6.6) Sumit Gupta 2026-05-27 19:46 ` [PATCH v4 1/2] ACPI: CPPC: Add support for CPPC v4 Sumit Gupta 2026-06-01 17:35 ` Rafael J. Wysocki 2026-06-01 18:01 ` Sumit Gupta 2026-06-01 18:11 ` Rafael J. Wysocki 2026-05-27 19:46 ` [PATCH v4 2/2] ACPI: CPPC: Add ospm_nominal_perf support Sumit Gupta 2026-05-28 12:12 ` Pierre Gondois 2026-06-09 7:47 ` Sumit Gupta 2026-05-29 13:12 ` Christian Loehle 2026-06-09 7:37 ` Sumit Gupta 2026-06-01 17:37 ` Rafael J. Wysocki 2026-06-09 9:59 ` Sumit Gupta
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox