All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] video: ipuv3_fb: skip IPU shutdown if IPU was not enabled before
@ 2017-08-25 13:10 Anatolij Gustschin
  2017-08-28 16:22 ` Fabio Estevam
  2017-08-28 16:54 ` Stefano Babic
  0 siblings, 2 replies; 5+ messages in thread
From: Anatolij Gustschin @ 2017-08-25 13:10 UTC (permalink / raw)
  To: u-boot

Boards can skip display interface init using board_video_skip().
If display interface was not initialized (e.g. no ipuv3 framebuffer
registered or IPU clock disabled), booting Linux stops due to the
crash in IPU shutdown function, when accessing IPU registers.
Check IPU clock and skip shutdown if clock is not enabled.

Signed-off-by: Anatolij Gustschin <agust@denx.de>
---
 drivers/video/mxc_ipuv3_fb.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/video/mxc_ipuv3_fb.c b/drivers/video/mxc_ipuv3_fb.c
index 0d0a0a9..8836229 100644
--- a/drivers/video/mxc_ipuv3_fb.c
+++ b/drivers/video/mxc_ipuv3_fb.c
@@ -13,6 +13,7 @@
 
 #include <common.h>
 #include <linux/errno.h>
+#include <asm/arch/crm_regs.h>
 #include <asm/global_data.h>
 #include <linux/string.h>
 #include <linux/list.h>
