From c4b9783866db5c8e7131d5c9b406ba4e80d38d5c Mon Sep 17 00:00:00 2001 From: Ping Li Date: Thu, 20 Jun 2019 18:53:40 -0700 Subject: [PATCH] disp: msm: sde: clean up LTM driver states when lastclose is called Clean up LTM buffers and reset LTM related lists when lastclose is call to make sure LTM will be in clean state when hwc restarts or when user runs LTM driver lua tests. Change-Id: Ib2af68e70f2e5ff246aca890487085bc46dca7da Signed-off-by: Ping Li --- msm/sde/sde_color_processing.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/msm/sde/sde_color_processing.c b/msm/sde/sde_color_processing.c index 42dd8a742be3..334ae682cad8 100644 --- a/msm/sde/sde_color_processing.c +++ b/msm/sde/sde_color_processing.c @@ -1588,10 +1588,8 @@ void sde_cp_crtc_destroy_properties(struct drm_crtc *crtc) mutex_destroy(&sde_crtc->crtc_cp_lock); INIT_LIST_HEAD(&sde_crtc->active_list); INIT_LIST_HEAD(&sde_crtc->dirty_list); - INIT_LIST_HEAD(&sde_crtc->feature_list); INIT_LIST_HEAD(&sde_crtc->ad_dirty); INIT_LIST_HEAD(&sde_crtc->ad_active); - mutex_destroy(&sde_crtc->ltm_buffer_lock); INIT_LIST_HEAD(&sde_crtc->ltm_buf_free); INIT_LIST_HEAD(&sde_crtc->ltm_buf_busy); } @@ -1645,6 +1643,7 @@ void sde_cp_crtc_clear(struct drm_crtc *crtc) { struct sde_crtc *sde_crtc = NULL; unsigned long flags; + u32 i = 0; if (!crtc) { DRM_ERROR("crtc %pK\n", crtc); @@ -1666,6 +1665,21 @@ void sde_cp_crtc_clear(struct drm_crtc *crtc) spin_lock_irqsave(&sde_crtc->spin_lock, flags); list_del_init(&sde_crtc->user_event_list); spin_unlock_irqrestore(&sde_crtc->spin_lock, flags); + + for (i = 0; i < sde_crtc->ltm_buffer_cnt; i++) { + if (sde_crtc->ltm_buffers[i]) { + msm_gem_put_vaddr(sde_crtc->ltm_buffers[i]->gem); + drm_framebuffer_put(sde_crtc->ltm_buffers[i]->fb); + msm_gem_put_iova(sde_crtc->ltm_buffers[i]->gem, + sde_crtc->ltm_buffers[i]->aspace); + kfree(sde_crtc->ltm_buffers[i]); + sde_crtc->ltm_buffers[i] = NULL; + } + } + sde_crtc->ltm_buffer_cnt = 0; + sde_crtc->ltm_hist_en = false; + INIT_LIST_HEAD(&sde_crtc->ltm_buf_free); + INIT_LIST_HEAD(&sde_crtc->ltm_buf_busy); } static void dspp_pcc_install_property(struct drm_crtc *crtc)