* [PATCH 0/2] ACPI: CPPC: Add CPPC v4 support (ACPI 6.6)
@ 2026-04-27 5:18 Sumit Gupta
2026-04-27 5:18 ` [PATCH 1/2] ACPI: CPPC: Add support for CPPC v4 Sumit Gupta
2026-04-27 5:18 ` [PATCH 2/2] ACPI: CPPC: Add ospm_nominal_perf support Sumit Gupta
0 siblings, 2 replies; 5+ messages in thread
From: Sumit Gupta @ 2026-04-27 5:18 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, 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): write-only 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,
handle the Resource Priority package, and mark the two new
registers optional.
Patch 2: cppc_set_ospm_nominal_perf() API, write-only
acpi_cppc/ospm_nominal_perf sysfs attribute, and init to platform
nominal during cppc_cpufreq policy init.
Sumit Gupta (2):
ACPI: CPPC: Add support for CPPC v4
ACPI: CPPC: Add ospm_nominal_perf support
drivers/acpi/cppc_acpi.c | 66 ++++++++++++++++++++++++++++++----
drivers/cpufreq/cppc_cpufreq.c | 10 ++++++
include/acpi/cppc_acpi.h | 13 +++++--
3 files changed, 81 insertions(+), 8 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH 1/2] ACPI: CPPC: Add support for CPPC v4 2026-04-27 5:18 [PATCH 0/2] ACPI: CPPC: Add CPPC v4 support (ACPI 6.6) Sumit Gupta @ 2026-04-27 5:18 ` Sumit Gupta 2026-04-27 7:06 ` zhenglifeng (A) 2026-04-27 5:18 ` [PATCH 2/2] ACPI: CPPC: Add ospm_nominal_perf support Sumit Gupta 1 sibling, 1 reply; 5+ messages in thread From: Sumit Gupta @ 2026-04-27 5:18 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, bbasu, sumitg 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> --- drivers/acpi/cppc_acpi.c | 24 ++++++++++++++++++------ include/acpi/cppc_acpi.h | 8 ++++++-- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c index 2e91c5a97761..a1c91ce20cc8 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,17 @@ 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) { + /* + * 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 entry %d: package type not supported\n", + pr->id, i); + 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 d1f02ceec4f9..8693890a7275 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 @@ -109,6 +111,8 @@ enum cppc_regs { REFERENCE_PERF, LOWEST_FREQ, NOMINAL_FREQ, + OSPM_NOMINAL_PERF, + RESOURCE_PRIORITY, }; /* -- 2.34.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] ACPI: CPPC: Add support for CPPC v4 2026-04-27 5:18 ` [PATCH 1/2] ACPI: CPPC: Add support for CPPC v4 Sumit Gupta @ 2026-04-27 7:06 ` zhenglifeng (A) 2026-04-27 8:04 ` Sumit Gupta 0 siblings, 1 reply; 5+ messages in thread From: zhenglifeng (A) @ 2026-04-27 7:06 UTC (permalink / raw) To: Sumit Gupta, rafael, viresh.kumar, lenb, pierre.gondois, zhanjie9, mario.limonciello, saket.dumbre, linux-acpi, linux-kernel, linux-pm, acpica-devel Cc: treding, jonathanh, vsethi, ksitaraman, sanjayc, bbasu It seems that mario has sent a similar patch: https://lore.kernel.org/all/20260427035520.1427080-3-superm1@kernel.org/ On 4/27/2026 1:18 PM, Sumit Gupta 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> > --- > drivers/acpi/cppc_acpi.c | 24 ++++++++++++++++++------ > include/acpi/cppc_acpi.h | 8 ++++++-- > 2 files changed, 24 insertions(+), 8 deletions(-) > > diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c > index 2e91c5a97761..a1c91ce20cc8 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,17 @@ 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) { > + /* > + * 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 entry %d: package type not supported\n", > + pr->id, i); > + 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 d1f02ceec4f9..8693890a7275 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 > @@ -109,6 +111,8 @@ enum cppc_regs { > REFERENCE_PERF, > LOWEST_FREQ, > NOMINAL_FREQ, > + OSPM_NOMINAL_PERF, > + RESOURCE_PRIORITY, > }; > > /* ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] ACPI: CPPC: Add support for CPPC v4 2026-04-27 7:06 ` zhenglifeng (A) @ 2026-04-27 8:04 ` Sumit Gupta 0 siblings, 0 replies; 5+ messages in thread From: Sumit Gupta @ 2026-04-27 8:04 UTC (permalink / raw) To: zhenglifeng (A), rafael, viresh.kumar, lenb, pierre.gondois, zhanjie9, mario.limonciello, saket.dumbre, linux-acpi, linux-kernel, linux-pm, acpica-devel Cc: treding, jonathanh, vsethi, ksitaraman, sanjayc, bbasu, sumitg On 27/04/26 12:36, zhenglifeng (A) wrote: > External email: Use caution opening links or attachments > > > It seems that mario has sent a similar patch: > > https://lore.kernel.org/all/20260427035520.1427080-3-superm1@kernel.org/ Thank you for sharing. Yes, both look similar with below two change. 1. REG_OPTIONAL needs the 0x1FC7D0 -> 0x7FC7D0 update to mark the two new registers optional. This is present in my [PATCH 1/2]. 2. For Resource Priority, pkg_data added to cpc_entry. This is present in Mario's [PATCH 2/6]. Hi Mario, How would you like to proceed? A few options: (a) Let both CPPCv4 patches from this series go separately. (b) Fold the REG_OPTIONAL update from my patch 1/2 into your patch, and pull my patch 2/2 into your series. (c) Anything else you'd prefer. Either way works for me. Thank you, Sumit Gupta > > On 4/27/2026 1:18 PM, Sumit Gupta 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> >> --- >> drivers/acpi/cppc_acpi.c | 24 ++++++++++++++++++------ >> include/acpi/cppc_acpi.h | 8 ++++++-- >> 2 files changed, 24 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c >> index 2e91c5a97761..a1c91ce20cc8 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,17 @@ 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) { >> + /* >> + * 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 entry %d: package type not supported\n", >> + pr->id, i); >> + 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 d1f02ceec4f9..8693890a7275 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 >> @@ -109,6 +111,8 @@ enum cppc_regs { >> REFERENCE_PERF, >> LOWEST_FREQ, >> NOMINAL_FREQ, >> + OSPM_NOMINAL_PERF, >> + RESOURCE_PRIORITY, >> }; >> >> /* ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 2/2] ACPI: CPPC: Add ospm_nominal_perf support 2026-04-27 5:18 [PATCH 0/2] ACPI: CPPC: Add CPPC v4 support (ACPI 6.6) Sumit Gupta 2026-04-27 5:18 ` [PATCH 1/2] ACPI: CPPC: Add support for CPPC v4 Sumit Gupta @ 2026-04-27 5:18 ` Sumit Gupta 1 sibling, 0 replies; 5+ messages in thread From: Sumit Gupta @ 2026-04-27 5:18 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, bbasu, sumitg Add acpi_cppc/ospm_nominal_perf sysfs attribute (write-only) and cppc_set_ospm_nominal_perf() API for the OSPM Nominal Performance register (ACPI 6.6, Section 8.4.6.1.2.6). The register conveys the desired nominal performance level at which the platform may run. OSPM can request a lower level than platform nominal. Valid range is [Lowest Performance, Nominal Performance]. The value tells the platform what OSPM considers nominal. The platform classifies performance above this as boosted and below as throttled. It uses that for its power/thermal decisions. Initialize to platform nominal at policy init. Override via sysfs if needed. Signed-off-by: Sumit Gupta <sumitg@nvidia.com> --- drivers/acpi/cppc_acpi.c | 42 ++++++++++++++++++++++++++++++++++ drivers/cpufreq/cppc_cpufreq.c | 10 ++++++++ include/acpi/cppc_acpi.h | 5 ++++ 3 files changed, 57 insertions(+) diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c index a1c91ce20cc8..83b4b14652fb 100644 --- a/drivers/acpi/cppc_acpi.c +++ b/drivers/acpi/cppc_acpi.c @@ -155,6 +155,10 @@ static DEFINE_PER_CPU(struct cpc_desc *, cpc_desc_ptr); static struct kobj_attribute _name = \ __ATTR(_name, 0444, show_##_name, NULL) +#define define_one_cppc_wo(_name) \ +static struct kobj_attribute _name = \ +__ATTR(_name, 0200, NULL, store_##_name) + #define to_cpc_desc(a) container_of(a, struct cpc_desc, kobj) #define show_cppc_data(access_fn, struct_name, member_name) \ @@ -211,6 +215,26 @@ static ssize_t show_feedback_ctrs(struct kobject *kobj, } define_one_cppc_ro(feedback_ctrs); +static ssize_t store_ospm_nominal_perf(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + struct cpc_desc *cpc_ptr = to_cpc_desc(kobj); + u64 val; + int ret; + + ret = kstrtou64(buf, 0, &val); + if (ret) + return ret; + + ret = cppc_set_ospm_nominal_perf(cpc_ptr->cpu_id, val); + if (ret) + return ret; + + return count; +} +define_one_cppc_wo(ospm_nominal_perf); + static struct attribute *cppc_attrs[] = { &feedback_ctrs.attr, &reference_perf.attr, @@ -222,6 +246,7 @@ static struct attribute *cppc_attrs[] = { &nominal_perf.attr, &nominal_freq.attr, &lowest_freq.attr, + &ospm_nominal_perf.attr, NULL }; ATTRIBUTE_GROUPS(cppc); @@ -1683,6 +1708,23 @@ 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 allows OSPM to inform the platform of the nominal + * performance level it intends to maintain. This is a write-only register per + * ACPI specification. + * + * Return: 0 for success, -EOPNOTSUPP if not supported, -EIO otherwise. + */ +int cppc_set_ospm_nominal_perf(int cpu, u64 ospm_nominal_perf) +{ + 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 7e7f9dfb7a24..d06cba963550 100644 --- a/drivers/cpufreq/cppc_cpufreq.c +++ b/drivers/cpufreq/cppc_cpufreq.c @@ -715,6 +715,16 @@ static int cppc_cpufreq_cpu_init(struct cpufreq_policy *policy) goto out; } + /* + * Initialize OSPM Nominal Performance to inform firmware of + * OSPM's nominal level. Performance above this value = boost; + * below = throttle. Uses platform nominal by default. + */ + ret = cppc_set_ospm_nominal_perf(cpu, caps->nominal_perf); + if (ret && ret != -EOPNOTSUPP) + pr_debug("Failed to set ospm_nominal_perf for CPU%d: %d\n", + cpu, ret); + cppc_cpufreq_cpu_fie_init(policy); return 0; diff --git a/include/acpi/cppc_acpi.h b/include/acpi/cppc_acpi.h index 8693890a7275..ad1035b0e1de 100644 --- a/include/acpi/cppc_acpi.h +++ b/include/acpi/cppc_acpi.h @@ -180,6 +180,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); @@ -266,6 +267,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] 5+ messages in thread
end of thread, other threads:[~2026-04-27 8:04 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-04-27 5:18 [PATCH 0/2] ACPI: CPPC: Add CPPC v4 support (ACPI 6.6) Sumit Gupta 2026-04-27 5:18 ` [PATCH 1/2] ACPI: CPPC: Add support for CPPC v4 Sumit Gupta 2026-04-27 7:06 ` zhenglifeng (A) 2026-04-27 8:04 ` Sumit Gupta 2026-04-27 5:18 ` [PATCH 2/2] ACPI: CPPC: Add ospm_nominal_perf support Sumit Gupta
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox