diff options
author | xinglong.yang <xinglong.yang@cixtech.com> | 2023-11-09 16:28:55 +0800 |
---|---|---|
committer | Sudeep Holla <sudeep.holla@arm.com> | 2023-11-13 14:30:37 +0000 |
commit | 189df98777a32c17d73e116df144e22b2ac3ae6b (patch) | |
tree | 54ec709c534712eacbad8d2bd656bcdca25b3fe8 /drivers/firmware/arm_scmi | |
parent | b85ea95d086471afb4ad062012a4d73cd328fa86 (diff) |
firmware: arm_scmi: Check beforehand if the perf domain set operations are allowed
Certain SCMI performance domains may have restrictions on the set level
and/or limits operation. If the set level/limits are performed by an
agent who is not allowed to do so may get SCMI_ERR_SUPPORT. However,
since this information about the domain is already known to the
agent(OSPM here) obtained via PERF_DOMAIN_ATTRIBUTES, the agent(OSPM)
can avoid making PERF_LEVEL_SET and PERF_LIMITS_SET calls to the firmware.
Add those checks and return -ENOTSUPP to the caller without interacting
with the firmware based on the information collected during the domain
enumeration stage.
Signed-off-by: xinglong.yang <xinglong.yang@cixtech.com>
Link: https://lore.kernel.org/r/20231109082855.472681-1-xinglong.yang@cixtech.com
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Diffstat (limited to 'drivers/firmware/arm_scmi')
-rw-r--r-- | drivers/firmware/arm_scmi/perf.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c index c2435be0ae1b..f5a063b0b1ab 100644 --- a/drivers/firmware/arm_scmi/perf.c +++ b/drivers/firmware/arm_scmi/perf.c @@ -504,6 +504,9 @@ static int scmi_perf_limits_set(const struct scmi_protocol_handle *ph, if (IS_ERR(dom)) return PTR_ERR(dom); + if (!dom->set_limits) + return -EOPNOTSUPP; + if (PROTOCOL_REV_MAJOR(pi->version) >= 0x3 && !max_perf && !min_perf) return -EINVAL; @@ -654,6 +657,9 @@ static int scmi_perf_level_set(const struct scmi_protocol_handle *ph, if (IS_ERR(dom)) return PTR_ERR(dom); + if (!dom->info.set_perf) + return -EOPNOTSUPP; + if (dom->level_indexing_mode) { struct scmi_opp *opp; |