From: Ulf Hansson <ulf.hansson@linaro.org>
To: "Rafael J . Wysocki" <rjw@rjwysocki.net>,
Sudeep Holla <sudeep.holla@arm.com>,
Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>,
Mark Rutland <mark.rutland@arm.com>,
Daniel Lezcano <daniel.lezcano@linaro.org>,
linux-pm@vger.kernel.org
Cc: "Raju P . L . S . S . S . N" <rplsssn@codeaurora.org>,
Stephen Boyd <sboyd@kernel.org>, Tony Lindgren <tony@atomide.com>,
Kevin Hilman <khilman@kernel.org>,
Lina Iyer <ilina@codeaurora.org>,
Ulf Hansson <ulf.hansson@linaro.org>,
Viresh Kumar <viresh.kumar@linaro.org>,
Vincent Guittot <vincent.guittot@linaro.org>,
Geert Uytterhoeven <geert+renesas@glider.be>,
linux-arm-kernel@lists.infradead.org,
linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v10 00/27] PM / Domains: Support hierarchical CPU arrangement (PSCI/ARM)
Date: Thu, 29 Nov 2018 18:46:33 +0100 [thread overview]
Message-ID: <20181129174700.16585-1-ulf.hansson@linaro.org> (raw)
Over the years this series have been iterated and discussed at various Linux
conferences and LKML. In this new v10, a quite significant amount of changes
have been made to address comments from v8 and v9. A summary is available
below, although let's start with a brand new clarification of the motivation
behind this series.
For ARM64/ARM based platforms CPUs are often arranged in a hierarchical manner.
>From a CPU idle state perspective, this means some states may be shared among a
group of CPUs (aka CPU cluster).
To deal with idle management of a group of CPUs, sometimes the kernel needs to
be involved to manage the last-man standing algorithm, simply because it can't
rely solely on power management FWs to deal with this. Depending on the
platform, of course.
There are a couple of typical scenarios for when the kernel needs to be in
control, dealing with synchronization of when the last CPU in a cluster is about
to enter a deep idle state.
1)
The kernel needs to carry out so called last-man activities before the
CPU cluster can enter a deep idle state. This may for example involve to
configure external logics for wakeups, as the GIC may no longer be functional
once a deep cluster idle state have been entered. Likewise, these operations
may need to be restored, when the first CPU wakes up.
2)
Other more generic I/O devices, such as an MMC controller for example, may be a
part of the same power domain as the CPU cluster, due to a shared power-rail.
For these scenarios, when the MMC controller is in use dealing with an MMC
request, a deeper idle state of the CPU cluster may needs to be temporarily
disabled. This is needed to retain the MMC controller in a functional state,
else it may loose its register-context in the middle of serving a request.
In this series, we are extending the generic PM domain (aka genpd) to be used
for also CPU devices. Hence the goal is to re-use much of its current code to
help us manage the last-man standing synchronization. Moreover, as we already
use genpd to model power domains for generic I/O devices, both 1) and 2) can be
address with its help.
Moreover, to address these problems for ARM64 DT based platforms, we are
deploying support for genpd and runtime PM to the PSCI FW driver - and finally
we make some updates to two ARM64 DTBs, as to deploy the new PSCI CPU topology
layout.
The series has been tested on the QCOM 410c dragonboard and the Hisilicon Hikey
board. You may also find the code at:
git.linaro.org/people/ulf.hansson/linux-pm.git next
Kind regards
Ulf Hansson
Changes in v10:
- Quite significant changes have been to the PSCI driver deployment. According
to an agreement with Lorenzo, the hierarchical CPU layout for PSCI should be
orthogonal to whether the PSCI FW supports OSI or not. This has been taken
care of in this version.
- Drop the generic attach/detach helpers of CPUs to genpd, instead make that
related code internal to PSCI, for now.
- Fix "BUG: sleeping for invalid context" for hotplug, as reported by Raju.
- Addressed various comments from version 8 and 9.
- Clarified changelogs and re-wrote the cover-letter to better explain the
motivations behind these changes.
Changes in v9:
- Collect only a subset from the changes in v8.
- Patch 3 is new, documenting existing genpd flags. Future wise, this means
when a new genpd flag is invented, we must also properly document it.
- No changes have been made to the patches picked from v8.
- Dropped the text from v8 cover-letter[1], to avoid confusion. When posting v10
(or whatever the next version containing the rest becomes), I am going re-write
the cover-letter to clarify, more exactly, the problems this series intends to
solve. The earlier text was simply too vague.
[1]
https://lwn.net/Articles/758091/
Changes in v8:
- Added some tags for reviews and acks.
- Cleanup timer patch (patch6) according to comments from Rafael.
- Rebased series on top of v4.18rc1 - it applied cleanly, except for patch 5.
- While adopting patch 5 to new genpd changes, I took the opportunity to
improve the new function description a bit.
- Corrected malformed SPDX-License-Identifier in patch20.
Changes in v7:
- Addressed comments concerning the PSCI changes from Mark Rutland, which moves
the psci firmware driver to a new firmware subdir and change to force PSCI PC
mode during boot to cope with kexec'ed booted kernels.
- Added some maintainers in cc for the timer/nohz patches.
- Minor update to the new genpd governor, taking into account the state's
poweroff latency while validating the sleep duration time.
- Addressed a problem pointed out by Geert Uytterhoeven, around calling
pm_runtime_get|put() for CPUs that has not been attached to a CPU PM domain.
- Re-based on Linus' latest master.
Lina Iyer (5):
timer: Export next wakeup time of a CPU
dt: psci: Update DT bindings to support hierarchical PSCI states
cpuidle: dt: Support hierarchical CPU idle states
drivers: firmware: psci: Support hierarchical CPU idle states
arm64: dts: Convert to the hierarchical CPU topology layout for
MSM8916
Ulf Hansson (22):
PM / Domains: Add generic data pointer to genpd_power_state struct
PM / Domains: Add support for CPU devices to genpd
PM / Domains: Add genpd governor for CPUs
of: base: Add of_get_cpu_state_node() to get idle states for a CPU
node
ARM/ARM64: cpuidle: Let back-end init ops take the driver as input
drivers: firmware: psci: Move psci to separate directory
MAINTAINERS: Update files for PSCI
drivers: firmware: psci: Split psci_dt_cpu_init_idle()
drivers: firmware: psci: Simplify state node parsing
drivers: firmware: psci: Simplify error path of psci_dt_init()
drivers: firmware: psci: Announce support for OS initiated suspend
mode
drivers: firmware: psci: Prepare to use OS initiated suspend mode
drivers: firmware: psci: Prepare to support PM domains
drivers: firmware: psci: Add support for PM domains using genpd
drivers: firmware: psci: Add hierarchical domain idle states converter
drivers: firmware: psci: Introduce psci_dt_topology_init()
drivers: firmware: psci: Add a helper to attach a CPU to its PM domain
drivers: firmware: psci: Attach the CPU's device to its PM domain
drivers: firmware: psci: Manage runtime PM in the idle path for CPUs
drivers: firmware: psci: Support CPU hotplug for the hierarchical
model
arm64: kernel: Respect the hierarchical CPU topology in DT for PSCI
arm64: dts: hikey: Convert to the hierarchical CPU topology layout
.../devicetree/bindings/arm/psci.txt | 166 ++++++++
MAINTAINERS | 2 +-
arch/arm/include/asm/cpuidle.h | 4 +-
arch/arm/kernel/cpuidle.c | 5 +-
arch/arm64/boot/dts/hisilicon/hi6220.dtsi | 87 +++-
arch/arm64/boot/dts/qcom/msm8916.dtsi | 57 ++-
arch/arm64/include/asm/cpu_ops.h | 4 +-
arch/arm64/include/asm/cpuidle.h | 6 +-
arch/arm64/kernel/cpuidle.c | 6 +-
arch/arm64/kernel/setup.c | 3 +
drivers/base/power/domain.c | 74 +++-
drivers/base/power/domain_governor.c | 61 ++-
drivers/cpuidle/cpuidle-arm.c | 2 +-
drivers/cpuidle/dt_idle_states.c | 5 +-
drivers/firmware/Kconfig | 15 +-
drivers/firmware/Makefile | 3 +-
drivers/firmware/psci/Kconfig | 13 +
drivers/firmware/psci/Makefile | 4 +
drivers/firmware/{ => psci}/psci.c | 240 ++++++++---
drivers/firmware/psci/psci.h | 23 ++
drivers/firmware/{ => psci}/psci_checker.c | 0
drivers/firmware/psci/psci_pm_domain.c | 389 ++++++++++++++++++
drivers/of/base.c | 35 ++
drivers/soc/qcom/spm.c | 3 +-
include/linux/of.h | 8 +
include/linux/pm_domain.h | 19 +-
include/linux/psci.h | 6 +-
include/linux/tick.h | 8 +
include/uapi/linux/psci.h | 5 +
kernel/time/tick-sched.c | 13 +
30 files changed, 1163 insertions(+), 103 deletions(-)
create mode 100644 drivers/firmware/psci/Kconfig
create mode 100644 drivers/firmware/psci/Makefile
rename drivers/firmware/{ => psci}/psci.c (76%)
create mode 100644 drivers/firmware/psci/psci.h
rename drivers/firmware/{ => psci}/psci_checker.c (100%)
create mode 100644 drivers/firmware/psci/psci_pm_domain.c
--
2.17.1
next reply other threads:[~2018-11-29 17:46 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-29 17:46 Ulf Hansson [this message]
2018-11-29 17:46 ` [PATCH v10 01/27] PM / Domains: Add generic data pointer to genpd_power_state struct Ulf Hansson
2018-12-18 10:39 ` Daniel Lezcano
2018-12-18 11:53 ` Ulf Hansson
2019-01-11 10:52 ` Rafael J. Wysocki
2018-11-29 17:46 ` [PATCH v10 02/27] PM / Domains: Add support for CPU devices to genpd Ulf Hansson
2018-12-19 9:53 ` Daniel Lezcano
2018-12-19 10:02 ` Ulf Hansson
2019-01-11 10:54 ` Rafael J. Wysocki
2018-11-29 17:46 ` [PATCH v10 03/27] timer: Export next wakeup time of a CPU Ulf Hansson
2019-01-11 11:06 ` Rafael J. Wysocki
2019-01-16 7:57 ` Ulf Hansson
2019-01-16 10:59 ` Rafael J. Wysocki
2019-01-16 12:00 ` Ulf Hansson
2019-01-25 10:04 ` Ulf Hansson
2019-01-25 10:18 ` Rafael J. Wysocki
2018-11-29 17:46 ` [PATCH v10 04/27] PM / Domains: Add genpd governor for CPUs Ulf Hansson
2018-12-19 9:54 ` Daniel Lezcano
2018-12-19 10:09 ` Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 05/27] dt: psci: Update DT bindings to support hierarchical PSCI states Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 06/27] of: base: Add of_get_cpu_state_node() to get idle states for a CPU node Ulf Hansson
2018-12-19 11:05 ` Daniel Lezcano
2018-11-29 17:46 ` [PATCH v10 07/27] cpuidle: dt: Support hierarchical CPU idle states Ulf Hansson
2018-12-19 11:20 ` Daniel Lezcano
2018-11-29 17:46 ` [PATCH v10 08/27] ARM/ARM64: cpuidle: Let back-end init ops take the driver as input Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 09/27] drivers: firmware: psci: Move psci to separate directory Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 10/27] MAINTAINERS: Update files for PSCI Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 11/27] drivers: firmware: psci: Split psci_dt_cpu_init_idle() Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 12/27] drivers: firmware: psci: Simplify state node parsing Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 13/27] drivers: firmware: psci: Support hierarchical CPU idle states Ulf Hansson
2018-12-19 12:11 ` Daniel Lezcano
2018-12-19 12:53 ` Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 14/27] drivers: firmware: psci: Simplify error path of psci_dt_init() Ulf Hansson
2018-12-19 12:08 ` Daniel Lezcano
2018-11-29 17:46 ` [PATCH v10 15/27] drivers: firmware: psci: Announce support for OS initiated suspend mode Ulf Hansson
2018-12-20 13:11 ` Daniel Lezcano
2018-11-29 17:46 ` [PATCH v10 16/27] drivers: firmware: psci: Prepare to use " Ulf Hansson
2018-12-20 14:08 ` Daniel Lezcano
2018-12-20 15:41 ` Ulf Hansson
2018-12-20 17:16 ` Daniel Lezcano
2018-11-29 17:46 ` [PATCH v10 17/27] drivers: firmware: psci: Prepare to support PM domains Ulf Hansson
2018-12-20 14:19 ` Daniel Lezcano
2018-12-20 15:49 ` Ulf Hansson
2018-12-20 18:06 ` Daniel Lezcano
2018-12-20 21:37 ` Ulf Hansson
2018-12-21 7:15 ` Daniel Lezcano
2018-11-29 17:46 ` [PATCH v10 18/27] drivers: firmware: psci: Add support for PM domains using genpd Ulf Hansson
2018-12-03 16:37 ` Lina Iyer
2018-12-03 20:03 ` Ulf Hansson
2018-12-20 14:35 ` Daniel Lezcano
2018-12-20 21:09 ` Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 19/27] drivers: firmware: psci: Add hierarchical domain idle states converter Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 20/27] drivers: firmware: psci: Introduce psci_dt_topology_init() Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 21/27] drivers: firmware: psci: Add a helper to attach a CPU to its PM domain Ulf Hansson
2018-12-04 18:45 ` Lina Iyer
2018-12-06 9:15 ` Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 22/27] drivers: firmware: psci: Attach the CPU's device " Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 23/27] drivers: firmware: psci: Manage runtime PM in the idle path for CPUs Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 24/27] drivers: firmware: psci: Support CPU hotplug for the hierarchical model Ulf Hansson
2018-11-29 22:31 ` Lina Iyer
2018-11-30 8:25 ` Ulf Hansson
2018-11-30 20:57 ` Lina Iyer
2018-12-19 11:17 ` Lorenzo Pieralisi
2018-12-19 11:47 ` Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 25/27] arm64: kernel: Respect the hierarchical CPU topology in DT for PSCI Ulf Hansson
2018-11-29 17:46 ` [PATCH v10 26/27] arm64: dts: Convert to the hierarchical CPU topology layout for MSM8916 Ulf Hansson
2018-11-29 17:47 ` [PATCH v10 27/27] arm64: dts: hikey: Convert to the hierarchical CPU topology layout Ulf Hansson
2018-12-17 16:12 ` [PATCH v10 00/27] PM / Domains: Support hierarchical CPU arrangement (PSCI/ARM) Ulf Hansson
2019-01-11 11:08 ` Rafael J. Wysocki
2019-01-03 12:06 ` Sudeep Holla
2019-01-16 9:10 ` Ulf Hansson
2019-01-17 17:44 ` Sudeep Holla
2019-01-18 11:56 ` 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=20181129174700.16585-1-ulf.hansson@linaro.org \
--to=ulf.hansson@linaro.org \
--cc=Lorenzo.Pieralisi@arm.com \
--cc=daniel.lezcano@linaro.org \
--cc=geert+renesas@glider.be \
--cc=ilina@codeaurora.org \
--cc=khilman@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=rjw@rjwysocki.net \
--cc=rplsssn@codeaurora.org \
--cc=sboyd@kernel.org \
--cc=sudeep.holla@arm.com \
--cc=tony@atomide.com \
--cc=vincent.guittot@linaro.org \
--cc=viresh.kumar@linaro.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).