cpuidle: psci: Enable suspend-to-idle for PSCI OSI mode
authorUlf Hansson <ulf.hansson@linaro.org>
Tue, 3 Nov 2020 15:06:27 +0000 (16:06 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 10 Nov 2020 19:42:01 +0000 (20:42 +0100)
commit670c90def03429a228229420fa48a17913fdcc0d
treeb1b43ae851e4f8a042e31a9ee13d53f557942246
parentb9795a3e4e1cbf521bbb5ef240eb47803c303b02
cpuidle: psci: Enable suspend-to-idle for PSCI OSI mode

To select domain idlestates for cpuidle-psci when OSI mode has been
enabled, the PM domains via genpd are being managed through runtime PM.
This works fine for the regular idlepath, but it doesn't during system wide
suspend. More precisely, the domain idlestates becomes temporarily
disabled, which is because the PM core disables runtime PM for devices
during system wide suspend.

Later in the system suspend phase, genpd intends to deal with this from its
->suspend_noirq() callback, but this doesn't work as expected for a device
corresponding to a CPU, because the domain idlestates needs to be selected
on a per CPU basis (the PM core doesn't invoke the callbacks like that).

To address this problem, let's enable the syscore flag for the
corresponding CPU device that becomes successfully attached to its PM
domain (applicable only in OSI mode). This informs the PM core to skip
invoke the system wide suspend/resume callbacks for the device, thus also
prevents genpd from screwing up its internal state of it.

Moreover, to properly select a domain idlestate for the CPUs during
suspend-to-idle, let's assign a specific ->enter_s2idle() callback for the
corresponding domain idlestate (applicable only in OSI mode). From that
callback, let's invoke dev_pm_genpd_suspend|resume(), as this allows a
domain idlestate to be selected for the current CPU by genpd.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpuidle/cpuidle-psci-domain.c
drivers/cpuidle/cpuidle-psci.c