* [PATCH] drm/msm/dsi: Implement reset correctly @ 2019-10-09 21:34 Jeffrey Hugo 2019-10-10 18:45 ` Sean Paul 0 siblings, 1 reply; 4+ messages in thread From: Jeffrey Hugo @ 2019-10-09 21:34 UTC (permalink / raw) To: robdclark, sean, airlied, daniel Cc: linux-arm-msm, dri-devel, freedreno, linux-kernel, Jeffrey Hugo On msm8998, vblank timeouts are observed because the DSI controller is not reset properly, which ends up stalling the MDP. This is because the reset logic is not correct per the hardware documentation. The documentation states that after asserting reset, software should wait some time (no indication of how long), or poll the status register until it returns 0 before deasserting reset. wmb() is insufficient for this purpose since it just ensures ordering, not timing between writes. Since asserting and deasserting reset occurs on the same register, ordering is already guaranteed by the architecture, making the wmb extraneous. Since we would define a timeout for polling the status register to avoid a possible infinite loop, lets just use a static delay of 20 ms, since 16.666 ms is the time available to process one frame at 60 fps. Fixes: a689554ba6ed (drm/msm: Initial add DSI connector support) Signed-off-by: Jeffrey Hugo <jeffrey.l.hugo@gmail.com> --- Rob et al, is it possible for this to go into a 5.4-rc? drivers/gpu/drm/msm/dsi/dsi_host.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c index 663ff9f4fac9..68ded9b4735d 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_host.c +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c @@ -986,7 +986,7 @@ static void dsi_sw_reset(struct msm_dsi_host *msm_host) wmb(); /* clocks need to be enabled before reset */ dsi_write(msm_host, REG_DSI_RESET, 1); - wmb(); /* make sure reset happen */ + msleep(20); /* make sure reset happen */ dsi_write(msm_host, REG_DSI_RESET, 0); } @@ -1396,7 +1396,7 @@ static void dsi_sw_reset_restore(struct msm_dsi_host *msm_host) /* dsi controller can only be reset while clocks are running */ dsi_write(msm_host, REG_DSI_RESET, 1); - wmb(); /* make sure reset happen */ + msleep(20); /* make sure reset happen */ dsi_write(msm_host, REG_DSI_RESET, 0); wmb(); /* controller out of reset */ dsi_write(msm_host, REG_DSI_CTRL, data0); -- 2.17.1 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] drm/msm/dsi: Implement reset correctly 2019-10-09 21:34 [PATCH] drm/msm/dsi: Implement reset correctly Jeffrey Hugo @ 2019-10-10 18:45 ` Sean Paul 2019-10-10 18:48 ` Sean Paul 0 siblings, 1 reply; 4+ messages in thread From: Sean Paul @ 2019-10-10 18:45 UTC (permalink / raw) To: Jeffrey Hugo Cc: robdclark, sean, airlied, daniel, linux-arm-msm, dri-devel, freedreno, linux-kernel On Wed, Oct 09, 2019 at 02:34:54PM -0700, Jeffrey Hugo wrote: > On msm8998, vblank timeouts are observed because the DSI controller is not > reset properly, which ends up stalling the MDP. This is because the reset > logic is not correct per the hardware documentation. > > The documentation states that after asserting reset, software should wait > some time (no indication of how long), or poll the status register until it > returns 0 before deasserting reset. > > wmb() is insufficient for this purpose since it just ensures ordering, not > timing between writes. Since asserting and deasserting reset occurs on the > same register, ordering is already guaranteed by the architecture, making > the wmb extraneous. > > Since we would define a timeout for polling the status register to avoid a > possible infinite loop, lets just use a static delay of 20 ms, since 16.666 > ms is the time available to process one frame at 60 fps. > > Fixes: a689554ba6ed (drm/msm: Initial add DSI connector support) > Signed-off-by: Jeffrey Hugo <jeffrey.l.hugo@gmail.com> > --- > > Rob et al, is it possible for this to go into a 5.4-rc? > > drivers/gpu/drm/msm/dsi/dsi_host.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c > index 663ff9f4fac9..68ded9b4735d 100644 > --- a/drivers/gpu/drm/msm/dsi/dsi_host.c > +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c > @@ -986,7 +986,7 @@ static void dsi_sw_reset(struct msm_dsi_host *msm_host) > wmb(); /* clocks need to be enabled before reset */ > > dsi_write(msm_host, REG_DSI_RESET, 1); > - wmb(); /* make sure reset happen */ > + msleep(20); /* make sure reset happen */ Could you please pull this out into a #define used for both in case we decide to tweak it? I don't want these 2 values to drift. Thanks, Sean > dsi_write(msm_host, REG_DSI_RESET, 0); > } > > @@ -1396,7 +1396,7 @@ static void dsi_sw_reset_restore(struct msm_dsi_host *msm_host) > > /* dsi controller can only be reset while clocks are running */ > dsi_write(msm_host, REG_DSI_RESET, 1); > - wmb(); /* make sure reset happen */ > + msleep(20); /* make sure reset happen */ > dsi_write(msm_host, REG_DSI_RESET, 0); > wmb(); /* controller out of reset */ > dsi_write(msm_host, REG_DSI_CTRL, data0); > -- > 2.17.1 > -- Sean Paul, Software Engineer, Google / Chromium OS ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] drm/msm/dsi: Implement reset correctly 2019-10-10 18:45 ` Sean Paul @ 2019-10-10 18:48 ` Sean Paul 2019-10-10 18:59 ` Jeffrey Hugo 0 siblings, 1 reply; 4+ messages in thread From: Sean Paul @ 2019-10-10 18:48 UTC (permalink / raw) To: Jeffrey Hugo Cc: Rob Clark, Dave Airlie, Daniel Vetter, linux-arm-msm, dri-devel, freedreno, LKML On Thu, Oct 10, 2019 at 2:45 PM Sean Paul <sean@poorly.run> wrote: > > On Wed, Oct 09, 2019 at 02:34:54PM -0700, Jeffrey Hugo wrote: > > On msm8998, vblank timeouts are observed because the DSI controller is not > > reset properly, which ends up stalling the MDP. This is because the reset > > logic is not correct per the hardware documentation. > > > > The documentation states that after asserting reset, software should wait > > some time (no indication of how long), or poll the status register until it > > returns 0 before deasserting reset. > > > > wmb() is insufficient for this purpose since it just ensures ordering, not > > timing between writes. Since asserting and deasserting reset occurs on the > > same register, ordering is already guaranteed by the architecture, making > > the wmb extraneous. > > > > Since we would define a timeout for polling the status register to avoid a > > possible infinite loop, lets just use a static delay of 20 ms, since 16.666 > > ms is the time available to process one frame at 60 fps. > > > > Fixes: a689554ba6ed (drm/msm: Initial add DSI connector support) > > Signed-off-by: Jeffrey Hugo <jeffrey.l.hugo@gmail.com> > > --- > > > > Rob et al, is it possible for this to go into a 5.4-rc? Sorry, I missed this on the first go-around, I'm Ok with this getting into 5.4. Rob, if you're Ok with this, I can send it through -misc unless you're planning an msm-fixes PR. > > > > drivers/gpu/drm/msm/dsi/dsi_host.c | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c > > index 663ff9f4fac9..68ded9b4735d 100644 > > --- a/drivers/gpu/drm/msm/dsi/dsi_host.c > > +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c > > @@ -986,7 +986,7 @@ static void dsi_sw_reset(struct msm_dsi_host *msm_host) > > wmb(); /* clocks need to be enabled before reset */ > > > > dsi_write(msm_host, REG_DSI_RESET, 1); > > - wmb(); /* make sure reset happen */ > > + msleep(20); /* make sure reset happen */ > > Could you please pull this out into a #define used for both in case we decide to > tweak it? I don't want these 2 values to drift. > oh yeah, and with that fixed, Reviewed-by: Sean Paul <sean@poorly.run> > Thanks, > Sean > > > dsi_write(msm_host, REG_DSI_RESET, 0); > > } > > > > @@ -1396,7 +1396,7 @@ static void dsi_sw_reset_restore(struct msm_dsi_host *msm_host) > > > > /* dsi controller can only be reset while clocks are running */ > > dsi_write(msm_host, REG_DSI_RESET, 1); > > - wmb(); /* make sure reset happen */ > > + msleep(20); /* make sure reset happen */ > > dsi_write(msm_host, REG_DSI_RESET, 0); > > wmb(); /* controller out of reset */ > > dsi_write(msm_host, REG_DSI_CTRL, data0); > > -- > > 2.17.1 > > > > -- > Sean Paul, Software Engineer, Google / Chromium OS ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] drm/msm/dsi: Implement reset correctly 2019-10-10 18:48 ` Sean Paul @ 2019-10-10 18:59 ` Jeffrey Hugo 0 siblings, 0 replies; 4+ messages in thread From: Jeffrey Hugo @ 2019-10-10 18:59 UTC (permalink / raw) To: Sean Paul Cc: Rob Clark, Dave Airlie, Daniel Vetter, linux-arm-msm, dri-devel, freedreno, LKML On Thu, Oct 10, 2019 at 12:49 PM Sean Paul <sean@poorly.run> wrote: > > On Thu, Oct 10, 2019 at 2:45 PM Sean Paul <sean@poorly.run> wrote: > > > > On Wed, Oct 09, 2019 at 02:34:54PM -0700, Jeffrey Hugo wrote: > > > On msm8998, vblank timeouts are observed because the DSI controller is not > > > reset properly, which ends up stalling the MDP. This is because the reset > > > logic is not correct per the hardware documentation. > > > > > > The documentation states that after asserting reset, software should wait > > > some time (no indication of how long), or poll the status register until it > > > returns 0 before deasserting reset. > > > > > > wmb() is insufficient for this purpose since it just ensures ordering, not > > > timing between writes. Since asserting and deasserting reset occurs on the > > > same register, ordering is already guaranteed by the architecture, making > > > the wmb extraneous. > > > > > > Since we would define a timeout for polling the status register to avoid a > > > possible infinite loop, lets just use a static delay of 20 ms, since 16.666 > > > ms is the time available to process one frame at 60 fps. > > > > > > Fixes: a689554ba6ed (drm/msm: Initial add DSI connector support) > > > Signed-off-by: Jeffrey Hugo <jeffrey.l.hugo@gmail.com> > > > --- > > > > > > Rob et al, is it possible for this to go into a 5.4-rc? > > Sorry, I missed this on the first go-around, I'm Ok with this getting > into 5.4. Rob, if you're Ok with this, I can send it through -misc > unless you're planning an msm-fixes PR. > > > > > > > drivers/gpu/drm/msm/dsi/dsi_host.c | 4 ++-- > > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c > > > index 663ff9f4fac9..68ded9b4735d 100644 > > > --- a/drivers/gpu/drm/msm/dsi/dsi_host.c > > > +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c > > > @@ -986,7 +986,7 @@ static void dsi_sw_reset(struct msm_dsi_host *msm_host) > > > wmb(); /* clocks need to be enabled before reset */ > > > > > > dsi_write(msm_host, REG_DSI_RESET, 1); > > > - wmb(); /* make sure reset happen */ > > > + msleep(20); /* make sure reset happen */ > > > > Could you please pull this out into a #define used for both in case we decide to > > tweak it? I don't want these 2 values to drift. > > Oh, yeah. That's a really good point. Will fix. > > oh yeah, and with that fixed, > > Reviewed-by: Sean Paul <sean@poorly.run> Thanks. > > > Thanks, > > Sean > > > > > dsi_write(msm_host, REG_DSI_RESET, 0); > > > } > > > > > > @@ -1396,7 +1396,7 @@ static void dsi_sw_reset_restore(struct msm_dsi_host *msm_host) > > > > > > /* dsi controller can only be reset while clocks are running */ > > > dsi_write(msm_host, REG_DSI_RESET, 1); > > > - wmb(); /* make sure reset happen */ > > > + msleep(20); /* make sure reset happen */ > > > dsi_write(msm_host, REG_DSI_RESET, 0); > > > wmb(); /* controller out of reset */ > > > dsi_write(msm_host, REG_DSI_CTRL, data0); > > > -- > > > 2.17.1 > > > > > > > -- > > Sean Paul, Software Engineer, Google / Chromium OS ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-10-10 19:00 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-10-09 21:34 [PATCH] drm/msm/dsi: Implement reset correctly Jeffrey Hugo 2019-10-10 18:45 ` Sean Paul 2019-10-10 18:48 ` Sean Paul 2019-10-10 18:59 ` Jeffrey Hugo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®