From 6b4a148d585be2d7d6e594fe518126bf5a2da28d Mon Sep 17 00:00:00 2001 From: Yashwanth Date: Thu, 25 Feb 2021 14:51:36 +0530 Subject: [PATCH 1/9] disp: msm: sde: avoid using spinlock for register log Add support to use atomic variable instead of spinlock for register logs during register write. This change helps in reducing the run-time and is safe to use as most of the register writes happen in commit context. Change-Id: Ib7e377f80cbf437e391792b0b424cbd1eefdf497 Signed-off-by: Yashwanth --- msm/sde_dbg.h | 3 +-- msm/sde_dbg_evtlog.c | 13 ++++--------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/msm/sde_dbg.h b/msm/sde_dbg.h index 44ba3c145dc0..9efa19436fbb 100644 --- a/msm/sde_dbg.h +++ b/msm/sde_dbg.h @@ -156,11 +156,10 @@ struct sde_dbg_reglog { u32 first; u32 last; u32 last_dump; - u32 curr; + atomic64_t curr; u32 next; u32 enable; u32 enable_mask; - spinlock_t spin_lock; }; extern struct sde_dbg_reglog *sde_dbg_base_reglog; diff --git a/msm/sde_dbg_evtlog.c b/msm/sde_dbg_evtlog.c index 484480b8eacd..5724d4cdb5e1 100644 --- a/msm/sde_dbg_evtlog.c +++ b/msm/sde_dbg_evtlog.c @@ -103,27 +103,22 @@ exit: void sde_reglog_log(u8 blk_id, u32 val, u32 addr) { - unsigned long flags; struct sde_dbg_reglog_log *log; struct sde_dbg_reglog *reglog = sde_dbg_base_reglog; + int index; if (!reglog) return; - spin_lock_irqsave(®log->spin_lock, flags); - - log = ®log->logs[reglog->curr]; + index = abs(atomic64_inc_return(®log->curr) % SDE_REGLOG_ENTRY); + log = ®log->logs[index]; log->blk_id = blk_id; log->val = val; log->addr = addr; log->time = local_clock(); log->pid = current->pid; - - reglog->curr = (reglog->curr + 1) % SDE_REGLOG_ENTRY; reglog->last++; - - spin_unlock_irqrestore(®log->spin_lock, flags); } /* always dump the last entries which are not dumped yet */ @@ -244,7 +239,7 @@ struct sde_dbg_reglog *sde_reglog_init(void) if (!reglog) return ERR_PTR(-ENOMEM); - spin_lock_init(®log->spin_lock); + atomic64_set(®log->curr, 0); return reglog; } From d5c892e8505face3d4576985eb81fd638bb88235 Mon Sep 17 00:00:00 2001 From: Steve Cohen Date: Wed, 31 Mar 2021 12:08:50 +0530 Subject: [PATCH 2/9] disp: msm: sde: fix tracking of pending rsvps Previous logic expected rsvp_nxt to always be the 2nd rsvp for a given encoder. This does not work for releasing back-to-back test-only reservations (with no current rsvp). If new resources become available between the 2 test-only commits we may end up reserving more resources than necessary. Change the logic by adding a pending flag to the rsvp to simplify lookup of both current and pending/next resource reservations. Change-Id: Iefa8085f1b4c0cf49bb744dcc2deb7fb92608454 Signed-off-by: Steve Cohen --- msm/sde/sde_rm.c | 68 +++++++++++++++++++----------------------------- 1 file changed, 27 insertions(+), 41 deletions(-) diff --git a/msm/sde/sde_rm.c b/msm/sde/sde_rm.c index fd76b4352576..cb3d589bd072 100644 --- a/msm/sde/sde_rm.c +++ b/msm/sde/sde_rm.c @@ -125,13 +125,15 @@ struct sde_rm_requirements { * @enc_id: Reservations are tracked by Encoder DRM object ID. * CRTCs may be connected to multiple Encoders. * An encoder or connector id identifies the display path. - * @topology DRM<->HW topology use case + * @topology: DRM<->HW topology use case + * @pending: True for pending rsvp-nxt, cleared when the rsvp is committed */ struct sde_rm_rsvp { struct list_head list; uint32_t seq; uint32_t enc_id; enum sde_rm_topology_name topology; + bool pending; }; /** @@ -274,9 +276,9 @@ static void _sde_rm_print_rsvps( SDE_DEBUG("%d\n", stage); list_for_each_entry(rsvp, &rm->rsvps, list) { - SDE_DEBUG("%d rsvp[s%ue%u] topology %d\n", stage, rsvp->seq, - rsvp->enc_id, rsvp->topology); - SDE_EVT32(stage, rsvp->seq, rsvp->enc_id, rsvp->topology); + SDE_DEBUG("%d rsvp%s[s%ue%u] topology %d\n", stage, rsvp->pending ? "_nxt" : "", + rsvp->seq, rsvp->enc_id, rsvp->topology); + SDE_EVT32(stage, rsvp->seq, rsvp->enc_id, rsvp->topology, rsvp->pending); } for (type = 0; type < SDE_HW_BLK_MAX; type++) { @@ -1825,6 +1827,7 @@ static int _sde_rm_make_next_rsvp(struct sde_rm *rm, struct drm_encoder *enc, rsvp->seq = ++rm->rsvp_next_seq; rsvp->enc_id = enc->base.id; rsvp->topology = reqs->topology->top_name; + rsvp->pending = true; list_add_tail(&rsvp->list, &rm->rsvps); ret = _sde_rm_make_lm_rsvp(rm, rsvp, reqs, splash_display); @@ -2076,9 +2079,8 @@ static int _sde_rm_populate_requirements( return 0; } -static struct sde_rm_rsvp *_sde_rm_get_rsvp( - struct sde_rm *rm, - struct drm_encoder *enc) +static struct sde_rm_rsvp *_sde_rm_get_rsvp(struct sde_rm *rm, + struct drm_encoder *enc, bool nxt) { struct sde_rm_rsvp *i; @@ -2091,30 +2093,22 @@ static struct sde_rm_rsvp *_sde_rm_get_rsvp( return NULL; list_for_each_entry(i, &rm->rsvps, list) - if (i->enc_id == enc->base.id) + if (i->pending == nxt && i->enc_id == enc->base.id) return i; return NULL; } -static struct sde_rm_rsvp *_sde_rm_get_rsvp_nxt( - struct sde_rm *rm, +static struct sde_rm_rsvp *_sde_rm_get_rsvp_nxt(struct sde_rm *rm, struct drm_encoder *enc) { - struct sde_rm_rsvp *i; + return _sde_rm_get_rsvp(rm, enc, true); +} - if (list_empty(&rm->rsvps)) - return NULL; - - list_for_each_entry(i, &rm->rsvps, list) - if (i->enc_id == enc->base.id) - break; - - list_for_each_entry_continue(i, &rm->rsvps, list) - if (i->enc_id == enc->base.id) - return i; - - return NULL; +static struct sde_rm_rsvp *_sde_rm_get_rsvp_cur(struct sde_rm *rm, + struct drm_encoder *enc) +{ + return _sde_rm_get_rsvp(rm, enc, false); } static struct drm_connector *_sde_rm_get_connector( @@ -2312,10 +2306,7 @@ void sde_rm_release(struct sde_rm *rm, struct drm_encoder *enc, bool nxt) mutex_lock(&rm->rm_lock); - if (nxt) - rsvp = _sde_rm_get_rsvp_nxt(rm, enc); - else - rsvp = _sde_rm_get_rsvp(rm, enc); + rsvp = _sde_rm_get_rsvp(rm, enc, nxt); if (!rsvp) { SDE_DEBUG("failed to find rsvp for enc %d, nxt %d", enc->base.id, nxt); @@ -2353,14 +2344,13 @@ end: mutex_unlock(&rm->rm_lock); } -static int _sde_rm_commit_rsvp( +static void _sde_rm_commit_rsvp( struct sde_rm *rm, struct sde_rm_rsvp *rsvp, struct drm_connector_state *conn_state) { struct sde_rm_hw_blk *blk; enum sde_hw_blk_type type; - int ret = 0; /* Swap next rsvp to be the active */ for (type = 0; type < SDE_HW_BLK_MAX; type++) { @@ -2375,13 +2365,9 @@ static int _sde_rm_commit_rsvp( } } - if (!ret) { - SDE_DEBUG("rsrv enc %d topology %d\n", rsvp->enc_id, - rsvp->topology); - SDE_EVT32(rsvp->enc_id, rsvp->topology); - } - - return ret; + rsvp->pending = false; + SDE_DEBUG("rsrv enc %d topology %d\n", rsvp->enc_id, rsvp->topology); + SDE_EVT32(rsvp->enc_id, rsvp->topology); } /* call this only after rm_mutex held */ @@ -2420,7 +2406,7 @@ int sde_rm_reserve( struct msm_drm_private *priv; struct sde_kms *sde_kms; struct msm_compression_info *comp_info; - int ret; + int ret = 0; if (!rm || !enc || !crtc_state || !conn_state) { SDE_ERROR("invalid arguments\n"); @@ -2456,7 +2442,7 @@ int sde_rm_reserve( _sde_rm_print_rsvps(rm, SDE_RM_STAGE_BEGIN); - rsvp_cur = _sde_rm_get_rsvp(rm, enc); + rsvp_cur = _sde_rm_get_rsvp_cur(rm, enc); rsvp_nxt = _sde_rm_get_rsvp_nxt(rm, enc); /* @@ -2545,7 +2531,7 @@ int sde_rm_reserve( commit_rsvp: _sde_rm_release_rsvp(rm, rsvp_cur, conn_state->connector); - ret = _sde_rm_commit_rsvp(rm, rsvp_nxt, conn_state); + _sde_rm_commit_rsvp(rm, rsvp_nxt, conn_state); end: kfree(comp_info); @@ -2574,7 +2560,7 @@ int sde_rm_ext_blk_create_reserve(struct sde_rm *rm, mutex_lock(&rm->rm_lock); - rsvp = _sde_rm_get_rsvp(rm, enc); + rsvp = _sde_rm_get_rsvp_cur(rm, enc); if (!rsvp) { rsvp = kzalloc(sizeof(*rsvp), GFP_KERNEL); if (!rsvp) { @@ -2625,7 +2611,7 @@ int sde_rm_ext_blk_destroy(struct sde_rm *rm, mutex_lock(&rm->rm_lock); - rsvp = _sde_rm_get_rsvp(rm, enc); + rsvp = _sde_rm_get_rsvp_cur(rm, enc); if (!rsvp) { ret = -ENOENT; SDE_ERROR("failed to find rsvp for enc %d\n", enc->base.id); From e3f86bb93a4756d797593b3f044e405c8ae98a8b Mon Sep 17 00:00:00 2001 From: Sankeerth Billakanti Date: Wed, 23 Sep 2020 12:53:33 +0530 Subject: [PATCH 3/9] disp: msm: dp: inform multi-func support to usb driver The usb controller driver does not know if DP is supported / connected and whether it is operating in concurrent mode. So, whenever there is a ucsi role switch call to the usb controller driver, it will reset the usb phy irrespective of DP connection. The phy reset while DP driver is still processing cable connect or disconnect will cause aux timeout or NOC errors. This change will inform the usb controller driver about the multi_func mode support to convey how many lanes DP will be using. Change-Id: I9e96ed399e879820ddd238cf0fbed7069f1de60d Signed-off-by: Sankeerth Billakanti --- msm/dp/dp_altmode.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/msm/dp/dp_altmode.c b/msm/dp/dp_altmode.c index 52d954f4a37a..0f09ddda36bf 100644 --- a/msm/dp/dp_altmode.c +++ b/msm/dp/dp_altmode.c @@ -40,7 +40,8 @@ enum dp_altmode_pin_assignment { DPAM_HPD_F, }; -static int dp_altmode_release_ss_lanes(struct dp_altmode_private *altmode) +static int dp_altmode_release_ss_lanes(struct dp_altmode_private *altmode, + bool multi_func) { int rc; struct device_node *np; @@ -69,7 +70,7 @@ static int dp_altmode_release_ss_lanes(struct dp_altmode_private *altmode) } while (timeout) { - rc = dwc3_msm_release_ss_lane(&usb_pdev->dev); + rc = dwc3_msm_release_ss_lane(&usb_pdev->dev, multi_func); if (rc != -EBUSY) break; @@ -178,11 +179,10 @@ static int dp_altmode_notify(void *priv, void *data, size_t len) altmode->dp_altmode.base.orientation = orientation; - if (!altmode->dp_altmode.base.multi_func) { - rc = dp_altmode_release_ss_lanes(altmode); - if (rc) - goto ack; - } + rc = dp_altmode_release_ss_lanes(altmode, + altmode->dp_altmode.base.multi_func); + if (rc) + goto ack; if (altmode->dp_cb && altmode->dp_cb->configure) altmode->dp_cb->configure(altmode->dev); From 7ad0876fa7ade9097dabac18cfd7bf331af76285 Mon Sep 17 00:00:00 2001 From: Andhavarapu Karthik Date: Thu, 11 Mar 2021 16:04:25 +0530 Subject: [PATCH 4/9] disp: msm: sde: add evt log minidump partition Changes are made to add wrapper function to add a minidump partition. Also, to add evt log to minidump. Change-Id: I1204a965bab9db72cb3d381a2817dbe8ef723c66 Signed-off-by: Andhavarapu Karthik --- msm/sde_dbg.c | 12 ++++++++++++ msm/sde_dbg.h | 3 +++ msm/sde_dbg_evtlog.c | 4 ++++ 3 files changed, 19 insertions(+) diff --git a/msm/sde_dbg.c b/msm/sde_dbg.c index eb85c0e37e7e..31a9e26ef21c 100644 --- a/msm/sde_dbg.c +++ b/msm/sde_dbg.c @@ -300,6 +300,18 @@ struct sde_dbg_evtlog *sde_dbg_base_evtlog; /* sde_dbg_base_reglog - global pointer to main sde reg log for macro use */ struct sde_dbg_reglog *sde_dbg_base_reglog; +u32 sde_mini_dump_add_region(const char *name, u32 size, void *virt_addr) +{ + struct md_region md_entry; + + strlcpy(md_entry.name, name, sizeof(md_entry.name)); + md_entry.virt_addr = (uintptr_t)virt_addr; + md_entry.phys_addr = virt_to_phys(virt_addr); + md_entry.size = size; + + return msm_minidump_add_region(&md_entry); +} + static void _sde_debug_bus_xbar_dump(void __iomem *mem_base, struct sde_debug_bus_entry *entry, u32 val, u32 block_id_off, u32 test_id_off) diff --git a/msm/sde_dbg.h b/msm/sde_dbg.h index 9efa19436fbb..4e3dbdbb9b7b 100644 --- a/msm/sde_dbg.h +++ b/msm/sde_dbg.h @@ -9,6 +9,7 @@ #include #include #include +#include /* select an uncommon hex value for the limiter */ #define SDE_EVTLOG_DATA_LIMITER (0xC0DEBEEF) @@ -248,6 +249,8 @@ extern struct sde_dbg_reglog *sde_dbg_base_reglog; #define SDE_DBG_CTRL(...) sde_dbg_ctrl(__func__, ##__VA_ARGS__, \ SDE_DBG_DUMP_DATA_LIMITER) +u32 sde_mini_dump_add_region(const char *name, u32 size, void *virt_addr); + /** * sde_evtlog_init - allocate a new event log object * Returns: evtlog or -ERROR diff --git a/msm/sde_dbg_evtlog.c b/msm/sde_dbg_evtlog.c index 5724d4cdb5e1..91c10f4dde35 100644 --- a/msm/sde_dbg_evtlog.c +++ b/msm/sde_dbg_evtlog.c @@ -223,6 +223,10 @@ struct sde_dbg_evtlog *sde_evtlog_init(void) if (!evtlog) return ERR_PTR(-ENOMEM); + if (sde_mini_dump_add_region("evt_log", sizeof(*evtlog), + evtlog) < 0) + pr_err("minidump add region failed for evtlog\n"); + spin_lock_init(&evtlog->spin_lock); evtlog->enable = SDE_EVTLOG_DEFAULT_ENABLE; From 361a8e335117c72dc2bc2076d9f33ad2dcf41a61 Mon Sep 17 00:00:00 2001 From: Andhavarapu Karthik Date: Tue, 16 Mar 2021 12:12:31 +0530 Subject: [PATCH 5/9] disp: msm: sde: add sde and vbif debug bus to minidump Changes are made to add sde and vbif debug bus to minidump. Change-Id: I8fc615c57e14bf2aa0b814ebda2270cd3124c794 Signed-off-by: Andhavarapu Karthik --- msm/sde_dbg.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/msm/sde_dbg.c b/msm/sde_dbg.c index 31a9e26ef21c..89715d376f24 100644 --- a/msm/sde_dbg.c +++ b/msm/sde_dbg.c @@ -868,6 +868,9 @@ static void _sde_dbg_dump_sde_dbg_bus(struct sde_dbg_sde_debug_bus *bus) dev_info(sde_dbg_base.dev, "%s: start_addr:0x%pK len:0x%x\n", __func__, dump_addr, list_size); + if (sde_mini_dump_add_region("sde_dbgbus", list_size, + *dump_mem) < 0) + pr_err("minidump add sde debug bus failed\n"); } else { in_mem = false; pr_err("dump_mem: allocation fails\n"); @@ -998,6 +1001,9 @@ static void _sde_dbg_dump_vbif_dbg_bus(struct sde_dbg_vbif_debug_bus *bus) dev_info(sde_dbg_base.dev, "%s: start_addr:0x%pK len:0x%x\n", __func__, dump_addr, list_size); + if (sde_mini_dump_add_region("vbif_dbgbus", list_size, + *dump_mem) < 0) + pr_err("minidump add vbif debug bus failed\n"); } else { in_mem = false; pr_err("dump_mem: allocation fails\n"); From ae9f6d8dce37d9c2e28b9dfa46588b486ba1f5bd Mon Sep 17 00:00:00 2001 From: Andhavarapu Karthik Date: Tue, 16 Mar 2021 12:56:34 +0530 Subject: [PATCH 6/9] disp: msm: sde: add reg log minidump partition Changes are made to add reg log to minidump. Change-Id: I703075ae22cfa0d987e4bb51ebc28dcdf13baa46 Signed-off-by: Andhavarapu Karthik --- msm/sde_dbg_evtlog.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/msm/sde_dbg_evtlog.c b/msm/sde_dbg_evtlog.c index 91c10f4dde35..21ae067957c5 100644 --- a/msm/sde_dbg_evtlog.c +++ b/msm/sde_dbg_evtlog.c @@ -244,6 +244,9 @@ struct sde_dbg_reglog *sde_reglog_init(void) return ERR_PTR(-ENOMEM); atomic64_set(®log->curr, 0); + if (sde_mini_dump_add_region("reg_log", sizeof(*reglog), + reglog) < 0) + pr_err("minidump add region failed for reglog\n"); return reglog; } From 061744ebb0e985341782146ed1accfbe278df4c7 Mon Sep 17 00:00:00 2001 From: Jayaprakash Madisetty Date: Fri, 23 Apr 2021 12:10:27 +0530 Subject: [PATCH 7/9] disp: msm: sde: increase kickoff timeout for doze usecase This change increases the kickoff timeout in doze and doze suspend usecases. This avoids false timeouts seen in doze due to rscc static wakeup configured at a different fps from actual panel TE. Change-Id: I11c94eb40d4dbbc3d95b8268b007580599ee90fd Signed-off-by: Jayaprakash Madisetty --- msm/sde/sde_encoder_phys_cmd.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/msm/sde/sde_encoder_phys_cmd.c b/msm/sde/sde_encoder_phys_cmd.c index d8e062c5fc01..a6acf9f31a85 100644 --- a/msm/sde/sde_encoder_phys_cmd.c +++ b/msm/sde/sde_encoder_phys_cmd.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved. */ #define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__ @@ -1509,20 +1509,27 @@ static int _sde_encoder_phys_cmd_wait_for_wr_ptr( struct sde_encoder_phys_cmd *cmd_enc = to_sde_encoder_phys_cmd(phys_enc); struct sde_encoder_wait_info wait_info = {0}; - int ret; + struct sde_connector *c_conn; bool frame_pending = true; struct sde_hw_ctl *ctl; unsigned long lock_flags; + int ret, timeout_ms; - if (!phys_enc || !phys_enc->hw_ctl) { + if (!phys_enc || !phys_enc->hw_ctl || !phys_enc->connector) { SDE_ERROR("invalid argument(s)\n"); return -EINVAL; } ctl = phys_enc->hw_ctl; + c_conn = to_sde_connector(phys_enc->connector); + timeout_ms = KICKOFF_TIMEOUT_MS; + + if (c_conn->lp_mode == SDE_MODE_DPMS_LP1 || + c_conn->lp_mode == SDE_MODE_DPMS_LP2) + timeout_ms = (KICKOFF_TIMEOUT_MS) * 2; wait_info.wq = &phys_enc->pending_kickoff_wq; wait_info.atomic_cnt = &phys_enc->pending_retire_fence_cnt; - wait_info.timeout_ms = KICKOFF_TIMEOUT_MS; + wait_info.timeout_ms = timeout_ms; /* slave encoder doesn't enable for ppsplit */ if (_sde_encoder_phys_is_ppsplit_slave(phys_enc)) From 94f831f4cf9a5f5ffbee07d3a8584faf1435a89a Mon Sep 17 00:00:00 2001 From: Mahadevan Date: Fri, 23 Apr 2021 12:28:54 +0530 Subject: [PATCH 8/9] disp: msm: avoid deadlock by prepending connection_mutex Commit caused by dpms on may use extra modeset lock on connection_mutex before msm_atomic_commit, so to avoid deadlock, make the modeset lock within msm_atomic_commit to be used before the waiting for pending_crtcs_event. Change-Id: Ic43af0f775d87ccc1d145ead9cb2e1b65018c86f Signed-off-by: Mahadevan --- msm/msm_atomic.c | 12 +++++++++++- msm/sde/sde_kms.c | 11 +---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/msm/msm_atomic.c b/msm/msm_atomic.c index 6bddb33d9824..953fd3b174e1 100644 --- a/msm/msm_atomic.c +++ b/msm/msm_atomic.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. * Copyright (C) 2014 Red Hat * Author: Rob Clark * @@ -689,6 +689,16 @@ int msm_atomic_commit(struct drm_device *dev, c->plane_mask |= (1 << drm_plane_index(plane)); } + /* Protection for prepare_fence callback */ +retry: + ret = drm_modeset_lock(&state->dev->mode_config.connection_mutex, + state->acquire_ctx); + + if (ret == -EDEADLK) { + drm_modeset_backoff(state->acquire_ctx); + goto retry; + } + /* * Wait for pending updates on any of the same crtc's and then * mark our set of crtc's as busy: diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index 0b36b0b2d0e7..78bcf7aed5be 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -1589,7 +1589,7 @@ static void sde_kms_prepare_fence(struct msm_kms *kms, { struct drm_crtc *crtc; struct drm_crtc_state *old_crtc_state; - int i, rc; + int i; if (!kms || !old_state || !old_state->dev || !old_state->acquire_ctx) { SDE_ERROR("invalid argument(s)\n"); @@ -1597,15 +1597,6 @@ static void sde_kms_prepare_fence(struct msm_kms *kms, } SDE_ATRACE_BEGIN("sde_kms_prepare_fence"); -retry: - /* attempt to acquire ww mutex for connection */ - rc = drm_modeset_lock(&old_state->dev->mode_config.connection_mutex, - old_state->acquire_ctx); - - if (rc == -EDEADLK) { - drm_modeset_backoff(old_state->acquire_ctx); - goto retry; - } /* old_state actually contains updated crtc pointers */ for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) { From 81b58ee731d6ac65c5d325baac98e3441c9d20f3 Mon Sep 17 00:00:00 2001 From: Andhavarapu Karthik Date: Mon, 26 Apr 2021 02:12:27 +0530 Subject: [PATCH 9/9] disp: msm: sde: allow input fence status show only when kickoff in progress Allow input fence status read only when crtc kickoff is in progress to avoid race between status read and fence destroy. Change-Id: I3402bfcb38940628f09f645a3cee31f821daeae9 Signed-off-by: Andhavarapu Karthik --- msm/sde/sde_crtc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index 348bff1199ec..a54e222a81b8 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -6148,6 +6148,9 @@ static int _sde_debugfs_fence_status_show(struct seq_file *s, void *data) dev = crtc->dev; cstate = to_sde_crtc_state(crtc->state); + if (!sde_crtc->kickoff_in_progress) + goto skip_input_fence; + /* Dump input fence info */ seq_puts(s, "===Input fence===\n"); drm_atomic_crtc_for_each_plane(plane, crtc) { @@ -6175,6 +6178,7 @@ static int _sde_debugfs_fence_status_show(struct seq_file *s, void *data) } } +skip_input_fence: /* Dump release fence info */ seq_puts(s, "\n"); seq_puts(s, "===Release fence===\n");