diff options
author | Frode Isaksen <fisaksen@baylibre.com> | 2017-12-19 11:15:35 +0000 |
---|---|---|
committer | Jan-Simon Moeller <jsmoeller@linuxfoundation.org> | 2018-02-07 11:47:29 +0000 |
commit | c4a6287185179732dfc1e903c195ff90c19f1065 (patch) | |
tree | d35f5010dbd952e40f5c178322026445b55757c1 /meta-eas/recipes-kernel/linux/linux-renesas/0090-arm64-Define-R-CAR-Gen3-energy-and-provide-it-to-the.patch | |
parent | 109dea1d5c5a38807b098b588584636ae636a302 (diff) |
This layer provides Energy Aware Scheduling (EAS) patcheseel_5.1.0eel_5.0.3eel_5.0.2eel/5.1.0eel/5.0.3eel/5.0.25.1.05.0.35.0.2eel
For the moment only for Renesas R-Car Gen3 SoC's.
Can be expanded for other SoC's by setting the machine
feature biglittle and provide the relevant EAS patches.
Bug-AGL: SPEC-813
Change-Id: I2b5e69c515c33e57be19b30466fe208d7b8ac1a5
Signed-off-by: Frode Isaksen <fisaksen@baylibre.com>
Diffstat (limited to 'meta-eas/recipes-kernel/linux/linux-renesas/0090-arm64-Define-R-CAR-Gen3-energy-and-provide-it-to-the.patch')
-rw-r--r-- | meta-eas/recipes-kernel/linux/linux-renesas/0090-arm64-Define-R-CAR-Gen3-energy-and-provide-it-to-the.patch | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/meta-eas/recipes-kernel/linux/linux-renesas/0090-arm64-Define-R-CAR-Gen3-energy-and-provide-it-to-the.patch b/meta-eas/recipes-kernel/linux/linux-renesas/0090-arm64-Define-R-CAR-Gen3-energy-and-provide-it-to-the.patch new file mode 100644 index 0000000..c1d7ef8 --- /dev/null +++ b/meta-eas/recipes-kernel/linux/linux-renesas/0090-arm64-Define-R-CAR-Gen3-energy-and-provide-it-to-the.patch @@ -0,0 +1,224 @@ +From 5881cc9ff86977d3d506f9f9549f2ffcca0fb932 Mon Sep 17 00:00:00 2001 +From: Gaku Inami <gaku.inami.xw@bp.renesas.com> +Date: Fri, 24 Mar 2017 20:10:51 +0900 +Subject: [PATCH 90/92] arm64: Define R-CAR Gen3 energy and provide it to the + scheduler + +Set the capacity and the power for R-CAR H3 and M3. +This value is based on the result of the evaluation. + +Signed-off-by: Gaku Inami <gaku.inami.xw@bp.renesas.com> +--- + arch/arm64/kernel/energy_model.h | 186 +++++++++++++++++++++++++++++++++++++++ + 1 file changed, 186 insertions(+) + +diff --git a/arch/arm64/kernel/energy_model.h b/arch/arm64/kernel/energy_model.h +index 0a7c134..c2aae4f 100644 +--- a/arch/arm64/kernel/energy_model.h ++++ b/arch/arm64/kernel/energy_model.h +@@ -171,6 +171,178 @@ + .cap_states = cap_states_core_hikey, + }; + ++/* R-Car Gen3 */ ++ ++static struct idle_state idle_states_cluster_h3_a53[] = { ++ { .power = 17 }, /* arch_cpu_idle() (active idle) = WFI */ ++ { .power = 17 }, /* WFI */ ++ { .power = 0 }, /* cpu-sleep-0 */ ++ { .power = 0 }, /* cluster-sleep-0 */ ++}; ++ ++static struct idle_state idle_states_cluster_h3_a57[] = { ++ { .power = 112 }, /* arch_cpu_idle() (active idle) = WFI */ ++ { .power = 112 }, /* WFI */ ++ { .power = 0 }, /* cpu-sleep-0 */ ++ { .power = 0 }, /* cluster-sleep-0 */ ++}; ++ ++static struct capacity_state cap_states_cluster_h3_a53[] = { ++ /* Power per cluster */ ++ { .cap = 379, .power = 16, }, /* 1200 MHz */ ++}; ++ ++static struct capacity_state cap_states_cluster_h3_a57[] = { ++ /* Power per cluster */ ++ { .cap = 308, .power = 33, }, /* 500 MHz */ ++ { .cap = 596, .power = 71, }, /* 1000 MHz */ ++ { .cap = 898, .power = 112, }, /* 1500 MHz */ ++ { .cap = 965, .power = 126, }, /* 1600 MHz */ ++ { .cap = 1024, .power = 154, }, /* 1700 MHz */ ++}; ++ ++static struct sched_group_energy energy_cluster_h3_a53 = { ++ .nr_idle_states = ARRAY_SIZE(idle_states_cluster_h3_a53), ++ .idle_states = idle_states_cluster_h3_a53, ++ .nr_cap_states = ARRAY_SIZE(cap_states_cluster_h3_a53), ++ .cap_states = cap_states_cluster_h3_a53, ++}; ++ ++static struct sched_group_energy energy_cluster_h3_a57 = { ++ .nr_idle_states = ARRAY_SIZE(idle_states_cluster_h3_a57), ++ .idle_states = idle_states_cluster_h3_a57, ++ .nr_cap_states = ARRAY_SIZE(cap_states_cluster_h3_a57), ++ .cap_states = cap_states_cluster_h3_a57, ++}; ++ ++static struct idle_state idle_states_core_h3_a53[] = { ++ { .power = 17 }, /* arch_cpu_idle() (active idle) = WFI */ ++ { .power = 17 }, /* WFI */ ++ { .power = 0 }, /* cpu-sleep-0 */ ++ { .power = 0 }, /* cluster-sleep-0 */ ++}; ++ ++static struct idle_state idle_states_core_h3_a57[] = { ++ { .power = 71 }, /* arch_cpu_idle() (active idle) = WFI */ ++ { .power = 71 }, /* WFI */ ++ { .power = 0 }, /* cpu-sleep-0 */ ++ { .power = 0 }, /* cluster-sleep-0 */ ++}; ++ ++static struct capacity_state cap_states_core_h3_a53[] = { ++ /* Power per cpu */ ++ { .cap = 379, .power = 131, }, /* 1200 MHz */ ++}; ++ ++static struct capacity_state cap_states_core_h3_a57[] = { ++ /* Power per cpu */ ++ { .cap = 308, .power = 315, }, /* 500 MHz */ ++ { .cap = 596, .power = 618, }, /* 1000 MHz */ ++ { .cap = 898, .power = 934, }, /* 1500 MHz */ ++ { .cap = 965, .power = 1044, }, /* 1600 MHz */ ++ { .cap = 1024, .power = 1286, }, /* 1700 MHz */ ++}; ++ ++static struct sched_group_energy energy_core_h3_a53 = { ++ .nr_idle_states = ARRAY_SIZE(idle_states_core_h3_a53), ++ .idle_states = idle_states_core_h3_a53, ++ .nr_cap_states = ARRAY_SIZE(cap_states_core_h3_a53), ++ .cap_states = cap_states_core_h3_a53, ++}; ++ ++static struct sched_group_energy energy_core_h3_a57 = { ++ .nr_idle_states = ARRAY_SIZE(idle_states_core_h3_a57), ++ .idle_states = idle_states_core_h3_a57, ++ .nr_cap_states = ARRAY_SIZE(cap_states_core_h3_a57), ++ .cap_states = cap_states_core_h3_a57, ++}; ++ ++static struct idle_state idle_states_cluster_m3_a53[] = { ++ { .power = 33 }, /* arch_cpu_idle() (active idle) = WFI */ ++ { .power = 33 }, /* WFI */ ++ { .power = 0 }, /* cpu-sleep-0 */ ++ { .power = 0 }, /* cluster-sleep-0 */ ++}; ++ ++static struct idle_state idle_states_cluster_m3_a57[] = { ++ { .power = 66 }, /* arch_cpu_idle() (active idle) = WFI */ ++ { .power = 66 }, /* WFI */ ++ { .power = 0 }, /* cpu-sleep-0 */ ++ { .power = 0 }, /* cluster-sleep-0 */ ++}; ++ ++static struct capacity_state cap_states_cluster_m3_a53[] = { ++ /* Power per cluster */ ++ { .cap = 362, .power = 33, }, /* 1200 MHz */ ++}; ++ ++static struct capacity_state cap_states_cluster_m3_a57[] = { ++ /* Power per cluster */ ++ { .cap = 293, .power = 17, }, /* 500 MHz */ ++ { .cap = 560, .power = 42, }, /* 1000 MHz */ ++ { .cap = 853, .power = 66, }, /* 1500 MHz */ ++ { .cap = 910, .power = 72, }, /* 1600 MHz */ ++ { .cap = 967, .power = 90, }, /* 1700 MHz */ ++ { .cap = 1024, .power = 115, }, /* 1800 MHz */ ++}; ++ ++static struct sched_group_energy energy_cluster_m3_a53 = { ++ .nr_idle_states = ARRAY_SIZE(idle_states_cluster_m3_a53), ++ .idle_states = idle_states_cluster_m3_a53, ++ .nr_cap_states = ARRAY_SIZE(cap_states_cluster_m3_a53), ++ .cap_states = cap_states_cluster_m3_a53, ++}; ++ ++static struct sched_group_energy energy_cluster_m3_a57 = { ++ .nr_idle_states = ARRAY_SIZE(idle_states_cluster_m3_a57), ++ .idle_states = idle_states_cluster_m3_a57, ++ .nr_cap_states = ARRAY_SIZE(cap_states_cluster_m3_a57), ++ .cap_states = cap_states_cluster_m3_a57, ++}; ++ ++static struct idle_state idle_states_core_m3_a53[] = { ++ { .power = 16 }, /* arch_cpu_idle() (active idle) = WFI */ ++ { .power = 16 }, /* WFI */ ++ { .power = 0 }, /* cpu-sleep-0 */ ++ { .power = 0 }, /* cluster-sleep-0 */ ++}; ++ ++static struct idle_state idle_states_core_m3_a57[] = { ++ { .power = 83 }, /* arch_cpu_idle() (active idle) = WFI */ ++ { .power = 83 }, /* WFI */ ++ { .power = 0 }, /* cpu-sleep-0 */ ++ { .power = 0 }, /* cluster-sleep-0 */ ++}; ++ ++static struct capacity_state cap_states_core_m3_a53[] = { ++ /* Power per cpu */ ++ { .cap = 362, .power = 131, }, /* 1200 MHz */ ++}; ++ ++static struct capacity_state cap_states_core_m3_a57[] = { ++ /* Power per cpu */ ++ { .cap = 293, .power = 299, }, /* 500 MHz */ ++ { .cap = 560, .power = 581, }, /* 1000 MHz */ ++ { .cap = 853, .power = 888, }, /* 1500 MHz */ ++ { .cap = 910, .power = 1098, }, /* 1600 MHz */ ++ { .cap = 967, .power = 1179, }, /* 1700 MHz */ ++ { .cap = 1024, .power = 1421, }, /* 1800 MHz */ ++}; ++ ++static struct sched_group_energy energy_core_m3_a53 = { ++ .nr_idle_states = ARRAY_SIZE(idle_states_core_m3_a53), ++ .idle_states = idle_states_core_m3_a53, ++ .nr_cap_states = ARRAY_SIZE(cap_states_core_m3_a53), ++ .cap_states = cap_states_core_m3_a53, ++}; ++ ++static struct sched_group_energy energy_core_m3_a57 = { ++ .nr_idle_states = ARRAY_SIZE(idle_states_core_m3_a57), ++ .idle_states = idle_states_core_m3_a57, ++ .nr_cap_states = ARRAY_SIZE(cap_states_core_m3_a57), ++ .cap_states = cap_states_core_m3_a57, ++}; ++ + /* 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(). +@@ -194,9 +366,23 @@ struct energy_model { + { &energy_system_hikey, &energy_system_hikey, }, + }; + ++static struct energy_model r8a7795_model = { ++ { &energy_core_h3_a57, &energy_core_h3_a53, }, ++ { &energy_cluster_h3_a57, &energy_cluster_h3_a53, }, ++ {}, ++}; ++ ++static struct energy_model r8a7796_model = { ++ { &energy_core_m3_a57, &energy_core_m3_a53, }, ++ { &energy_cluster_m3_a57, &energy_cluster_m3_a53, }, ++ {}, ++}; ++ + static struct of_device_id model_matches[] = { + { .compatible = "arm,juno", .data = &juno_model }, + { .compatible = "hisilicon,hi6220-hikey", .data = &hikey_model }, ++ { .compatible = "renesas,r8a7795", .data = &r8a7795_model }, ++ { .compatible = "renesas,r8a7796", .data = &r8a7796_model }, + {}, + }; + +-- +1.9.1 + |