drm/msm/dpu: remove dpu_encoder_virt_ops
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Mon, 2 Jan 2023 15:47:47 +0000 (17:47 +0200)
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Wed, 18 Jan 2023 01:26:27 +0000 (03:26 +0200)
Struct dpu_encoder_virt_ops is used to provide several callbacks to the
phys_enc backends. However these ops are static and are not supposed to
change in the foreseeble future. Drop the indirection and call
corresponding functions directly.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
Patchwork: https://patchwork.freedesktop.org/patch/516518/
Link: https://lore.kernel.org/r/20230102154748.951328-1-dmitry.baryshkov@linaro.org
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c

index 19fb20a..d1a528f 100644 (file)
@@ -340,9 +340,7 @@ void dpu_encoder_helper_report_irq_timeout(struct dpu_encoder_phys *phys_enc,
                        phys_enc->intf_idx - INTF_0, phys_enc->wb_idx - WB_0,
                        phys_enc->hw_pp->idx - PINGPONG_0, intr_idx);
 
-       if (phys_enc->parent_ops->handle_frame_done)
-               phys_enc->parent_ops->handle_frame_done(
-                               phys_enc->parent, phys_enc,
+       dpu_encoder_frame_done_callback(phys_enc->parent, phys_enc,
                                DPU_ENCODER_FRAME_EVENT_ERROR);
 }
 
@@ -1283,7 +1281,7 @@ static enum dpu_wb dpu_encoder_get_wb(const struct dpu_mdss_cfg *catalog,
        return WB_MAX;
 }
 
