Commit 20416c14 authored by Ionela Voinescu's avatar Ionela Voinescu
Browse files

arch_topology: obtain cpu capacity using information from CPPC



Define arch_init_invariance_cppc() to use highest performance values
from _CPC objects to obtain and set maximum capacity information for
each CPU.

The performance scale used by CPPC is a unified scale for all CPUs in
the system. Therefore, by obtaining the raw highest performance values
from the _CPC objects, and normalizing them on the [0, 1024] capacity
scale used by the task scheduler we obtain the CPU capacity of each
CPU.
Signed-off-by: Ionela Voinescu's avatarIonela Voinescu <ionela.voinescu@arm.com>
Cc: Sudeep Holla <sudeep.holla@arm.com>
parent 83744b77
......@@ -338,6 +338,47 @@ bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)
return !ret;
}
#ifdef CONFIG_ACPI_CPPC_LIB
#include <acpi/cppc_acpi.h>
void init_cpu_capacity_cppc(void)
{
struct cppc_perf_caps perf_caps;
static bool cap_init_done;
int cpu;
if (acpi_disabled || cap_init_done || !acpi_cpc_valid())
return;
raw_capacity = kcalloc(num_possible_cpus(), sizeof(*raw_capacity),
GFP_KERNEL);
if (!raw_capacity)
return;
for_each_possible_cpu(cpu) {
if (!cppc_get_perf_caps(cpu, &perf_caps)) {
raw_capacity[cpu] = perf_caps.highest_perf;
pr_debug("%s: CPU%d cpu_capacity=%u (raw).\n",
__func__, cpu, raw_capacity[cpu]);
} else {
pr_err("%s: CPU%d missing highest performance.\n",
__func__, cpu);
pr_err("%s: fallback to 1024 for all CPUs\n",
__func__);
goto exit;
}
}
topology_normalize_cpu_scale();
schedule_work(&update_topology_flags_work);
pr_debug("%s: cpu_capacity initialization done\n", __func__);
exit:
cap_init_done = true;
free_raw_capacity();
}
#endif
#ifdef CONFIG_CPU_FREQ
static cpumask_var_t cpus_to_visit;
static void parsing_done_workfn(struct work_struct *work);
......
......@@ -11,6 +11,11 @@
void topology_normalize_cpu_scale(void);
int topology_update_cpu_topology(void);
#ifdef CONFIG_ACPI_CPPC_LIB
void init_cpu_capacity_cppc(void);
#define arch_init_invariance_cppc init_cpu_capacity_cppc
#endif
struct device_node;
bool topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment