Commit 5b90752f authored by Dmitry Baryshkov's avatar Dmitry Baryshkov

drm/msm/dpu: remove CRTC frame event callback registration

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().
Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: default avatarAbhinav Kumar <quic_abhinavk@quicinc.com>
Patchwork: https://patchwork.freedesktop.org/patch/600751/
Link: https://lore.kernel.org/r/20240625-dpu-no-crtc-register-v3-1-1b161df13776@linaro.org
parent 2df01619
...@@ -658,18 +658,18 @@ static void dpu_crtc_frame_event_work(struct kthread_work *work) ...@@ -658,18 +658,18 @@ static void dpu_crtc_frame_event_work(struct kthread_work *work)
DPU_ATRACE_END("crtc_frame_event"); DPU_ATRACE_END("crtc_frame_event");
} }
/* /**
* dpu_crtc_frame_event_cb - crtc frame event callback API. CRTC module * dpu_crtc_frame_event_cb - crtc frame event callback API
* registers this API to encoder for all frame event callbacks like * @crtc: Pointer to crtc
* frame_error, frame_done, idle_timeout, etc. Encoder may call different events * @event: Event to process
* from different context - IRQ, user thread, commit_thread, etc. Each event *
* should be carefully reviewed and should be processed in proper task context * Encoder may call this for different events from different context - IRQ,
* to avoid schedulin delay or properly manage the irq context's bottom half * user thread, commit_thread, etc. Each event should be carefully reviewed and
* processing. * 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 dpu_crtc *dpu_crtc;
struct msm_drm_private *priv; struct msm_drm_private *priv;
struct dpu_crtc_frame_event *fevent; struct dpu_crtc_frame_event *fevent;
...@@ -1091,9 +1091,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc, ...@@ -1091,9 +1091,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc,
dpu_core_perf_crtc_update(crtc, 0); dpu_core_perf_crtc_update(crtc, 0);
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)); memset(cstate->mixers, 0, sizeof(cstate->mixers));
cstate->num_mixers = 0; cstate->num_mixers = 0;
...@@ -1132,8 +1129,6 @@ static void dpu_crtc_enable(struct drm_crtc *crtc, ...@@ -1132,8 +1129,6 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,
*/ */
if (dpu_encoder_get_intf_mode(encoder) == INTF_MODE_VIDEO) if (dpu_encoder_get_intf_mode(encoder) == INTF_MODE_VIDEO)
request_bandwidth = true; request_bandwidth = true;
dpu_encoder_register_frame_event_callback(encoder,
dpu_crtc_frame_event_cb, (void *)crtc);
} }
if (request_bandwidth) if (request_bandwidth)
......
...@@ -300,4 +300,6 @@ static inline enum dpu_crtc_client_type dpu_crtc_get_client_type( ...@@ -300,4 +300,6 @@ static inline enum dpu_crtc_client_type dpu_crtc_get_client_type(
return crtc && crtc->state ? RT_CLIENT : NRT_CLIENT; return crtc && crtc->state ? RT_CLIENT : NRT_CLIENT;
} }
void dpu_crtc_frame_event_cb(struct drm_crtc *crtc, u32 event);
#endif /* _DPU_CRTC_H_ */ #endif /* _DPU_CRTC_H_ */
...@@ -151,8 +151,6 @@ enum dpu_enc_rc_states { ...@@ -151,8 +151,6 @@ enum dpu_enc_rc_states {
* @frame_busy_mask: Bitmask tracking which phys_enc we are still * @frame_busy_mask: Bitmask tracking which phys_enc we are still
* busy processing current command. * busy processing current command.
* Bit0 = phys_encs[0] etc. * 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_timeout_ms: frame done timeout in ms
* @frame_done_timeout_cnt: atomic counter tracking the number of frame * @frame_done_timeout_cnt: atomic counter tracking the number of frame
* done timeouts * done timeouts
...@@ -192,8 +190,6 @@ struct dpu_encoder_virt { ...@@ -192,8 +190,6 @@ struct dpu_encoder_virt {
struct mutex enc_lock; struct mutex enc_lock;
DECLARE_BITMAP(frame_busy_mask, MAX_PHYS_ENCODERS_PER_VIRTUAL); 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; atomic_t frame_done_timeout_ms;
atomic_t frame_done_timeout_cnt; atomic_t frame_done_timeout_cnt;
...@@ -1453,28 +1449,6 @@ void dpu_encoder_toggle_vblank_for_crtc(struct drm_encoder *drm_enc, ...@@ -1453,28 +1449,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( void dpu_encoder_frame_done_callback(
struct drm_encoder *drm_enc, struct drm_encoder *drm_enc,
struct dpu_encoder_phys *ready_phys, u32 event) struct dpu_encoder_phys *ready_phys, u32 event)
...@@ -1514,15 +1488,12 @@ void dpu_encoder_frame_done_callback( ...@@ -1514,15 +1488,12 @@ void dpu_encoder_frame_done_callback(
dpu_encoder_resource_control(drm_enc, dpu_encoder_resource_control(drm_enc,
DPU_ENC_RC_EVENT_FRAME_DONE); DPU_ENC_RC_EVENT_FRAME_DONE);
if (dpu_enc->crtc_frame_event_cb) if (dpu_enc->crtc)
dpu_enc->crtc_frame_event_cb( dpu_crtc_frame_event_cb(dpu_enc->crtc, event);
dpu_enc->crtc_frame_event_cb_data,
event);
} }
} else { } else {
if (dpu_enc->crtc_frame_event_cb) if (dpu_enc->crtc)
dpu_enc->crtc_frame_event_cb( dpu_crtc_frame_event_cb(dpu_enc->crtc, event);
dpu_enc->crtc_frame_event_cb_data, event);
} }
} }
...@@ -2455,7 +2426,7 @@ static void dpu_encoder_frame_done_timeout(struct timer_list *t) ...@@ -2455,7 +2426,7 @@ static void dpu_encoder_frame_done_timeout(struct timer_list *t)
return; 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", DRM_DEBUG_KMS("id:%u invalid timeout frame_busy_mask=%lu\n",
DRMID(drm_enc), dpu_enc->frame_busy_mask[0]); DRMID(drm_enc), dpu_enc->frame_busy_mask[0]);
return; return;
...@@ -2471,7 +2442,7 @@ static void dpu_encoder_frame_done_timeout(struct timer_list *t) ...@@ -2471,7 +2442,7 @@ static void dpu_encoder_frame_done_timeout(struct timer_list *t)
event = DPU_ENCODER_FRAME_EVENT_ERROR; event = DPU_ENCODER_FRAME_EVENT_ERROR;
trace_dpu_enc_frame_done_timeout(DRMID(drm_enc), event); 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 = { static const struct drm_encoder_helper_funcs dpu_encoder_helper_funcs = {
......
...@@ -54,16 +54,6 @@ void dpu_encoder_assign_crtc(struct drm_encoder *encoder, ...@@ -54,16 +54,6 @@ void dpu_encoder_assign_crtc(struct drm_encoder *encoder,
void dpu_encoder_toggle_vblank_for_crtc(struct drm_encoder *encoder, void dpu_encoder_toggle_vblank_for_crtc(struct drm_encoder *encoder,
struct drm_crtc *crtc, bool enable); 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 * dpu_encoder_prepare_for_kickoff - schedule double buffer flip of the ctl
* path (i.e. ctl flush and start) at next appropriate time. * path (i.e. ctl flush and start) at next appropriate time.
......
...@@ -354,10 +354,6 @@ DEFINE_EVENT(dpu_enc_id_enable_template, dpu_enc_vblank_cb, ...@@ -354,10 +354,6 @@ DEFINE_EVENT(dpu_enc_id_enable_template, dpu_enc_vblank_cb,
TP_PROTO(uint32_t drm_id, bool enable), TP_PROTO(uint32_t drm_id, bool enable),
TP_ARGS(drm_id, 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, DEFINE_EVENT(dpu_enc_id_enable_template, dpu_enc_phys_cmd_connect_te,
TP_PROTO(uint32_t drm_id, bool enable), TP_PROTO(uint32_t drm_id, bool enable),
TP_ARGS(drm_id, enable) TP_ARGS(drm_id, enable)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment