diff --git a/msm/sde/sde_core_irq.c b/msm/sde/sde_core_irq.c index 9a381c66af..f2dc66fa6f 100644 --- a/msm/sde/sde_core_irq.c +++ b/msm/sde/sde_core_irq.c @@ -475,9 +475,12 @@ void sde_core_irq_preinstall(struct sde_kms *sde_kms) return; 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 f46c03f150..c876467880 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -4562,8 +4562,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; @@ -4620,6 +4622,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 e2e7c6e392..5447b5d5e5 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -3099,9 +3099,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++) { @@ -3117,7 +3121,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 a7bb239088..c6c3b7f1c9 100644 --- a/msm/sde/sde_hw_reg_dma_v1_color_proc.c +++ b/msm/sde/sde_hw_reg_dma_v1_color_proc.c @@ -2764,13 +2764,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 7024210251..ec3aa5940d 100644 --- a/msm/sde/sde_hw_sspp.c +++ b/msm/sde/sde_hw_sspp.c @@ -158,11 +158,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;