Merge v5.6-rc2 into drm-misc-next
[linux-2.6-microblaze.git] / drivers / gpu / drm / msm / disp / dpu1 / dpu_encoder.c
index 6197261..58d3400 100644 (file)
@@ -58,7 +58,7 @@
 
 #define IDLE_SHORT_TIMEOUT     1
 
-#define MAX_VDISPLAY_SPLIT 1080
+#define MAX_HDISPLAY_SPLIT 1080
 
 /* timeout in frames waiting for frame done */
 #define DPU_ENCODER_FRAME_DONE_TIMEOUT_FRAMES 5
@@ -233,7 +233,7 @@ int dpu_encoder_helper_wait_for_irq(struct dpu_encoder_phys *phys_enc,
        u32 irq_status;
        int ret;
 
-       if (!phys_enc || !wait_info || intr_idx >= INTR_IDX_MAX) {
+       if (!wait_info || intr_idx >= INTR_IDX_MAX) {
                DPU_ERROR("invalid params\n");
                return -EINVAL;
        }
@@ -308,7 +308,7 @@ int dpu_encoder_helper_register_irq(struct dpu_encoder_phys *phys_enc,
        struct dpu_encoder_irq *irq;
        int ret = 0;
 
-       if (!phys_enc || intr_idx >= INTR_IDX_MAX) {
+       if (intr_idx >= INTR_IDX_MAX) {
                DPU_ERROR("invalid params\n");
                return -EINVAL;
        }
@@ -363,10 +363,6 @@ int dpu_encoder_helper_unregister_irq(struct dpu_encoder_phys *phys_enc,
        struct dpu_encoder_irq *irq;
        int ret;
 
-       if (!phys_enc) {
-               DPU_ERROR("invalid encoder\n");
-               return -EINVAL;
-       }
        irq = &phys_enc->irq[intr_idx];
 
        /* silently skip irqs that weren't registered */
@@ -415,7 +411,7 @@ void dpu_encoder_get_hw_resources(struct drm_encoder *drm_enc,
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
 
-               if (phys && phys->ops.get_hw_resources)
+               if (phys->ops.get_hw_resources)
                        phys->ops.get_hw_resources(phys, hw_res);
        }
 }
@@ -438,7 +434,7 @@ static void dpu_encoder_destroy(struct drm_encoder *drm_enc)
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
 
-               if (phys && phys->ops.destroy) {
+               if (phys->ops.destroy) {
                        phys->ops.destroy(phys);
                        --dpu_enc->num_phys_encs;
                        dpu_enc->phys_encs[i] = NULL;
@@ -464,7 +460,7 @@ void dpu_encoder_helper_split_config(
        struct dpu_hw_mdp *hw_mdptop;
        struct msm_display_info *disp_info;
 
-       if (!phys_enc || !phys_enc->hw_mdptop || !phys_enc->parent) {
+       if (!phys_enc->hw_mdptop || !phys_enc->parent) {
                DPU_ERROR("invalid arg(s), encoder %d\n", phys_enc != 0);
                return;
        }
@@ -533,8 +529,23 @@ static struct msm_display_topology dpu_encoder_get_topology(
                if (dpu_enc->phys_encs[i])
                        intf_count++;
 
-       /* User split topology for width > 1080 */
-       topology.num_lm = (mode->vdisplay > MAX_VDISPLAY_SPLIT) ? 2 : 1;
+       /* Datapath topology selection
+        *
+        * Dual display
+        * 2 LM, 2 INTF ( Split display using 2 interfaces)
+        *
+        * Single display
+        * 1 LM, 1 INTF
+        * 2 LM, 1 INTF (stream merge to support high resolution interfaces)
+        *
+        */
+       if (intf_count == 2)
+               topology.num_lm = 2;
+       else if (!dpu_kms->catalog->caps->has_3d_merge)
+               topology.num_lm = 1;
+       else
+               topology.num_lm = (mode->hdisplay > MAX_HDISPLAY_SPLIT) ? 2 : 1;
+
        topology.num_enc = 0;
        topology.num_intf = intf_count;
 
@@ -582,10 +593,10 @@ static int dpu_encoder_virt_atomic_check(
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
 
-               if (phys && phys->ops.atomic_check)
+               if (phys->ops.atomic_check)
                        ret = phys->ops.atomic_check(phys, crtc_state,
                                        conn_state);
-               else if (phys && phys->ops.mode_fixup)
+               else if (phys->ops.mode_fixup)
                        if (!phys->ops.mode_fixup(phys, mode, adj_mode))
                                ret = -EINVAL;
 
@@ -681,7 +692,7 @@ static void _dpu_encoder_irq_control(struct drm_encoder *drm_enc, bool enable)
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
 
-               if (phys && phys->ops.irq_control)
+               if (phys->ops.irq_control)
                        phys->ops.irq_control(phys, enable);
        }
 
@@ -1031,46 +1042,43 @@ static void dpu_encoder_virt_mode_set(struct drm_encoder *drm_enc,
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
 
-               if (phys) {
-                       if (!dpu_enc->hw_pp[i]) {
-                               DPU_ERROR_ENC(dpu_enc, "no pp block assigned"
-                                            "at idx: %d\n", i);
-                               goto error;
-                       }
+               if (!dpu_enc->hw_pp[i]) {
+                       DPU_ERROR_ENC(dpu_enc,
+                               "no pp block assigned at idx: %d\n", i);
+                       goto error;
+               }
 
-                       if (!hw_ctl[i]) {
-                               DPU_ERROR_ENC(dpu_enc, "no ctl block assigned"
-                                            "at idx: %d\n", i);
-                               goto error;
-                       }
+               if (!hw_ctl[i]) {
+                       DPU_ERROR_ENC(dpu_enc,
+                               "no ctl block assigned at idx: %d\n", i);
+                       goto error;
+               }
 
-                       phys->hw_pp = dpu_enc->hw_pp[i];
-                       phys->hw_ctl = hw_ctl[i];
+               phys->hw_pp = dpu_enc->hw_pp[i];
+               phys->hw_ctl = hw_ctl[i];
 
-                       dpu_rm_init_hw_iter(&hw_iter, drm_enc->base.id,
-                                           DPU_HW_BLK_INTF);
-                       for (j = 0; j < MAX_CHANNELS_PER_ENC; j++) {
-                               struct dpu_hw_intf *hw_intf;
+               dpu_rm_init_hw_iter(&hw_iter, drm_enc->base.id,
+                                   DPU_HW_BLK_INTF);
+               for (j = 0; j < MAX_CHANNELS_PER_ENC; j++) {
+                       struct dpu_hw_intf *hw_intf;
 
-                               if (!dpu_rm_get_hw(&dpu_kms->rm, &hw_iter))
-                                       break;
+                       if (!dpu_rm_get_hw(&dpu_kms->rm, &hw_iter))
+                               break;
 
-                               hw_intf = (struct dpu_hw_intf *)hw_iter.hw;
-                               if (hw_intf->idx == phys->intf_idx)
-                                       phys->hw_intf = hw_intf;
-                       }
+                       hw_intf = (struct dpu_hw_intf *)hw_iter.hw;
+                       if (hw_intf->idx == phys->intf_idx)
+                               phys->hw_intf = hw_intf;
+               }
 
-                       if (!phys->hw_intf) {
-                               DPU_ERROR_ENC(dpu_enc,
-                                             "no intf block assigned at idx: %d\n",
-                                             i);
+               if (!phys->hw_intf) {
+                       DPU_ERROR_ENC(dpu_enc,
+                                     "no intf block assigned at idx: %d\n", i);
                                goto error;
-                       }
-
-                       phys->connector = conn->state->connector;
-                       if (phys->ops.mode_set)
-                               phys->ops.mode_set(phys, mode, adj_mode);
                }
+
+               phys->connector = conn->state->connector;
+               if (phys->ops.mode_set)
+                       phys->ops.mode_set(phys, mode, adj_mode);
        }
 
        dpu_enc->mode_set_complete = true;
@@ -1202,7 +1210,7 @@ static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc)
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
 
-               if (phys && phys->ops.disable)
+               if (phys->ops.disable)
                        phys->ops.disable(phys);
        }
 
@@ -1215,8 +1223,7 @@ static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc)
        dpu_encoder_resource_control(drm_enc, DPU_ENC_RC_EVENT_STOP);
 
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
-               if (dpu_enc->phys_encs[i])
-                       dpu_enc->phys_encs[i]->connector = NULL;
+               dpu_enc->phys_encs[i]->connector = NULL;
        }
 
        DPU_DEBUG_ENC(dpu_enc, "encoder disabled\n");
@@ -1306,7 +1313,7 @@ void dpu_encoder_toggle_vblank_for_crtc(struct drm_encoder *drm_enc,
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
 
-               if (phys && phys->ops.control_vblank_irq)
+               if (phys->ops.control_vblank_irq)
                        phys->ops.control_vblank_irq(phys, enable);
        }
 }
@@ -1418,7 +1425,7 @@ static void _dpu_encoder_trigger_flush(struct drm_encoder *drm_enc,
        }
 
        ctl = phys->hw_ctl;
-       if (!ctl || !ctl->ops.trigger_flush) {
+       if (!ctl->ops.trigger_flush) {
                DPU_ERROR("missing trigger cb\n");
                return;
        }
@@ -1462,13 +1469,8 @@ void dpu_encoder_helper_trigger_start(struct dpu_encoder_phys *phys_enc)
 {
        struct dpu_hw_ctl *ctl;
 
-       if (!phys_enc) {
-               DPU_ERROR("invalid encoder\n");
-               return;
-       }
-
        ctl = phys_enc->hw_ctl;
-       if (ctl && ctl->ops.trigger_start) {
+       if (ctl->ops.trigger_start) {
                ctl->ops.trigger_start(ctl);
                trace_dpu_enc_trigger_start(DRMID(phys_enc->parent), ctl->idx);
        }
@@ -1505,14 +1507,10 @@ static void dpu_encoder_helper_hw_reset(struct dpu_encoder_phys *phys_enc)
        struct dpu_hw_ctl *ctl;
        int rc;
 
-       if (!phys_enc) {
-               DPU_ERROR("invalid encoder\n");
-               return;
-       }
        dpu_enc = to_dpu_encoder_virt(phys_enc->parent);
        ctl = phys_enc->hw_ctl;
 
-       if (!ctl || !ctl->ops.reset)
+       if (!ctl->ops.reset)
                return;
 
        DRM_DEBUG_KMS("id:%u ctl %d reset\n", DRMID(phys_enc->parent),
@@ -1549,12 +1547,10 @@ static void _dpu_encoder_kickoff_phys(struct dpu_encoder_virt *dpu_enc)
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
 
-               if (!phys || phys->enable_state == DPU_ENC_DISABLED)
+               if (phys->enable_state == DPU_ENC_DISABLED)
                        continue;
 
                ctl = phys->hw_ctl;
-               if (!ctl)
-                       continue;
 
                /*
                 * This is cleared in frame_done worker, which isn't invoked
@@ -1602,17 +1598,15 @@ void dpu_encoder_trigger_kickoff_pending(struct drm_encoder *drm_enc)
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                phys = dpu_enc->phys_encs[i];
 
-               if (phys && phys->hw_ctl) {
-                       ctl = phys->hw_ctl;
-                       if (ctl->ops.clear_pending_flush)
-                               ctl->ops.clear_pending_flush(ctl);
+               ctl = phys->hw_ctl;
+               if (ctl->ops.clear_pending_flush)
+                       ctl->ops.clear_pending_flush(ctl);
 
-                       /* update only for command mode primary ctl */
-                       if ((phys == dpu_enc->cur_master) &&
-                          (disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE)
-                           && ctl->ops.trigger_pending)
-                               ctl->ops.trigger_pending(ctl);
-               }
+               /* update only for command mode primary ctl */
+               if ((phys == dpu_enc->cur_master) &&
+                  (disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE)
+                   && ctl->ops.trigger_pending)
+                       ctl->ops.trigger_pending(ctl);
        }
 }
 
@@ -1772,12 +1766,10 @@ void dpu_encoder_prepare_for_kickoff(struct drm_encoder *drm_enc)
        DPU_ATRACE_BEGIN("enc_prepare_for_kickoff");
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                phys = dpu_enc->phys_encs[i];
-               if (phys) {
-                       if (phys->ops.prepare_for_kickoff)
-                               phys->ops.prepare_for_kickoff(phys);
-                       if (phys->enable_state == DPU_ENC_ERR_NEEDS_HW_RESET)
-                               needs_hw_reset = true;
-               }
+               if (phys->ops.prepare_for_kickoff)
+                       phys->ops.prepare_for_kickoff(phys);
+               if (phys->enable_state == DPU_ENC_ERR_NEEDS_HW_RESET)
+                       needs_hw_reset = true;
        }
        DPU_ATRACE_END("enc_prepare_for_kickoff");
 
@@ -1818,7 +1810,7 @@ void dpu_encoder_kickoff(struct drm_encoder *drm_enc)
        /* allow phys encs to handle any post-kickoff business */
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                phys = dpu_enc->phys_encs[i];
-               if (phys && phys->ops.handle_post_kickoff)
+               if (phys->ops.handle_post_kickoff)
                        phys->ops.handle_post_kickoff(phys);
        }
 
@@ -1847,7 +1839,7 @@ void dpu_encoder_prepare_commit(struct drm_encoder *drm_enc)
 
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                phys = dpu_enc->phys_encs[i];
-               if (phys && phys->ops.prepare_commit)
+               if (phys->ops.prepare_commit)
                        phys->ops.prepare_commit(phys);
        }
 }
@@ -1862,9 +1854,6 @@ static int _dpu_encoder_status_show(struct seq_file *s, void *data)
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
 
-               if (!phys)
-                       continue;
-
                seq_printf(s, "intf:%d    vsync:%8d     underrun:%8d    ",
                                phys->intf_idx - INTF_0,
                                atomic_read(&phys->vsync_cnt),
@@ -1923,8 +1912,7 @@ static int _dpu_encoder_init_debugfs(struct drm_encoder *drm_enc)
                dpu_enc->debugfs_root, dpu_enc, &debugfs_status_fops);
 
        for (i = 0; i < dpu_enc->num_phys_encs; i++)
-               if (dpu_enc->phys_encs[i] &&
-                               dpu_enc->phys_encs[i]->ops.late_register)
+               if (dpu_enc->phys_encs[i]->ops.late_register)
                        dpu_enc->phys_encs[i]->ops.late_register(
                                        dpu_enc->phys_encs[i],
                                        dpu_enc->debugfs_root);
@@ -2093,11 +2081,8 @@ static int dpu_encoder_setup_display(struct dpu_encoder_virt *dpu_enc,
 
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
-
-               if (phys) {
-                       atomic_set(&phys->vsync_cnt, 0);
-                       atomic_set(&phys->underrun_cnt, 0);
-               }
+               atomic_set(&phys->vsync_cnt, 0);
+               atomic_set(&phys->underrun_cnt, 0);
        }
        mutex_unlock(&dpu_enc->enc_lock);
 
@@ -2239,8 +2224,6 @@ int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,
 
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
-               if (!phys)
-                       continue;
 
                switch (event) {
                case MSM_ENC_COMMIT_DONE:
@@ -2256,7 +2239,7 @@ int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,
                        DPU_ERROR_ENC(dpu_enc, "unknown wait event %d\n",
                                        event);
                        return -EINVAL;
-               };
+               }
 
                if (fn_wait) {
                        DPU_ATRACE_BEGIN("wait_for_completion_event");
@@ -2273,7 +2256,6 @@ int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,
 enum dpu_intf_mode dpu_encoder_get_intf_mode(struct drm_encoder *encoder)
 {
        struct dpu_encoder_virt *dpu_enc = NULL;
-       int i;
 
        if (!encoder) {
                DPU_ERROR("invalid encoder\n");
@@ -2284,12 +2266,8 @@ enum dpu_intf_mode dpu_encoder_get_intf_mode(struct drm_encoder *encoder)
        if (dpu_enc->cur_master)
                return dpu_enc->cur_master->intf_mode;
 
-       for (i = 0; i < dpu_enc->num_phys_encs; i++) {
-               struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
-
-               if (phys)
-                       return phys->intf_mode;
-       }
+       if (dpu_enc->num_phys_encs)
+               return dpu_enc->phys_encs[0]->intf_mode;
 
        return INTF_MODE_NONE;
 }