]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
firmware: arm_scmi: Fix frequency truncation by promoting multiplier type
authorSudeep Holla <sudeep.holla@arm.com>
Thu, 30 Nov 2023 20:43:42 +0000 (20:43 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 10 Jan 2024 16:10:32 +0000 (17:10 +0100)
[ Upstream commit 8e3c98d9187e09274fc000a7d1a77b070a42d259 ]

Fix the possible frequency truncation for all values equal to or greater
4GHz on 64bit machines by updating the multiplier 'mult_factor' to
'unsigned long' type. It is also possible that the multiplier itself can
be greater than or equal to 2^32. So we need to also fix the equation
computing the value of the multiplier.

Fixes: a9e3fbfaa0ff ("firmware: arm_scmi: add initial support for performance protocol")
Reported-by: Sibi Sankar <quic_sibis@quicinc.com>
Closes: https://lore.kernel.org/all/20231129065748.19871-3-quic_sibis@quicinc.com/
Cc: Cristian Marussi <cristian.marussi@arm.com>
Link: https://lore.kernel.org/r/20231130204343.503076-1-sudeep.holla@arm.com
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/firmware/arm_scmi/perf.c

index 431bda9165c3d5c1b982bfa2eac4852c8f397d2b..2775bcafe40f66bfb0a59603d2c49593428b04db 100644 (file)
@@ -131,7 +131,7 @@ struct perf_dom_info {
        u32 opp_count;
        u32 sustained_freq_khz;
        u32 sustained_perf_level;
-       u32 mult_factor;
+       unsigned long mult_factor;
        char name[SCMI_MAX_STR_SIZE];
        struct scmi_opp opp[MAX_OPPS];
        struct scmi_fc_info *fc_info;
@@ -223,8 +223,8 @@ scmi_perf_domain_attributes_get(const struct scmi_protocol_handle *ph,
                        dom_info->mult_factor = 1000;
                else
                        dom_info->mult_factor =
-                                       (dom_info->sustained_freq_khz * 1000) /
-                                       dom_info->sustained_perf_level;
+                                       (dom_info->sustained_freq_khz * 1000UL)
+                                       dom_info->sustained_perf_level;
                strscpy(dom_info->name, attr->name, SCMI_SHORT_NAME_MAX_SIZE);
        }