@@ -568,8 +569,18 @@ err0:
 
 void ipuv3_fb_shutdown(void)
 {
-	int i;
+	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
 	struct ipu_stat *stat = (struct ipu_stat *)IPU_STAT;
+	u32 reg;
+	int i;
+
+	/*
+	 * Check if IPU clock was enabled before. Won't access
+	 * IPU registers if clock is not enabled.
+	 */
+	reg = readl(&mxc_ccm->CCGR3);
+	if ((reg & MXC_CCM_CCGR3_IPU1_IPU_MASK) == 0)
+		return;
 
 	for (i = 0; i < ARRAY_SIZE(mxcfb_info); i++) {
 		struct fb_info *fbi = mxcfb_info[i];
-- 
2.7.4

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

* [U-Boot] [PATCH] video: ipuv3_fb: skip IPU shutdown if IPU was not enabled before
  2017-08-25 13:10 [U-Boot] [PATCH] video: ipuv3_fb: skip IPU shutdown if IPU was not enabled before Anatolij Gustschin
@ 2017-08-28 16:22 ` Fabio Estevam
  2017-08-28 18:08   ` Anatolij Gustschin
  2017-08-28 16:54 ` Stefano Babic
  1 sibling, 1 reply; 5+ messages in thread
From: Fabio Estevam @ 2017-08-28 16:22 UTC (permalink / raw)
  To: u-boot

Hi Anatolij,

On Fri, Aug 25, 2017 at 10:10 AM, Anatolij Gustschin <agust@denx.de> wrote:

>  void ipuv3_fb_shutdown(void)
>  {
> -       int i;
> +       struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
>         struct ipu_stat *stat = (struct ipu_stat *)IPU_STAT;
> +       u32 reg;
> +       int i;
> +
> +       /*
> +        * Check if IPU clock was enabled before. Won't access
> +        * IPU registers if clock is not enabled.
> +        */
> +       reg = readl(&mxc_ccm->CCGR3);
> +       if ((reg & MXC_CCM_CCGR3_IPU1_IPU_MASK) == 0)
> +               return;

Maybe you could also check whether IPU2 has been enabled?

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

* [U-Boot] [PATCH] video: ipuv3_fb: skip IPU shutdown if IPU was not enabled before
  2017-08-25 13:10 [U-Boot] [PATCH] video: ipuv3_fb: skip IPU shutdown if IPU was not enabled before Anatolij Gustschin
  2017-08-28 16:22 ` Fabio Estevam
@ 2017-08-28 16:54 ` Stefano Babic
  2017-08-28 18:23   ` Anatolij Gustschin
  1 sibling, 1 reply; 5+ messages in thread
From: Stefano Babic @ 2017-08-28 16:54 UTC (permalink / raw)
  To: u-boot

Hi Anatolji,

On 25/08/2017 15:10, Anatolij Gustschin wrote:
> Boards can skip display interface init using board_video_skip().
> If display interface was not initialized (e.g. no ipuv3 framebuffer
> registered or IPU clock disabled), booting Linux stops due to the
> crash in IPU shutdown function, when accessing IPU registers.
> Check IPU clock and skip shutdown if clock is not enabled.
> 
> Signed-off-by: Anatolij Gustschin <agust@denx.de>
> ---
>  drivers/video/mxc_ipuv3_fb.c | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/video/mxc_ipuv3_fb.c b/drivers/video/mxc_ipuv3_fb.c
> index 0d0a0a9..8836229 100644
> --- a/drivers/video/mxc_ipuv3_fb.c
> +++ b/drivers/video/mxc_ipuv3_fb.c
> @@ -13,6 +13,7 @@
>  
>  #include <common.h>
>  #include <linux/errno.h>
> +#include <asm/arch/crm_regs.h>
>  #include <asm/global_data.h>
>  #include <linux/string.h>
>  #include <linux/list.h>
> @@ -568,8 +569,18 @@ err0:
>  
>  void ipuv3_fb_shutdown(void)
>  {
> -	int i;
> +	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
>  	struct ipu_stat *stat = (struct ipu_stat *)IPU_STAT;
> +	u32 reg;
> +	int i;
> +
> +	/*
> +	 * Check if IPU clock was enabled before. Won't access
> +	 * IPU registers if clock is not enabled.
> +	 */
> +	reg = readl(&mxc_ccm->CCGR3);
> +	if ((reg & MXC_CCM_CCGR3_IPU1_IPU_MASK) == 0)
> +		return;
>  

It looks to me quite weak to simply check if clock is gated. On some
board clock is gated even if IPU is not active. Do you have a way
reading inside IPU itself ? Then we can better decide if it was really
acrive. For example, checking if ipu_enable_channel() was called (and
DMA registers are set).

Best regards,
Stefano


-- 
=====================================================================
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

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

* [U-Boot] [PATCH] video: ipuv3_fb: skip IPU shutdown if IPU was not enabled before
  2017-08-28 16:22 ` Fabio Estevam
@ 2017-08-28 18:08   ` Anatolij Gustschin
  0 siblings, 0 replies; 5+ messages in thread
From: Anatolij Gustschin @ 2017-08-28 18:08 UTC (permalink / raw)
  To: u-boot

Hi Fabio,

On Mon, 28 Aug 2017 13:22:19 -0300
Fabio Estevam festevam at gmail.com wrote:
...
> > +       /*
> > +        * Check if IPU clock was enabled before. Won't access
> > +        * IPU registers if clock is not enabled.
> > +        */
> > +       reg = readl(&mxc_ccm->CCGR3);
> > +       if ((reg & MXC_CCM_CCGR3_IPU1_IPU_MASK) == 0)
> > +               return;  
> 
> Maybe you could also check whether IPU2 has been enabled?

currently IPU2 is not used, the driver never enables it. I checked
it when preparing this patch.

Thanks,
Anatolij

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

* [U-Boot] [PATCH] video: ipuv3_fb: skip IPU shutdown if IPU was not enabled before
  2017-08-28 16:54 ` Stefano Babic
@ 2017-08-28 18:23   ` Anatolij Gustschin
  0 siblings, 0 replies; 5+ messages in thread
From: Anatolij Gustschin @ 2017-08-28 18:23 UTC (permalink / raw)
  To: u-boot

Hi Stefano,

On Mon, 28 Aug 2017 18:54:39 +0200
Stefano Babic sbabic at denx.de wrote:
...
> > +	/*
> > +	 * Check if IPU clock was enabled before. Won't access
> > +	 * IPU registers if clock is not enabled.
> > +	 */
> > +	reg = readl(&mxc_ccm->CCGR3);
> > +	if ((reg & MXC_CCM_CCGR3_IPU1_IPU_MASK) == 0)
> > +		return;
> >    
> 
> It looks to me quite weak to simply check if clock is gated. On some
> board clock is gated even if IPU is not active. Do you have a way
> reading inside IPU itself ? Then we can better decide if it was really
> acrive. For example, checking if ipu_enable_channel() was called (and
> DMA registers are set).

we cannot access IPU registers when IPU clock is disabled (register
access will hang the CPU).

Thanks,
Anatolij

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

end of thread, other threads:[~2017-08-28 18:23 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-25 13:10 [U-Boot] [PATCH] video: ipuv3_fb: skip IPU shutdown if IPU was not enabled before Anatolij Gustschin
2017-08-28 16:22 ` Fabio Estevam
2017-08-28 18:08   ` Anatolij Gustschin
2017-08-28 16:54 ` Stefano Babic
2017-08-28 18:23   ` Anatolij Gustschin

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.