From patchwork Tue Mar 1 21:15:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lina Iyer X-Patchwork-Id: 63354 Delivered-To: patch@linaro.org Received: by 10.112.199.169 with SMTP id jl9csp2050450lbc; Tue, 1 Mar 2016 13:16:41 -0800 (PST) X-Received: by 10.98.70.139 with SMTP id o11mr33362972pfi.123.1456866979324; Tue, 01 Mar 2016 13:16:19 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id yv4si14565505pab.119.2016.03.01.13.16.19; Tue, 01 Mar 2016 13:16:19 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-arm-msm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-arm-msm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dkim=neutral (body hash did not verify) header.i=@linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753682AbcCAVQS (ORCPT + 7 others); Tue, 1 Mar 2016 16:16:18 -0500 Received: from mail-pf0-f176.google.com ([209.85.192.176]:34707 "EHLO mail-pf0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753639AbcCAVQR (ORCPT ); Tue, 1 Mar 2016 16:16:17 -0500 Received: by mail-pf0-f176.google.com with SMTP id 4so41320584pfd.1 for ; Tue, 01 Mar 2016 13:16:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=LUsnL3sZufQX8YPyy3lno40OmeplZISpCKgBPWmM3Dg=; b=fDioDQ146j2vTlSva1EW5r9U3vbKthRHxl47KbxZuF5lGWLNxtAXYiwLt9ZN75097x RUjUf4nMeFf8Bhvp+287WKxVDAVv3zZ2vjGH8QdmJYlFnYM3GNdgbgs65bRYqEPXL4n1 FH6/U/FaNWSRIXRJobEnSoAfcogznyPomz7j0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=LUsnL3sZufQX8YPyy3lno40OmeplZISpCKgBPWmM3Dg=; b=NbHL0rtvHs8EVJnSUN4YrVcZdUJyayrCPwP28IfJmS2ciNZdooCITPV/S1LzTFt0aw 9hf+P6QyGEsriAcgWTex/Q4GcOnvz6D/0s5tgt8HoORndmaAs7CeaXIwsI2KWcQI9LUG 8ib5nUQTXR3oBKEu0g6FU5SiWht6t3r0IHtxJPBgJ2sWMiHnqrPm22IdLKWyFjDit3F4 xXAJLKvoi4kbgwf96UGkxkfZs2h0FXQW470JVVA3Er0AukdTtIvdJXkYTyl4Zyeph2Sp bUVoaCXo3EdkLqbjsmcjF0JEWW/Qu6XNEZ39ngLXokSMqgeyx4jMqjDHID134jg7B/2g BQAA== X-Gm-Message-State: AD7BkJJLYDRQFEOk9GjWGzqqw9RQdp2nQJaF5h+vVYemiqbz68x1+d5w1fOQgtph/59SY6TL X-Received: by 10.98.12.8 with SMTP id u8mr33047709pfi.36.1456866976522; Tue, 01 Mar 2016 13:16:16 -0800 (PST) Received: from ubuntu.localdomain (i-global254.qualcomm.com. [199.106.103.254]) by smtp.gmail.com with ESMTPSA id kw10sm47749328pab.0.2016.03.01.13.16.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 01 Mar 2016 13:16:15 -0800 (PST) From: Lina Iyer To: ulf.hansson@linaro.org, khilman@kernel.org, rjw@rjwysocki.net, linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: geert@linux-m68k.org, k.kozlowski@samsung.com, msivasub@codeaurora.org, agross@codeaurora.org, sboyd@codeaurora.org, linux-arm-msm@vger.kernel.org, lorenzo.pieralisi@arm.com, ahaslam@baylibre.com, mtitinger@baylibre.com, Lina Iyer Subject: [RFC v3 06/12] PM / cpu_domains: Record CPUs that are part of the domain Date: Tue, 1 Mar 2016 14:15:25 -0700 Message-Id: <1456866931-37851-8-git-send-email-lina.iyer@linaro.org> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1456866931-37851-1-git-send-email-lina.iyer@linaro.org> References: <1456866931-37851-1-git-send-email-lina.iyer@linaro.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org In order to power down a CPU domain, the domain needs information about the CPUs in that domain. The reference counting for the CPU devices in a domain is done by genpd. In order to understand the idle time for the domain, it is necessary to know which CPUs are part of the domain, so the domain governor may understand the sleep durations of the comprising CPU devices and make a judicious decision on the domain's idle state. This extends to the parent of such domains, which may have multiple such CPU domains and therefore would need to know the sleep patterns of all the CPUs in all the CPU domains. To aid this functionality, traverse up the parent chain and set the CPU in the cpumasks while attaching a CPU to its domain. This mask is provided in the callback to the platform driver to help identify the CPUs in the domain that is being powered off. Signed-off-by: Lina Iyer --- drivers/base/power/cpu_domains.c | 28 ++++++++++++++++++++++++---- include/linux/cpu_domains.h | 4 +++- 2 files changed, 27 insertions(+), 5 deletions(-) -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/base/power/cpu_domains.c b/drivers/base/power/cpu_domains.c index 62704e6..62c1ab9 100644 --- a/drivers/base/power/cpu_domains.c +++ b/drivers/base/power/cpu_domains.c @@ -9,6 +9,7 @@ */ #include +#include #include #include #include @@ -27,6 +28,7 @@ struct cpu_pm_domain { struct cpu_pd_ops ops; struct generic_pm_domain *genpd; struct cpu_pm_domain *parent; + cpumask_var_t cpus; }; /* List of CPU PM domains we care about */ @@ -50,7 +52,7 @@ struct cpu_pm_domain *to_cpu_pd(struct generic_pm_domain *d) return res; } -static int cpu_pd_attach_cpu(int cpu) +static int cpu_pd_attach_cpu(struct cpu_pm_domain *cpu_pd, int cpu) { int ret; struct device *cpu_dev; @@ -70,6 +72,11 @@ static int cpu_pd_attach_cpu(int cpu) else dev_dbg(cpu_dev, "Attached to domain\n"); + while (!ret && cpu_pd) { + cpumask_set_cpu(cpu, cpu_pd->cpus); + cpu_pd = cpu_pd->parent; + }; + return ret; } @@ -85,8 +92,8 @@ static int cpu_pd_power_off(struct generic_pm_domain *genpd) struct cpu_pm_domain *pd = to_cpu_pd(genpd); return pd->ops.power_off ? pd->ops.power_off(genpd->state_idx, - genpd->states[genpd->state_idx].param), - : 0; + genpd->states[genpd->state_idx].param, + pd->cpus) : 0; } /** @@ -119,6 +126,9 @@ static struct generic_pm_domain *of_init_cpu_pm_domain(struct device_node *dn, if (!pd) goto fail; + if (!zalloc_cpumask_var(&pd->cpus, GFP_KERNEL)) + goto fail; + pd->genpd = genpd; pd->genpd->power_off = cpu_pd_power_off; pd->genpd->power_on = cpu_pd_power_on; @@ -149,6 +159,8 @@ fail: kfree(genpd->name); kfree(genpd); + if (pd) + kfree(pd->cpus); kfree(pd); return ERR_PTR(ret); } @@ -224,6 +236,7 @@ int of_setup_cpu_pd_single(int cpu, const struct cpu_pd_ops *ops) struct device_node *dn; struct generic_pm_domain *genpd; + struct cpu_pm_domain *cpu_pd; dn = of_get_cpu_node(cpu, NULL); if (!dn) @@ -239,7 +252,14 @@ int of_setup_cpu_pd_single(int cpu, const struct cpu_pd_ops *ops) return PTR_ERR(genpd); of_node_put(dn); - return cpu_pd_attach_cpu(cpu); + cpu_pd = to_cpu_pd(genpd); + if (!cpu_pd) { + pr_err("%s: Genpd was created outside CPU PM domains\n", + __func__); + return -ENOENT; + } + + return cpu_pd_attach_cpu(cpu_pd, cpu); } EXPORT_SYMBOL(of_setup_cpu_pd_single); diff --git a/include/linux/cpu_domains.h b/include/linux/cpu_domains.h index 9530b2d..50e3321 100644 --- a/include/linux/cpu_domains.h +++ b/include/linux/cpu_domains.h @@ -13,8 +13,10 @@ #include +struct cpumask; + struct cpu_pd_ops { - int (*power_off)(u32 state_idx, u32 param); + int (*power_off)(u32 state_idx, u32 param, const struct cpumask *mask); int (*power_on)(void); };