From patchwork Thu Jul 3 16:25:53 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Morten Rasmussen X-Patchwork-Id: 33045 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-oa0-f70.google.com (mail-oa0-f70.google.com [209.85.219.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 9D7DD203AC for ; Thu, 3 Jul 2014 16:28:50 +0000 (UTC) Received: by mail-oa0-f70.google.com with SMTP id m1sf1958748oag.9 for ; Thu, 03 Jul 2014 09:28:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe:content-type :content-transfer-encoding; bh=bv8ziOmIpEHlxaaXMaw2mdIP/e1ucAoNeu5KHo8+PXk=; b=CoQdV8GQblpyifhtk0zrCjBqnJUyaYJTlagRtOup8dgl302a6/bXBx5fI6eGp3SOm7 ocFFs5hFMZr5+y0iJGJd0L05hol85ICBZr2jKuNB86/F7Eirj5WNs3hAIoL7XJw332ap 4DKof5UwEBFzCEHO1dPmrbcx23D+6Kb3zRuDBdhEBfrtVEwicZTQkjPpAm6UxL617dSY URw3XRzKMMpzWwB4w/m7D6+NjAZBeZrHQig/jQUZYWFM5VZXciWdF+CD3uEDqaU5BAyG H+ekY2p8kCcEhqOo5l298OWE6CVdV0ehQBqyjGF/d0GfGhPFogm9t0FFzQ6N3xsZGOmn ewLA== X-Gm-Message-State: ALoCoQkysj1QUhE5rDOWcRc6j/lzAvt902oXKwxlwPjW564ob06SZlK6RYddEJLA6+s5jmvNl2AB X-Received: by 10.43.92.195 with SMTP id br3mr4993446icc.1.1404404930192; Thu, 03 Jul 2014 09:28:50 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.87.207 with SMTP id r73ls570431qgd.44.gmail; Thu, 03 Jul 2014 09:28:50 -0700 (PDT) X-Received: by 10.58.165.106 with SMTP id yx10mr4900693veb.17.1404404930097; Thu, 03 Jul 2014 09:28:50 -0700 (PDT) Received: from mail-vc0-f181.google.com (mail-vc0-f181.google.com [209.85.220.181]) by mx.google.com with ESMTPS id ga2si14382364vdc.81.2014.07.03.09.28.50 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 03 Jul 2014 09:28:50 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.181 as permitted sender) client-ip=209.85.220.181; Received: by mail-vc0-f181.google.com with SMTP id il7so469838vcb.12 for ; Thu, 03 Jul 2014 09:28:50 -0700 (PDT) X-Received: by 10.221.64.80 with SMTP id xh16mr1701465vcb.35.1404404929970; Thu, 03 Jul 2014 09:28:49 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.37.5 with SMTP id tc5csp390490vcb; Thu, 3 Jul 2014 09:28:49 -0700 (PDT) X-Received: by 10.68.245.100 with SMTP id xn4mr5650887pbc.152.1404404928937; Thu, 03 Jul 2014 09:28:48 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id cm7si964954pdb.360.2014.07.03.09.28.46; Thu, 03 Jul 2014 09:28:46 -0700 (PDT) Received-SPF: none (google.com: linux-kernel-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759544AbaGCQ2g (ORCPT + 27 others); Thu, 3 Jul 2014 12:28:36 -0400 Received: from service87.mimecast.com ([91.220.42.44]:53540 "EHLO service87.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754895AbaGCQ2d (ORCPT ); Thu, 3 Jul 2014 12:28:33 -0400 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Thu, 03 Jul 2014 17:26:10 +0100 Received: from e103034-lin.cambridge.arm.com ([10.1.255.212]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 3 Jul 2014 17:26:10 +0100 From: Morten Rasmussen To: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, peterz@infradead.org, mingo@kernel.org Cc: rjw@rjwysocki.net, vincent.guittot@linaro.org, daniel.lezcano@linaro.org, preeti@linux.vnet.ibm.com, Dietmar.Eggemann@arm.com, pjt@google.com Subject: [RFCv2 PATCH 06/23] arm: topology: Define TC2 energy and provide it to the scheduler Date: Thu, 3 Jul 2014 17:25:53 +0100 Message-Id: <1404404770-323-7-git-send-email-morten.rasmussen@arm.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1404404770-323-1-git-send-email-morten.rasmussen@arm.com> References: <1404404770-323-1-git-send-email-morten.rasmussen@arm.com> X-OriginalArrivalTime: 03 Jul 2014 16:26:10.0725 (UTC) FILETIME=[800B1D50:01CF96DB] X-MC-Unique: 114070317261009801 Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: morten.rasmussen@arm.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.181 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , From: Dietmar Eggemann This patch is only here to be able to test provisioning of energy related data from an arch topology shim layer to the scheduler. Since there is no code today which deals with extracting energy related data from the dtb or acpi, and process it in the topology shim layer, the content of the sched_group_energy structures as well as the idle_state and capacity_state arrays are hard-coded here. This patch defines the sched_group_energy structure as well as the idle_state and capacity_state array for the cluster (relates to sched groups (sg's) in DIE sched domain (sd) level) and for the core (relates to sg's in MC sd level) for a Cortex A7 as well as for a Cortex A15. It further provides related implementations of the sched_domain_energy_f functions (cpu_cluster_energy() and cpu_core_energy()). To be able to propagate this information from the topology shim layer to the scheduler, the elements of the arm_topology[] table have been provisioned with the appropriate sched_domain_energy_f functions. Signed-off-by: Dietmar Eggemann --- arch/arm/kernel/topology.c | 116 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 113 insertions(+), 3 deletions(-) diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c index d42a7db..a7d5a6e 100644 --- a/arch/arm/kernel/topology.c +++ b/arch/arm/kernel/topology.c @@ -275,6 +275,117 @@ 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 = 10, .wu_energy = 6 /* << 10 */, }, + }; + +static struct idle_state idle_states_cluster_a15[] = { + { .power = 25, .wu_energy = 210 /* << 10 */, }, + }; + +static struct capacity_state cap_states_cluster_a7[] = { + /* Cluster only power */ + { .cap = 358, .power = 2967, }, /* 350 MHz */ + { .cap = 410, .power = 2792, }, /* 400 MHz */ + { .cap = 512, .power = 2810, }, /* 500 MHz */ + { .cap = 614, .power = 2815, }, /* 600 MHz */ + { .cap = 717, .power = 2919, }, /* 700 MHz */ + { .cap = 819, .power = 2847, }, /* 800 MHz */ + { .cap = 922, .power = 3917, }, /* 900 MHz */ + { .cap = 1024, .power = 4905, }, /* 1000 MHz */ + }; + +static struct capacity_state cap_states_cluster_a15[] = { + /* Cluster only power */ + { .cap = 840, .power = 7920, }, /* 500 MHz */ + { .cap = 1008, .power = 8165, }, /* 600 MHz */ + { .cap = 1176, .power = 8172, }, /* 700 MHz */ + { .cap = 1343, .power = 8195, }, /* 800 MHz */ + { .cap = 1511, .power = 8265, }, /* 900 MHz */ + { .cap = 1679, .power = 8446, }, /* 1000 MHz */ + { .cap = 1847, .power = 11426, }, /* 1100 MHz */ + { .cap = 2015, .power = 15200, }, /* 1200 MHz */ + }; + +static struct sched_group_energy energy_cluster_a7 = { + .nr_idle_states = ARRAY_SIZE(idle_states_cluster_a7), + .idle_states = idle_states_cluster_a7, + .nr_cap_states = ARRAY_SIZE(cap_states_cluster_a7), + .cap_states = cap_states_cluster_a7, +}; + +static struct sched_group_energy energy_cluster_a15 = { + .nr_idle_states = ARRAY_SIZE(idle_states_cluster_a15), + .idle_states = idle_states_cluster_a15, + .nr_cap_states = ARRAY_SIZE(cap_states_cluster_a15), + .cap_states = cap_states_cluster_a15, +}; + +static struct idle_state idle_states_core_a7[] = { + { .power = 0 /* No power gating */, .wu_energy = 0 /* << 10 */, }, + }; + +static struct idle_state idle_states_core_a15[] = { + { .power = 0 /* No power gating */, .wu_energy = 5 /* << 10 */, }, + }; + +static struct capacity_state cap_states_core_a7[] = { + /* Power per cpu */ + { .cap = 358, .power = 187, }, /* 350 MHz */ + { .cap = 410, .power = 275, }, /* 400 MHz */ + { .cap = 512, .power = 334, }, /* 500 MHz */ + { .cap = 614, .power = 407, }, /* 600 MHz */ + { .cap = 717, .power = 447, }, /* 700 MHz */ + { .cap = 819, .power = 549, }, /* 800 MHz */ + { .cap = 922, .power = 761, }, /* 900 MHz */ + { .cap = 1024, .power = 1024, }, /* 1000 MHz */ + }; + +static struct capacity_state cap_states_core_a15[] = { + /* Power per cpu */ + { .cap = 840, .power = 2021, }, /* 500 MHz */ + { .cap = 1008, .power = 2312, }, /* 600 MHz */ + { .cap = 1176, .power = 2756, }, /* 700 MHz */ + { .cap = 1343, .power = 3125, }, /* 800 MHz */ + { .cap = 1511, .power = 3524, }, /* 900 MHz */ + { .cap = 1679, .power = 3846, }, /* 1000 MHz */ + { .cap = 1847, .power = 5177, }, /* 1100 MHz */ + { .cap = 2015, .power = 6997, }, /* 1200 MHz */ + }; + +static struct sched_group_energy energy_core_a7 = { + .nr_idle_states = ARRAY_SIZE(idle_states_core_a7), + .idle_states = idle_states_core_a7, + .nr_cap_states = ARRAY_SIZE(cap_states_core_a7), + .cap_states = cap_states_core_a7, +}; + +static struct sched_group_energy energy_core_a15 = { + .nr_idle_states = ARRAY_SIZE(idle_states_core_a15), + .idle_states = idle_states_core_a15, + .nr_cap_states = ARRAY_SIZE(cap_states_core_a15), + .cap_states = cap_states_core_a15, +}; + +/* sd energy functions */ +static inline const struct sched_group_energy *cpu_cluster_energy(int cpu) +{ + return cpu_topology[cpu].socket_id ? &energy_cluster_a7 : + &energy_cluster_a15; +} + +static inline const struct sched_group_energy *cpu_core_energy(int cpu) +{ + return cpu_topology[cpu].socket_id ? &energy_core_a7 : + &energy_core_a15; +} + static inline const int cpu_corepower_flags(void) { return SD_SHARE_PKG_RESOURCES | SD_SHARE_POWERDOMAIN; @@ -282,10 +393,9 @@ static inline const int cpu_corepower_flags(void) static struct sched_domain_topology_level arm_topology[] = { #ifdef CONFIG_SCHED_MC - { cpu_corepower_mask, cpu_corepower_flags, SD_INIT_NAME(GMC) }, - { cpu_coregroup_mask, cpu_core_flags, SD_INIT_NAME(MC) }, + { cpu_coregroup_mask, cpu_corepower_flags, cpu_core_energy, SD_INIT_NAME(MC) }, #endif - { cpu_cpu_mask, SD_INIT_NAME(DIE) }, + { cpu_cpu_mask, 0, cpu_cluster_energy, SD_INIT_NAME(DIE) }, { NULL, }, };