diff --git a/msm/sde/sde_core_irq.c b/msm/sde/sde_core_irq.c index 7c315a76f1..9882b94758 100644 --- a/msm/sde/sde_core_irq.c +++ b/msm/sde/sde_core_irq.c @@ -471,9 +471,12 @@ void sde_core_irq_preinstall(struct sde_kms *sde_kms) sde_kms->irq_obj.irq_counts = kcalloc(sde_kms->irq_obj.total_irqs, sizeof(atomic_t), GFP_KERNEL); for (i = 0; i < sde_kms->irq_obj.total_irqs; i++) { - INIT_LIST_HEAD(&sde_kms->irq_obj.irq_cb_tbl[i]); - atomic_set(&sde_kms->irq_obj.enable_counts[i], 0); - atomic_set(&sde_kms->irq_obj.irq_counts[i], 0); + if (sde_kms->irq_obj.irq_cb_tbl) + INIT_LIST_HEAD(&sde_kms->irq_obj.irq_cb_tbl[i]); + if (sde_kms->irq_obj.enable_counts) + atomic_set(&sde_kms->irq_obj.enable_counts[i], 0); + if (sde_kms->irq_obj.irq_counts) + atomic_set(&sde_kms->irq_obj.irq_counts[i], 0); } } diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index df40f2e738..4518b3039a 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -4644,8 +4644,10 @@ static int sde_crtc_atomic_check(struct drm_crtc *crtc, struct sde_crtc *sde_crtc; struct plane_state *pstates = NULL; struct sde_crtc_state *cstate; + const struct drm_plane_state *pstate; + struct drm_plane *plane; struct drm_display_mode *mode; - int rc = 0; + int mixer_height, mixer_width, rc = 0; struct sde_multirect_plane_states *multirect_plane = NULL; struct drm_connector *conn; struct drm_connector_list_iter conn_iter; @@ -4702,6 +4704,26 @@ static int sde_crtc_atomic_check(struct drm_crtc *crtc, } drm_connector_list_iter_end(&conn_iter); + mixer_width = sde_crtc_get_mixer_width(sde_crtc, cstate, mode); + mixer_height = sde_crtc_get_mixer_height(sde_crtc, cstate, mode); + + if (cstate->num_ds_enabled) { + if (!state->state) + goto end; + + drm_atomic_crtc_state_for_each_plane_state(plane, + pstate, state) { + if ((pstate->crtc_h > mixer_height) || + (pstate->crtc_w > mixer_width)) { + SDE_ERROR("plane w/h:%x*%x > mixer w/h:%x*%x\n", + pstate->crtc_w, pstate->crtc_h, + mixer_width, mixer_height); + return -E2BIG; + goto end; + } + } + } + _sde_crtc_setup_is_ppsplit(state); _sde_crtc_setup_lm_bounds(crtc, state); diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 736e7e8041..6886374f76 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -3060,9 +3060,13 @@ void sde_encoder_virt_restore(struct drm_encoder *drm_enc) sde_enc = to_sde_encoder_virt(drm_enc); - if (sde_enc->cur_master) - memset(&sde_enc->cur_master->intf_cfg_v1, 0, - sizeof(sde_enc->cur_master->intf_cfg_v1)); + if (!sde_enc->cur_master) { + SDE_ERROR("virt encoder has no master\n"); + return; + } + + memset(&sde_enc->cur_master->intf_cfg_v1, 0, + sizeof(sde_enc->cur_master->intf_cfg_v1)); sde_enc->idle_pc_restore = true; for (i = 0; i < sde_enc->num_phys_encs; i++) { @@ -3078,7 +3082,7 @@ void sde_encoder_virt_restore(struct drm_encoder *drm_enc) phys->ops.restore(phys); } - if (sde_enc->cur_master && sde_enc->cur_master->ops.restore) + if (sde_enc->cur_master->ops.restore) sde_enc->cur_master->ops.restore(sde_enc->cur_master); _sde_encoder_virt_enable_helper(drm_enc); diff --git a/msm/sde/sde_hw_reg_dma_v1_color_proc.c b/msm/sde/sde_hw_reg_dma_v1_color_proc.c index 71ddd28ccd..7c92db9d94 100644 --- a/msm/sde/sde_hw_reg_dma_v1_color_proc.c +++ b/msm/sde/sde_hw_reg_dma_v1_color_proc.c @@ -2723,13 +2723,14 @@ void reg_dmav1_setup_scaler3_lut(struct sde_reg_dma_setup_ops_cfg *buf, + off_tbl[filter][i][1]; lut_len = off_tbl[filter][i][0] << 2; REG_DMA_SETUP_OPS(*buf, lut_addr, - &lut[filter][0], lut_len * sizeof(u32), + &lut[filter][lut_offset], lut_len * sizeof(u32), REG_BLK_WRITE_SINGLE, 0, 0, 0); rc = dma_ops->setup_payload(buf); if (rc) { DRM_ERROR("lut write failed ret %d\n", rc); return; } + lut_offset += lut_len; } } diff --git a/msm/sde/sde_hw_sspp.c b/msm/sde/sde_hw_sspp.c index 2ebc0f607c..392e55ca14 100644 --- a/msm/sde/sde_hw_sspp.c +++ b/msm/sde/sde_hw_sspp.c @@ -157,11 +157,12 @@ static inline int _sspp_subblk_offset(struct sde_hw_pipe *ctx, u32 *idx) { int rc = 0; - const struct sde_sspp_sub_blks *sblk = ctx->cap->sblk; + const struct sde_sspp_sub_blks *sblk; if (!ctx) return -EINVAL; + sblk = ctx->cap->sblk; switch (s_id) { case SDE_SSPP_SRC: *idx = sblk->src_blk.base;