From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rob Herring Subject: Re: [PATCH V4 2/2] base/drivers/arch_topology: Default dmips-mhz if they are not set in DT Date: Mon, 26 Nov 2018 19:42:47 -0600 Message-ID: <20181127014247.GA26233@bogus> References: <1543234847-21611-1-git-send-email-daniel.lezcano@linaro.org> <1543234847-21611-2-git-send-email-daniel.lezcano@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline In-Reply-To: <1543234847-21611-2-git-send-email-daniel.lezcano@linaro.org> Sender: linux-kernel-owner@vger.kernel.org To: Daniel Lezcano Cc: rjw@rjwysocki.net, linux-kernel@vger.kernel.org, viresh.kumar@linaro.org, Chris Redpath , Quentin Perret , Amit Kucheria , Nicolas Dechesne , Niklas Cassel , Mark Rutland , Greg Kroah-Hartman , "Rafael J. Wysocki" , Sudeep Holla , Li Yang , "open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS" List-Id: devicetree@vger.kernel.org On Mon, Nov 26, 2018 at 01:20:43PM +0100, 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. > > Cc: Chris Redpath > Cc: Quentin Perret > Cc: Viresh Kumar > Cc: Amit Kucheria > Cc: Nicolas Dechesne > Cc: Niklas Cassel > Reviewed-by: Viresh Kumar > Signed-off-by: Daniel Lezcano > --- > Documentation/devicetree/bindings/arm/cpu-capacity.txt | 6 ++++++ Acked-by: Rob Herring > drivers/base/arch_topology.c | 13 ++++++++++++- > 2 files changed, 18 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..e0c5b60 100644 > --- a/drivers/base/arch_topology.c > +++ b/drivers/base/arch_topology.c > @@ -243,9 +243,20 @@ 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) { > + > + pr_info("cpu_capacity: No capacity defined in DT, set default " > + "values to %ld\n", SCHED_CAPACITY_SCALE); > + > + 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 >