All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] ram: stm32mp1: Conditionally enable ASR
@ 2022-04-26 14:37 Marek Vasut
  2022-04-29  9:21 ` Patrick DELAUNAY
  2022-05-10  7:48 ` Patrice CHOTARD
  0 siblings, 2 replies; 3+ messages in thread
From: Marek Vasut @ 2022-04-26 14:37 UTC (permalink / raw)
  To: u-boot; +Cc: Marek Vasut, Patrick Delaunay, Patrice Chotard

Enable DRAM ASR, auto self-refresh, conditionally, based on DT PWRCTL
register bits. While ASR does save considerable amount of power at
runtime automatically, it also causes LTDC underruns on large panels.
Let user select whether or not ASR is required or not, generally ASR
should be enabled on portable and battery operated devices.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Patrick Delaunay <patrick.delaunay@foss.st.com>
Cc: Patrice Chotard <patrice.chotard@foss.st.com>
---
V2: Infer ASR settings from DT PWRCTL
---
 drivers/ram/stm32mp1/stm32mp1_ddr.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/ram/stm32mp1/stm32mp1_ddr.c b/drivers/ram/stm32mp1/stm32mp1_ddr.c
index 528a171b454..ab913a68761 100644
--- a/drivers/ram/stm32mp1/stm32mp1_ddr.c
+++ b/drivers/ram/stm32mp1/stm32mp1_ddr.c
@@ -653,10 +653,14 @@ static void stm32mp1_refresh_restore(struct stm32mp1_ddrctl *ctl,
 	wait_sw_done_ack(ctl);
 }
 
-static void stm32mp1_asr_enable(struct ddr_info *priv)
+static void stm32mp1_asr_enable(struct ddr_info *priv, const u32 pwrctl)
 {
 	struct stm32mp1_ddrctl *ctl = priv->ctl;
 
+	/* SSR is the best we can do. */
+	if (!(pwrctl & DDRCTRL_PWRCTL_EN_DFI_DRAM_CLK_DISABLE))
+		return;
+
 	clrsetbits_le32(priv->rcc + RCC_DDRITFCR, RCC_DDRITFCR_DDRCKMOD_MASK,
 			RCC_DDRITFCR_DDRCKMOD_ASR);
 
@@ -666,8 +670,12 @@ static void stm32mp1_asr_enable(struct ddr_info *priv)
 	writel(DDRCTRL_PWRTMG_POWERDOWN_TO_X32(0x10) |
 	       DDRCTRL_PWRTMG_SELFREF_TO_X32(0x01),
 	       &ctl->pwrtmg);
+
+	/* HSR we can do. */
 	setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_EN_DFI_DRAM_CLK_DISABLE);
-	setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_SELFREF_EN);
+
+	if (pwrctl & DDRCTRL_PWRCTL_SELFREF_EN)	/* ASR we can do. */
+		setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_SELFREF_EN);
 
 	setbits_le32(&ctl->dfimisc, DDRCTRL_DFIMISC_DFI_INIT_COMPLETE_EN);
 	wait_sw_done_ack(ctl);
@@ -845,7 +853,7 @@ start:
 				 config->c_reg.pwrctl);
 
 /* Enable auto-self-refresh, which saves a bit of power at runtime. */
-	stm32mp1_asr_enable(priv);
+	stm32mp1_asr_enable(priv, config->c_reg.pwrctl);
 
 	/* enable uMCTL2 AXI port 0 and 1 */
 	setbits_le32(&priv->ctl->pctrl_0, DDRCTRL_PCTRL_N_PORT_EN);
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] ram: stm32mp1: Conditionally enable ASR
  2022-04-26 14:37 [PATCH v2] ram: stm32mp1: Conditionally enable ASR Marek Vasut
@ 2022-04-29  9:21 ` Patrick DELAUNAY
  2022-05-10  7:48 ` Patrice CHOTARD
  1 sibling, 0 replies; 3+ messages in thread