-static void dpu_encoder_vblank_callback(struct drm_encoder *drm_enc,
+void dpu_encoder_vblank_callback(struct drm_encoder *drm_enc,
                struct dpu_encoder_phys *phy_enc)
 {
        struct dpu_encoder_virt *dpu_enc = NULL;
@@ -1305,7 +1303,7 @@ static void dpu_encoder_vblank_callback(struct drm_encoder *drm_enc,
        DPU_ATRACE_END("encoder_vblank_callback");
 }
 
-static void dpu_encoder_underrun_callback(struct drm_encoder *drm_enc,
+void dpu_encoder_underrun_callback(struct drm_encoder *drm_enc,
                struct dpu_encoder_phys *phy_enc)
 {
        if (!phy_enc)
@@ -1381,7 +1379,7 @@ void dpu_encoder_register_frame_event_callback(struct drm_encoder *drm_enc,
        spin_unlock_irqrestore(&dpu_enc->enc_spinlock, lock_flags);
 }
 
-static void dpu_encoder_frame_done_callback(
+void dpu_encoder_frame_done_callback(
                struct drm_encoder *drm_enc,
                struct dpu_encoder_phys *ready_phys, u32 event)
 {
@@ -2235,12 +2233,6 @@ static int dpu_encoder_virt_add_phys_encs(
        return 0;
 }
 
-static const struct dpu_encoder_virt_ops dpu_encoder_parent_ops = {
-       .handle_vblank_virt = dpu_encoder_vblank_callback,
-       .handle_underrun_virt = dpu_encoder_underrun_callback,
-       .handle_frame_done = dpu_encoder_frame_done_callback,
-};
-
 static int dpu_encoder_setup_display(struct dpu_encoder_virt *dpu_enc,
                                 struct dpu_kms *dpu_kms,
                                 struct msm_display_info *disp_info)
@@ -2260,7 +2252,6 @@ static int dpu_encoder_setup_display(struct dpu_encoder_virt *dpu_enc,
        memset(&phys_params, 0, sizeof(phys_params));
        phys_params.dpu_kms = dpu_kms;
        phys_params.parent = &dpu_enc->base;
-       phys_params.parent_ops = &dpu_encoder_parent_ops;
        phys_params.enc_spinlock = &dpu_enc->enc_spinlock;
 
        switch (disp_info->intf_type) {
index f2af07d..1d434b2 100644 (file)
@@ -60,25 +60,6 @@ enum dpu_enc_enable_state {
 
 struct dpu_encoder_phys;
 
-/**
- * struct dpu_encoder_virt_ops - Interface the containing virtual encoder
- *     provides for the physical encoders to use to callback.
- * @handle_vblank_virt:        Notify virtual encoder of vblank IRQ reception
- *                     Note: This is called from IRQ handler context.
- * @handle_underrun_virt: Notify virtual encoder of underrun IRQ reception
- *                     Note: This is called from IRQ handler context.
- * @handle_frame_done: Notify virtual encoder that this phys encoder
- *                     completes last request frame.
- */
-struct dpu_encoder_virt_ops {
-       void (*handle_vblank_virt)(struct drm_encoder *,
-                       struct dpu_encoder_phys *phys);
-       void (*handle_underrun_virt)(struct drm_encoder *,
-                       struct dpu_encoder_phys *phys);
-       void (*handle_frame_done)(struct drm_encoder *,
-                       struct dpu_encoder_phys *phys, u32 event);
-};
-
 /**
  * struct dpu_encoder_phys_ops - Interface the physical encoders provide to
  *     the containing virtual encoder.
@@ -199,7 +180,6 @@ enum dpu_intr_idx {
 struct dpu_encoder_phys {
        struct drm_encoder *parent;
        struct dpu_encoder_phys_ops ops;
-       const struct dpu_encoder_virt_ops *parent_ops;
        struct dpu_hw_mdp *hw_mdptop;
        struct dpu_hw_ctl *hw_ctl;
        struct dpu_hw_pingpong *hw_pp;
@@ -283,7 +263,6 @@ struct dpu_encoder_phys_cmd {
 struct dpu_enc_phys_init_params {
        struct dpu_kms *dpu_kms;
        struct drm_encoder *parent;
-       const struct dpu_encoder_virt_ops *parent_ops;
        enum dpu_enc_split_role split_role;
        enum dpu_intf intf_idx;
        enum dpu_wb wb_idx;
@@ -400,4 +379,30 @@ int dpu_encoder_helper_wait_for_irq(struct dpu_encoder_phys *phys_enc,
  */
 void dpu_encoder_helper_phys_cleanup(struct dpu_encoder_phys *phys_enc);
 
+/**
+ * dpu_encoder_vblank_callback - Notify virtual encoder of vblank IRQ reception
+ * @drm_enc:    Pointer to drm encoder structure
+ * @phys_enc:  Pointer to physical encoder
+ * Note: This is called from IRQ handler context.
+ */
+void dpu_encoder_vblank_callback(struct drm_encoder *drm_enc,
+                                struct dpu_encoder_phys *phy_enc);
+
+/** dpu_encoder_underrun_callback - Notify virtual encoder of underrun IRQ reception
+ * @drm_enc:    Pointer to drm encoder structure
+ * @phys_enc:  Pointer to physical encoder
+ * Note: This is called from IRQ handler context.
+ */
+void dpu_encoder_underrun_callback(struct drm_encoder *drm_enc,
+                                  struct dpu_encoder_phys *phy_enc);
+
+/** dpu_encoder_frame_done_callback -- Notify virtual encoder that this phys encoder completes last request frame
+ * @drm_enc:    Pointer to drm encoder structure
+ * @phys_enc:  Pointer to physical encoder
+ * @event:     Event to process
+ */
+void dpu_encoder_frame_done_callback(
+               struct drm_encoder *drm_enc,
+               struct dpu_encoder_phys *ready_phys, u32 event);
+
 #endif /* __dpu_encoder_phys_H__ */
index 35791f9..c8f4a62 100644 (file)
@@ -84,9 +84,7 @@ static void dpu_encoder_phys_cmd_pp_tx_done_irq(void *arg, int irq_idx)
 
        DPU_ATRACE_BEGIN("pp_done_irq");
        /* notify all synchronous clients first, then asynchronous clients */
-       if (phys_enc->parent_ops->handle_frame_done)
-               phys_enc->parent_ops->handle_frame_done(phys_enc->parent,
-                               phys_enc, event);
+       dpu_encoder_frame_done_callback(phys_enc->parent, phys_enc, event);
 
        spin_lock_irqsave(phys_enc->enc_spinlock, lock_flags);
        new_cnt = atomic_add_unless(&phys_enc->pending_kickoff_cnt, -1, 0);
@@ -112,9 +110,7 @@ static void dpu_encoder_phys_cmd_pp_rd_ptr_irq(void *arg, int irq_idx)
        DPU_ATRACE_BEGIN("rd_ptr_irq");
        cmd_enc = to_dpu_encoder_phys_cmd(phys_enc);
 
-       if (phys_enc->parent_ops->handle_vblank_virt)
-               phys_enc->parent_ops->handle_vblank_virt(phys_enc->parent,
-                       phys_enc);
+       dpu_encoder_vblank_callback(phys_enc->parent, phys_enc);
 
        atomic_add_unless(&cmd_enc->pending_vblank_cnt, -1, 0);
        wake_up_all(&cmd_enc->pending_vblank_wq);
@@ -138,9 +134,7 @@ static void dpu_encoder_phys_cmd_underrun_irq(void *arg, int irq_idx)
 {
        struct dpu_encoder_phys *phys_enc = arg;
 
-       if (phys_enc->parent_ops->handle_underrun_virt)
-               phys_enc->parent_ops->handle_underrun_virt(phys_enc->parent,
-                       phys_enc);
+       dpu_encoder_underrun_callback(phys_enc->parent, phys_enc);
 }
 
 static void dpu_encoder_phys_cmd_atomic_mode_set(
@@ -203,9 +197,7 @@ static int _dpu_encoder_phys_cmd_handle_ppdone_timeout(
        /* request a ctl reset before the next kickoff */
        phys_enc->enable_state = DPU_ENC_ERR_NEEDS_HW_RESET;
 
-       if (phys_enc->parent_ops->handle_frame_done)
-               phys_enc->parent_ops->handle_frame_done(
-                               drm_enc, phys_enc, frame_event);
+       dpu_encoder_frame_done_callback(phys_enc->parent, phys_enc, frame_event);
 
        return -ETIMEDOUT;
 }
@@ -781,7 +773,6 @@ struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
 
        dpu_encoder_phys_cmd_init_ops(&phys_enc->ops);
        phys_enc->parent = p->parent;
-       phys_enc->parent_ops = p->parent_ops;
        phys_enc->dpu_kms = p->dpu_kms;
        phys_enc->split_role = p->split_role;
        phys_enc->intf_mode = INTF_MODE_CMD;
index 8f64351..fe82a86 100644 (file)
@@ -308,9 +308,7 @@ static void dpu_encoder_phys_vid_vblank_irq(void *arg, int irq_idx)
 
        DPU_ATRACE_BEGIN("vblank_irq");
 
-       if (phys_enc->parent_ops->handle_vblank_virt)
-               phys_enc->parent_ops->handle_vblank_virt(phys_enc->parent,
-                               phys_enc);
+       dpu_encoder_vblank_callback(phys_enc->parent, phys_enc);
 
        atomic_read(&phys_enc->pending_kickoff_cnt);
 
@@ -330,7 +328,7 @@ static void dpu_encoder_phys_vid_vblank_irq(void *arg, int irq_idx)
        /* Signal any waiting atomic commit thread */
        wake_up_all(&phys_enc->pending_kickoff_wq);
 
-       phys_enc->parent_ops->handle_frame_done(phys_enc->parent, phys_enc,
+       dpu_encoder_frame_done_callback(phys_enc->parent, phys_enc,
                        DPU_ENCODER_FRAME_EVENT_DONE);
 
        DPU_ATRACE_END("vblank_irq");
@@ -340,9 +338,7 @@ static void dpu_encoder_phys_vid_underrun_irq(void *arg, int irq_idx)
 {
        struct dpu_encoder_phys *phys_enc = arg;
 
-       if (phys_enc->parent_ops->handle_underrun_virt)
-               phys_enc->parent_ops->handle_underrun_virt(phys_enc->parent,
-                       phys_enc);
+       dpu_encoder_underrun_callback(phys_enc->parent, phys_enc);
 }
 
 static bool dpu_encoder_phys_vid_needs_single_flush(
@@ -698,7 +694,6 @@ struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
 
        dpu_encoder_phys_vid_init_ops(&phys_enc->ops);
        phys_enc->parent = p->parent;
-       phys_enc->parent_ops = p->parent_ops;
        phys_enc->dpu_kms = p->dpu_kms;
        phys_enc->split_role = p->split_role;
        phys_enc->intf_mode = INTF_MODE_VIDEO;
index 62f6ff6..95921ef 100644 (file)
@@ -364,13 +364,9 @@ static void _dpu_encoder_phys_wb_frame_done_helper(void *arg)
 
        DPU_DEBUG("[wb:%d]\n", hw_wb->idx - WB_0);
 
-       if (phys_enc->parent_ops->handle_frame_done)
-               phys_enc->parent_ops->handle_frame_done(phys_enc->parent,
-                               phys_enc, event);
+       dpu_encoder_frame_done_callback(phys_enc->parent, phys_enc, event);
 
-       if (phys_enc->parent_ops->handle_vblank_virt)
-               phys_enc->parent_ops->handle_vblank_virt(phys_enc->parent,
-                               phys_enc);
+       dpu_encoder_vblank_callback(phys_enc->parent, phys_enc);
 
        spin_lock_irqsave(phys_enc->enc_spinlock, lock_flags);
        atomic_add_unless(&phys_enc->pending_kickoff_cnt, -1, 0);
@@ -440,9 +436,7 @@ static void _dpu_encoder_phys_wb_handle_wbdone_timeout(
        if (wb_enc->wb_conn)
                drm_writeback_signal_completion(wb_enc->wb_conn, 0);
 
-       if (phys_enc->parent_ops->handle_frame_done)
-               phys_enc->parent_ops->handle_frame_done(
-                               phys_enc->parent, phys_enc, frame_event);
+       dpu_encoder_frame_done_callback(phys_enc->parent, phys_enc, frame_event);
 }
 
 /**
@@ -722,7 +716,6 @@ struct dpu_encoder_phys *dpu_encoder_phys_wb_init(
 
        dpu_encoder_phys_wb_init_ops(&phys_enc->ops);
        phys_enc->parent = p->parent;
-       phys_enc->parent_ops = p->parent_ops;
        phys_enc->dpu_kms = p->dpu_kms;
        phys_enc->split_role = p->split_role;
        phys_enc->intf_mode = INTF_MODE_WB_LINE;