diff mbox series

firmware: arm_scmi: Warn if domain frequency multiplier is 0 or rounded off

Message ID 20240119111033.3011853-1-sudeep.holla@arm.com (mailing list archive)
State New, archived
Headers show
Series firmware: arm_scmi: Warn if domain frequency multiplier is 0 or rounded off | expand

Commit Message

Sudeep Holla Jan. 19, 2024, 11:10 a.m. UTC
When (sustained_freq_khz * 1000) is less than sustained_perf_level, the
multiplier will be less than 1 and hence rounded down as 0. Similarly if
it is not multiple of sustained_perf_level the dom_info->mult_factor will
contain rounded down value and will end up impacting all the frequency
calculations done using it.

Add warning if and when the domain frequency multiplier is 0 or rounded
down so that it gives a clue to get the firmware tables fixed.

Suggested-by: Pierre Gondois <Pierre.Gondois@arm.com>
Cc: Cristian Marussi <cristian.marussi@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
---
 drivers/firmware/arm_scmi/perf.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

Comments

Pierre Gondois Jan. 19, 2024, 2:05 p.m. UTC | #1
Hello Sudeep,
Thanks for the patch. Just to add a note, it means that the firmware must have
freq and level values such as:
- freq = K * level
- K >= 1
- K being an integer

If K is not an integer, the bigger K is, the lower the imprecision in the
available frequencies is. Having imprecise frequency values did not impact
the frequency changes when I tried it.

Reviewed-by: Pierre Gondois <pierre.gondois@arm.com>

On 1/19/24 12:10, Sudeep Holla wrote:
> When (sustained_freq_khz * 1000) is less than sustained_perf_level, the
> multiplier will be less than 1 and hence rounded down as 0. Similarly if
> it is not multiple of sustained_perf_level the dom_info->mult_factor will
> contain rounded down value and will end up impacting all the frequency
> calculations done using it.
> 
> Add warning if and when the domain frequency multiplier is 0 or rounded
> down so that it gives a clue to get the firmware tables fixed.
> 
> Suggested-by: Pierre Gondois <Pierre.Gondois@arm.com>
> Cc: Cristian Marussi <cristian.marussi@arm.com>
> Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
> ---
>   drivers/firmware/arm_scmi/perf.c | 12 ++++++++++--
>   1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c
> index 8ea2a7b3d35d..5a7358e89d6f 100644
> --- a/drivers/firmware/arm_scmi/perf.c
> +++ b/drivers/firmware/arm_scmi/perf.c
> @@ -272,13 +272,21 @@ scmi_perf_domain_attributes_get(const struct scmi_protocol_handle *ph,
>   					le32_to_cpu(attr->sustained_perf_level);
>   		if (!dom_info->sustained_freq_khz ||
>   		    !dom_info->sustained_perf_level ||
> -		    dom_info->level_indexing_mode)
> +		    dom_info->level_indexing_mode) {
>   			/* CPUFreq converts to kHz, hence default 1000 */
>   			dom_info->mult_factor =	1000;
> -		else
> +		} else {
>   			dom_info->mult_factor =
>   					(dom_info->sustained_freq_khz * 1000UL)
>   					/ dom_info->sustained_perf_level;
> +			if ((dom_info->sustained_freq_khz * 1000UL) %
> +			    dom_info->sustained_perf_level)
> +				pr_warn("mult_factor of domain %d is rounded\n",
> +					dom_info->id);
> +		}
> +		if (!dom_info->mult_factor)
> +			pr_warn("Incorrect sustained perf level or freq kHz\n");
> +
>   		strscpy(dom_info->info.name, attr->name,
>   			SCMI_SHORT_NAME_MAX_SIZE);
>   	}
Cristian Marussi Jan. 19, 2024, 2:06 p.m. UTC | #2
On Fri, Jan 19, 2024 at 11:10:33AM +0000, Sudeep Holla wrote:
> When (sustained_freq_khz * 1000) is less than sustained_perf_level, the
> multiplier will be less than 1 and hence rounded down as 0. Similarly if
> it is not multiple of sustained_perf_level the dom_info->mult_factor will
> contain rounded down value and will end up impacting all the frequency
> calculations done using it.
> 
> Add warning if and when the domain frequency multiplier is 0 or rounded
> down so that it gives a clue to get the firmware tables fixed.
> 

Hi,

just one small nitpick down below...

> Suggested-by: Pierre Gondois <Pierre.Gondois@arm.com>
> Cc: Cristian Marussi <cristian.marussi@arm.com>
> Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
> ---
>  drivers/firmware/arm_scmi/perf.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c
> index 8ea2a7b3d35d..5a7358e89d6f 100644
> --- a/drivers/firmware/arm_scmi/perf.c
> +++ b/drivers/firmware/arm_scmi/perf.c
> @@ -272,13 +272,21 @@ scmi_perf_domain_attributes_get(const struct scmi_protocol_handle *ph,
>  					le32_to_cpu(attr->sustained_perf_level);
>  		if (!dom_info->sustained_freq_khz ||
>  		    !dom_info->sustained_perf_level ||
> -		    dom_info->level_indexing_mode)
> +		    dom_info->level_indexing_mode) {
>  			/* CPUFreq converts to kHz, hence default 1000 */
>  			dom_info->mult_factor =	1000;
> -		else
> +		} else {
>  			dom_info->mult_factor =
>  					(dom_info->sustained_freq_khz * 1000UL)
>  					/ dom_info->sustained_perf_level;
> +			if ((dom_info->sustained_freq_khz * 1000UL) %
> +			    dom_info->sustained_perf_level)
> +				pr_warn("mult_factor of domain %d is rounded\n",
> +					dom_info->id);

...here you can use dev_warn(ph->dev, ...) if you want.

Other than that, LGTM.

Reviewed-by: Cristian Marussi <cristian.marussi@arm.com>

Thanks,
Cristian
Sudeep Holla Jan. 19, 2024, 2:43 p.m. UTC | #3
On Fri, Jan 19, 2024 at 03:05:09PM +0100, Pierre Gondois wrote:
> Hello Sudeep,
> Thanks for the patch. Just to add a note, it means that the firmware must have
> freq and level values such as:
> - freq = K * level
> - K >= 1
> - K being an integer
>

Correct, if it helps for future references, I can add the info as a comment
in the code.

> If K is not an integer, the bigger K is, the lower the imprecision in the
> available frequencies is. Having imprecise frequency values did not impact
> the frequency changes when I tried it.

Agreed. But I don't want to make any assumption on the values to throw
this warning. We can silence it to debug in the future if it gets annoying
on some real systems where it doesn't matter much. I just want to keep
it to give f/w a change to correct/adjust it if they can.

>
> Reviewed-by: Pierre Gondois <pierre.gondois@arm.com>
>

Thanks.
Sudeep Holla Jan. 19, 2024, 2:45 p.m. UTC | #4
On Fri, Jan 19, 2024 at 02:06:56PM +0000, Cristian Marussi wrote:
> On Fri, Jan 19, 2024 at 11:10:33AM +0000, Sudeep Holla wrote:
> > When (sustained_freq_khz * 1000) is less than sustained_perf_level, the
> > multiplier will be less than 1 and hence rounded down as 0. Similarly if
> > it is not multiple of sustained_perf_level the dom_info->mult_factor will
> > contain rounded down value and will end up impacting all the frequency
> > calculations done using it.
> > 
> > Add warning if and when the domain frequency multiplier is 0 or rounded
> > down so that it gives a clue to get the firmware tables fixed.
> > 
> 
> Hi,
> 
> just one small nitpick down below...
> 
> > Suggested-by: Pierre Gondois <Pierre.Gondois@arm.com>
> > Cc: Cristian Marussi <cristian.marussi@arm.com>
> > Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
> > ---
> >  drivers/firmware/arm_scmi/perf.c | 12 ++++++++++--
> >  1 file changed, 10 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c
> > index 8ea2a7b3d35d..5a7358e89d6f 100644
> > --- a/drivers/firmware/arm_scmi/perf.c
> > +++ b/drivers/firmware/arm_scmi/perf.c
> > @@ -272,13 +272,21 @@ scmi_perf_domain_attributes_get(const struct scmi_protocol_handle *ph,
> >  					le32_to_cpu(attr->sustained_perf_level);
> >  		if (!dom_info->sustained_freq_khz ||
> >  		    !dom_info->sustained_perf_level ||
> > -		    dom_info->level_indexing_mode)
> > +		    dom_info->level_indexing_mode) {
> >  			/* CPUFreq converts to kHz, hence default 1000 */
> >  			dom_info->mult_factor =	1000;
> > -		else
> > +		} else {
> >  			dom_info->mult_factor =
> >  					(dom_info->sustained_freq_khz * 1000UL)
> >  					/ dom_info->sustained_perf_level;
> > +			if ((dom_info->sustained_freq_khz * 1000UL) %
> > +			    dom_info->sustained_perf_level)
> > +				pr_warn("mult_factor of domain %d is rounded\n",
> > +					dom_info->id);
> 
> ...here you can use dev_warn(ph->dev, ...) if you want.
>

Good point, I didn't even check the logging elsewhere in the file 
diff mbox series

Patch

diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c
index 8ea2a7b3d35d..5a7358e89d6f 100644
--- a/drivers/firmware/arm_scmi/perf.c
+++ b/drivers/firmware/arm_scmi/perf.c
@@ -272,13 +272,21 @@  scmi_perf_domain_attributes_get(const struct scmi_protocol_handle *ph,
 					le32_to_cpu(attr->sustained_perf_level);
 		if (!dom_info->sustained_freq_khz ||
 		    !dom_info->sustained_perf_level ||
-		    dom_info->level_indexing_mode)
+		    dom_info->level_indexing_mode) {
 			/* CPUFreq converts to kHz, hence default 1000 */
 			dom_info->mult_factor =	1000;
-		else
+		} else {
 			dom_info->mult_factor =
 					(dom_info->sustained_freq_khz * 1000UL)
 					/ dom_info->sustained_perf_level;
+			if ((dom_info->sustained_freq_khz * 1000UL) %
+			    dom_info->sustained_perf_level)
+				pr_warn("mult_factor of domain %d is rounded\n",
+					dom_info->id);
+		}
+		if (!dom_info->mult_factor)
+			pr_warn("Incorrect sustained perf level or freq kHz\n");
+
 		strscpy(dom_info->info.name, attr->name,
 			SCMI_SHORT_NAME_MAX_SIZE);
 	}