From bada02f317456d60217bc474a0917363eb1c1436 Mon Sep 17 00:00:00 2001 From: Jayaprakash Date: Fri, 3 Jan 2020 15:58:01 +0530 Subject: [PATCH 01/11] disp: msm: sde: add changes to fix get connector failure in rm_release Currently during rm_release, drm_conn is available only if connector and encoder are bound together. If a test_only commit occurs before a non-blocking modeset commit, this bound is uncertain. The resources allocated by test_only commit will not be released and leads to resource allocation failures for the consequent commits. Add changes to modify this by checking for the encoder attached to sde_connector which happens during bootup. Change-Id: Icb1d9595efda8a104ba527175b2dbc6a2c856d44 Signed-off-by: Jayaprakash --- msm/sde/sde_rm.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/msm/sde/sde_rm.c b/msm/sde/sde_rm.c index 0ae2309f3d44..5e648914e9a2 100644 --- a/msm/sde/sde_rm.c +++ b/msm/sde/sde_rm.c @@ -2074,11 +2074,13 @@ static struct drm_connector *_sde_rm_get_connector( struct drm_encoder *enc) { struct drm_connector *conn = NULL, *conn_search; + struct sde_connector *c_conn = NULL; struct drm_connector_list_iter conn_iter; drm_connector_list_iter_begin(enc->dev, &conn_iter); drm_for_each_connector_iter(conn_search, &conn_iter) { - if (conn_search->encoder == enc) { + c_conn = to_sde_connector(conn_search); + if (c_conn->encoder == enc) { conn = conn_search; break; } @@ -2229,10 +2231,10 @@ void sde_rm_release(struct sde_rm *rm, struct drm_encoder *enc, bool nxt) conn = _sde_rm_get_connector(enc); if (!conn) { - SDE_DEBUG("failed to get connector for enc %d, nxt %d", - enc->base.id, nxt); SDE_EVT32(enc->base.id, 0x0, 0xffffffff); _sde_rm_release_rsvp(rm, rsvp, conn); + SDE_DEBUG("failed to get conn for enc %d nxt %d rsvp[s%de%d]\n", + enc->base.id, nxt, rsvp->seq, rsvp->enc_id); goto end; } From 4194c7b7cdb42735485e9bba76d5b622f8278559 Mon Sep 17 00:00:00 2001 From: Yashwanth Date: Tue, 17 Mar 2020 19:12:21 +0530 Subject: [PATCH 02/11] disp: msm: sde: add dt based support for pm qos irq latency This change adds dt based support for pm qos irq latency instead of using hardcoded value. Change-Id: I9f67ed1092eefac193a409773f841350532bc722 Signed-off-by: Yashwanth --- msm/sde/sde_hw_catalog.c | 7 +++++++ msm/sde/sde_hw_catalog.h | 2 ++ msm/sde/sde_kms.c | 5 +++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/msm/sde/sde_hw_catalog.c b/msm/sde/sde_hw_catalog.c index 6fbebd005199..5a788c9988cb 100644 --- a/msm/sde/sde_hw_catalog.c +++ b/msm/sde/sde_hw_catalog.c @@ -228,6 +228,7 @@ enum { PERF_CPU_MASK, CPU_MASK_PERF, PERF_CPU_DMA_LATENCY, + PERF_CPU_IRQ_LATENCY, PERF_PROP_MAX, }; @@ -607,6 +608,8 @@ static struct sde_prop_type sde_perf_prop[] = { PROP_TYPE_U32}, {PERF_CPU_DMA_LATENCY, "qcom,sde-qos-cpu-dma-latency", false, PROP_TYPE_U32}, + {PERF_CPU_IRQ_LATENCY, "qcom,sde-qos-cpu-irq-latency", false, + PROP_TYPE_U32}, }; static struct sde_prop_type sde_qos_prop[] = { @@ -4162,6 +4165,10 @@ static int _sde_perf_parse_dt_cfg(struct device_node *np, prop_exists[PERF_CPU_DMA_LATENCY] ? PROP_VALUE_ACCESS(prop_value, PERF_CPU_DMA_LATENCY, 0) : DEFAULT_CPU_DMA_LATENCY; + cfg->perf.cpu_irq_latency = + prop_exists[PERF_CPU_IRQ_LATENCY] ? + PROP_VALUE_ACCESS(prop_value, PERF_CPU_IRQ_LATENCY, 0) : + PM_QOS_DEFAULT_VALUE; return 0; } diff --git a/msm/sde/sde_hw_catalog.h b/msm/sde/sde_hw_catalog.h index 33f2e49d90d4..f8ed130857bd 100644 --- a/msm/sde/sde_hw_catalog.h +++ b/msm/sde/sde_hw_catalog.h @@ -1317,6 +1317,7 @@ struct sde_sc_cfg { * @cpu_mask: pm_qos cpu mask value * @cpu_mask_perf: pm_qos cpu silver core mask value * @cpu_dma_latency: pm_qos cpu dma latency value + * @cpu_irq_latency: pm_qos cpu irq latency value * @axi_bus_width: axi bus width value in bytes * @num_mnoc_ports: number of mnoc ports */ @@ -1348,6 +1349,7 @@ struct sde_perf_cfg { unsigned long cpu_mask; unsigned long cpu_mask_perf; u32 cpu_dma_latency; + u32 cpu_irq_latency; u32 axi_bus_width; u32 num_mnoc_ports; }; diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index b335f9ab0c9b..c7ee914c7340 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -3008,6 +3008,7 @@ static void _sde_kms_update_pm_qos_irq_request(struct sde_kms *sde_kms) { struct device *cpu_dev; int cpu = 0; + u32 cpu_irq_latency = sde_kms->catalog->perf.cpu_irq_latency; if (cpumask_empty(&sde_kms->irq_cpu_mask)) { SDE_DEBUG("%s: irq_cpu_mask is empty\n", __func__); @@ -3024,12 +3025,12 @@ static void _sde_kms_update_pm_qos_irq_request(struct sde_kms *sde_kms) if (dev_pm_qos_request_active(&sde_kms->pm_qos_irq_req[cpu])) dev_pm_qos_update_request(&sde_kms->pm_qos_irq_req[cpu], - sde_kms->catalog->perf.cpu_dma_latency); + cpu_irq_latency); else dev_pm_qos_add_request(cpu_dev, &sde_kms->pm_qos_irq_req[cpu], DEV_PM_QOS_RESUME_LATENCY, - sde_kms->catalog->perf.cpu_dma_latency); + cpu_irq_latency); } } From 3bfb8cafce94f5779d1ec9e1b0c91581fcdf79dd Mon Sep 17 00:00:00 2001 From: Ray Zhang Date: Thu, 12 Mar 2020 16:20:30 +0800 Subject: [PATCH 03/11] disp: msm: support framebuffer emulation in KMS driver framebuffer support is required in some use cases, so add framebuffer emulation for KMS driver. Change-Id: Icf0bbcd59ca430478d2bef4df033988d0338f2bb Signed-off-by: Ray Zhang --- msm/Makefile | 2 ++ msm/sde/sde_kms.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/msm/Makefile b/msm/Makefile index cbaf7cdf1361..952746f5f5da 100644 --- a/msm/Makefile +++ b/msm/Makefile @@ -132,3 +132,5 @@ msm_drm-$(CONFIG_DRM_MSM) += \ msm_drm-$(CONFIG_HDCP_QSEECOM) += ../hdcp/msm_hdcp.o \ obj-$(CONFIG_DISPLAY_BUILD) += msm_drm.o + +obj-$(CONFIG_DRM_FBDEV_EMULATION) += msm_fbdev.o diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index c7ee914c7340..c770ba015b35 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -2944,6 +2944,8 @@ static int _sde_kms_mmu_init(struct sde_kms *sde_kms) } } + sde_kms->base.aspace = sde_kms->aspace[0]; + return 0; early_map_fail: From 11aab5f9c38229ee1e9db3bf15841fb3a57e6088 Mon Sep 17 00:00:00 2001 From: Jayaprakash Date: Mon, 6 Apr 2020 19:08:57 +0530 Subject: [PATCH 04/11] disp: msm: sde: Fix null dereference errors Add changes to avoid NULL dereference access and uninitalized access in sde driver. Change-Id: Ic9c06f54d1ccd820973fc0ba4aa75d2848f2ce03 Signed-off-by: Jayaprakash --- msm/sde/sde_core_perf.c | 3 +++ msm/sde/sde_rm.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/msm/sde/sde_core_perf.c b/msm/sde/sde_core_perf.c index 9d94ddedd25b..0a0cac365021 100644 --- a/msm/sde/sde_core_perf.c +++ b/msm/sde/sde_core_perf.c @@ -818,6 +818,9 @@ static void _sde_core_perf_crtc_update_check(struct drm_crtc *crtc, struct sde_core_perf_params *new = &sde_crtc->new_perf; int i; + if (!kms) + return; + for (i = 0; i < SDE_POWER_HANDLE_DBUS_ID_MAX; i++) { /* * cases for bus bandwidth update. diff --git a/msm/sde/sde_rm.c b/msm/sde/sde_rm.c index 5e648914e9a2..25c9ab6ec7b7 100644 --- a/msm/sde/sde_rm.c +++ b/msm/sde/sde_rm.c @@ -2346,7 +2346,7 @@ int sde_rm_reserve( * comes again after earlier commit gets processed. */ - if (test_only && rsvp_nxt) { + if (test_only && rsvp_cur && rsvp_nxt) { SDE_ERROR("cur %d nxt %d enc %d conn %d\n", rsvp_cur->seq, rsvp_nxt->seq, enc->base.id, conn_state->connector->base.id); From 45e57a9f87e47f32c5c600dc004af5002c3b6ff7 Mon Sep 17 00:00:00 2001 From: Yashwanth Date: Wed, 8 Apr 2020 12:04:00 +0530 Subject: [PATCH 05/11] disp: msm: sde: add ubwc verification during plane atomic check In targets where ubwc is not supported, atomic check should fail and return a error value if the input format is ubwc. Change-Id: I21a40f510cc852e64fbcc05a5fb4848da4b4faaa Signed-off-by: Yashwanth --- msm/sde/sde_plane.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/msm/sde/sde_plane.c b/msm/sde/sde_plane.c index 7f4137d635ea..ce16c1568e0e 100644 --- a/msm/sde/sde_plane.c +++ b/msm/sde/sde_plane.c @@ -2621,6 +2621,10 @@ static int _sde_plane_sspp_atomic_check_helper(struct sde_plane *psde, SDE_ERROR_PLANE(psde, "invalid dest rect %u, %u, %ux%u\n", dst.x, dst.y, dst.w, dst.h); ret = -EINVAL; + } else if (SDE_FORMAT_IS_UBWC(fmt) && + !psde->catalog->ubwc_version) { + SDE_ERROR_PLANE(psde, "ubwc not supported\n"); + ret = -EINVAL; } return ret; From 5792eb97d136d3db084dd1bfc63c3f884e9b38a9 Mon Sep 17 00:00:00 2001 From: Yashwanth Date: Thu, 23 Apr 2020 13:53:27 +0530 Subject: [PATCH 06/11] disp: msm: sde: add check for max encoder limit during allocation This change checks max limit while allocating encoders during display init. Change-Id: I48736667c2b83f916f09f9e81cb1b24a9fef215a Signed-off-by: Yashwanth --- msm/sde/sde_kms.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index c770ba015b35..ade246cd11cf 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -1489,7 +1489,9 @@ static int _sde_kms_setup_displays(struct drm_device *dev, /* update display cap to MST_MODE for DP MST encoders */ info.capabilities |= MSM_DISPLAY_CAP_MST_MODE; - for (idx = 0; idx < sde_kms->dp_stream_count; idx++) { + + for (idx = 0; idx < sde_kms->dp_stream_count && + priv->num_encoders < max_encoders; idx++) { info.h_tile_instance[0] = idx; encoder = sde_encoder_init(dev, &info); if (IS_ERR_OR_NULL(encoder)) { From 889c4786ae9c9c5695c1e978b2603d31fbcfeffa Mon Sep 17 00:00:00 2001 From: Raviteja Tamatam Date: Mon, 27 Apr 2020 12:36:36 +0530 Subject: [PATCH 07/11] disp: msm: sde: enable dim layer setup event log Enable dim layer event log to know the composition of all blend stages in a commit from xlogs. Change-Id: I387fd888f06f0c61d2042896459119d614b3f60b Signed-off-by: Raviteja Tamatam --- msm/sde/sde_crtc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index aaf4b6ac1648..088d696e6cdb 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -567,7 +567,7 @@ static void _sde_crtc_setup_dim_layer_cfg(struct drm_crtc *crtc, cstate->lm_roi[i].y; } - SDE_EVT32_VERBOSE(DRMID(crtc), + SDE_EVT32(DRMID(crtc), dim_layer->stage, cstate->lm_roi[i].x, cstate->lm_roi[i].y, cstate->lm_roi[i].w, From 74f3b5a9de30e04553b6bb01dae98ae6a4c65058 Mon Sep 17 00:00:00 2001 From: Krishna Manikandan Date: Wed, 29 Apr 2020 14:58:07 +0530 Subject: [PATCH 08/11] disp: msm: sde: allow kthread init for off work during cwb During transition to cwb, kthread initialisation has to be done for the corresponding encoder off work so that the correct worker thread is used for this particular work. There can be scenarios where a cwb commit is received after a writeback session and the worker associated with the off work is still assigned to old crtc's worker resulting in a mismatch when this work is queued. Add support to handle such scenarios. Change-Id: I6080025e799977827f4d0f4ab7eb93c6644f981e Signed-off-by: Krishna Manikandan --- msm/sde/sde_encoder.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 6f4b65ea5cfc..4e8c3436b2aa 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -2652,7 +2652,9 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc) _sde_encoder_input_handler_register(drm_enc); - if (!(msm_is_mode_seamless_vrr(cur_mode) + if ((drm_enc->crtc->state->connectors_changed && + sde_encoder_in_clone_mode(drm_enc)) || + !(msm_is_mode_seamless_vrr(cur_mode) || msm_is_mode_seamless_dms(cur_mode) || msm_is_mode_seamless_dyn_clk(cur_mode))) kthread_init_delayed_work(&sde_enc->delayed_off_work, From 9cb06f9b21c1f40bcd28fd7c4c850c6fe4b8b1dc Mon Sep 17 00:00:00 2001 From: Krishna Manikandan Date: Thu, 28 May 2020 16:51:45 +0530 Subject: [PATCH 09/11] disp: msm: avoid unlocking mutex_lock twice Remove mutex unlock from msm_gem_get_iova_locked as acquiring and releasing the lock are handled in the caller function. Change-Id: Ie4a8408d3e6308d19eb26aafee8dfe15bcb682da Signed-off-by: Krishna Manikandan --- msm/msm_gem.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/msm/msm_gem.c b/msm/msm_gem.c index d9cd8c9f7344..fbc8bc616c60 100644 --- a/msm/msm_gem.c +++ b/msm/msm_gem.c @@ -449,7 +449,8 @@ static int msm_gem_get_iova_locked(struct drm_gem_object *obj, if (IS_ERR(obj->import_attach)) { DRM_ERROR("dma_buf_attach failure, err=%ld\n", PTR_ERR(obj->import_attach)); - goto unlock; + ret = PTR_ERR(obj->import_attach); + return ret; } msm_obj->obj_dirty = false; reattach = true; @@ -462,14 +463,14 @@ static int msm_gem_get_iova_locked(struct drm_gem_object *obj, if (ret) { DRM_ERROR("delayed dma-buf import failed %d\n", ret); - goto unlock; + return ret; } } vma = add_vma(obj, aspace); if (IS_ERR(vma)) { ret = PTR_ERR(vma); - goto unlock; + return ret; } pages = get_pages(obj); @@ -493,13 +494,10 @@ static int msm_gem_get_iova_locked(struct drm_gem_object *obj, mutex_unlock(&aspace->list_lock); } - mutex_unlock(&msm_obj->lock); return 0; fail: del_vma(vma); -unlock: - mutex_unlock(&msm_obj->lock); return ret; } static int msm_gem_pin_iova(struct drm_gem_object *obj, From 19253d6e192a4209a100460e7eed8e384716866b Mon Sep 17 00:00:00 2001 From: Jayaprakash Date: Fri, 6 Dec 2019 17:33:59 +0530 Subject: [PATCH 10/11] disp: msm: sde: modify the args for sid switch call Modify the size of SID's passed as an argument during scm call as per client requirement. Change-Id: Idd3bb57a8f9e0a4e7eb6a23d96bfa5b68510063a Signed-off-by: Jayaprakash --- msm/sde/sde_kms.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index ade246cd11cf..1441f6b92e54 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -299,7 +299,12 @@ static int _sde_kms_scm_call(struct sde_kms *sde_kms, int vmid) sec_sid = (uint32_t *) shm.vaddr; mem_addr = shm.paddr; - mem_size = shm.size; + /** + * SMMUSecureModeSwitch requires the size to be number of SID's + * but shm allocates size in pages. Modify the args as per + * client requirement. + */ + mem_size = sizeof(uint32_t) * num_sids; } else { sec_sid = kcalloc(num_sids, sizeof(uint32_t), GFP_KERNEL); if (!sec_sid) From fb72c8faa8e5bdffd57915c66b99d3f7b4e689d3 Mon Sep 17 00:00:00 2001 From: santosh Date: Thu, 28 May 2020 15:33:54 -0700 Subject: [PATCH 11/11] disp: msm: sde: add vig formats before qseed and csc initializations Setup vig pipe makes an early return if csc and qseed are not supported. This change moves addition of vig formats before intializing qseed and csc. Change-Id: I2eb651f7bbd81757a9de23501fda51a510d0e673 Signed-off-by: santosh --- msm/sde/sde_hw_catalog.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/msm/sde/sde_hw_catalog.c b/msm/sde/sde_hw_catalog.c index 5a788c9988cb..db2df82aa212 100644 --- a/msm/sde/sde_hw_catalog.c +++ b/msm/sde/sde_hw_catalog.c @@ -1434,6 +1434,9 @@ static int _sde_sspp_setup_vigs(struct device_node *np, set_bit(SDE_PERF_SSPP_QOS_8LVL, &sspp->perf_features); vig_count++; + sblk->format_list = sde_cfg->vig_formats; + sblk->virt_format_list = sde_cfg->virt_vig_formats; + if ((sde_cfg->qseed_type == SDE_SSPP_SCALER_QSEED2) || (sde_cfg->qseed_type == SDE_SSPP_SCALER_QSEED3) || (sde_cfg->qseed_type == SDE_SSPP_SCALER_QSEED3LITE)) { @@ -1449,9 +1452,6 @@ static int _sde_sspp_setup_vigs(struct device_node *np, _sde_sspp_setup_vigs_pp(props, sde_cfg, sspp); - sblk->format_list = sde_cfg->vig_formats; - sblk->virt_format_list = sde_cfg->virt_vig_formats; - if (sde_cfg->true_inline_rot_rev > 0) { set_bit(SDE_SSPP_TRUE_INLINE_ROT, &sspp->features); sblk->in_rot_format_list = sde_cfg->inline_rot_formats;