Re: [Freedreno] [PATCH 3/3] drm/msm: dpu: Don't store/deref pointers in trace ringbuffer

2018-09-19 Thread Sean Paul
On Wed, Sep 19, 2018 at 01:04:42PM -0700, Abhinav Kumar wrote:
> On 2018-09-19 11:33, Sean Paul wrote:
> > From: Sean Paul 
> > 
> > TP_printk is not synchronous, so storing pointers and then later
> > derferencing them is a Bad Idea. This patch stores everything locally to
> minor typo "dereferencing",
> > avoid display stomped memory.
> > 
> > Signed-off-by: Sean Paul 
> After fixing the minor nit please add,
> Reviewed-by: Abhinav Kumar 

Thanks for the reviews, Abhinav, I've stuffed the set in dpu-staging/for-next.

Sean

> > ---
> >  drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h | 98 +--
> >  1 file changed, 55 insertions(+), 43 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
> > b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
> > index ae6b0c51ba52..e12c4cefb742 100644
> > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
> > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
> > @@ -686,37 +686,41 @@ TRACE_EVENT(dpu_crtc_setup_mixer,
> > TP_STRUCT__entry(
> > __field(uint32_t,   crtc_id )
> > __field(uint32_t,   plane_id)
> > -   __field(struct drm_plane_state*,state   )
> > -   __field(struct dpu_plane_state*,pstate  )
> > +   __field(uint32_t,   fb_id   )
> > +   __field_struct( struct drm_rect,src_rect)
> > +   __field_struct( struct drm_rect,dst_rect)
> > __field(uint32_t,   stage_idx   )
> > +   __field(enum dpu_stage, stage   )
> > __field(enum dpu_sspp,  sspp)
> > +   __field(uint32_t,   multirect_idx   )
> > +   __field(uint32_t,   multirect_mode  )
> > __field(uint32_t,   pixel_format)
> > __field(uint64_t,   modifier)
> > ),
> > TP_fast_assign(
> > __entry->crtc_id = crtc_id;
> > __entry->plane_id = plane_id;
> > -   __entry->state = state;
> > -   __entry->pstate = pstate;
> > +   __entry->fb_id = state ? state->fb->base.id : 0;
> > +   __entry->src_rect = drm_plane_state_src(state);
> > +   __entry->dst_rect = drm_plane_state_dest(state);
> > __entry->stage_idx = stage_idx;
> > +   __entry->stage = pstate->stage;
> > __entry->sspp = sspp;
> > +   __entry->multirect_idx = pstate->multirect_index;
> > +   __entry->multirect_mode = pstate->multirect_mode;
> > __entry->pixel_format = pixel_format;
> > __entry->modifier = modifier;
> > ),
> > -   TP_printk("crtc_id:%u plane_id:%u fb_id:%u src:{%ux%u+%ux%u} "
> > - "dst:{%ux%u+%ux%u} stage_idx:%u stage:%d, sspp:%d "
> > +   TP_printk("crtc_id:%u plane_id:%u fb_id:%u src:" DRM_RECT_FP_FMT
> > + " dst:" DRM_RECT_FMT " stage_idx:%u stage:%d, sspp:%d "
> >   "multirect_index:%d multirect_mode:%u pix_format:%u "
> >   "modifier:%llu",
> > - __entry->crtc_id, __entry->plane_id,
> > - __entry->state->fb ? __entry->state->fb->base.id : -1,
> > - __entry->state->src_w >> 16,  __entry->state->src_h >> 16,
> > - __entry->state->src_x >> 16,  __entry->state->src_y >> 16,
> > - __entry->state->crtc_w,  __entry->state->crtc_h,
> > - __entry->state->crtc_x,  __entry->state->crtc_y,
> > - __entry->stage_idx, __entry->pstate->stage, __entry->sspp,
> > - __entry->pstate->multirect_index,
> > - __entry->pstate->multirect_mode, __entry->pixel_format,
> > - __entry->modifier)
> > + __entry->crtc_id, __entry->plane_id, __entry->fb_id,
> > + DRM_RECT_FP_ARG(&__entry->src_rect),
> > + DRM_RECT_ARG(&__entry->dst_rect),
> > + __entry->stage_idx, __entry->stage, __entry->sspp,
> > + __entry->multirect_idx, __entry->multirect_mode,
> > + __entry->pixel_format, __entry->modifier)
> >  );
> > 
> >  TRACE_EVENT(dpu_crtc_setup_lm_bounds,
> > @@ -725,15 +729,15 @@ TRACE_EVENT(dpu_crtc_setup_lm_bounds,
> > TP_STRUCT__entry(
> > __field(uint32_t,   drm_id  )
> > __field(int,mixer   )
> > -   __field(struct drm_rect *,  bounds  )
> > +   __field_struct( struct drm_rect,bounds  )
> > ),
> > TP_fast_assign(
> > __entry->drm_id = drm_id;
> > __entry->mixer = mixer;
> > -   __entry->bounds = bounds;
> > +   __entry->bounds = *bounds;
> > ),
> > TP_printk("id:%u mixer:%d bounds:" DRM_RECT_FMT, __entry->drm_id,
> > - __entry->mixer, 

Re: [Freedreno] [PATCH 2/3] drm/msm: dpu: Add extra_flush_bits to trigger_flush trace

2018-09-19 Thread Abhinav Kumar

On 2018-09-19 11:33, Sean Paul wrote:

From: Sean Paul 

It's useful to know which bits of the flush come from 
"extra_flush_bits"


Signed-off-by: Sean Paul 

Reviewed-by: Abhinav Kumar 

---
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c |  3 ++-
 drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h   | 14 +-
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index e56f29190121..8f6880db5c99 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -1444,7 +1444,8 @@ static inline void
_dpu_encoder_trigger_flush(struct drm_encoder *drm_enc,
ret = ctl->ops.get_pending_flush(ctl);

trace_dpu_enc_trigger_flush(DRMID(drm_enc), phys->intf_idx,
-   pending_kickoff_cnt, ctl->idx, ret);
+   pending_kickoff_cnt, ctl->idx,
+   extra_flush_bits, ret);
 }

 /**
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
index 0be51db02f2e..ae6b0c51ba52 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
@@ -468,14 +468,16 @@ TRACE_EVENT(dpu_enc_frame_done_cb,

 TRACE_EVENT(dpu_enc_trigger_flush,
TP_PROTO(uint32_t drm_id, enum dpu_intf intf_idx,
-int pending_kickoff_cnt, int ctl_idx, u32 pending_flush_ret),
+int pending_kickoff_cnt, int ctl_idx, u32 extra_flush_bits,
+u32 pending_flush_ret),
TP_ARGS(drm_id, intf_idx, pending_kickoff_cnt, ctl_idx,
-   pending_flush_ret),
+   extra_flush_bits, pending_flush_ret),
TP_STRUCT__entry(
__field(uint32_t,   drm_id  )
__field(enum dpu_intf,  intf_idx)
__field(int,pending_kickoff_cnt )
__field(int,ctl_idx )
+   __field(u32,extra_flush_bits)
__field(u32,pending_flush_ret   )
),
TP_fast_assign(
@@ -483,12 +485,14 @@ TRACE_EVENT(dpu_enc_trigger_flush,
__entry->intf_idx = intf_idx;
__entry->pending_kickoff_cnt = pending_kickoff_cnt;
__entry->ctl_idx = ctl_idx;
+   __entry->extra_flush_bits = extra_flush_bits;
__entry->pending_flush_ret = pending_flush_ret;
),
TP_printk("id=%u, intf_idx=%d, pending_kickoff_cnt=%d ctl_idx=%d "
- "pending_flush_ret=%u", __entry->drm_id,
- __entry->intf_idx, __entry->pending_kickoff_cnt,
- __entry->ctl_idx, __entry->pending_flush_ret)
+ "extra_flush_bits=0x%x pending_flush_ret=0x%x",
+ __entry->drm_id, __entry->intf_idx,
+ __entry->pending_kickoff_cnt, __entry->ctl_idx,
+ __entry->extra_flush_bits, __entry->pending_flush_ret)
 );

 DECLARE_EVENT_CLASS(dpu_enc_ktime_template,

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


Re: [Freedreno] [PATCH 1/3] drm/msm: dpu: Clear frame_busy_mask bit after trace

2018-09-19 Thread Abhinav Kumar

On 2018-09-19 11:33, Sean Paul wrote:

From: Sean Paul 

We're printing the frame_busy_mask in a trace, but after it's been
cleared. This, as it turns out, is pretty pointless.

Signed-off-by: Sean Paul 

Reviewed-by: Abhinav Kumar 

---
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index c2e8985b4c54..e56f29190121 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -1361,9 +1361,9 @@ static void dpu_encoder_frame_done_callback(
/* One of the physical encoders has become idle */
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
if (dpu_enc->phys_encs[i] == ready_phys) {
-   clear_bit(i, dpu_enc->frame_busy_mask);
trace_dpu_enc_frame_done_cb(DRMID(drm_enc), i,
dpu_enc->frame_busy_mask[0]);
+   clear_bit(i, dpu_enc->frame_busy_mask);
}
}

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


Re: [Freedreno] [PATCH 4/5] drm/msm/dpu: Change _dpu_crtc_power_enable to void

2018-09-19 Thread Sean Paul
On Wed, Sep 19, 2018 at 03:13:12PM -0400, Sean Paul wrote:
> On Wed, Sep 19, 2018 at 11:44:14AM -0400, Bruce Wang wrote:
> > All checks for _dpu_crtc_power_enable are not true, so the function
> > can never return an error code. All calls of the function have also
> > been changed so that they don't expect a return value.
> > 
> > Signed-off-by: Bruce Wang 
> > ---
> >  drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 35 
> >  1 file changed, 5 insertions(+), 30 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c 
> > b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> > index 017d16131dac..f0b52281c46f 100644
> > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> > @@ -60,37 +60,16 @@ static inline struct dpu_kms *_dpu_crtc_get_kms(struct 
> > drm_crtc *crtc)
> > return to_dpu_kms(priv->kms);
> >  }
> >  
> > -static inline int _dpu_crtc_power_enable(struct dpu_crtc *dpu_crtc, bool 
> > enable)
> > +static inline void _dpu_crtc_power_enable(struct dpu_crtc *dpu_crtc, bool 
> > enable)
> >  {
> > -   struct drm_crtc *crtc;
> > -   struct msm_drm_private *priv;
> > -   struct dpu_kms *dpu_kms;
> > -
> > -   if (!dpu_crtc) {
> > -   DPU_ERROR("invalid dpu crtc\n");
> > -   return -EINVAL;
> > -   }
> > -
> > -   crtc = _crtc->base;
> > -   if (!crtc->dev || !crtc->dev->dev_private) {
> > -   DPU_ERROR("invalid drm device\n");
> > -   return -EINVAL;
> > -   }
> > -
> > -   priv = crtc->dev->dev_private;
> > -   if (!priv->kms) {
> > -   DPU_ERROR("invalid kms\n");
> > -   return -EINVAL;
> > -   }
> > -
> > -   dpu_kms = to_dpu_kms(priv->kms);
> > +   struct drm_crtc *crtc = _crtc->base;
> > +   struct msm_drm_private *priv = crtc->dev->dev_private;
> > +   struct dpu_kms *dpu_kms = to_dpu_kms(priv->kms);
> >  
> > if (enable)
> > pm_runtime_get_sync(_kms->pdev->dev);
> > else
> > pm_runtime_put_sync(_kms->pdev->dev);
> > -
> > -   return 0;
> >  }
> >  
> >  static void dpu_crtc_destroy(struct drm_crtc *crtc)
> > @@ -849,14 +828,10 @@ static int _dpu_crtc_vblank_enable_no_lock(
> 
> I think this can go to void now too since the if (!dpu_crtc) check at the top 
> is
> a no-op.
> 
> This is a good thing, too since this function is only called from void 
> functions
> with one exception where its return value isn't passed on!

In light of patch 5/5,

Reviewed-by: Sean Paul 


> 
> Sean
> 
> > dev = crtc->dev;
> >  
> > if (enable) {
> > -   int ret;
> > -
> > /* drop lock since power crtc cb may try to re-acquire lock */
> > mutex_unlock(_crtc->crtc_lock);
> > -   ret = _dpu_crtc_power_enable(dpu_crtc, true);
> > +   _dpu_crtc_power_enable(dpu_crtc, true);
> > mutex_lock(_crtc->crtc_lock);
> > -   if (ret)
> > -   return ret;
> >  
> > list_for_each_entry(enc, >mode_config.encoder_list, head) {
> > if (enc->crtc != crtc)
> > -- 
> > 2.19.0.397.gdd90340f6a-goog
> > 
> 
> -- 
> Sean Paul, Software Engineer, Google / Chromium OS

-- 
Sean Paul, Software Engineer, Google / Chromium OS
___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


Re: [Freedreno] [PATCH 4/5] drm/msm/dpu: Change _dpu_crtc_power_enable to void

2018-09-19 Thread Sean Paul
On Wed, Sep 19, 2018 at 11:44:14AM -0400, Bruce Wang wrote:
> All checks for _dpu_crtc_power_enable are not true, so the function
> can never return an error code. All calls of the function have also
> been changed so that they don't expect a return value.
> 
> Signed-off-by: Bruce Wang 
> ---
>  drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 35 
>  1 file changed, 5 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c 
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> index 017d16131dac..f0b52281c46f 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> @@ -60,37 +60,16 @@ static inline struct dpu_kms *_dpu_crtc_get_kms(struct 
> drm_crtc *crtc)
>   return to_dpu_kms(priv->kms);
>  }
>  
> -static inline int _dpu_crtc_power_enable(struct dpu_crtc *dpu_crtc, bool 
> enable)
> +static inline void _dpu_crtc_power_enable(struct dpu_crtc *dpu_crtc, bool 
> enable)
>  {
> - struct drm_crtc *crtc;
> - struct msm_drm_private *priv;
> - struct dpu_kms *dpu_kms;
> -
> - if (!dpu_crtc) {
> - DPU_ERROR("invalid dpu crtc\n");
> - return -EINVAL;
> - }
> -
> - crtc = _crtc->base;
> - if (!crtc->dev || !crtc->dev->dev_private) {
> - DPU_ERROR("invalid drm device\n");
> - return -EINVAL;
> - }
> -
> - priv = crtc->dev->dev_private;
> - if (!priv->kms) {
> - DPU_ERROR("invalid kms\n");
> - return -EINVAL;
> - }
> -
> - dpu_kms = to_dpu_kms(priv->kms);
> + struct drm_crtc *crtc = _crtc->base;
> + struct msm_drm_private *priv = crtc->dev->dev_private;
> + struct dpu_kms *dpu_kms = to_dpu_kms(priv->kms);
>  
>   if (enable)
>   pm_runtime_get_sync(_kms->pdev->dev);
>   else
>   pm_runtime_put_sync(_kms->pdev->dev);
> -
> - return 0;
>  }
>  
>  static void dpu_crtc_destroy(struct drm_crtc *crtc)
> @@ -849,14 +828,10 @@ static int _dpu_crtc_vblank_enable_no_lock(

I think this can go to void now too since the if (!dpu_crtc) check at the top is
a no-op.

This is a good thing, too since this function is only called from void functions
with one exception where its return value isn't passed on!

Sean

>   dev = crtc->dev;
>  
>   if (enable) {
> - int ret;
> -
>   /* drop lock since power crtc cb may try to re-acquire lock */
>   mutex_unlock(_crtc->crtc_lock);
> - ret = _dpu_crtc_power_enable(dpu_crtc, true);
> + _dpu_crtc_power_enable(dpu_crtc, true);
>   mutex_lock(_crtc->crtc_lock);
> - if (ret)
> - return ret;
>  
>   list_for_each_entry(enc, >mode_config.encoder_list, head) {
>   if (enc->crtc != crtc)
> -- 
> 2.19.0.397.gdd90340f6a-goog
> 

-- 
Sean Paul, Software Engineer, Google / Chromium OS
___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


Re: [Freedreno] [PATCH 3/5] drm/msm/dpu: Remove impossible checks

2018-09-19 Thread Sean Paul
On Wed, Sep 19, 2018 at 11:44:13AM -0400, Bruce Wang wrote:
> Removes additional impossible checks in dpu_plane.c and dpu_crtc.c.
> Variable assignments are moved up to be initializations where
> possible. Some variables are no longer used, these are removed.
> 
> Signed-off-by: Bruce Wang 
> ---
>  drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c  | 121 +++---
>  drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c |  16 +--

The dpu_plane changes should probably get rolled into the dpu_plane removal
patch, then rename the subject of this patch "Remove impossible checks from
dpu_crtc".

>  2 files changed, 17 insertions(+), 120 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c 
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> index a8f2dd7a37c7..017d16131dac 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> @@ -55,17 +55,7 @@ static inline int _dpu_crtc_get_mixer_width(struct 
> dpu_crtc_state *cstate,
>  
>  static inline struct dpu_kms *_dpu_crtc_get_kms(struct drm_crtc *crtc)
>  {
> - struct msm_drm_private *priv;
> -
> - if (!crtc || !crtc->dev || !crtc->dev->dev_private) {
> - DPU_ERROR("invalid crtc\n");
> - return NULL;
> - }
> - priv = crtc->dev->dev_private;
> - if (!priv || !priv->kms) {
> - DPU_ERROR("invalid kms\n");
> - return NULL;
> - }
> + struct msm_drm_private *priv = crtc->dev->dev_private;
>  
>   return to_dpu_kms(priv->kms);

Might as well just slap the whole thing in the arg and save a local:

return to_dpu_kms(crtc->dev->dev_private->kms);



>  }
> @@ -177,28 +167,17 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc 
> *crtc,
>   struct drm_plane *plane;
>   struct drm_framebuffer *fb;
>   struct drm_plane_state *state;
> - struct dpu_crtc_state *cstate;
> + struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
>   struct dpu_plane_state *pstate = NULL;
>   struct dpu_format *format;
> - struct dpu_hw_ctl *ctl;
> - struct dpu_hw_mixer *lm;
> - struct dpu_hw_stage_cfg *stage_cfg;
> + struct dpu_hw_ctl *ctl = mixer->lm_ctl;
> + struct dpu_hw_stage_cfg *stage_cfg = _crtc->stage_cfg;
>  
>   u32 flush_mask;
>   uint32_t stage_idx, lm_idx;
>   int zpos_cnt[DPU_STAGE_MAX + 1] = { 0 };
>   bool bg_alpha_enable = false;
>  
> - if (!dpu_crtc || !mixer) {
> - DPU_ERROR("invalid dpu_crtc or mixer\n");
> - return;
> - }
> -
> - ctl = mixer->lm_ctl;
> - lm = mixer->hw_lm;
> - stage_cfg = _crtc->stage_cfg;
> - cstate = to_dpu_crtc_state(crtc->state);
> -
>   drm_atomic_crtc_for_each_plane(plane, crtc) {
>   state = plane->state;
>   if (!state)
> @@ -217,10 +196,6 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc 
> *crtc,
>   state->fb ? state->fb->base.id : -1);
>  
>   format = to_dpu_format(msm_framebuffer_format(pstate->base.fb));
> - if (!format) {
> - DPU_ERROR("invalid format\n");
> - return;
> - }
>  
>   if (pstate->stage == DPU_STAGE_BASE && format->alpha_enable)
>   bg_alpha_enable = true;
> @@ -261,21 +236,13 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc 
> *crtc,
>   */
>  static void _dpu_crtc_blend_setup(struct drm_crtc *crtc)
>  {
> - struct dpu_crtc *dpu_crtc;
> - struct dpu_crtc_state *cstate;
> - struct dpu_crtc_mixer *mixer;
> + struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
> + struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
> + struct dpu_crtc_mixer *mixer = cstate->mixers;
>   struct dpu_hw_ctl *ctl;
>   struct dpu_hw_mixer *lm;
> -
>   int i;
>  
> - if (!crtc)
> - return;
> -
> - dpu_crtc = to_dpu_crtc(crtc);
> - cstate = to_dpu_crtc_state(crtc->state);
> - mixer = cstate->mixers;
> -
>   DPU_DEBUG("%s\n", dpu_crtc->name);
>  
>   for (i = 0; i < cstate->num_mixers; i++) {
> @@ -377,7 +344,6 @@ static void dpu_crtc_vblank_cb(void *data)
>  
>  static void dpu_crtc_frame_event_work(struct kthread_work *work)
>  {
> - struct msm_drm_private *priv;
>   struct dpu_crtc_frame_event *fevent;
>   struct drm_crtc *crtc;
>   struct dpu_crtc *dpu_crtc;
> @@ -400,11 +366,6 @@ static void dpu_crtc_frame_event_work(struct 
> kthread_work *work)

This is collapsed, but the if (!work) condition is also bogus.

The fevent null checks are also suspicious. Checking fevent->crtc->state
is downright dangerous since it's unlocked access. Fortunately it doesn't
look like the function is using state, so let's remove that check. Given that
you can remove a bunch more, most of these assignments can be folded up top.

>   dpu_crtc = to_dpu_crtc(crtc);
>  
>   dpu_kms = _dpu_crtc_get_kms(crtc);
> - if 

Re: [Freedreno] [PATCH 2/5] drm/msm/dpu: Clean up plane atomic disable/update

2018-09-19 Thread Sean Paul
On Wed, Sep 19, 2018 at 11:44:12AM -0400, Bruce Wang wrote:
> Removes unnecessary checks from dpu_plane_atomic_disable, old_state
> argument for both dpu_plane_atomic_disable and
> dpu_plane_sspp_atomic_update is removed as it is no longer used.
> 
> Signed-off-by: Bruce Wang 

Reviewed-by: Sean Paul 

> ---
>  drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 31 +--
>  1 file changed, 7 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c 
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> index a8d00f57f06a..7f6046166626 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> @@ -1157,8 +1157,7 @@ void dpu_plane_set_error(struct drm_plane *plane, bool 
> error)
>   pdpu->is_error = error;
>  }
>  
> -static void dpu_plane_sspp_atomic_update(struct drm_plane *plane,
> -  struct drm_plane_state *old_state)
> +static void dpu_plane_sspp_atomic_update(struct drm_plane *plane)
>  {
>   uint32_t src_flags;
>   struct dpu_plane *pdpu = to_dpu_plane(plane);
> @@ -1271,27 +1270,11 @@ static void dpu_plane_sspp_atomic_update(struct 
> drm_plane *plane,
>   _dpu_plane_set_qos_remap(plane);
>  }
>  
> -static void _dpu_plane_atomic_disable(struct drm_plane *plane,
> - struct drm_plane_state *old_state)
> +static void _dpu_plane_atomic_disable(struct drm_plane *plane)
>  {
> - struct dpu_plane *pdpu;
> - struct drm_plane_state *state;
> - struct dpu_plane_state *pstate;
> -
> - if (!plane) {
> - DPU_ERROR("invalid plane\n");
> - return;
> - } else if (!plane->state) {
> - DPU_ERROR("invalid plane state\n");
> - return;
> - } else if (!old_state) {
> - DPU_ERROR("invalid old state\n");
> - return;
> - }
> -
> - pdpu = to_dpu_plane(plane);
> - state = plane->state;
> - pstate = to_dpu_plane_state(state);
> + struct dpu_plane *pdpu = to_dpu_plane(plane);
> + struct drm_plane_state *state = plane->state;
> + struct dpu_plane_state *pstate = to_dpu_plane_state(state);
>  
>   trace_dpu_plane_disable(DRMID(plane), is_dpu_plane_virtual(plane),
>   pstate->multirect_mode);
> @@ -1315,9 +1298,9 @@ static void dpu_plane_atomic_update(struct drm_plane 
> *plane,
>   DPU_DEBUG_PLANE(pdpu, "\n");
>  
>   if (!state->visible) {
> - _dpu_plane_atomic_disable(plane, old_state);
> + _dpu_plane_atomic_disable(plane);
>   } else {
> - dpu_plane_sspp_atomic_update(plane, old_state);
> + dpu_plane_sspp_atomic_update(plane);
>   }
>  }
>  
> -- 
> 2.19.0.397.gdd90340f6a-goog
> 

-- 
Sean Paul, Software Engineer, Google / Chromium OS
___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


Re: [Freedreno] [PATCH 1/5] drm/msm/dpu: Remove unneeded checks from dpu_plane

2018-09-19 Thread Sean Paul
On Wed, Sep 19, 2018 at 11:44:11AM -0400, Bruce Wang wrote:
> Removes some checks from dpu_plane.c that will never result in an error.
> Subsequent variable assignments become part of the initialization wherever
> possible.
> 
> Signed-off-by: Bruce Wang 
> ---
>  drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 53 +++
>  1 file changed, 6 insertions(+), 47 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c 
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> index 1ce76460d710..a8d00f57f06a 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> @@ -229,19 +229,11 @@ static u64 _dpu_plane_get_qos_lut(const struct 
> dpu_qos_lut_tbl *tbl,
>  static void _dpu_plane_set_qos_lut(struct drm_plane *plane,
>   struct drm_framebuffer *fb)
>  {
> - struct dpu_plane *pdpu;
> + struct dpu_plane *pdpu = to_dpu_plane(plane);
>   const struct dpu_format *fmt = NULL;
>   u64 qos_lut;
>   u32 total_fl = 0, lut_usage;
>  
> - if (!plane || !fb) {
> - DPU_ERROR("invalid arguments plane %d fb %d\n",
> - plane != 0, fb != 0);
> - return;
> - }
> -
> - pdpu = to_dpu_plane(plane);
> -
>   if (!pdpu->pipe_hw || !pdpu->pipe_sblk || !pdpu->catalog) {

As we discussed, it looks like we can remove all of these too \o/

>   DPU_ERROR("invalid arguments\n");
>   return;
> @@ -290,17 +282,10 @@ static void _dpu_plane_set_qos_lut(struct drm_plane 
> *plane,
>  static void _dpu_plane_set_danger_lut(struct drm_plane *plane,
>   struct drm_framebuffer *fb)
>  {
> - struct dpu_plane *pdpu;
> + struct dpu_plane *pdpu = to_dpu_plane(plane);
>   const struct dpu_format *fmt = NULL;
>   u32 danger_lut, safe_lut;
>  
> - if (!plane || !fb) {
> - DPU_ERROR("invalid arguments\n");
> - return;
> - }
> -
> - pdpu = to_dpu_plane(plane);
> -
>   if (!pdpu->pipe_hw || !pdpu->pipe_sblk || !pdpu->catalog) {

and here

>   DPU_ERROR("invalid arguments\n");
>   return;
> @@ -361,14 +346,7 @@ static void _dpu_plane_set_danger_lut(struct drm_plane 
> *plane,
>  static void _dpu_plane_set_qos_ctrl(struct drm_plane *plane,
>   bool enable, u32 flags)
>  {
> - struct dpu_plane *pdpu;
> -
> - if (!plane) {
> - DPU_ERROR("invalid arguments\n");
> - return;
> - }
> -
> - pdpu = to_dpu_plane(plane);
> + struct dpu_plane *pdpu = to_dpu_plane(plane);
>  
>   if (!pdpu->pipe_hw || !pdpu->pipe_sblk) {

and here

>   DPU_ERROR("invalid arguments\n");
> @@ -452,16 +430,9 @@ static void _dpu_plane_set_ot_limit(struct drm_plane 
> *plane,
>  {
>   struct dpu_plane *pdpu;
>   struct dpu_vbif_set_ot_params ot_params;
> - struct msm_drm_private *priv;
> + struct msm_drm_private *priv = plane->dev->dev_private;
>   struct dpu_kms *dpu_kms;
>  
> - if (!plane || !plane->dev || !crtc) {
> - DPU_ERROR("invalid arguments plane %d crtc %d\n",
> - plane != 0, crtc != 0);
> - return;
> - }
> -
> - priv = plane->dev->dev_private;
>   if (!priv || !priv->kms) {

These are also guaranteed to be non-NULL (dev_private checked in msm_drv and kms
is checked in dpu_kms.c (or maybe msm_kms.c, but either way)).

>   DPU_ERROR("invalid KMS reference\n");
>   return;
> @@ -496,15 +467,9 @@ static void _dpu_plane_set_qos_remap(struct drm_plane 
> *plane)
>  {
>   struct dpu_plane *pdpu;
>   struct dpu_vbif_set_qos_params qos_params;
> - struct msm_drm_private *priv;
> + struct msm_drm_private *priv = plane->dev->dev_private;
>   struct dpu_kms *dpu_kms;
>  
> - if (!plane || !plane->dev) {
> - DPU_ERROR("invalid arguments\n");
> - return;
> - }
> -
> - priv = plane->dev->dev_private;
>   if (!priv || !priv->kms) {
>   DPU_ERROR("invalid KMS reference\n");
>   return;
> @@ -1737,17 +1702,11 @@ struct drm_plane *dpu_plane_init(struct drm_device 
> *dev,
>   struct drm_plane *plane = NULL, *master_plane = NULL;
>   const struct dpu_format_extended *format_list;
>   struct dpu_plane *pdpu;
> - struct msm_drm_private *priv;
> + struct msm_drm_private *priv = dev->dev_private;
>   struct dpu_kms *kms;
>   int zpos_max = DPU_ZPOS_MAX;
>   int ret = -EINVAL;
>  
> - if (!dev) {
> - DPU_ERROR("[%u]device is NULL\n", pipe);
> - goto exit;
> - }
> -
> - priv = dev->dev_private;
>   if (!priv) {

So let's do another pass of all dev_private checks along with kms, 
pipe_hw/sblk/etc.

Sean

>   DPU_ERROR("[%u]private data is NULL\n", pipe);
>   goto exit;
> -- 
> 2.19.0.397.gdd90340f6a-goog
> 

-- 
Sean Paul, Software Engineer, Google / Chromium OS

[Freedreno] [PATCH 2/2] drm/msm: dpu: Make legacy cursor updates asynchronous

2018-09-19 Thread Sean Paul
From: Sean Paul 

This patch sprinkles a few async/legacy_cursor_update checks
through commit to ensure that cursor updates aren't blocked on vsync.
There are 2 main components to this, the first is that we don't want to
wait_for_commit_done in msm_atomic  before returning from atomic_complete.
The second is that in dpu we don't want to wait for frame_done events when
updating the cursor.

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c| 44 +++--
 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h|  3 +-
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 21 ++
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h |  6 ++-
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c |  5 ++-
 drivers/gpu/drm/msm/msm_atomic.c|  3 +-
 6 files changed, 48 insertions(+), 34 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index a8f2dd7a37c7..b23f00a2554b 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -816,7 +816,7 @@ static int _dpu_crtc_wait_for_frame_done(struct drm_crtc 
*crtc)
return rc;
 }
 
-void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)
+void dpu_crtc_commit_kickoff(struct drm_crtc *crtc, bool async)
 {
struct drm_encoder *encoder;
struct drm_device *dev;
@@ -862,27 +862,30 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)
 * Encoder will flush/start now, unless it has a tx pending.
 * If so, it may delay and flush at an irq event (e.g. ppdone)
 */
-   dpu_encoder_prepare_for_kickoff(encoder, );
+   dpu_encoder_prepare_for_kickoff(encoder, , async);
}
 
-   /* wait for frame_event_done completion */
-   DPU_ATRACE_BEGIN("wait_for_frame_done_event");
-   ret = _dpu_crtc_wait_for_frame_done(crtc);
-   DPU_ATRACE_END("wait_for_frame_done_event");
-   if (ret) {
-   DPU_ERROR("crtc%d wait for frame done failed;frame_pending%d\n",
-   crtc->base.id,
-   atomic_read(_crtc->frame_pending));
-   goto end;
-   }
 
-   if (atomic_inc_return(_crtc->frame_pending) == 1) {
-   /* acquire bandwidth and other resources */
-   DPU_DEBUG("crtc%d first commit\n", crtc->base.id);
-   } else
-   DPU_DEBUG("crtc%d commit\n", crtc->base.id);
+   if (!async) {
+   /* wait for frame_event_done completion */
+   DPU_ATRACE_BEGIN("wait_for_frame_done_event");
+   ret = _dpu_crtc_wait_for_frame_done(crtc);
+   DPU_ATRACE_END("wait_for_frame_done_event");
+   if (ret) {
+   DPU_ERROR("crtc%d wait for frame done 
failed;frame_pending%d\n",
+   crtc->base.id,
+   atomic_read(_crtc->frame_pending));
+   goto end;
+   }
+
+   if (atomic_inc_return(_crtc->frame_pending) == 1) {
+   /* acquire bandwidth and other resources */
+   DPU_DEBUG("crtc%d first commit\n", crtc->base.id);
+   } else
+   DPU_DEBUG("crtc%d commit\n", crtc->base.id);
 
-   dpu_crtc->play_count++;
+   dpu_crtc->play_count++;
+   }
 
dpu_vbif_clear_errors(dpu_kms);
 
@@ -890,11 +893,12 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)
if (encoder->crtc != crtc)
continue;
 
-   dpu_encoder_kickoff(encoder);
+   dpu_encoder_kickoff(encoder, async);
}
 
 end:
-   reinit_completion(_crtc->frame_done_comp);
+   if (!async)
+   reinit_completion(_crtc->frame_done_comp);
DPU_ATRACE_END("crtc_commit");
 }
 
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
index 3723b4830335..67c9f59997cf 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
@@ -285,8 +285,9 @@ int dpu_crtc_vblank(struct drm_crtc *crtc, bool en);
 /**
  * dpu_crtc_commit_kickoff - trigger kickoff of the commit for this crtc
  * @crtc: Pointer to drm crtc object
+ * @async: true if the commit is asynchronous, false otherwise
  */
-void dpu_crtc_commit_kickoff(struct drm_crtc *crtc);
+void dpu_crtc_commit_kickoff(struct drm_crtc *crtc, bool async);
 
 /**
  * dpu_crtc_complete_commit - callback signalling completion of current commit
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index c2e8985b4c54..fc729fc8dd8c 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -1410,7 +1410,7 @@ static void dpu_encoder_off_work(struct kthread_work 
*work)
  * extra_flush_bits: Additional bit mask to include in flush 

[Freedreno] [PATCH 1/2] drm/msm: dpu: Only check flush register against pending flushes

2018-09-19 Thread Sean Paul
From: Sean Paul 

There exists a case where a flush of a plane/dma may have been triggered
& started from an async commit. If that plane/dma is subsequently disabled
by the next commit, the flush register will continue to hold the flush
bit for the disabled plane. Since the bit remains active,
pending_kickoff_cnt will never decrement and we'll miss frame_done
events.

This patch limits the check of flush_register to include only those bits
which have been updated with the latest commit.

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
index 84de385a9f62..60f146f02b77 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
@@ -331,7 +331,7 @@ static void dpu_encoder_phys_vid_vblank_irq(void *arg, int 
irq_idx)
if (hw_ctl && hw_ctl->ops.get_flush_register)
flush_register = hw_ctl->ops.get_flush_register(hw_ctl);
 
-   if (flush_register == 0)
+   if (!(flush_register & hw_ctl->ops.get_pending_flush(hw_ctl)))
new_cnt = atomic_add_unless(_enc->pending_kickoff_cnt,
-1, 0);
spin_unlock_irqrestore(phys_enc->enc_spinlock, lock_flags);
-- 
Sean Paul, Software Engineer, Google / Chromium OS

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


[Freedreno] [PATCH 0/2] drm/msm: dpu: Fix cursor updates

2018-09-19 Thread Sean Paul
From: Sean Paul 

Hey all,
So here's the async cursor patchset, it works pretty well on my device
(video mode dsi). I do have a couple of concerns that hopefully people
might have solutions for.

The first patch masks off the flush register to exclude inactive bits.
I think it'd be nicer to clear those bits if the plane was being
disabled, but it wasn't obvious how I could do this. Any suggestions?

The second patch seems a bit more spread out than I would like. I'd
rather not propagate the async checks all over, but this seemed like the
minimum amount in order to get things working reliably. If you have
better suggestions, please speak up.

Thanks,

Sean

Sean Paul (2):
  drm/msm: dpu: Only check flush register against pending flushes
  drm/msm: dpu: Make legacy cursor updates asynchronous

 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c  | 44 ++-
 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h  |  3 +-
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c   | 21 +
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h   |  6 ++-
 .../drm/msm/disp/dpu1/dpu_encoder_phys_vid.c  |  2 +-
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c   |  5 ++-
 drivers/gpu/drm/msm/msm_atomic.c  |  3 +-
 7 files changed, 49 insertions(+), 35 deletions(-)

-- 
Sean Paul, Software Engineer, Google / Chromium OS

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


[Freedreno] [PATCH 3/3] drm/msm: dpu: Don't store/deref pointers in trace ringbuffer

2018-09-19 Thread Sean Paul
From: Sean Paul 

TP_printk is not synchronous, so storing pointers and then later
derferencing them is a Bad Idea. This patch stores everything locally to
avoid display stomped memory.

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h | 98 +--
 1 file changed, 55 insertions(+), 43 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
index ae6b0c51ba52..e12c4cefb742 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
@@ -686,37 +686,41 @@ TRACE_EVENT(dpu_crtc_setup_mixer,
TP_STRUCT__entry(
__field(uint32_t,   crtc_id )
__field(uint32_t,   plane_id)
-   __field(struct drm_plane_state*,state   )
-   __field(struct dpu_plane_state*,pstate  )
+   __field(uint32_t,   fb_id   )
+   __field_struct( struct drm_rect,src_rect)
+   __field_struct( struct drm_rect,dst_rect)
__field(uint32_t,   stage_idx   )
+   __field(enum dpu_stage, stage   )
__field(enum dpu_sspp,  sspp)
+   __field(uint32_t,   multirect_idx   )
+   __field(uint32_t,   multirect_mode  )
__field(uint32_t,   pixel_format)
__field(uint64_t,   modifier)
),
TP_fast_assign(
__entry->crtc_id = crtc_id;
__entry->plane_id = plane_id;
-   __entry->state = state;
-   __entry->pstate = pstate;
+   __entry->fb_id = state ? state->fb->base.id : 0;
+   __entry->src_rect = drm_plane_state_src(state);
+   __entry->dst_rect = drm_plane_state_dest(state);
__entry->stage_idx = stage_idx;
+   __entry->stage = pstate->stage;
__entry->sspp = sspp;
+   __entry->multirect_idx = pstate->multirect_index;
+   __entry->multirect_mode = pstate->multirect_mode;
__entry->pixel_format = pixel_format;
__entry->modifier = modifier;
),
-   TP_printk("crtc_id:%u plane_id:%u fb_id:%u src:{%ux%u+%ux%u} "
- "dst:{%ux%u+%ux%u} stage_idx:%u stage:%d, sspp:%d "
+   TP_printk("crtc_id:%u plane_id:%u fb_id:%u src:" DRM_RECT_FP_FMT
+ " dst:" DRM_RECT_FMT " stage_idx:%u stage:%d, sspp:%d "
  "multirect_index:%d multirect_mode:%u pix_format:%u "
  "modifier:%llu",
- __entry->crtc_id, __entry->plane_id,
- __entry->state->fb ? __entry->state->fb->base.id : -1,
- __entry->state->src_w >> 16,  __entry->state->src_h >> 16,
- __entry->state->src_x >> 16,  __entry->state->src_y >> 16,
- __entry->state->crtc_w,  __entry->state->crtc_h,
- __entry->state->crtc_x,  __entry->state->crtc_y,
- __entry->stage_idx, __entry->pstate->stage, __entry->sspp,
- __entry->pstate->multirect_index,
- __entry->pstate->multirect_mode, __entry->pixel_format,
- __entry->modifier)
+ __entry->crtc_id, __entry->plane_id, __entry->fb_id,
+ DRM_RECT_FP_ARG(&__entry->src_rect),
+ DRM_RECT_ARG(&__entry->dst_rect),
+ __entry->stage_idx, __entry->stage, __entry->sspp,
+ __entry->multirect_idx, __entry->multirect_mode,
+ __entry->pixel_format, __entry->modifier)
 );
 
 TRACE_EVENT(dpu_crtc_setup_lm_bounds,
@@ -725,15 +729,15 @@ TRACE_EVENT(dpu_crtc_setup_lm_bounds,
TP_STRUCT__entry(
__field(uint32_t,   drm_id  )
__field(int,mixer   )
-   __field(struct drm_rect *,  bounds  )
+   __field_struct( struct drm_rect,bounds  )
),
TP_fast_assign(
__entry->drm_id = drm_id;
__entry->mixer = mixer;
-   __entry->bounds = bounds;
+   __entry->bounds = *bounds;
),
TP_printk("id:%u mixer:%d bounds:" DRM_RECT_FMT, __entry->drm_id,
- __entry->mixer, DRM_RECT_ARG(__entry->bounds))
+ __entry->mixer, DRM_RECT_ARG(&__entry->bounds))
 );
 
 TRACE_EVENT(dpu_crtc_vblank_enable,
@@ -744,21 +748,25 @@ TRACE_EVENT(dpu_crtc_vblank_enable,
__field(uint32_t,   drm_id  )
__field(uint32_t,   enc_id  )
__field(bool,  

[Freedreno] [PATCH 2/3] drm/msm: dpu: Add extra_flush_bits to trigger_flush trace

2018-09-19 Thread Sean Paul
From: Sean Paul 

It's useful to know which bits of the flush come from "extra_flush_bits"

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c |  3 ++-
 drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h   | 14 +-
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index e56f29190121..8f6880db5c99 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -1444,7 +1444,8 @@ static inline void _dpu_encoder_trigger_flush(struct 
drm_encoder *drm_enc,
ret = ctl->ops.get_pending_flush(ctl);
 
trace_dpu_enc_trigger_flush(DRMID(drm_enc), phys->intf_idx,
-   pending_kickoff_cnt, ctl->idx, ret);
+   pending_kickoff_cnt, ctl->idx,
+   extra_flush_bits, ret);
 }
 
 /**
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
index 0be51db02f2e..ae6b0c51ba52 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
@@ -468,14 +468,16 @@ TRACE_EVENT(dpu_enc_frame_done_cb,
 
 TRACE_EVENT(dpu_enc_trigger_flush,
TP_PROTO(uint32_t drm_id, enum dpu_intf intf_idx,
-int pending_kickoff_cnt, int ctl_idx, u32 pending_flush_ret),
+int pending_kickoff_cnt, int ctl_idx, u32 extra_flush_bits,
+u32 pending_flush_ret),
TP_ARGS(drm_id, intf_idx, pending_kickoff_cnt, ctl_idx,
-   pending_flush_ret),
+   extra_flush_bits, pending_flush_ret),
TP_STRUCT__entry(
__field(uint32_t,   drm_id  )
__field(enum dpu_intf,  intf_idx)
__field(int,pending_kickoff_cnt )
__field(int,ctl_idx )
+   __field(u32,extra_flush_bits)
__field(u32,pending_flush_ret   )
),
TP_fast_assign(
@@ -483,12 +485,14 @@ TRACE_EVENT(dpu_enc_trigger_flush,
__entry->intf_idx = intf_idx;
__entry->pending_kickoff_cnt = pending_kickoff_cnt;
__entry->ctl_idx = ctl_idx;
+   __entry->extra_flush_bits = extra_flush_bits;
__entry->pending_flush_ret = pending_flush_ret;
),
TP_printk("id=%u, intf_idx=%d, pending_kickoff_cnt=%d ctl_idx=%d "
- "pending_flush_ret=%u", __entry->drm_id,
- __entry->intf_idx, __entry->pending_kickoff_cnt,
- __entry->ctl_idx, __entry->pending_flush_ret)
+ "extra_flush_bits=0x%x pending_flush_ret=0x%x",
+ __entry->drm_id, __entry->intf_idx,
+ __entry->pending_kickoff_cnt, __entry->ctl_idx,
+ __entry->extra_flush_bits, __entry->pending_flush_ret)
 );
 
 DECLARE_EVENT_CLASS(dpu_enc_ktime_template,
-- 
Sean Paul, Software Engineer, Google / Chromium OS

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


[Freedreno] [PATCH 1/3] drm/msm: dpu: Clear frame_busy_mask bit after trace

2018-09-19 Thread Sean Paul
From: Sean Paul 

We're printing the frame_busy_mask in a trace, but after it's been
cleared. This, as it turns out, is pretty pointless.

Signed-off-by: Sean Paul 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index c2e8985b4c54..e56f29190121 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -1361,9 +1361,9 @@ static void dpu_encoder_frame_done_callback(
/* One of the physical encoders has become idle */
for (i = 0; i < dpu_enc->num_phys_encs; i++) {
if (dpu_enc->phys_encs[i] == ready_phys) {
-   clear_bit(i, dpu_enc->frame_busy_mask);
trace_dpu_enc_frame_done_cb(DRMID(drm_enc), i,
dpu_enc->frame_busy_mask[0]);
+   clear_bit(i, dpu_enc->frame_busy_mask);
}
}
 
-- 
Sean Paul, Software Engineer, Google / Chromium OS

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


[Freedreno] [PATCH 1/5] drm/msm/dpu: Remove unneeded checks from dpu_plane

2018-09-19 Thread Bruce Wang
Removes some checks from dpu_plane.c that will never result in an error.
Subsequent variable assignments become part of the initialization wherever
possible.

Signed-off-by: Bruce Wang 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 53 +++
 1 file changed, 6 insertions(+), 47 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index 1ce76460d710..a8d00f57f06a 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -229,19 +229,11 @@ static u64 _dpu_plane_get_qos_lut(const struct 
dpu_qos_lut_tbl *tbl,
 static void _dpu_plane_set_qos_lut(struct drm_plane *plane,
struct drm_framebuffer *fb)
 {
-   struct dpu_plane *pdpu;
+   struct dpu_plane *pdpu = to_dpu_plane(plane);
const struct dpu_format *fmt = NULL;
u64 qos_lut;
u32 total_fl = 0, lut_usage;
 
-   if (!plane || !fb) {
-   DPU_ERROR("invalid arguments plane %d fb %d\n",
-   plane != 0, fb != 0);
-   return;
-   }
-
-   pdpu = to_dpu_plane(plane);
-
if (!pdpu->pipe_hw || !pdpu->pipe_sblk || !pdpu->catalog) {
DPU_ERROR("invalid arguments\n");
return;
@@ -290,17 +282,10 @@ static void _dpu_plane_set_qos_lut(struct drm_plane 
*plane,
 static void _dpu_plane_set_danger_lut(struct drm_plane *plane,
struct drm_framebuffer *fb)
 {
-   struct dpu_plane *pdpu;
+   struct dpu_plane *pdpu = to_dpu_plane(plane);
const struct dpu_format *fmt = NULL;
u32 danger_lut, safe_lut;
 
-   if (!plane || !fb) {
-   DPU_ERROR("invalid arguments\n");
-   return;
-   }
-
-   pdpu = to_dpu_plane(plane);
-
if (!pdpu->pipe_hw || !pdpu->pipe_sblk || !pdpu->catalog) {
DPU_ERROR("invalid arguments\n");
return;
@@ -361,14 +346,7 @@ static void _dpu_plane_set_danger_lut(struct drm_plane 
*plane,
 static void _dpu_plane_set_qos_ctrl(struct drm_plane *plane,
bool enable, u32 flags)
 {
-   struct dpu_plane *pdpu;
-
-   if (!plane) {
-   DPU_ERROR("invalid arguments\n");
-   return;
-   }
-
-   pdpu = to_dpu_plane(plane);
+   struct dpu_plane *pdpu = to_dpu_plane(plane);
 
if (!pdpu->pipe_hw || !pdpu->pipe_sblk) {
DPU_ERROR("invalid arguments\n");
@@ -452,16 +430,9 @@ static void _dpu_plane_set_ot_limit(struct drm_plane 
*plane,
 {
struct dpu_plane *pdpu;
struct dpu_vbif_set_ot_params ot_params;
-   struct msm_drm_private *priv;
+   struct msm_drm_private *priv = plane->dev->dev_private;
struct dpu_kms *dpu_kms;
 
-   if (!plane || !plane->dev || !crtc) {
-   DPU_ERROR("invalid arguments plane %d crtc %d\n",
-   plane != 0, crtc != 0);
-   return;
-   }
-
-   priv = plane->dev->dev_private;
if (!priv || !priv->kms) {
DPU_ERROR("invalid KMS reference\n");
return;
@@ -496,15 +467,9 @@ static void _dpu_plane_set_qos_remap(struct drm_plane 
*plane)
 {
struct dpu_plane *pdpu;
struct dpu_vbif_set_qos_params qos_params;
-   struct msm_drm_private *priv;
+   struct msm_drm_private *priv = plane->dev->dev_private;
struct dpu_kms *dpu_kms;
 
-   if (!plane || !plane->dev) {
-   DPU_ERROR("invalid arguments\n");
-   return;
-   }
-
-   priv = plane->dev->dev_private;
if (!priv || !priv->kms) {
DPU_ERROR("invalid KMS reference\n");
return;
@@ -1737,17 +1702,11 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
struct drm_plane *plane = NULL, *master_plane = NULL;
const struct dpu_format_extended *format_list;
struct dpu_plane *pdpu;
-   struct msm_drm_private *priv;
+   struct msm_drm_private *priv = dev->dev_private;
struct dpu_kms *kms;
int zpos_max = DPU_ZPOS_MAX;
int ret = -EINVAL;
 
-   if (!dev) {
-   DPU_ERROR("[%u]device is NULL\n", pipe);
-   goto exit;
-   }
-
-   priv = dev->dev_private;
if (!priv) {
DPU_ERROR("[%u]private data is NULL\n", pipe);
goto exit;
-- 
2.19.0.397.gdd90340f6a-goog

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


[Freedreno] [PATCH 2/5] drm/msm/dpu: Clean up plane atomic disable/update

2018-09-19 Thread Bruce Wang
Removes unnecessary checks from dpu_plane_atomic_disable, old_state
argument for both dpu_plane_atomic_disable and
dpu_plane_sspp_atomic_update is removed as it is no longer used.

Signed-off-by: Bruce Wang 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 31 +--
 1 file changed, 7 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index a8d00f57f06a..7f6046166626 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -1157,8 +1157,7 @@ void dpu_plane_set_error(struct drm_plane *plane, bool 
error)
pdpu->is_error = error;
 }
 
-static void dpu_plane_sspp_atomic_update(struct drm_plane *plane,
-struct drm_plane_state *old_state)
+static void dpu_plane_sspp_atomic_update(struct drm_plane *plane)
 {
uint32_t src_flags;
struct dpu_plane *pdpu = to_dpu_plane(plane);
@@ -1271,27 +1270,11 @@ static void dpu_plane_sspp_atomic_update(struct 
drm_plane *plane,
_dpu_plane_set_qos_remap(plane);
 }
 
-static void _dpu_plane_atomic_disable(struct drm_plane *plane,
-   struct drm_plane_state *old_state)
+static void _dpu_plane_atomic_disable(struct drm_plane *plane)
 {
-   struct dpu_plane *pdpu;
-   struct drm_plane_state *state;
-   struct dpu_plane_state *pstate;
-
-   if (!plane) {
-   DPU_ERROR("invalid plane\n");
-   return;
-   } else if (!plane->state) {
-   DPU_ERROR("invalid plane state\n");
-   return;
-   } else if (!old_state) {
-   DPU_ERROR("invalid old state\n");
-   return;
-   }
-
-   pdpu = to_dpu_plane(plane);
-   state = plane->state;
-   pstate = to_dpu_plane_state(state);
+   struct dpu_plane *pdpu = to_dpu_plane(plane);
+   struct drm_plane_state *state = plane->state;
+   struct dpu_plane_state *pstate = to_dpu_plane_state(state);
 
trace_dpu_plane_disable(DRMID(plane), is_dpu_plane_virtual(plane),
pstate->multirect_mode);
@@ -1315,9 +1298,9 @@ static void dpu_plane_atomic_update(struct drm_plane 
*plane,
DPU_DEBUG_PLANE(pdpu, "\n");
 
if (!state->visible) {
-   _dpu_plane_atomic_disable(plane, old_state);
+   _dpu_plane_atomic_disable(plane);
} else {
-   dpu_plane_sspp_atomic_update(plane, old_state);
+   dpu_plane_sspp_atomic_update(plane);
}
 }
 
-- 
2.19.0.397.gdd90340f6a-goog

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


[Freedreno] [PATCH 4/5] drm/msm/dpu: Change _dpu_crtc_power_enable to void

2018-09-19 Thread Bruce Wang
All checks for _dpu_crtc_power_enable are not true, so the function
can never return an error code. All calls of the function have also
been changed so that they don't expect a return value.

Signed-off-by: Bruce Wang 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 35 
 1 file changed, 5 insertions(+), 30 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index 017d16131dac..f0b52281c46f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -60,37 +60,16 @@ static inline struct dpu_kms *_dpu_crtc_get_kms(struct 
drm_crtc *crtc)
return to_dpu_kms(priv->kms);
 }
 
-static inline int _dpu_crtc_power_enable(struct dpu_crtc *dpu_crtc, bool 
enable)
+static inline void _dpu_crtc_power_enable(struct dpu_crtc *dpu_crtc, bool 
enable)
 {
-   struct drm_crtc *crtc;
-   struct msm_drm_private *priv;
-   struct dpu_kms *dpu_kms;
-
-   if (!dpu_crtc) {
-   DPU_ERROR("invalid dpu crtc\n");
-   return -EINVAL;
-   }
-
-   crtc = _crtc->base;
-   if (!crtc->dev || !crtc->dev->dev_private) {
-   DPU_ERROR("invalid drm device\n");
-   return -EINVAL;
-   }
-
-   priv = crtc->dev->dev_private;
-   if (!priv->kms) {
-   DPU_ERROR("invalid kms\n");
-   return -EINVAL;
-   }
-
-   dpu_kms = to_dpu_kms(priv->kms);
+   struct drm_crtc *crtc = _crtc->base;
+   struct msm_drm_private *priv = crtc->dev->dev_private;
+   struct dpu_kms *dpu_kms = to_dpu_kms(priv->kms);
 
if (enable)
pm_runtime_get_sync(_kms->pdev->dev);
else
pm_runtime_put_sync(_kms->pdev->dev);
-
-   return 0;
 }
 
 static void dpu_crtc_destroy(struct drm_crtc *crtc)
@@ -849,14 +828,10 @@ static int _dpu_crtc_vblank_enable_no_lock(
dev = crtc->dev;
 
if (enable) {
-   int ret;
-
/* drop lock since power crtc cb may try to re-acquire lock */
mutex_unlock(_crtc->crtc_lock);
-   ret = _dpu_crtc_power_enable(dpu_crtc, true);
+   _dpu_crtc_power_enable(dpu_crtc, true);
mutex_lock(_crtc->crtc_lock);
-   if (ret)
-   return ret;
 
list_for_each_entry(enc, >mode_config.encoder_list, head) {
if (enc->crtc != crtc)
-- 
2.19.0.397.gdd90340f6a-goog

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


[Freedreno] [PATCH 0/5] drm/msm/dpu: Clean up dpu code

2018-09-19 Thread Bruce Wang
Removes unneeded checks and unused variables. Changes some
functions that do not need return values to void.

Bruce Wang (5):
  [patch 1/5] drm/msm/dpu: Remove unneeded checks from dpu_plane
  [patch 2/5] drm/msm/dpu: Clean up plane atomic disable/update
  [patch 3/5] drm/msm/dpu: Remove impossible checks
  [patch 4/5] drm/msm/dpu: Change _dpu_crtc_power_enable to void
  [patch 5/5] drm/msm/dpu: Change _dpu_crtc_vblank_enable_no_lock to
void

 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c  | 198 +++---
 drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 100 ++-
 2 files changed, 42 insertions(+), 256 deletions(-)

-- 
2.19.0.397.gdd90340f6a-goog

___
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno


[Freedreno] [PATCH 5/5] drm/msm/dpu: Change _dpu_crtc_vblank_enable_no_lock to void

2018-09-19 Thread Bruce Wang
Removes redundant tests for _dpu_crtc_vblank_enable_no_lock.
Function return type is now void and all function calls have
been changed accordingly.

Signed-off-by: Bruce Wang 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 42 
 1 file changed, 7 insertions(+), 35 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index f0b52281c46f..8ce24a85e70b 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -809,24 +809,14 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)
  * _dpu_crtc_vblank_enable_no_lock - update power resource and vblank request
  * @dpu_crtc: Pointer to dpu crtc structure
  * @enable: Whether to enable/disable vblanks
- *
- * @Return: error code
  */
-static int _dpu_crtc_vblank_enable_no_lock(
+static void _dpu_crtc_vblank_enable_no_lock(
struct dpu_crtc *dpu_crtc, bool enable)
 {
-   struct drm_device *dev;
-   struct drm_crtc *crtc;
+   struct drm_crtc *crtc = _crtc->base;
+   struct drm_device *dev = crtc->dev;
struct drm_encoder *enc;
 
-   if (!dpu_crtc) {
-   DPU_ERROR("invalid crtc\n");
-   return -EINVAL;
-   }
-
-   crtc = _crtc->base;
-   dev = crtc->dev;
-
if (enable) {
/* drop lock since power crtc cb may try to re-acquire lock */
mutex_unlock(_crtc->crtc_lock);
@@ -861,8 +851,6 @@ static int _dpu_crtc_vblank_enable_no_lock(
_dpu_crtc_power_enable(dpu_crtc, false);
mutex_lock(_crtc->crtc_lock);
}
-
-   return 0;
 }
 
 /**
@@ -873,7 +861,6 @@ static int _dpu_crtc_vblank_enable_no_lock(
 static void _dpu_crtc_set_suspend(struct drm_crtc *crtc, bool enable)
 {
struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
-   int ret = 0;
 
DRM_DEBUG_KMS("crtc%d suspend = %d\n", crtc->base.id, enable);
 
@@ -888,10 +875,7 @@ static void _dpu_crtc_set_suspend(struct drm_crtc *crtc, 
bool enable)
DPU_DEBUG("crtc%d suspend already set to %d, ignoring update\n",
crtc->base.id, enable);
else if (dpu_crtc->enabled && dpu_crtc->vblank_requested) {
-   ret = _dpu_crtc_vblank_enable_no_lock(dpu_crtc, !enable);
-   if (ret)
-   DPU_ERROR("%s vblank enable failed: %d\n",
-   dpu_crtc->name, ret);
+   _dpu_crtc_vblank_enable_no_lock(dpu_crtc, !enable);
}
 
dpu_crtc->suspend = enable;
@@ -1000,7 +984,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc)
struct drm_display_mode *mode;
struct drm_encoder *encoder;
struct msm_drm_private *priv;
-   int ret;
unsigned long flags;
 
if (!crtc || !crtc->dev || !crtc->dev->dev_private || !crtc->state) {
@@ -1031,10 +1014,7 @@ static void dpu_crtc_disable(struct drm_crtc *crtc)
trace_dpu_crtc_disable(DRMID(crtc), false, dpu_crtc);
if (dpu_crtc->enabled && !dpu_crtc->suspend &&
dpu_crtc->vblank_requested) {
-   ret = _dpu_crtc_vblank_enable_no_lock(dpu_crtc, false);
-   if (ret)
-   DPU_ERROR("%s vblank enable failed: %d\n",
-   dpu_crtc->name, ret);
+   _dpu_crtc_vblank_enable_no_lock(dpu_crtc, false);
}
dpu_crtc->enabled = false;
 
@@ -1080,7 +1060,6 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,
struct dpu_crtc *dpu_crtc;
struct drm_encoder *encoder;
struct msm_drm_private *priv;
-   int ret;
 
if (!crtc || !crtc->dev || !crtc->dev->dev_private) {
DPU_ERROR("invalid crtc\n");
@@ -1102,10 +1081,7 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,
trace_dpu_crtc_enable(DRMID(crtc), true, dpu_crtc);
if (!dpu_crtc->enabled && !dpu_crtc->suspend &&
dpu_crtc->vblank_requested) {
-   ret = _dpu_crtc_vblank_enable_no_lock(dpu_crtc, true);
-   if (ret)
-   DPU_ERROR("%s vblank enable failed: %d\n",
-   dpu_crtc->name, ret);
+   _dpu_crtc_vblank_enable_no_lock(dpu_crtc, true);
}
dpu_crtc->enabled = true;
 
@@ -1360,7 +1336,6 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
 int dpu_crtc_vblank(struct drm_crtc *crtc, bool en)
 {
struct dpu_crtc *dpu_crtc;
-   int ret;
 
if (!crtc) {
DPU_ERROR("invalid crtc\n");
@@ -1371,10 +1346,7 @@ int dpu_crtc_vblank(struct drm_crtc *crtc, bool en)
mutex_lock(_crtc->crtc_lock);
trace_dpu_crtc_vblank(DRMID(_crtc->base), en, dpu_crtc);
if (dpu_crtc->enabled && !dpu_crtc->suspend) {
-   ret = _dpu_crtc_vblank_enable_no_lock(dpu_crtc, en);
-   if (ret)
-   

[Freedreno] [PATCH 3/5] drm/msm/dpu: Remove impossible checks

2018-09-19 Thread Bruce Wang
Removes additional impossible checks in dpu_plane.c and dpu_crtc.c.
Variable assignments are moved up to be initializations where
possible. Some variables are no longer used, these are removed.

Signed-off-by: Bruce Wang 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c  | 121 +++---
 drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c |  16 +--
 2 files changed, 17 insertions(+), 120 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index a8f2dd7a37c7..017d16131dac 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -55,17 +55,7 @@ static inline int _dpu_crtc_get_mixer_width(struct 
dpu_crtc_state *cstate,
 
 static inline struct dpu_kms *_dpu_crtc_get_kms(struct drm_crtc *crtc)
 {
-   struct msm_drm_private *priv;
-
-   if (!crtc || !crtc->dev || !crtc->dev->dev_private) {
-   DPU_ERROR("invalid crtc\n");
-   return NULL;
-   }
-   priv = crtc->dev->dev_private;
-   if (!priv || !priv->kms) {
-   DPU_ERROR("invalid kms\n");
-   return NULL;
-   }
+   struct msm_drm_private *priv = crtc->dev->dev_private;
 
return to_dpu_kms(priv->kms);
 }
@@ -177,28 +167,17 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc 
*crtc,
struct drm_plane *plane;
struct drm_framebuffer *fb;
struct drm_plane_state *state;
-   struct dpu_crtc_state *cstate;
+   struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
struct dpu_plane_state *pstate = NULL;
struct dpu_format *format;
-   struct dpu_hw_ctl *ctl;
-   struct dpu_hw_mixer *lm;
-   struct dpu_hw_stage_cfg *stage_cfg;
+   struct dpu_hw_ctl *ctl = mixer->lm_ctl;
+   struct dpu_hw_stage_cfg *stage_cfg = _crtc->stage_cfg;
 
u32 flush_mask;
uint32_t stage_idx, lm_idx;
int zpos_cnt[DPU_STAGE_MAX + 1] = { 0 };
bool bg_alpha_enable = false;
 
-   if (!dpu_crtc || !mixer) {
-   DPU_ERROR("invalid dpu_crtc or mixer\n");
-   return;
-   }
-
-   ctl = mixer->lm_ctl;
-   lm = mixer->hw_lm;
-   stage_cfg = _crtc->stage_cfg;
-   cstate = to_dpu_crtc_state(crtc->state);
-
drm_atomic_crtc_for_each_plane(plane, crtc) {
state = plane->state;
if (!state)
@@ -217,10 +196,6 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc 
*crtc,
state->fb ? state->fb->base.id : -1);
 
format = to_dpu_format(msm_framebuffer_format(pstate->base.fb));
-   if (!format) {
-   DPU_ERROR("invalid format\n");
-   return;
-   }
 
if (pstate->stage == DPU_STAGE_BASE && format->alpha_enable)
bg_alpha_enable = true;
@@ -261,21 +236,13 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc 
*crtc,
  */
 static void _dpu_crtc_blend_setup(struct drm_crtc *crtc)
 {
-   struct dpu_crtc *dpu_crtc;
-   struct dpu_crtc_state *cstate;
-   struct dpu_crtc_mixer *mixer;
+   struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
+   struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
+   struct dpu_crtc_mixer *mixer = cstate->mixers;
struct dpu_hw_ctl *ctl;
struct dpu_hw_mixer *lm;
-
int i;
 
-   if (!crtc)
-   return;
-
-   dpu_crtc = to_dpu_crtc(crtc);
-   cstate = to_dpu_crtc_state(crtc->state);
-   mixer = cstate->mixers;
-
DPU_DEBUG("%s\n", dpu_crtc->name);
 
for (i = 0; i < cstate->num_mixers; i++) {
@@ -377,7 +344,6 @@ static void dpu_crtc_vblank_cb(void *data)
 
 static void dpu_crtc_frame_event_work(struct kthread_work *work)
 {
-   struct msm_drm_private *priv;
struct dpu_crtc_frame_event *fevent;
struct drm_crtc *crtc;
struct dpu_crtc *dpu_crtc;
@@ -400,11 +366,6 @@ static void dpu_crtc_frame_event_work(struct kthread_work 
*work)
dpu_crtc = to_dpu_crtc(crtc);
 
dpu_kms = _dpu_crtc_get_kms(crtc);
-   if (!dpu_kms) {
-   DPU_ERROR("invalid kms handle\n");
-   return;
-   }
-   priv = dpu_kms->dev->dev_private;
DPU_ATRACE_BEGIN("crtc_frame_event");
 
DRM_DEBUG_KMS("crtc%d event:%u ts:%lld\n", crtc->base.id, fevent->event,
@@ -470,11 +431,6 @@ static void dpu_crtc_frame_event_cb(void *data, u32 event)
unsigned long flags;
u32 crtc_id;
 
-   if (!crtc || !crtc->dev || !crtc->dev->dev_private) {
-   DPU_ERROR("invalid parameters\n");
-   return;
-   }
-
/* Nothing to do on idle event */
if (event & DPU_ENCODER_FRAME_EVENT_IDLE)
return;
@@ -583,23 +539,12 @@ static void _dpu_crtc_setup_mixers(struct drm_crtc *crtc)
 static void _dpu_crtc_setup_lm_bounds(struct drm_crtc *crtc,
struct