Re: [RFCv5, 18/46] arm: topology: Define TC2 energy and provide it to the scheduler

Dietmar Eggemann
2015-08-20T19:19:39Z

Hi Leo,

On 08/17/2015 02:19 AM, Leo Yan wrote:

[...]

>> diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c
>> index b35d3e5..bbe20c7 100644
>> --- a/arch/arm/kernel/topology.c
>> +++ b/arch/arm/kernel/topology.c
>> @@ -274,6 +274,119 @@ void store_cpu_topology(unsigned int cpuid)
>> cpu_topology[cpuid].socket_id, mpidr);
>> }
>>
>> +/*
>> + * ARM TC2 specific energy cost model data. There are no unit requirements for
>> + * the data. Data can be normalized to any reference point, but the
>> + * normalization must be consistent. That is, one bogo-joule/watt must be the
>> + * same quantity for all data, but we don't care what it is.
>> + */
>> +static struct idle_state idle_states_cluster_a7[] = {
>> + { .power = 25 }, /* WFI */
>
> This state is confused. Is this state corresponding to all CPUs have been
> powered off but L2 cache RAM array and SCU are still power on?

This is what we refer to as 'active idle'. All cpus of the cluster are
in WFI but the cluster is not in cluster-sleep yet. We measure the
corresponding energy value by disabling the 'cluster-sleep-[b,l]' state
and let the cpus do nothing for a specific time period.
>
>> + { .power = 10 }, /* cluster-sleep-l */
>
> Is this status means all CPU and cluster have been powered off, if so
> then it will have no power consumption anymore...

The cluster is in cluster-sleep but there is still some peripheral
related to the cluster active which explains this power value we
calculated from the pre/post energy value diff (by reading the vexpress
energy counter for this cluster) and the time period we were idling on
this cluster.

>
>> + };
>> +
>> +static struct idle_state idle_states_cluster_a15[] = {
>> + { .power = 70 }, /* WFI */
>> + { .power = 25 }, /* cluster-sleep-b */
>> + };
>> +
>> +static struct capacity_state cap_states_cluster_a7[] = {
>> + /* Cluster only power */
>> + { .cap = 150, .power = 2967, }, /* 350 MHz */
>
> For cluster level's capacity, does it mean need run benchmark on all
> CPUs within cluster?

We run an 'always running thread per cpu' workload on {n, n-1, ..., 1}
cpus of a cluster (hotplug-out the other cpus) for a specific time
period. Then we calculate the cluster power value by extrapolating from
the power values for the {n, n-1, ... 1} test runs and use the delta
between a n and n+1 test run value as core power value.

[...]

>> +static struct idle_state idle_states_core_a7[] = {
>> + { .power = 0 }, /* WFI */
>
> Should have two idle states for CPU level (WFI and CPU's power off)?

The ARM TC2 platform has only 2 idle states, there is no 'cpu power off':

# cat /sys/devices/system/cpu/cpu[0,2]/cpuidle/state*/name
WFI
cluster-sleep-b
WFI
cluster-sleep-l …