summaryrefslogtreecommitdiffstats
path: root/meta-eas/recipes-kernel/linux/linux-renesas/0073-arm64-Introduce-sys-sd-energy-model-infrastructure.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-eas/recipes-kernel/linux/linux-renesas/0073-arm64-Introduce-sys-sd-energy-model-infrastructure.patch')
-rw-r--r--meta-eas/recipes-kernel/linux/linux-renesas/0073-arm64-Introduce-sys-sd-energy-model-infrastructure.patch126
1 files changed, 126 insertions, 0 deletions
diff --git a/meta-eas/recipes-kernel/linux/linux-renesas/0073-arm64-Introduce-sys-sd-energy-model-infrastructure.patch b/meta-eas/recipes-kernel/linux/linux-renesas/0073-arm64-Introduce-sys-sd-energy-model-infrastructure.patch
new file mode 100644
index 0000000..700ecc0
--- /dev/null
+++ b/meta-eas/recipes-kernel/linux/linux-renesas/0073-arm64-Introduce-sys-sd-energy-model-infrastructure.patch
@@ -0,0 +1,126 @@
+From dabca795d8793a16cbbce37b0cc187d2a65cd50e Mon Sep 17 00:00:00 2001
+From: Dietmar Eggemann <dietmar.eggemann@arm.com>
+Date: Thu, 18 Aug 2016 12:06:07 +0100
+Subject: [PATCH 73/92] arm64: Introduce sys sd energy model infrastructure
+
+Allow the energy model to contain a system level besides the already
+existing core and cluster level.
+
+This is necessary for platforms with frequency domains spanning all
+cpus to let the EAS algorithm work properly.
+
+The whole idea of this system level has to be rethought once
+the idea of the 'struct sched_domain_shared' gets more momentum:
+
+https://lkml.org/lkml/2016/6/16/209
+
+Signed-off-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
+(cherry picked from commit 83a776c78d6e2885f2821a35c78e465c60726244)
+Signed-off-by: Gaku Inami <gaku.inami.xw@bp.renesas.com>
+---
+ arch/arm64/kernel/energy_model.h | 28 ++++++++++++++++++++--------
+ arch/arm64/kernel/topology.c | 1 +
+ 2 files changed, 21 insertions(+), 8 deletions(-)
+
+diff --git a/arch/arm64/kernel/energy_model.h b/arch/arm64/kernel/energy_model.h
+index a71c78d..4a86fa3 100644
+--- a/arch/arm64/kernel/energy_model.h
++++ b/arch/arm64/kernel/energy_model.h
+@@ -153,24 +153,27 @@
+ .cap_states = cap_states_core_hikey,
+ };
+
+-/* An energy model contains core and cluster sched group energy for 2
+- * clusters (cluster id 0 and 1). set_energy_model() relies on this
+- * feature. It is enforced by a BUG_ON in energy().
++/* An energy model contains core, cluster and system sched group energy
++ * for 2 clusters (cluster id 0 and 1). set_energy_model() relies on
++ * this feature. It is enforced by a BUG_ON in energy().
+ */
+
+ struct energy_model {
+ struct sched_group_energy *core_energy[2];
+ struct sched_group_energy *cluster_energy[2];
++ struct sched_group_energy *system_energy[2];
+ };
+
+ static struct energy_model juno_model = {
+ { &energy_core_juno_a57, &energy_core_juno_a53, },
+ { &energy_cluster_juno_a57, &energy_cluster_juno_a53, },
++ {},
+ };
+
+ static struct energy_model hikey_model = {
+ { &energy_core_hikey, &energy_core_hikey, },
+ { &energy_cluster_hikey, &energy_cluster_hikey, },
++ {},
+ };
+
+ static struct of_device_id model_matches[] = {
+@@ -179,14 +182,14 @@ struct energy_model {
+ {},
+ };
+
+-static struct sched_group_energy **core_energy, **cluster_energy;
++struct sched_group_energy **core_energy, **cluster_energy, **system_energy;
+
+ static void __init set_energy_model(void)
+ {
+ const struct of_device_id *match;
+ struct energy_model *em;
+
+- BUG_ON(core_energy || cluster_energy);
++ BUG_ON(core_energy || cluster_energy || system_energy);
+
+ match = of_match_node(model_matches, of_root);
+
+@@ -197,10 +200,12 @@ static void __init set_energy_model(void)
+
+ core_energy = em->core_energy;
+ cluster_energy = em->cluster_energy;
++ system_energy = em->system_energy;
+
+- pr_debug("energy model core[0,1]=[%p,%p] cluster=[%p,%p]\n",
++ pr_debug("energy model core[0,1]=[%p,%p] cluster=[%p,%p] system=[%p,%p]\n",
+ em->core_energy[0], em->core_energy[1],
+- em->cluster_energy[0], em->cluster_energy[1]);
++ em->cluster_energy[0], em->cluster_energy[1],
++ em->system_energy[0], em->system_energy[1]);
+ }
+
+ static inline
+@@ -211,7 +216,8 @@ struct sched_group_energy *energy(int cpu, struct sched_group_energy **sge)
+ BUG_ON(idx != 0 && idx != 1);
+
+ pr_debug("cpu=%d %s%s[%d]=%p\n", cpu, (sge == core_energy) ?
+- "core" : "cluster", "_energy", idx, sge[idx]);
++ "core" : (sge == cluster_energy) ? "cluster" :
++ "system", "_energy", idx, sge[idx]);
+
+ return sge[idx];
+ }
+@@ -227,3 +233,9 @@ const struct sched_group_energy * const cpu_cluster_energy(int cpu)
+ {
+ return cluster_energy ? energy(cpu, cluster_energy) : NULL;
+ }
++
++static inline
++const struct sched_group_energy * const cpu_system_energy(int cpu)
++{
++ return system_energy ? energy(cpu, system_energy) : NULL;
++}
+diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c
+index baaab53..4062786 100644
+--- a/arch/arm64/kernel/topology.c
++++ b/arch/arm64/kernel/topology.c
+@@ -669,6 +669,7 @@ static void __init reset_cpu_topology(void)
+ { cpu_coregroup_mask, cpu_coregroup_flags, cpu_core_energy, SD_INIT_NAME(MC) },
+ #endif
+ { cpu_cpu_mask, cpu_cpu_flags, cpu_cluster_energy, SD_INIT_NAME(DIE) },
++ { cpu_cpu_mask, NULL, cpu_system_energy, SD_INIT_NAME(SYS) },
+ { NULL, }
+ };
+
+--
+1.9.1
+