From: ulf.hansson@linaro.org (Ulf Hansson)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v6 05/25] PM / Domains: Add helper functions to attach/detach CPUs to/from genpd
Date: Wed, 14 Mar 2018 17:58:15 +0100 [thread overview]
Message-ID: <1521046715-30683-6-git-send-email-ulf.hansson@linaro.org> (raw)
In-Reply-To: <1521046715-30683-1-git-send-email-ulf.hansson@linaro.org>
Introduce two new genpd helper functions, of_genpd_attach|detach_cpu(),
which takes the CPU-number as an in-parameter.
To attach a CPU to a genpd, of_genpd_attach_cpu() starts by fetching the
struct device belonging to the CPU. Then it calls genpd_dev_pm_attach(),
which via DT tries to hook up the CPU device to its corresponding PM
domain. If it succeeds, of_genpd_attach_cpu() continues to prepare/enable
runtime PM of the device.
To detach a CPU from its PM domain, of_genpd_attach_cpu() reverse the
operations made from of_genpd_attach_cpu(). However, first it checks that
the CPU device has a valid PM domain pointer assigned, as to make sure it
belongs to genpd.
Cc: Lina Iyer <ilina@codeaurora.org>
Co-developed-by: Lina Iyer <lina.iyer@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
---
drivers/base/power/domain.c | 67 +++++++++++++++++++++++++++++++++++++++++++++
include/linux/pm_domain.h | 9 ++++++
2 files changed, 76 insertions(+)
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index e178521..91ea9b2 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -2324,6 +2324,73 @@ int genpd_dev_pm_attach(struct device *dev)
}
EXPORT_SYMBOL_GPL(genpd_dev_pm_attach);
+/**
+ * of_genpd_attach_cpu() - Attach a CPU to its PM domain
+ * @cpu: The CPU to be attached.
+ *
+ * Try to find the corresponding PM domain provider for the CPU's device. Use
+ * it to attach the CPU's device to its PM domain. If attaching is completed
+ * successfully, we enable runtime PM for the CPU's device.
+ *
+ * Returns zero on success else a negative error code.
+ */
+int of_genpd_attach_cpu(int cpu)
+{
+ struct device *dev = get_cpu_device(cpu);
+ int ret;
+
+ if (!dev) {
+ pr_warn("genpd: no dev for cpu%d\n", cpu);
+ return -ENODEV;
+ }
+
+ ret = genpd_dev_pm_attach(dev);
+ if (ret) {
+ dev_warn(dev, "genpd: attach cpu failed %d\n", ret);
+ return ret;
+ }
+
+ pm_runtime_irq_safe(dev);
+ pm_runtime_get_noresume(dev);
+ pm_runtime_set_active(dev);
+ pm_runtime_enable(dev);
+
+ dev_info(dev, "genpd: attached cpu\n");
+ return 0;
+}
+EXPORT_SYMBOL(of_genpd_attach_cpu);
+
+/**
+ * of_genpd_detach_cpu() - Detach a CPU from its PM domain
+ * @cpu: The CPU to be detached.
+ *
+ * Detach the CPU's device from its corresponding PM domain. If detaching is
+ * completed successfully, disable runtime PM and restore the runtime PM usage
+ * count for the CPU's device.
+ */
+void of_genpd_detach_cpu(int cpu)
+{
+ struct device *dev = get_cpu_device(cpu);
+
+ if (!dev) {
+ pr_warn("genpd: no dev for cpu%d\n", cpu);
+ return;
+ }
+
+ /* Check that the device is attached to a genpd. */
+ if (!(dev->pm_domain && dev->pm_domain->detach == genpd_dev_pm_detach))
+ return;
+
+ genpd_dev_pm_detach(dev, true);
+
+ pm_runtime_disable(dev);
+ pm_runtime_put_noidle(dev);
+ pm_runtime_reinit(dev);
+
+ dev_info(dev, "genpd: detached cpu\n");
+}
+EXPORT_SYMBOL(of_genpd_detach_cpu);
+
static const struct of_device_id idle_state_match[] = {
{ .compatible = "domain-idle-state", },
{ }
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index 29ab00c..ccd7c94 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -249,6 +249,8 @@ extern int of_genpd_parse_idle_states(struct device_node *dn,
struct genpd_power_state **states, int *n);
int genpd_dev_pm_attach(struct device *dev);
+int of_genpd_attach_cpu(int cpu);
+void of_genpd_detach_cpu(int cpu);
#else /* !CONFIG_PM_GENERIC_DOMAINS_OF */
static inline int of_genpd_add_provider_simple(struct device_node *np,
struct generic_pm_domain *genpd)
@@ -287,6 +289,13 @@ static inline int genpd_dev_pm_attach(struct device *dev)
return -ENODEV;
}
+static inline int of_genpd_attach_cpu(int cpu)
+{
+ return -ENODEV;
+}
+
+static inline void of_genpd_detach_cpu(int cpu) {}
+
static inline
struct generic_pm_domain *of_genpd_remove_last(struct device_node *np)
{
--
2.7.4
next prev parent reply other threads:[~2018-03-14 16:58 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-14 16:58 [PATCH v6 00/25] PM / Domains: Support hierarchical CPU arrangement (PSCI/ARM) Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 01/25] PM / Domains: Don't treat zero found compatible idle states as an error Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 02/25] PM / Domains: Deal with multiple states but no governor in genpd Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 03/25] PM / Domains: Add generic data pointer to genpd_power_state struct Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 04/25] PM / Domains: Add support for CPU devices to genpd Ulf Hansson
2018-03-14 16:58 ` Ulf Hansson [this message]
2018-03-14 16:58 ` [PATCH v6 06/25] timer: Export next wakeup time of a CPU Ulf Hansson
2018-03-14 17:19 ` Mark Rutland
2018-03-14 16:58 ` [PATCH v6 07/25] PM / Domains: Add genpd governor for CPUs Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 08/25] PM / Domains: Extend genpd CPU governor to cope with QoS constraints Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 09/25] kernel/cpu_pm: Manage runtime PM in the idle path for CPUs Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 10/25] dt: psci: Update DT bindings to support hierarchical PSCI states Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 11/25] of: base: Add of_get_cpu_state_node() to get idle states for a CPU node Ulf Hansson
2018-03-18 12:51 ` Rob Herring
2018-03-14 16:58 ` [PATCH v6 12/25] cpuidle: dt: Support hierarchical CPU idle states Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 13/25] drivers: firmware: psci: Split psci_dt_cpu_init_idle() Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 14/25] drivers: firmware: psci: Support hierarchical CPU idle states Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 15/25] drivers: firmware: psci: Simplify error path of psci_dt_init() Ulf Hansson
2018-03-14 17:25 ` Mark Rutland
2018-03-14 16:58 ` [PATCH v6 16/25] drivers: firmware: psci: Announce support for OS initiated suspend mode Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 17/25] drivers: firmware: psci: Prepare to use " Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 18/25] drivers: firmware: psci: Share a few internal PSCI functions Ulf Hansson
2018-03-14 17:30 ` Mark Rutland
2018-03-14 16:58 ` [PATCH v6 19/25] drivers: firmware: psci: Add support for PM domains using genpd Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 20/25] drivers: firmware: psci: Introduce psci_dt_topology_init() Ulf Hansson
2018-03-14 17:38 ` Mark Rutland
2018-04-10 7:19 ` Ulf Hansson
2018-04-10 11:10 ` Mark Rutland
2018-04-10 12:25 ` Ulf Hansson
2018-04-18 11:32 ` Mark Rutland
2018-03-14 16:58 ` [PATCH v6 21/25] drivers: firmware: psci: Try to attach CPU devices to their PM domains Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 22/25] drivers: firmware: psci: Deal with CPU hotplug when using OSI mode Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 23/25] MAINTAINERS: Update files for PSCI Ulf Hansson
2018-03-14 17:40 ` Mark Rutland
2018-03-14 16:58 ` [PATCH v6 24/25] arm64: kernel: Respect the hierarchical CPU topology in DT " Ulf Hansson
2018-03-14 16:58 ` [PATCH v6 25/25] arm64: dts: Convert to the hierarchical CPU topology layout for MSM8916 Ulf Hansson
2018-03-14 17:19 ` [PATCH v6 00/25] PM / Domains: Support hierarchical CPU arrangement (PSCI/ARM) Mark Rutland
2018-03-15 14:19 ` Ulf Hansson
2018-03-15 11:00 ` Geert Uytterhoeven
2018-03-15 13:14 ` Ulf Hansson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1521046715-30683-6-git-send-email-ulf.hansson@linaro.org \
--to=ulf.hansson@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).