[Freedreno] [PATCH 2/2] drm/msm/dpu: remove CRTC frame event callback registration

Abhinav Kumar quic_abhinavk at quicinc.com
Sat Jan 14 00:49:37 UTC 2023



On 1/2/2023 7:47 AM, Dmitry Baryshkov wrote:
> The frame event callback is always set to dpu_crtc_frame_event_cb() (or
> to NULL) and the data is always either the CRTC itself or NULL
> (correpondingly). Thus drop the event callback registration, call the
> dpu_crtc_frame_event_cb() directly and gate on the dpu_enc->crtc
> assigned using dpu_encoder_assign_crtc().

I suggest you wait till we sort out the PSR series for this, especially 
this patch https://patchwork.freedesktop.org/patch/515787/

There is going to be some change in this code when PSR is pushed again 
sometime early next week because PSR will touch the crtc assignment code 
(dpu_enc->crtc),

Based on how we all like that patch, we can get back to this one as this 
one is a minor cleanup.

> 
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
> ---
>   drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c    | 17 +--------
>   drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h    | 14 +++++++
>   drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 41 +++------------------
>   drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 10 -----
>   drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h   |  4 --
>   5 files changed, 21 insertions(+), 65 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> index 13ce321283ff..64cd2ec8a0c4 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> @@ -640,18 +640,8 @@ static void dpu_crtc_frame_event_work(struct kthread_work *work)
>   	DPU_ATRACE_END("crtc_frame_event");
>   }
>   
> -/*
> - * dpu_crtc_frame_event_cb - crtc frame event callback API. CRTC module
> - * registers this API to encoder for all frame event callbacks like
> - * frame_error, frame_done, idle_timeout, etc. Encoder may call different events
> - * from different context - IRQ, user thread, commit_thread, etc. Each event
> - * should be carefully reviewed and should be processed in proper task context
> - * to avoid schedulin delay or properly manage the irq context's bottom half
> - * processing.
> - */
> -static void dpu_crtc_frame_event_cb(void *data, u32 event)
> +void dpu_crtc_frame_event_cb(struct drm_crtc *crtc, u32 event)
>   {
> -	struct drm_crtc *crtc = (struct drm_crtc *)data;
>   	struct dpu_crtc *dpu_crtc;
>   	struct msm_drm_private *priv;
>   	struct dpu_crtc_frame_event *fevent;
> @@ -1051,9 +1041,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc,
>   
>   	dpu_core_perf_crtc_update(crtc, 0, true);
>   
> -	drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask)
> -		dpu_encoder_register_frame_event_callback(encoder, NULL, NULL);
> -
>   	memset(cstate->mixers, 0, sizeof(cstate->mixers));
>   	cstate->num_mixers = 0;
>   
> @@ -1089,8 +1076,6 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,
>   		 */
>   		if (dpu_encoder_get_intf_mode(encoder) == INTF_MODE_VIDEO)
>   			request_bandwidth = true;
> -		dpu_encoder_register_frame_event_callback(encoder,
> -				dpu_crtc_frame_event_cb, (void *)crtc);
>   	}
>   
>   	if (request_bandwidth)
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> index 539b68b1626a..3aa536d95721 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> @@ -300,4 +300,18 @@ static inline enum dpu_crtc_client_type dpu_crtc_get_client_type(
>   	return crtc && crtc->state ? RT_CLIENT : NRT_CLIENT;
>   }
>   
> +/**
> + * dpu_crtc_frame_event_cb - crtc frame event callback API
> + * @crtc: Pointer to crtc
> + * @event: Event to process
> + *
> + * CRTC module registers this API to encoder for all frame event callbacks like
> + * frame_error, frame_done, idle_timeout, etc. Encoder may call different events
> + * from different context - IRQ, user thread, commit_thread, etc. Each event
> + * should be carefully reviewed and should be processed in proper task context
> + * to avoid schedulin delay or properly manage the irq context's bottom half
> + * processing.
> + */
> +void dpu_crtc_frame_event_cb(struct drm_crtc *crtc, u32 event);
> +
>   #endif /* _DPU_CRTC_H_ */
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> index 84f8c8a1b049..bf0af5af4306 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> @@ -147,8 +147,6 @@ enum dpu_enc_rc_states {
>    * @frame_busy_mask:		Bitmask tracking which phys_enc we are still
>    *				busy processing current command.
>    *				Bit0 = phys_encs[0] etc.
> - * @crtc_frame_event_cb:	callback handler for frame event
> - * @crtc_frame_event_cb_data:	callback handler private data
>    * @frame_done_timeout_ms:	frame done timeout in ms
>    * @frame_done_timer:		watchdog timer for frame done event
>    * @vsync_event_timer:		vsync timer
> @@ -187,8 +185,6 @@ struct dpu_encoder_virt {
>   	struct dentry *debugfs_root;
>   	struct mutex enc_lock;
>   	DECLARE_BITMAP(frame_busy_mask, MAX_PHYS_ENCODERS_PER_VIRTUAL);
> -	void (*crtc_frame_event_cb)(void *, u32 event);
> -	void *crtc_frame_event_cb_data;
>   
>   	atomic_t frame_done_timeout_ms;
>   	struct timer_list frame_done_timer;
> @@ -1358,28 +1354,6 @@ void dpu_encoder_toggle_vblank_for_crtc(struct drm_encoder *drm_enc,
>   	}
>   }
>   
> -void dpu_encoder_register_frame_event_callback(struct drm_encoder *drm_enc,
> -		void (*frame_event_cb)(void *, u32 event),
> -		void *frame_event_cb_data)
> -{
> -	struct dpu_encoder_virt *dpu_enc = to_dpu_encoder_virt(drm_enc);
> -	unsigned long lock_flags;
> -	bool enable;
> -
> -	enable = frame_event_cb ? true : false;
> -
> -	if (!drm_enc) {
> -		DPU_ERROR("invalid encoder\n");
> -		return;
> -	}
> -	trace_dpu_enc_frame_event_cb(DRMID(drm_enc), enable);
> -
> -	spin_lock_irqsave(&dpu_enc->enc_spinlock, lock_flags);
> -	dpu_enc->crtc_frame_event_cb = frame_event_cb;
> -	dpu_enc->crtc_frame_event_cb_data = frame_event_cb_data;
> -	spin_unlock_irqrestore(&dpu_enc->enc_spinlock, lock_flags);
> -}
> -
>   void dpu_encoder_frame_done_callback(
>   		struct drm_encoder *drm_enc,
>   		struct dpu_encoder_phys *ready_phys, u32 event)
> @@ -1418,15 +1392,12 @@ void dpu_encoder_frame_done_callback(
>   			dpu_encoder_resource_control(drm_enc,
>   					DPU_ENC_RC_EVENT_FRAME_DONE);
>   
> -			if (dpu_enc->crtc_frame_event_cb)
> -				dpu_enc->crtc_frame_event_cb(
> -					dpu_enc->crtc_frame_event_cb_data,
> -					event);
> +			if (dpu_enc->crtc)
> +				dpu_crtc_frame_event_cb(dpu_enc->crtc, event);
>   		}
>   	} else {
> -		if (dpu_enc->crtc_frame_event_cb)
> -			dpu_enc->crtc_frame_event_cb(
> -				dpu_enc->crtc_frame_event_cb_data, event);
> +		if (dpu_enc->crtc)
> +			dpu_crtc_frame_event_cb(dpu_enc->crtc, event);
>   	}
>   }
>   
> @@ -2367,7 +2338,7 @@ static void dpu_encoder_frame_done_timeout(struct timer_list *t)
>   		return;
>   	}
>   
> -	if (!dpu_enc->frame_busy_mask[0] || !dpu_enc->crtc_frame_event_cb) {
> +	if (!dpu_enc->frame_busy_mask[0] || !dpu_enc->crtc) {
>   		DRM_DEBUG_KMS("id:%u invalid timeout frame_busy_mask=%lu\n",
>   			      DRMID(drm_enc), dpu_enc->frame_busy_mask[0]);
>   		return;
> @@ -2380,7 +2351,7 @@ static void dpu_encoder_frame_done_timeout(struct timer_list *t)
>   
>   	event = DPU_ENCODER_FRAME_EVENT_ERROR;
>   	trace_dpu_enc_frame_done_timeout(DRMID(drm_enc), event);
> -	dpu_enc->crtc_frame_event_cb(dpu_enc->crtc_frame_event_cb_data, event);
> +	dpu_crtc_frame_event_cb(dpu_enc->crtc, event);
>   }
>   
>   static const struct drm_encoder_helper_funcs dpu_encoder_helper_funcs = {
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
> index 9e7236ef34e6..dd9cff4f1606 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
> @@ -57,16 +57,6 @@ void dpu_encoder_assign_crtc(struct drm_encoder *encoder,
>   void dpu_encoder_toggle_vblank_for_crtc(struct drm_encoder *encoder,
>   					struct drm_crtc *crtc, bool enable);
>   
> -/**
> - * dpu_encoder_register_frame_event_callback - provide callback to encoder that
> - *	will be called after the request is complete, or other events.
> - * @encoder:	encoder pointer
> - * @cb:		callback pointer, provide NULL to deregister
> - * @data:	user data provided to callback
> - */
> -void dpu_encoder_register_frame_event_callback(struct drm_encoder *encoder,
> -		void (*cb)(void *, u32), void *data);
> -
>   /**
>    * dpu_encoder_prepare_for_kickoff - schedule double buffer flip of the ctl
>    *	path (i.e. ctl flush and start) at next appropriate time.
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
> index 76169f406505..c75b4363bfc6 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h
> @@ -346,10 +346,6 @@ DEFINE_EVENT(dpu_enc_id_enable_template, dpu_enc_vblank_cb,
>   	TP_PROTO(uint32_t drm_id, bool enable),
>   	TP_ARGS(drm_id, enable)
>   );
> -DEFINE_EVENT(dpu_enc_id_enable_template, dpu_enc_frame_event_cb,
> -	TP_PROTO(uint32_t drm_id, bool enable),
> -	TP_ARGS(drm_id, enable)
> -);
>   DEFINE_EVENT(dpu_enc_id_enable_template, dpu_enc_phys_cmd_connect_te,
>   	TP_PROTO(uint32_t drm_id, bool enable),
>   	TP_ARGS(drm_id, enable)


More information about the Freedreno mailing list