From: Patrick DELAUNAY @ 2022-04-29  9:21 UTC (permalink / raw)
  To: Marek Vasut, u-boot; +Cc: Patrice Chotard, nicolas.le.bayon

Hi,

Adding also Nicolas,

On 4/26/22 16:37, Marek Vasut wrote:
> Enable DRAM ASR, auto self-refresh, conditionally, based on DT PWRCTL
> register bits. While ASR does save considerable amount of power at
> runtime automatically, it also causes LTDC underruns on large panels.
> Let user select whether or not ASR is required or not, generally ASR
> should be enabled on portable and battery operated devices.
>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Patrick Delaunay <patrick.delaunay@foss.st.com>
> Cc: Patrice Chotard <patrice.chotard@foss.st.com>
> ---
> V2: Infer ASR settings from DT PWRCTL
> ---
>   drivers/ram/stm32mp1/stm32mp1_ddr.c | 14 +++++++++++---
>   1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/ram/stm32mp1/stm32mp1_ddr.c b/drivers/ram/stm32mp1/stm32mp1_ddr.c
> index 528a171b454..ab913a68761 100644
> --- a/drivers/ram/stm32mp1/stm32mp1_ddr.c
> +++ b/drivers/ram/stm32mp1/stm32mp1_ddr.c
> @@ -653,10 +653,14 @@ static void stm32mp1_refresh_restore(struct stm32mp1_ddrctl *ctl,
>   	wait_sw_done_ack(ctl);
>   }
>   
> -static void stm32mp1_asr_enable(struct ddr_info *priv)
> +static void stm32mp1_asr_enable(struct ddr_info *priv, const u32 pwrctl)
>   {
>   	struct stm32mp1_ddrctl *ctl = priv->ctl;
>   
> +	/* SSR is the best we can do. */
> +	if (!(pwrctl & DDRCTRL_PWRCTL_EN_DFI_DRAM_CLK_DISABLE))
> +		return;
> +
>   	clrsetbits_le32(priv->rcc + RCC_DDRITFCR, RCC_DDRITFCR_DDRCKMOD_MASK,
>   			RCC_DDRITFCR_DDRCKMOD_ASR);
>   
> @@ -666,8 +670,12 @@ static void stm32mp1_asr_enable(struct ddr_info *priv)
>   	writel(DDRCTRL_PWRTMG_POWERDOWN_TO_X32(0x10) |
>   	       DDRCTRL_PWRTMG_SELFREF_TO_X32(0x01),
>   	       &ctl->pwrtmg);
> +
> +	/* HSR we can do. */
>   	setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_EN_DFI_DRAM_CLK_DISABLE);
> -	setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_SELFREF_EN);
> +
> +	if (pwrctl & DDRCTRL_PWRCTL_SELFREF_EN)	/* ASR we can do. */
> +		setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_SELFREF_EN);
>   
>   	setbits_le32(&ctl->dfimisc, DDRCTRL_DFIMISC_DFI_INIT_COMPLETE_EN);
>   	wait_sw_done_ack(ctl);
> @@ -845,7 +853,7 @@ start:
>   				 config->c_reg.pwrctl);
>   
>   /* Enable auto-self-refresh, which saves a bit of power at runtime. */
> -	stm32mp1_asr_enable(priv);
> +	stm32mp1_asr_enable(priv, config->c_reg.pwrctl);
>   
>   	/* enable uMCTL2 AXI port 0 and 1 */
>   	setbits_le32(&priv->ctl->pctrl_0, DDRCTRL_PCTRL_N_PORT_EN);


Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com>

Thanks
Patrick


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] ram: stm32mp1: Conditionally enable ASR
  2022-04-26 14:37 [PATCH v2] ram: stm32mp1: Conditionally enable ASR Marek Vasut
  2022-04-29  9:21 ` Patrick DELAUNAY
@ 2022-05-10  7:48 ` Patrice CHOTARD
  1 sibling, 0 replies; 3+ messages in thread
