firmware: arm_scmi: Add checks for min/max limits in PERFORMANCE_LIMITS_SET
authorCristian Marussi <cristian.marussi@arm.com>
Wed, 30 Mar 2022 15:05:51 +0000 (16:05 +0100)
committerSudeep Holla <sudeep.holla@arm.com>
Thu, 28 Apr 2022 17:22:53 +0000 (18:22 +0100)
Starting with SCMI v3.1, the PERFORMANCE_LIMITS_SET command allows a user
to request only one between max and min ranges to be changed, while leaving
the other untouched if set to zero in the request. Anyway SCMI v3.1 states
also explicitly that you cannot leave both of those unchanged (zeroed) when
issuing such command, so add a proper check for this condition.

Link: https://lore.kernel.org/r/20220330150551.2573938-23-cristian.marussi@arm.com
Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
[sudeep.holla: Dropped check for v3.0 and above to make the check
unconditional, updated the subject accordingly]
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/perf.c

index 65ffda5495d605f7624a73bfdba317e248962bc0..8f4051aca2200f6c9964a013f876572279d247e3 100644 (file)
@@ -423,6 +423,9 @@ static int scmi_perf_limits_set(const struct scmi_protocol_handle *ph,
        struct scmi_perf_info *pi = ph->get_priv(ph);
        struct perf_dom_info *dom = pi->dom_info + domain;
 
+       if (PROTOCOL_REV_MAJOR(pi->version) >= 0x3 && !max_perf && !min_perf)
+               return -EINVAL;
+
        if (dom->fc_info && dom->fc_info->limit_set_addr) {
                iowrite32(max_perf, dom->fc_info->limit_set_addr);
                iowrite32(min_perf, dom->fc_info->limit_set_addr + 4);