arm64: add hikey960 energy model
authorMichele Di Giorgio <michele.digiorgio@arm.com>
Fri, 1 Dec 2017 14:38:47 +0000 (14:38 +0000)
committerLukasz Luba <l.luba@partner.samsung.com>
Mon, 10 Sep 2018 08:24:14 +0000 (10:24 +0200)
Signed-off-by: Michele Di Giorgio <michele.digiorgio@arm.com>
Signed-off-by: Lukasz Luba <l.luba@partner.samsung.com>
arch/arm64/kernel/energy_model.h

index fc62ca5816fa2e8d6e59c6e471532d6d8735977d..0623bd01905ca2f0124d7b0ef3413cdade6e0d1a 100644 (file)
@@ -171,6 +171,98 @@ static struct sched_group_energy energy_core_hikey = {
        .cap_states     = cap_states_core_hikey,
 };
 
+/* HiKey 960 */
+
+static struct idle_state idle_states_cluster_hikey960_a53[] = {
+       { .power = 16 }, /* arch_cpu_idle() (active idle) = WFI */
+       { .power = 16 }, /* retention */
+       { .power = 16 }, /* cpu-sleep */
+       { .power =  0 }, /* cluster-sleep */
+};
+
+static struct idle_state idle_states_cluster_hikey960_a72[] = {
+       { .power = 150 }, /* arch_cpu_idle() (active idle) = WFI */
+       { .power = 150 }, /* retention */
+       { .power = 150 }, /* cpu-nap */
+       { .power = 150 }, /* cpu-sleep */
+       { .power =   0 }, /* cluster-sleep */
+};
+
+static struct capacity_state cap_states_cluster_hikey960_a53[] = {
+       { .cap =  107, .power = 16, }, /*  533 MHz */
+       { .cap =  209, .power = 28, }, /*  999 MHz */
+       { .cap =  306, .power = 44, }, /* 1402 MHz */
+       { .cap =  383, .power = 64, }, /* 1709 MHz */
+       { .cap =  402, .power = 84, }, /* 1844 Mhz */
+};
+
+static struct capacity_state cap_states_cluster_hikey960_a72[] = {
+       { .cap =  373, .power = 128, }, /*  903 MHz */
+       { .cap =  591, .power = 176, }, /* 1421 MHz */
+       { .cap =  747, .power = 233, }, /* 1805 MHz */
+       { .cap =  878, .power = 308, }, /* 2112 MHz */
+       { .cap = 1023, .power = 413, }, /* 2362 MHz */
+};
+
+static struct sched_group_energy energy_cluster_hikey960_a53 = {
+       .nr_idle_states = ARRAY_SIZE(idle_states_cluster_hikey960_a53),
+       .idle_states    = idle_states_cluster_hikey960_a53,
+       .nr_cap_states  = ARRAY_SIZE(cap_states_cluster_hikey960_a53),
+       .cap_states     = cap_states_cluster_hikey960_a53,
+};
+
+static struct sched_group_energy energy_cluster_hikey960_a72 = {
+       .nr_idle_states = ARRAY_SIZE(idle_states_cluster_hikey960_a72),
+       .idle_states    = idle_states_cluster_hikey960_a72,
+       .nr_cap_states  = ARRAY_SIZE(cap_states_cluster_hikey960_a72),
+       .cap_states     = cap_states_cluster_hikey960_a72,
+};
+
+static struct idle_state idle_states_core_hikey960_a53[] = {
+       { .power = 14 }, /* arch_cpu_idle() (active idle) = WFI */
+       { .power = 14 }, /* retention */
+       { .power =  0 }, /* cpu-sleep */
+       { .power =  0 }, /* cluster-sleep */
+};
+
+static struct idle_state idle_states_core_hikey960_a72[] = {
+       { .power = 50 }, /* arch_cpu_idle() (active idle) = WFI */
+       { .power = 50 }, /* retention */
+       { .power = 15 }, /* cpu-nap */
+       { .power =  0 }, /* cpu-sleep */
+       { .power =  0 }, /* cluster-sleep */
+};
+
+static struct capacity_state cap_states_core_hikey960_a53[] = {
+       { .cap =  107, .power =   32, }, /*  533 MHz */
+       { .cap =  209, .power =   69, }, /*  999 MHz */
+       { .cap =  306, .power =  119, }, /* 1402 MHz */
+       { .cap =  383, .power =  181, }, /* 1709 MHz */
+       { .cap =  402, .power =  242, }, /* 1844 Mhz */
+};
+
+static struct capacity_state cap_states_core_hikey960_a72[] = {
+       { .cap =  373, .power =  191, }, /*  903 MHz */
+       { .cap =  591, .power =  370, }, /* 1421 MHz */
+       { .cap =  747, .power =  596, }, /* 1805 MHz */
+       { .cap =  878, .power =  876, }, /* 2112 MHz */
+       { .cap = 1023, .power = 1214, }, /* 2362 MHz */
+};
+
+static struct sched_group_energy energy_core_hikey960_a53 = {
+       .nr_idle_states = ARRAY_SIZE(idle_states_core_hikey960_a53),
+       .idle_states    = idle_states_core_hikey960_a53,
+       .nr_cap_states  = ARRAY_SIZE(cap_states_core_hikey960_a53),
+       .cap_states     = cap_states_core_hikey960_a53,
+};
+
+static struct sched_group_energy energy_core_hikey960_a72 = {
+       .nr_idle_states = ARRAY_SIZE(idle_states_core_hikey960_a72),
+       .idle_states    = idle_states_core_hikey960_a72,
+       .nr_cap_states  = ARRAY_SIZE(cap_states_core_hikey960_a72),
+       .cap_states     = cap_states_core_hikey960_a72,
+};
+
 /* 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 +286,16 @@ static struct energy_model hikey_model = {
        { &energy_system_hikey, &energy_system_hikey, },
 };
 
+static struct energy_model hikey960_model = {
+       { &energy_core_hikey960_a53, &energy_core_hikey960_a72, },
+       { &energy_cluster_hikey960_a53, &energy_cluster_hikey960_a72, },
+       {},
+};
+
 static struct of_device_id model_matches[] = {
        { .compatible = "arm,juno", .data = &juno_model },
        { .compatible = "hisilicon,hi6220-hikey", .data = &hikey_model },
+       { .compatible = "hisilicon,hi3660-hikey960", .data = &hikey960_model },
        {},
 };