* [PATCH V5 2/2] base/drivers/arch_topology: Default dmips-mhz if they are not set in DT
[not found] <1543325060-1599-1-git-send-email-daniel.lezcano@linaro.org>
@ 2018-11-27 13:24 ` Daniel Lezcano
2018-12-03 13:46 ` Dietmar Eggemann
0 siblings, 1 reply; 3+ messages in thread
From: Daniel Lezcano @ 2018-11-27 13:24 UTC (permalink / raw)
To: rjw
Cc: linux-kernel, viresh.kumar, Chris Redpath, Quentin Perret,
Amit Kucheria, Nicolas Dechesne, Niklas Cassel, Rob Herring,
Quentin Perret, Rob Herring, Mark Rutland, Greg Kroah-Hartman,
Rafael J. Wysocki, Li Yang, Olof Johansson,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS
In the case of asymmetric SoC with the same micro-architecture, we
have a group of CPUs with smaller OPPs than the other group. One
example is the 96boards dragonboard 820c. There is no dmips/MHz
difference between both groups, so no need to specify the values in
the DT. Unfortunately, without these defined, there is no scaling
capacity computation triggered, so we need to write
'capacity-dmips-mhz' for each CPU with the same value in order to
force the scaled capacity computation.
In order to fix this situation, allocate 'raw_capacity' so the pointer
is set and the init_cpu_capacity_callback() function can be called.
This was tested on db820c:
- specified values in the DT (correct results)
- partial values defined in the DT (error + fallback to defaults)
- no specified values in the DT (correct results)
correct results are:
cat /sys/devices/system/cpu/cpu*/cpu_capacity
758
758
1024
1024
... respectively for CPU0, CPU1, CPU2 and CPU3.
That reflects the capacity for the max frequencies 1593600 and 2150400.
Cc: Chris Redpath <chris.redpath@linaro.org>
Cc: Quentin Perret <quentin.perret@linaro.org>
Cc: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Amit Kucheria <amit.kucheria@linaro.org>
Cc: Nicolas Dechesne <nicolas.dechesne@linaro.org>
Cc: Niklas Cassel <niklas.cassel@linaro.org>
Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
Tested-by: Quentin Perret <quentin.perret@arm.com>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
Documentation/devicetree/bindings/arm/cpu-capacity.txt | 6 ++++++
drivers/base/arch_topology.c | 9 ++++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/arm/cpu-capacity.txt b/Documentation/devicetree/bindings/arm/cpu-capacity.txt
index 84262cd..f53a3c9 100644
--- a/Documentation/devicetree/bindings/arm/cpu-capacity.txt
+++ b/Documentation/devicetree/bindings/arm/cpu-capacity.txt
@@ -54,6 +54,12 @@ fall back to the default capacity value for every CPU. If cpufreq is not
available, final capacities are calculated by directly using capacity-dmips-
mhz values (normalized w.r.t. the highest value found while parsing the DT).
+If capacity-dmips-mhz is not specified or if the parsing fails, the
+default capacity value will be computed against the highest frequency.
+When all CPUs have the same OPP, they will have the same capacity
+value otherwise the capacity will be scaled down for CPUs having lower
+frequencies.
+
===========================================
4 - Examples
===========================================
diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
index fd5325b..696cea5 100644
--- a/drivers/base/arch_topology.c
+++ b/drivers/base/arch_topology.c
@@ -243,9 +243,16 @@ static int __init register_cpufreq_notifier(void)
* until we have the necessary code to parse the cpu capacity, so
* skip registering cpufreq notifier.
*/
- if (!acpi_disabled || !raw_capacity)
+ if (!acpi_disabled)
return -EINVAL;
+ if (!raw_capacity) {
+ raw_capacity = kmalloc_array(num_possible_cpus(),
+ sizeof(*raw_capacity), GFP_KERNEL);
+ if (!raw_capacity)
+ return -ENOMEM;
+ }
+
if (!alloc_cpumask_var(&cpus_to_visit, GFP_KERNEL)) {
pr_err("cpu_capacity: failed to allocate memory for cpus_to_visit\n");
return -ENOMEM;
--
2.7.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH V5 2/2] base/drivers/arch_topology: Default dmips-mhz if they are not set in DT
2018-11-27 13:24 ` [PATCH V5 2/2] base/drivers/arch_topology: Default dmips-mhz if they are not set in DT Daniel Lezcano
@ 2018-12-03 13:46 ` Dietmar Eggemann
2018-12-04 10:02 ` Daniel Lezcano
0 siblings, 1 reply; 3+ messages in thread
From: Dietmar Eggemann @ 2018-12-03 13:46 UTC (permalink / raw)
To: Daniel Lezcano, rjw
Cc: linux-kernel, viresh.kumar, Chris Redpath, Quentin Perret,
Amit Kucheria, Nicolas Dechesne, Niklas Cassel, Rob Herring,
Quentin Perret, Rob Herring, Mark Rutland, Greg Kroah-Hartman,
Rafael J. Wysocki, Li Yang, Olof Johansson,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
Russell King
Hi Daniel,
+cc: Russell King <linux@armlinux.org.uk>
On 11/27/18 2:24 PM, Daniel Lezcano wrote:
> In the case of asymmetric SoC with the same micro-architecture, we
> have a group of CPUs with smaller OPPs than the other group. One
> example is the 96boards dragonboard 820c. There is no dmips/MHz
> difference between both groups, so no need to specify the values in
> the DT. Unfortunately, without these defined, there is no scaling
> capacity computation triggered, so we need to write
> 'capacity-dmips-mhz' for each CPU with the same value in order to
> force the scaled capacity computation.
>
> In order to fix this situation, allocate 'raw_capacity' so the pointer
> is set and the init_cpu_capacity_callback() function can be called.
>
> This was tested on db820c:
> - specified values in the DT (correct results)
> - partial values defined in the DT (error + fallback to defaults)
> - no specified values in the DT (correct results)
>
> correct results are:
> cat /sys/devices/system/cpu/cpu*/cpu_capacity
> 758
> 758
> 1024
> 1024
>
> ... respectively for CPU0, CPU1, CPU2 and CPU3.
>
> That reflects the capacity for the max frequencies 1593600 and 2150400.
[...]
I'm afraid that this change is incompatible with the still existing
cpu_efficiency interface we have in Arm32 for A15/A7 systems like Arm TC2:
In case you specify clock-frequency dt properties per cpu for such a
system, the cpu_capacity values are determined via the cpu_efficiency
code in arch/arm/kernel/topology.c.
So on Arm TC2 with clock-frequency = <1000000000> [A15] and <800000000>
[A7] you get:
root@linaro-nano:~# cat /sys/devices/system/cpu/cpu*/cpu_capacity
606
1441
1441
606
606
With your patches on top (cpu_capacity functionality in
drivers/base/arch_topology.c does not have to be switched on by
specifying capacity-dmips-mhz dt properties anymore) we end up scaling
by max frequency again:
root@linaro-nano:~# cat /sys/devices/system/cpu/cpu*/cpu_capacity
358
1024
1024
358
358
I tried to remove the cpu_efficiency based API a year ago but Russell
pointed out that the compatibility has to be maintained for longer:
https://lore.kernel.org/lkml/20171024102718.16113-1-dietmar.eggemann@arm.com/
I assume that the capacity-dmips-mhz dt property is like a switch to
turn this functionality on for big.Little and so called gold/silver
platforms, which have cores with the same uArch but in frequency domains
with different max frequency values.
So what's wrong with specifying capacity-dmips-mhz = <1024> for all
cores for those gold/silver platforms? I don't expect that there will be
so many of them. And normal SMP platforms (w/o frequency domains w/o
different max frequency values) don't have to execute this code.
IMHO, at least we should remove the cpu_efficiency bits before we do
this change.
[...]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH V5 2/2] base/drivers/arch_topology: Default dmips-mhz if they are not set in DT
2018-12-03 13:46 ` Dietmar Eggemann
@ 2018-12-04 10:02 ` Daniel Lezcano
0 siblings, 0 replies; 3+ messages in thread
From: Daniel Lezcano @ 2018-12-04 10:02 UTC (permalink / raw)
To: Dietmar Eggemann, rjw
Cc: linux-kernel, viresh.kumar, Chris Redpath, Quentin Perret,
Amit Kucheria, Nicolas Dechesne, Niklas Cassel, Rob Herring,
Quentin Perret, Rob Herring, Mark Rutland, Greg Kroah-Hartman,
Rafael J. Wysocki, Li Yang, Olof Johansson,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
Russell King
Hi Dietmar,
thanks for the review and spotting this.
On 03/12/2018 14:46, Dietmar Eggemann wrote:
> Hi Daniel,
>
> +cc: Russell King <linux@armlinux.org.uk>
>
> On 11/27/18 2:24 PM, Daniel Lezcano wrote:
>> In the case of asymmetric SoC with the same micro-architecture, we
>> have a group of CPUs with smaller OPPs than the other group. One
>> example is the 96boards dragonboard 820c. There is no dmips/MHz
>> difference between both groups, so no need to specify the values in
>> the DT. Unfortunately, without these defined, there is no scaling
>> capacity computation triggered, so we need to write
>> 'capacity-dmips-mhz' for each CPU with the same value in order to
>> force the scaled capacity computation.
>>
>> In order to fix this situation, allocate 'raw_capacity' so the pointer
>> is set and the init_cpu_capacity_callback() function can be called.
>>
>> This was tested on db820c:
>> - specified values in the DT (correct results)
>> - partial values defined in the DT (error + fallback to defaults)
>> - no specified values in the DT (correct results)
>>
>> correct results are:
>> cat /sys/devices/system/cpu/cpu*/cpu_capacity
>> 758
>> 758
>> 1024
>> 1024
>>
>> ... respectively for CPU0, CPU1, CPU2 and CPU3.
>>
>> That reflects the capacity for the max frequencies 1593600 and 2150400.
>
> [...]
>
> I'm afraid that this change is incompatible with the still existing
> cpu_efficiency interface we have in Arm32 for A15/A7 systems like Arm TC2:
>
> In case you specify clock-frequency dt properties per cpu for such a
> system, the cpu_capacity values are determined via the cpu_efficiency
> code in arch/arm/kernel/topology.c.
>
> So on Arm TC2 with clock-frequency = <1000000000> [A15] and <800000000>
> [A7] you get:
>
> root@linaro-nano:~# cat /sys/devices/system/cpu/cpu*/cpu_capacity
> 606
> 1441
> 1441
> 606
> 606
>
> With your patches on top (cpu_capacity functionality in
> drivers/base/arch_topology.c does not have to be switched on by
> specifying capacity-dmips-mhz dt properties anymore) we end up scaling
> by max frequency again:
>
> root@linaro-nano:~# cat /sys/devices/system/cpu/cpu*/cpu_capacity
> 358
> 1024
> 1024
> 358
> 358
>
> I tried to remove the cpu_efficiency based API a year ago but Russell
> pointed out that the compatibility has to be maintained for longer:
>
> https://lore.kernel.org/lkml/20171024102718.16113-1-dietmar.eggemann@arm.com/
>
>
> I assume that the capacity-dmips-mhz dt property is like a switch to
> turn this functionality on for big.Little and so called gold/silver
> platforms, which have cores with the same uArch but in frequency domains
> with different max frequency values.
>
> So what's wrong with specifying capacity-dmips-mhz = <1024> for all
> cores for those gold/silver platforms?
There is nothing wrong, I just don't like to specify in a DT a default
values.
> I don't expect that there will be
> so many of them. And normal SMP platforms (w/o frequency domains w/o
> different max frequency values) don't have to execute this code.
Fair enough, I will send a DT change, I'm tired of playing mikado with
this code.
Thanks again for the review.
-- Daniel
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2018-12-04 10:02 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1543325060-1599-1-git-send-email-daniel.lezcano@linaro.org>
2018-11-27 13:24 ` [PATCH V5 2/2] base/drivers/arch_topology: Default dmips-mhz if they are not set in DT Daniel Lezcano
2018-12-03 13:46 ` Dietmar Eggemann
2018-12-04 10:02 ` Daniel Lezcano
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).