* [PATCH v4 0/2] Allow imx6qp PU domain off in suspend
@ 2019-04-26 21:38 Leonard Crestez
2019-04-26 21:38 ` [PATCH v4 1/2] PM / Domains: Add GENPD_FLAG_NO_RUNTIME_OFF flag Leonard Crestez
2019-04-26 21:38 ` [PATCH v4 2/2] soc: imx: gpc: Use GENPD_FLAG_NO_RUNTIME_OFF for ERR009619 Leonard Crestez
0 siblings, 2 replies; 6+ messages in thread
From: Leonard Crestez @ 2019-04-26 21:38 UTC (permalink / raw)
To: Ulf Hansson, Lucas Stach, Viresh Kumar
Cc: Aisheng Dong, Anson Huang, linux-pm@vger.kernel.org,
Rafael J. Wysocki, Arulpandiyan Vadivel, kernel@pengutronix.de,
Fabio Estevam, Robin Gong, Shawn Guo,
linux-arm-kernel@lists.infradead.org, dl-linux-imx
On imx6qp power gating on the PU domain is disabled because of errata
ERR009619. However power gating during suspend/resume can still be
performed.
Implemented with a new core flag because otherwise distinguishing
between "runtime off" and "suspend off" is very complicated.
Link to v3 for previous attempt: https://lkml.org/lkml/2018/7/6/698
The imx vendor tree has been doing this for a many years but it uses
direct calls from platform suspend to GPC driver.
Link to v1 for similar attempt: https://lkml.org/lkml/2018/7/2/357
Leonard Crestez (2):
PM / Domains: Add GENPD_FLAG_NO_RUNTIME_OFF flag
soc: imx: gpc: Use GENPD_FLAG_NO_RUNTIME_OFF for ERR009619
drivers/base/power/domain.c | 8 ++++++--
drivers/soc/imx/gpc.c | 13 +++++++++++--
include/linux/pm_domain.h | 4 ++++
3 files changed, 21 insertions(+), 4 deletions(-)
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v4 1/2] PM / Domains: Add GENPD_FLAG_NO_RUNTIME_OFF flag
2019-04-26 21:38 [PATCH v4 0/2] Allow imx6qp PU domain off in suspend Leonard Crestez
@ 2019-04-26 21:38 ` Leonard Crestez
2019-04-29 9:11 ` Ulf Hansson
2019-04-26 21:38 ` [PATCH v4 2/2] soc: imx: gpc: Use GENPD_FLAG_NO_RUNTIME_OFF for ERR009619 Leonard Crestez
1 sibling, 1 reply; 6+ messages in thread
From: Leonard Crestez @ 2019-04-26 21:38 UTC (permalink / raw)
To: Ulf Hansson, Lucas Stach, Viresh Kumar
Cc: Aisheng Dong, Anson Huang, linux-pm@vger.kernel.org,
Rafael J. Wysocki, Arulpandiyan Vadivel, kernel@pengutronix.de,
Fabio Estevam, Robin Gong, Shawn Guo,
linux-arm-kernel@lists.infradead.org, dl-linux-imx
This is for power domains which can only be powered off for suspend but
not as part of runtime PM.
Suggested-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com>
---
drivers/base/power/domain.c | 8 ++++++--
include/linux/pm_domain.h | 4 ++++
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 189d7e14c611..f502218a0ddb 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -126,10 +126,11 @@ static const struct genpd_lock_ops genpd_spin_ops = {
#define genpd_status_on(genpd) (genpd->status == GPD_STATE_ACTIVE)
#define genpd_is_irq_safe(genpd) (genpd->flags & GENPD_FLAG_IRQ_SAFE)
#define genpd_is_always_on(genpd) (genpd->flags & GENPD_FLAG_ALWAYS_ON)
#define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP)
#define genpd_is_cpu_domain(genpd) (genpd->flags & GENPD_FLAG_CPU_DOMAIN)
+#define genpd_is_no_runtime_off(genpd) (genpd->flags & GENPD_FLAG_NO_RUNTIME_OFF)
static inline bool irq_safe_dev_in_no_sleep_domain(struct device *dev,
const struct generic_pm_domain *genpd)
{
bool ret;
@@ -513,11 +514,13 @@ static int genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on,
/*
* Abort power off for the PM domain in the following situations:
* (1) The domain is configured as always on.
* (2) When the domain has a subdomain being powered on.
*/
- if (genpd_is_always_on(genpd) || atomic_read(&genpd->sd_count) > 0)
+ if (genpd_is_always_on(genpd) ||
+ genpd_is_no_runtime_off(genpd) ||
+ atomic_read(&genpd->sd_count) > 0)
return -EBUSY;
list_for_each_entry(pdd, &genpd->dev_list, list_node) {
enum pm_qos_flags_status stat;
@@ -1813,11 +1816,12 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
genpd->dev_ops.stop = pm_clk_suspend;
genpd->dev_ops.start = pm_clk_resume;
}
/* Always-on domains must be powered on at initialization. */
- if (genpd_is_always_on(genpd) && !genpd_status_on(genpd))
+ if ((genpd_is_always_on(genpd) || genpd_is_no_runtime_off(genpd)) &&
+ !genpd_status_on(genpd))
return -EINVAL;
if (genpd_is_cpu_domain(genpd) &&
!zalloc_cpumask_var(&genpd->cpus, GFP_KERNEL))
return -ENOMEM;
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index bc82e74560ee..c9f3137e2c00 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -51,16 +51,20 @@
* deploy idle power management support for CPUs
* and groups of CPUs. Note that, the backend
* driver must then comply with the so called,
* last-man-standing algorithm, for the CPUs in the
* PM domain.
+ *
+ * GENPD_FLAG_NO_RUNTIME_OFF: Instructs genpd to always keep the PM domain
+ * powered on except for system suspend.
*/
#define GENPD_FLAG_PM_CLK (1U << 0)
#define GENPD_FLAG_IRQ_SAFE (1U << 1)
#define GENPD_FLAG_ALWAYS_ON (1U << 2)
#define GENPD_FLAG_ACTIVE_WAKEUP (1U << 3)
#define GENPD_FLAG_CPU_DOMAIN (1U << 4)
+#define GENPD_FLAG_NO_RUNTIME_OFF (1U << 5) /* Never powered off by RPM */
enum gpd_status {
GPD_STATE_ACTIVE = 0, /* PM domain is active */
GPD_STATE_POWER_OFF, /* PM domain is off */
};
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v4 2/2] soc: imx: gpc: Use GENPD_FLAG_NO_RUNTIME_OFF for ERR009619
2019-04-26 21:38 [PATCH v4 0/2] Allow imx6qp PU domain off in suspend Leonard Crestez
2019-04-26 21:38 ` [PATCH v4 1/2] PM / Domains: Add GENPD_FLAG_NO_RUNTIME_OFF flag Leonard Crestez
@ 2019-04-26 21:38 ` Leonard Crestez
1 sibling, 0 replies; 6+ messages in thread
From: Leonard Crestez @ 2019-04-26 21:38 UTC (permalink / raw)
To: Ulf Hansson, Lucas Stach, Viresh Kumar
Cc: Aisheng Dong, Anson Huang, linux-pm@vger.kernel.org,
Rafael J. Wysocki, Arulpandiyan Vadivel, kernel@pengutronix.de,
Fabio Estevam, Robin Gong, Shawn Guo,
linux-arm-kernel@lists.infradead.org, dl-linux-imx
This allows PU to be turned off in suspend and save power.
Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com>
---
drivers/soc/imx/gpc.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/soc/imx/gpc.c b/drivers/soc/imx/gpc.c
index a8f1e47ce698..4dd493eccc98 100644
--- a/drivers/soc/imx/gpc.c
+++ b/drivers/soc/imx/gpc.c
@@ -427,14 +427,23 @@ static int imx_gpc_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "failed to init regmap: %d\n",
ret);
return ret;
}
- /* Disable PU power down in normal operation if ERR009619 is present */
+ /*
+ * Disable PU power down by runtime PM if ERR009619 is present.
+ *
+ * The PRE clock will be paused for several cycles when turning on the
+ * PU domain LDO from power down state. If PRE is in use at that time,
+ * the IPU/PRG cannot get the correct display data from the PRE.
+ *
+ * This is not a concern when the whole system enters suspend state, so
+ * it's safe to power down PU in this case.
+ */
if (of_id_data->err009619_present)
imx_gpc_domains[GPC_PGC_DOMAIN_PU].base.flags |=
- GENPD_FLAG_ALWAYS_ON;
+ GENPD_FLAG_NO_RUNTIME_OFF;
/* Keep DISP always on if ERR006287 is present */
if (of_id_data->err006287_present)
imx_gpc_domains[GPC_PGC_DOMAIN_DISPLAY].base.flags |=
GENPD_FLAG_ALWAYS_ON;
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/2] PM / Domains: Add GENPD_FLAG_NO_RUNTIME_OFF flag
2019-04-26 21:38 ` [PATCH v4 1/2] PM / Domains: Add GENPD_FLAG_NO_RUNTIME_OFF flag Leonard Crestez
@ 2019-04-29 9:11 ` Ulf Hansson
2019-04-29 14:39 ` Leonard Crestez
0 siblings, 1 reply; 6+ messages in thread
From: Ulf Hansson @ 2019-04-29 9:11 UTC (permalink / raw)
To: Leonard Crestez
Cc: Aisheng Dong, Anson Huang, linux-pm@vger.kernel.org, Viresh Kumar,
Rafael J. Wysocki, dl-linux-imx, Arulpandiyan Vadivel,
kernel@pengutronix.de, Fabio Estevam, Robin Gong, Shawn Guo,
linux-arm-kernel@lists.infradead.org, Lucas Stach
On Fri, 26 Apr 2019 at 23:38, Leonard Crestez <leonard.crestez@nxp.com> wrote:
>
> This is for power domains which can only be powered off for suspend but
> not as part of runtime PM.
>
> Suggested-by: Ulf Hansson <ulf.hansson@linaro.org>
> Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com>
> ---
> drivers/base/power/domain.c | 8 ++++++--
> include/linux/pm_domain.h | 4 ++++
> 2 files changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
> index 189d7e14c611..f502218a0ddb 100644
> --- a/drivers/base/power/domain.c
> +++ b/drivers/base/power/domain.c
> @@ -126,10 +126,11 @@ static const struct genpd_lock_ops genpd_spin_ops = {
> #define genpd_status_on(genpd) (genpd->status == GPD_STATE_ACTIVE)
> #define genpd_is_irq_safe(genpd) (genpd->flags & GENPD_FLAG_IRQ_SAFE)
> #define genpd_is_always_on(genpd) (genpd->flags & GENPD_FLAG_ALWAYS_ON)
> #define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP)
> #define genpd_is_cpu_domain(genpd) (genpd->flags & GENPD_FLAG_CPU_DOMAIN)
> +#define genpd_is_no_runtime_off(genpd) (genpd->flags & GENPD_FLAG_NO_RUNTIME_OFF)
May I suggest to switch the name to, GENPD_FLAG_RUNTIME_ON.
Other than that, this looks good to me!
Kind regards
Uffe
>
> static inline bool irq_safe_dev_in_no_sleep_domain(struct device *dev,
> const struct generic_pm_domain *genpd)
> {
> bool ret;
> @@ -513,11 +514,13 @@ static int genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on,
> /*
> * Abort power off for the PM domain in the following situations:
> * (1) The domain is configured as always on.
> * (2) When the domain has a subdomain being powered on.
> */
> - if (genpd_is_always_on(genpd) || atomic_read(&genpd->sd_count) > 0)
> + if (genpd_is_always_on(genpd) ||
> + genpd_is_no_runtime_off(genpd) ||
> + atomic_read(&genpd->sd_count) > 0)
> return -EBUSY;
>
> list_for_each_entry(pdd, &genpd->dev_list, list_node) {
> enum pm_qos_flags_status stat;
>
> @@ -1813,11 +1816,12 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
> genpd->dev_ops.stop = pm_clk_suspend;
> genpd->dev_ops.start = pm_clk_resume;
> }
>
> /* Always-on domains must be powered on at initialization. */
> - if (genpd_is_always_on(genpd) && !genpd_status_on(genpd))
> + if ((genpd_is_always_on(genpd) || genpd_is_no_runtime_off(genpd)) &&
> + !genpd_status_on(genpd))
> return -EINVAL;
>
> if (genpd_is_cpu_domain(genpd) &&
> !zalloc_cpumask_var(&genpd->cpus, GFP_KERNEL))
> return -ENOMEM;
> diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
> index bc82e74560ee..c9f3137e2c00 100644
> --- a/include/linux/pm_domain.h
> +++ b/include/linux/pm_domain.h
> @@ -51,16 +51,20 @@
> * deploy idle power management support for CPUs
> * and groups of CPUs. Note that, the backend
> * driver must then comply with the so called,
> * last-man-standing algorithm, for the CPUs in the
> * PM domain.
> + *
> + * GENPD_FLAG_NO_RUNTIME_OFF: Instructs genpd to always keep the PM domain
> + * powered on except for system suspend.
> */
> #define GENPD_FLAG_PM_CLK (1U << 0)
> #define GENPD_FLAG_IRQ_SAFE (1U << 1)
> #define GENPD_FLAG_ALWAYS_ON (1U << 2)
> #define GENPD_FLAG_ACTIVE_WAKEUP (1U << 3)
> #define GENPD_FLAG_CPU_DOMAIN (1U << 4)
> +#define GENPD_FLAG_NO_RUNTIME_OFF (1U << 5) /* Never powered off by RPM */
>
> enum gpd_status {
> GPD_STATE_ACTIVE = 0, /* PM domain is active */
> GPD_STATE_POWER_OFF, /* PM domain is off */
> };
> --
> 2.17.1
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/2] PM / Domains: Add GENPD_FLAG_NO_RUNTIME_OFF flag
2019-04-29 9:11 ` Ulf Hansson
@ 2019-04-29 14:39 ` Leonard Crestez
2019-04-30 11:15 ` Ulf Hansson
0 siblings, 1 reply; 6+ messages in thread
From: Leonard Crestez @ 2019-04-29 14:39 UTC (permalink / raw)
To: Ulf Hansson, Viresh Kumar, Rafael J. Wysocki
Cc: Aisheng Dong, Anson Huang, linux-pm@vger.kernel.org, dl-linux-imx,
Arulpandiyan Vadivel, kernel@pengutronix.de, Fabio Estevam,
Robin Gong, Shawn Guo, linux-arm-kernel@lists.infradead.org,
Lucas Stach
On 4/29/2019 12:11 PM, Ulf Hansson wrote:
> On Fri, 26 Apr 2019 at 23:38, Leonard Crestez <leonard.crestez@nxp.com> wrote:
>>
>> This is for power domains which can only be powered off for suspend but
>> not as part of runtime PM.
>>
>> @@ -126,10 +126,11 @@ static const struct genpd_lock_ops genpd_spin_ops = {
>> #define genpd_status_on(genpd) (genpd->status == GPD_STATE_ACTIVE)
>> #define genpd_is_irq_safe(genpd) (genpd->flags & GENPD_FLAG_IRQ_SAFE)
>> #define genpd_is_always_on(genpd) (genpd->flags & GENPD_FLAG_ALWAYS_ON)
>> #define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP)
>> #define genpd_is_cpu_domain(genpd) (genpd->flags & GENPD_FLAG_CPU_DOMAIN)
>> +#define genpd_is_no_runtime_off(genpd) (genpd->flags & GENPD_FLAG_NO_RUNTIME_OFF) >
> May I suggest to switch the name to, GENPD_FLAG_RUNTIME_ON.
>
> Other than that, this looks good to me!
Then it's easy to confuse genpd_status_on with genpd_is_runtime_on. How
about genpd_is_rpm_always_on?
--
Regards,
Leonard
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/2] PM / Domains: Add GENPD_FLAG_NO_RUNTIME_OFF flag
2019-04-29 14:39 ` Leonard Crestez
@ 2019-04-30 11:15 ` Ulf Hansson
0 siblings, 0 replies; 6+ messages in thread
From: Ulf Hansson @ 2019-04-30 11:15 UTC (permalink / raw)
To: Leonard Crestez
Cc: Aisheng Dong, Anson Huang, linux-pm@vger.kernel.org, Viresh Kumar,
Rafael J. Wysocki, dl-linux-imx, Arulpandiyan Vadivel,
kernel@pengutronix.de, Fabio Estevam, Robin Gong, Shawn Guo,
linux-arm-kernel@lists.infradead.org, Lucas Stach
On Mon, 29 Apr 2019 at 16:39, Leonard Crestez <leonard.crestez@nxp.com> wrote:
>
> On 4/29/2019 12:11 PM, Ulf Hansson wrote:
> > On Fri, 26 Apr 2019 at 23:38, Leonard Crestez <leonard.crestez@nxp.com> wrote:
> >>
> >> This is for power domains which can only be powered off for suspend but
> >> not as part of runtime PM.
> >>
> >> @@ -126,10 +126,11 @@ static const struct genpd_lock_ops genpd_spin_ops = {
> >> #define genpd_status_on(genpd) (genpd->status == GPD_STATE_ACTIVE)
> >> #define genpd_is_irq_safe(genpd) (genpd->flags & GENPD_FLAG_IRQ_SAFE)
> >> #define genpd_is_always_on(genpd) (genpd->flags & GENPD_FLAG_ALWAYS_ON)
> >> #define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP)
> >> #define genpd_is_cpu_domain(genpd) (genpd->flags & GENPD_FLAG_CPU_DOMAIN)
> >> +#define genpd_is_no_runtime_off(genpd) (genpd->flags & GENPD_FLAG_NO_RUNTIME_OFF) >
> > May I suggest to switch the name to, GENPD_FLAG_RUNTIME_ON.
> >
> > Other than that, this looks good to me!
>
> Then it's easy to confuse genpd_status_on with genpd_is_runtime_on. How
> about genpd_is_rpm_always_on?
Even better, let's take that.
Kind regards
Uffe
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-04-30 11:15 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-04-26 21:38 [PATCH v4 0/2] Allow imx6qp PU domain off in suspend Leonard Crestez
2019-04-26 21:38 ` [PATCH v4 1/2] PM / Domains: Add GENPD_FLAG_NO_RUNTIME_OFF flag Leonard Crestez
2019-04-29 9:11 ` Ulf Hansson
2019-04-29 14:39 ` Leonard Crestez
2019-04-30 11:15 ` Ulf Hansson
2019-04-26 21:38 ` [PATCH v4 2/2] soc: imx: gpc: Use GENPD_FLAG_NO_RUNTIME_OFF for ERR009619 Leonard Crestez
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).