Re: [PATCH 1/7] pmdomain: arm: Fix -EINVAL from scmi_pd_set_perf_state() on state 0
Ulf Hansson <[email protected]> Mon, 10 Aug 2026 16:19:19 +0200
| Newsgroups | org.kernel.vger.linux-i2c,org.infradead.lists.linux-arm-kernel,org.kernel.vger.arm-scmi,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm,org.kernel.vger.linux-serial,org.kernel.vger.linux-spi |
|---|---|
| Message-ID | <CAPx+jO9MZTsDpofZ0fR7FxJbrfuAV+soqN3x7ttK-F7o6MkYmg@mail.gmail.com> |
On Tue, Aug 4, 2026 at 9:58 PM Praveen Talari <[email protected]> wrote: > > Currently, scmi_pd_set_perf_state() treats a performance state of 0 as > invalid and returns -EINVAL. As a result, devices attached to SCMI > performance domains can report failures when relinquishing their > performance vote. Yes, this is indeed a problem. I recall that I hesitated when deciding what was best here, returning an error code or 0. The reasoning I had for returning -EINVAL, was that I didn't want genpd to believe that it actually succeeded in setting the performance state to 0, when in fact it didn't. However, except for the problem below with the OPP library, it actually also screws up the internal performance state aggregation in genpd, potentially leading us to running at higher state than necessary. > > The OPP framework use performance state 0 to indicate that no performance > vote is required. For example, dev_pm_opp_set_rate(dev, 0) is commonly > used (by firmware or linux) when a device is runtime suspended. > > A zero performance state does not require any SCMI performance request > to be sent. Treat it as a no-op and return success instead of reporting > an error. > > Signed-off-by: Praveen Talari <[email protected]> I added a fixes+stable tag and applied this for fixes, thanks! Kind regards Uffe > --- > drivers/pmdomain/arm/scmi_perf_domain.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/pmdomain/arm/scmi_perf_domain.c b/drivers/pmdomain/arm/scmi_perf_domain.c > index 3693423459c9..e390f902a444 100644 > --- a/drivers/pmdomain/arm/scmi_perf_domain.c > +++ b/drivers/pmdomain/arm/scmi_perf_domain.c > @@ -33,7 +33,7 @@ scmi_pd_set_perf_state(struct generic_pm_domain *genpd, unsigned int state) > return 0; > > if (!state) > - return -EINVAL; > + return 0; > > ret = pd->perf_ops->level_set(pd->ph, pd->domain_id, state, false); > if (ret) > > -- > 2.34.1 >