disp: msm: sde: clear wb mode and cached cwb encoder mask
The issue scenario is as follows 1. A CWB commit has run and it has disabled. Composer kill is done. 2. If Composer starts again or another client has open DRM the previous cwb state is intact. 3. When userspace is trying to query wb modes, primary modes which are attached to wb as part of cwb commit is exposed. This leads to commit failures if userspace is trying to trigger wb on the same CRTC of what primary has run cwb before. This change properly clears wb mode and the cached encoder mask to avoid commit failures. Change-Id: I4ca8bd2b52a980630b7fb1319bf67b718ebb2ac2 Signed-off-by: Mahadevan <quic_mahap@quicinc.com>
This commit is contained in:

gecommit door
Akash Gajjar

bovenliggende
8bbb79fffb
commit
d8db76b3ff
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
* Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
|
||||||
* Copyright (C) 2013 Red Hat
|
* Copyright (C) 2013 Red Hat
|
||||||
* Author: Rob Clark <robdclark@gmail.com>
|
* Author: Rob Clark <robdclark@gmail.com>
|
||||||
@@ -5373,6 +5373,7 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
|
|||||||
crtc->state->enable, sde_crtc->cached_encoder_mask);
|
crtc->state->enable, sde_crtc->cached_encoder_mask);
|
||||||
sde_crtc->enabled = false;
|
sde_crtc->enabled = false;
|
||||||
sde_crtc->cached_encoder_mask = 0;
|
sde_crtc->cached_encoder_mask = 0;
|
||||||
|
cstate->cached_cwb_enc_mask = 0;
|
||||||
|
|
||||||
/* Try to disable uidle */
|
/* Try to disable uidle */
|
||||||
sde_core_perf_crtc_update_uidle(crtc, false);
|
sde_core_perf_crtc_update_uidle(crtc, false);
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -2073,6 +2073,7 @@ static void _sde_encoder_phys_wb_reset_state(struct sde_encoder_phys *phys_enc)
|
|||||||
{
|
{
|
||||||
struct sde_encoder_phys_wb *wb_enc = to_sde_encoder_phys_wb(phys_enc);
|
struct sde_encoder_phys_wb *wb_enc = to_sde_encoder_phys_wb(phys_enc);
|
||||||
struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(phys_enc->parent);
|
struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(phys_enc->parent);
|
||||||
|
struct sde_wb_device *wb_dev = wb_enc->wb_dev;
|
||||||
struct sde_crtc *sde_crtc;
|
struct sde_crtc *sde_crtc;
|
||||||
|
|
||||||
phys_enc->enable_state = SDE_ENC_DISABLED;
|
phys_enc->enable_state = SDE_ENC_DISABLED;
|
||||||
@@ -2093,6 +2094,9 @@ static void _sde_encoder_phys_wb_reset_state(struct sde_encoder_phys *phys_enc)
|
|||||||
phys_enc->hw_cdm = NULL;
|
phys_enc->hw_cdm = NULL;
|
||||||
phys_enc->hw_ctl = NULL;
|
phys_enc->hw_ctl = NULL;
|
||||||
phys_enc->in_clone_mode = false;
|
phys_enc->in_clone_mode = false;
|
||||||
|
kfree(wb_dev->modes);
|
||||||
|
wb_dev->modes = NULL;
|
||||||
|
wb_dev->count_modes = 0;
|
||||||
atomic_set(&phys_enc->pending_kickoff_cnt, 0);
|
atomic_set(&phys_enc->pending_kickoff_cnt, 0);
|
||||||
atomic_set(&phys_enc->pending_retire_fence_cnt, 0);
|
atomic_set(&phys_enc->pending_retire_fence_cnt, 0);
|
||||||
atomic_set(&phys_enc->pending_ctl_start_cnt, 0);
|
atomic_set(&phys_enc->pending_ctl_start_cnt, 0);
|
||||||
|
Verwijs in nieuw issue
Block a user