From: Patrice CHOTARD @ 2022-05-10  7:48 UTC (permalink / raw)
  To: Marek Vasut, u-boot; +Cc: Patrick Delaunay



On 4/26/22 16:37, Marek Vasut wrote:
> Enable DRAM ASR, auto self-refresh, conditionally, based on DT PWRCTL
> register bits. While ASR does save considerable amount of power at
> runtime automatically, it also causes LTDC underruns on large panels.
> Let user select whether or not ASR is required or not, generally ASR
> should be enabled on portable and battery operated devices.
> 
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Patrick Delaunay <patrick.delaunay@foss.st.com>
> Cc: Patrice Chotard <patrice.chotard@foss.st.com>
> ---
> V2: Infer ASR settings from DT PWRCTL
> ---
>  drivers/ram/stm32mp1/stm32mp1_ddr.c | 14 +++++++++++---
>  1 file changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/ram/stm32mp1/stm32mp1_ddr.c b/drivers/ram/stm32mp1/stm32mp1_ddr.c
> index 528a171b454..ab913a68761 100644
> --- a/drivers/ram/stm32mp1/stm32mp1_ddr.c
> +++ b/drivers/ram/stm32mp1/stm32mp1_ddr.c
> @@ -653,10 +653,14 @@ static void stm32mp1_refresh_restore(struct stm32mp1_ddrctl *ctl,
>  	wait_sw_done_ack(ctl);
>  }
>  
> -static void stm32mp1_asr_enable(struct ddr_info *priv)
> +static void stm32mp1_asr_enable(struct ddr_info *priv, const u32 pwrctl)
>  {
>  	struct stm32mp1_ddrctl *ctl = priv->ctl;
>  
> +	/* SSR is the best we can do. */
> +	if (!(pwrctl & DDRCTRL_PWRCTL_EN_DFI_DRAM_CLK_DISABLE))
> +		return;
> +
>  	clrsetbits_le32(priv->rcc + RCC_DDRITFCR, RCC_DDRITFCR_DDRCKMOD_MASK,
>  			RCC_DDRITFCR_DDRCKMOD_ASR);
>  
> @@ -666,8 +670,12 @@ static void stm32mp1_asr_enable(struct ddr_info *priv)
>  	writel(DDRCTRL_PWRTMG_POWERDOWN_TO_X32(0x10) |
>  	       DDRCTRL_PWRTMG_SELFREF_TO_X32(0x01),
>  	       &ctl->pwrtmg);
> +
> +	/* HSR we can do. */
>  	setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_EN_DFI_DRAM_CLK_DISABLE);
> -	setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_SELFREF_EN);
> +
> +	if (pwrctl & DDRCTRL_PWRCTL_SELFREF_EN)	/* ASR we can do. */
> +		setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_SELFREF_EN);
>  
>  	setbits_le32(&ctl->dfimisc, DDRCTRL_DFIMISC_DFI_INIT_COMPLETE_EN);
>  	wait_sw_done_ack(ctl);
> @@ -845,7 +853,7 @@ start:
>  				 config->c_reg.pwrctl);
>  
>  /* Enable auto-self-refresh, which saves a bit of power at runtime. */
> -	stm32mp1_asr_enable(priv);
> +	stm32mp1_asr_enable(priv, config->c_reg.pwrctl);
>  
>  	/* enable uMCTL2 AXI port 0 and 1 */
>  	setbits_le32(&priv->ctl->pctrl_0, DDRCTRL_PCTRL_N_PORT_EN);
Applied to u-boot-stm32

Thanks
Patrice

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-05-10  7:48 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-26 14:37 [PATCH v2] ram: stm32mp1: Conditionally enable ASR Marek Vasut
2022-04-29  9:21 ` Patrick DELAUNAY
2022-05-10  7:48 ` Patrice CHOTARD

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.