Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

firmware: arm_scmi: Add checks for min/max limits in PERFORMANCE_LIMITS_SET

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>

authored by

Cristian Marussi and committed by
Sudeep Holla
71bea057 3630cd81

+3
+3
drivers/firmware/arm_scmi/perf.c
··· 423 423 struct scmi_perf_info *pi = ph->get_priv(ph); 424 424 struct perf_dom_info *dom = pi->dom_info + domain; 425 425 426 + if (PROTOCOL_REV_MAJOR(pi->version) >= 0x3 && !max_perf && !min_perf) 427 + return -EINVAL; 428 + 426 429 if (dom->fc_info && dom->fc_info->limit_set_addr) { 427 430 iowrite32(max_perf, dom->fc_info->limit_set_addr); 428 431 iowrite32(min_perf, dom->fc_info->limit_set_addr + 4);