Re: [PATCH v3 5/7] drivers: firmware: psci: Add hierarchical domain idle states converter

From: Maulik Shah
Date: Wed Feb 05 2020 - 07:23:13 EST



On 2/4/2020 8:51 PM, Sudeep Holla wrote:
On Tue, Feb 04, 2020 at 10:22:42AM +0530, Maulik Shah wrote:
On 2/3/2020 10:38 PM, Sudeep Holla wrote:
On Mon, Feb 03, 2020 at 07:05:38PM +0530, Maulik Shah wrote:
From: Ulf Hansson <ulf.hansson@xxxxxxxxxx>

If the hierarchical CPU topology is used, but the OS initiated mode isn't
supported, we need to rely solely on the regular cpuidle framework to
manage the idle state selection, rather than using genpd and its
governor.

For this reason, introduce a new PSCI DT helper function,
psci_dt_pm_domains_parse_states(), which parses and converts the
hierarchically described domain idle states from DT, into regular flattened
cpuidle states. The converted states are added to the existing cpuidle
driver's array of idle states, which make them available for cpuidle.

And what's the main motivation for this if OSI is not supported in the
firmware ?
Hi Sudeep,

Main motivation is to do last-man activities before the CPU cluster can
enter a deep idle state.

Details on those last-man activities will help the discussion. Basically
I am wondering what they are and why they need to done in OSPM ?

Hi Sudeep,

there are cases like,

Last cpu going to deepest idle mode need to lower various resoruce requirements (for eg DDR freq).

This is done by calling rpmh_flush which send SLEEP values for various shared resources.

Signed-off-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx>
[applied to new path, resolved conflicts]
Signed-off-by: Maulik Shah <mkshah@xxxxxxxxxxxxxx>
---
drivers/cpuidle/cpuidle-psci-domain.c | 137 +++++++++++++++++++++++++++++-----
drivers/cpuidle/cpuidle-psci.c | 41 +++++-----
drivers/cpuidle/cpuidle-psci.h | 11 +++
3 files changed, 153 insertions(+), 36 deletions(-)

diff --git a/drivers/cpuidle/cpuidle-psci-domain.c b/drivers/cpuidle/cpuidle-psci-domain.c
index 423f03b..3c417f7 100644
--- a/drivers/cpuidle/cpuidle-psci-domain.c
+++ b/drivers/cpuidle/cpuidle-psci-domain.c
@@ -26,13 +26,17 @@ struct psci_pd_provider {
};

static LIST_HEAD(psci_pd_providers);
-static bool osi_mode_enabled __initdata;
+static bool osi_mode_enabled;

static int psci_pd_power_off(struct generic_pm_domain *pd)
{
struct genpd_power_state *state = &pd->states[pd->state_idx];
u32 *pd_state;

+ /* If we have failed to enable OSI mode, then abort power off. */
+ if ((psci_has_osi_support()) && !osi_mode_enabled)
+ return -EBUSY;
+
Why is this needed ? IIUC we don't create genpd domains if OSI is not
enabled.
we do create genpd domains, for cpu domains, we just abort power off here
since idle states are converted into regular flattened mode.

OK, IIRC the OSI patches from Ulf didn't add the genpd or rather removed
them in case of any failure to enable OSI. Has that been changed ? If so,
why ?

however genpd poweroff will be used by parent domain (rsc in this case)
which is kept in hireachy in DTSI with cluster domain to do last man
activities.

I am bit confused here. Either we do OSI or PC and what you are describing
sounds like a mix-n-match to me and I am totally against it.

we still do PC based on sc7180. there is no OSI.

can you please check v4 series, i have cleaned this change by remove converter part.

Thanks,

Maulik


--
Regards,
Sudeep

--
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation