From: Thierry Escande <thierry.escande@collabora.com> To: Archit Taneja <architt@codeaurora.org>, Inki Dae <inki.dae@samsung.com>, Thierry Reding <thierry.reding@gmail.com>, Sandy Huang <hjc@rock-chips.com>, Sean Paul <seanpaul@chromium.org>, David Airlie <airlied@linux.ie> Cc: "Tomasz Figa" <tfiga@chromium.org>, "Haixia Shi" <hshi@chromium.org>, "Ørjan Eide" <orjan.eide@arm.com>, "zain wang" <wzz@rock-chips.com>, "Yakir Yang" <ykk@rock-chips.com>, "Lin Huang" <hl@rock-chips.com>, "Douglas Anderson" <dianders@chromium.org>, "Mark Yao" <mark.yao@rock-chips.com>, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org Subject: [PATCH 10/40] drm/rockchip: add mutex vop lock Date: Mon, 15 Jan 2018 18:15:44 +0100 [thread overview] Message-ID: <20180115171614.14474-11-thierry.escande@collabora.com> (raw) In-Reply-To: <20180115171614.14474-1-thierry.escande@collabora.com> From: zain wang <wzz@rock-chips.com> Add a lock to vop to avoid disabling the crtc while waiting for a line flag while enabling psr. If we disable in the middle of waiting for the line flag, we'll end up timing out or worse. Signed-off-by: zain wang <wzz@rock-chips.com> Signed-off-by: Sean Paul <seanpaul@chromium.org> Signed-off-by: Thierry Escande <thierry.escande@collabora.com> --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 30 +++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 31304434847a..bf4b1a2f3fa4 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -117,6 +117,8 @@ struct vop { spinlock_t reg_lock; /* lock vop irq reg */ spinlock_t irq_lock; + /* protects crtc enable/disable */ + struct mutex vop_lock; unsigned int irq; @@ -577,6 +579,7 @@ static void vop_crtc_atomic_disable(struct drm_crtc *crtc, WARN_ON(vop->event); + mutex_lock(&vop->vop_lock); drm_crtc_vblank_off(crtc); /* @@ -612,6 +615,7 @@ static void vop_crtc_atomic_disable(struct drm_crtc *crtc, clk_disable(vop->aclk); clk_disable(vop->hclk); pm_runtime_put(vop->dev); + mutex_unlock(&vop->vop_lock); if (crtc->state->event && !crtc->state->active) { spin_lock_irq(&crtc->dev->event_lock); @@ -882,10 +886,13 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, uint32_t pin_pol, val; int ret; + mutex_lock(&vop->vop_lock); + WARN_ON(vop->event); ret = vop_enable(crtc); if (ret) { + mutex_unlock(&vop->vop_lock); DRM_DEV_ERROR(vop->dev, "Failed to enable vop (%d)\n", ret); return; } @@ -949,6 +956,7 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, clk_set_rate(vop->dclk, adjusted_mode->clock * 1000); VOP_REG_SET(vop, common, standby, 0); + mutex_unlock(&vop->vop_lock); } static bool vop_fs_irq_is_pending(struct vop *vop) @@ -1487,15 +1495,21 @@ int rockchip_drm_wait_vact_end(struct drm_crtc *crtc, unsigned int mstimeout) { struct vop *vop = to_vop(crtc); unsigned long jiffies_left; + int ret = 0; if (!crtc || !vop->is_enabled) return -ENODEV; - if (mstimeout <= 0) - return -EINVAL; + mutex_lock(&vop->vop_lock); + if (mstimeout <= 0) { + ret = -EINVAL; + goto out; + } - if (vop_line_flag_irq_is_enabled(vop)) - return -EBUSY; + if (vop_line_flag_irq_is_enabled(vop)) { + ret = -EBUSY; + goto out; + } reinit_completion(&vop->line_flag_completion); vop_line_flag_irq_enable(vop); @@ -1506,10 +1520,13 @@ int rockchip_drm_wait_vact_end(struct drm_crtc *crtc, unsigned int mstimeout) if (jiffies_left == 0) { DRM_DEV_ERROR(vop->dev, "Timeout waiting for IRQ\n"); - return -ETIMEDOUT; + ret = -ETIMEDOUT; + goto out; } - return 0; +out: + mutex_unlock(&vop->vop_lock); + return ret; } EXPORT_SYMBOL(rockchip_drm_wait_vact_end); @@ -1559,6 +1576,7 @@ static int vop_bind(struct device *dev, struct device *master, void *data) spin_lock_init(&vop->reg_lock); spin_lock_init(&vop->irq_lock); + mutex_init(&vop->vop_lock); ret = devm_request_irq(dev, vop->irq, vop_isr, IRQF_SHARED, dev_name(dev), vop); -- 2.14.1
WARNING: multiple messages have this Message-ID (diff)
From: Thierry Escande <thierry.escande-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org> To: Archit Taneja <architt-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>, Inki Dae <inki.dae-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>, Thierry Reding <thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>, Sandy Huang <hjc-TNX95d0MmH7DzftRWevZcw@public.gmane.org>, Sean Paul <seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>, David Airlie <airlied-cv59FeDIM0c@public.gmane.org> Cc: "zain wang" <wzz-TNX95d0MmH7DzftRWevZcw@public.gmane.org>, "Lin Huang" <hl-TNX95d0MmH7DzftRWevZcw@public.gmane.org>, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, "Douglas Anderson" <dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, "Tomasz Figa" <tfiga-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>, linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, "Yakir Yang" <ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>, "Ørjan Eide" <orjan.eide-5wv7dgnIgG8@public.gmane.org>, "Mark Yao" <mark.yao-TNX95d0MmH7DzftRWevZcw@public.gmane.org>, "Haixia Shi" <hshi-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org> Subject: [PATCH 10/40] drm/rockchip: add mutex vop lock Date: Mon, 15 Jan 2018 18:15:44 +0100 [thread overview] Message-ID: <20180115171614.14474-11-thierry.escande@collabora.com> (raw) In-Reply-To: <20180115171614.14474-1-thierry.escande-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org> From: zain wang <wzz-TNX95d0MmH7DzftRWevZcw@public.gmane.org> Add a lock to vop to avoid disabling the crtc while waiting for a line flag while enabling psr. If we disable in the middle of waiting for the line flag, we'll end up timing out or worse. Signed-off-by: zain wang <wzz-TNX95d0MmH7DzftRWevZcw@public.gmane.org> Signed-off-by: Sean Paul <seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org> Signed-off-by: Thierry Escande <thierry.escande-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org> --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 30 +++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 31304434847a..bf4b1a2f3fa4 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -117,6 +117,8 @@ struct vop { spinlock_t reg_lock; /* lock vop irq reg */ spinlock_t irq_lock; + /* protects crtc enable/disable */ + struct mutex vop_lock; unsigned int irq; @@ -577,6 +579,7 @@ static void vop_crtc_atomic_disable(struct drm_crtc *crtc, WARN_ON(vop->event); + mutex_lock(&vop->vop_lock); drm_crtc_vblank_off(crtc); /* @@ -612,6 +615,7 @@ static void vop_crtc_atomic_disable(struct drm_crtc *crtc, clk_disable(vop->aclk); clk_disable(vop->hclk); pm_runtime_put(vop->dev); + mutex_unlock(&vop->vop_lock); if (crtc->state->event && !crtc->state->active) { spin_lock_irq(&crtc->dev->event_lock); @@ -882,10 +886,13 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, uint32_t pin_pol, val; int ret; + mutex_lock(&vop->vop_lock); + WARN_ON(vop->event); ret = vop_enable(crtc); if (ret) { + mutex_unlock(&vop->vop_lock); DRM_DEV_ERROR(vop->dev, "Failed to enable vop (%d)\n", ret); return; } @@ -949,6 +956,7 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, clk_set_rate(vop->dclk, adjusted_mode->clock * 1000); VOP_REG_SET(vop, common, standby, 0); + mutex_unlock(&vop->vop_lock); } static bool vop_fs_irq_is_pending(struct vop *vop) @@ -1487,15 +1495,21 @@ int rockchip_drm_wait_vact_end(struct drm_crtc *crtc, unsigned int mstimeout) { struct vop *vop = to_vop(crtc); unsigned long jiffies_left; + int ret = 0; if (!crtc || !vop->is_enabled) return -ENODEV; - if (mstimeout <= 0) - return -EINVAL; + mutex_lock(&vop->vop_lock); + if (mstimeout <= 0) { + ret = -EINVAL; + goto out; + } - if (vop_line_flag_irq_is_enabled(vop)) - return -EBUSY; + if (vop_line_flag_irq_is_enabled(vop)) { + ret = -EBUSY; + goto out; + } reinit_completion(&vop->line_flag_completion); vop_line_flag_irq_enable(vop); @@ -1506,10 +1520,13 @@ int rockchip_drm_wait_vact_end(struct drm_crtc *crtc, unsigned int mstimeout) if (jiffies_left == 0) { DRM_DEV_ERROR(vop->dev, "Timeout waiting for IRQ\n"); - return -ETIMEDOUT; + ret = -ETIMEDOUT; + goto out; } - return 0; +out: + mutex_unlock(&vop->vop_lock); + return ret; } EXPORT_SYMBOL(rockchip_drm_wait_vact_end); @@ -1559,6 +1576,7 @@ static int vop_bind(struct device *dev, struct device *master, void *data) spin_lock_init(&vop->reg_lock); spin_lock_init(&vop->irq_lock); + mutex_init(&vop->vop_lock); ret = devm_request_irq(dev, vop->irq, vop_isr, IRQF_SHARED, dev_name(dev), vop); -- 2.14.1
next prev parent reply other threads:[~2018-01-15 17:28 UTC|newest] Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-01-15 17:15 [PATCH 00/40] DRM Rockchip rk3399 (Kevin) Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 01/40] drm/rockchip: Get rid of some unnecessary code Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-16 3:53 ` Tomasz Figa 2018-01-15 17:15 ` [PATCH 02/40] drm/rockchip: support prime import sg table Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-22 10:44 ` Heiko Stuebner 2018-01-15 17:15 ` [PATCH 03/40] drm/rockchip: Respect page offset for PRIME mmap calls Thierry Escande 2018-01-22 10:44 ` Heiko Stuebner 2018-01-15 17:15 ` [PATCH 04/40] drm/bridge: analogix_dp: set psr activate/deactivate when enable/disable bridge Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 05/40] drm/bridge: analogix_dp: Don't power bridge in analogix_dp_bind Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 06/40] drm/rockchip: Don't use atomic constructs for psr Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 07/40] drm/bridge: analogix_dp: detect Sink PSR state after configuring the PSR Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 08/40] drm/rockchip: Remove analogix psr worker Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 09/40] drm/bridge: analogix_dp: Don't change psr while bridge is disabled Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` Thierry Escande [this message] 2018-01-15 17:15 ` [PATCH 10/40] drm/rockchip: add mutex vop lock Thierry Escande 2018-01-15 17:15 ` [PATCH 11/40] drm/bridge: analogix_dp: add fast link train for eDP Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 12/40] drm/rockchip: Only wait for panel ACK on PSR entry Thierry Escande 2018-01-15 17:15 ` [PATCH 13/40] drm/bridge: analogix_dp: Move enable video into config_video() Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 14/40] drm/bridge: analogix_dp: Check AUX_EN status when doing AUX transfer Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 15/40] drm/bridge: analogix_dp: Don't use fast link training when panel just powered up Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 16/40] drm/bridge: analogix_dp: Retry bridge enable when it failed Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 17/40] drm/bridge: analogix_dp: Wait for HPD signal before configuring link Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 18/40] drm/bridge: analogix_dp: Set PD_INC_BG first when powering up edp phy Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 19/40] drm/bridge: analogix_dp: Ensure edp is disabled when shutting down the panel Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 20/40] drm/bridge: analogix_dp: Extend hpd check time to 100ms Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 21/40] drm/bridge: analogix_dp: Fix incorrect usage of enhanced mode Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 22/40] drm/bridge: analogix_dp: Check dpcd write/read status Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 23/40] drm/bridge: analogix_dp: Fix AUX_PD bit for Rockchip Thierry Escande 2018-01-15 17:15 ` [PATCH 24/40] drm/bridge: analogix_dp: Reset aux channel if an error occurred Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:15 ` [PATCH 25/40] drm/rockchip: Restore psr->state when enable/disable psr failed Thierry Escande 2018-01-15 17:15 ` Thierry Escande 2018-01-15 17:16 ` [PATCH 26/40] drm/bridge: analogix_dp: Don't use ANALOGIX_DP_PLL_CTL to control pll Thierry Escande 2018-01-15 17:16 ` Thierry Escande 2018-01-15 17:16 ` [PATCH 27/40] drm/bridge: analogix_dp: Fix timeout of video streamclk config Thierry Escande 2018-01-15 17:16 ` Thierry Escande 2018-01-15 17:16 ` [PATCH 28/40] drm/bridge: analogix_dp: Fix incorrect operations with register ANALOGIX_DP_FUNC_EN_1 Thierry Escande 2018-01-15 17:16 ` Thierry Escande 2018-01-15 17:16 ` [PATCH 29/40] drm/bridge: analogix_dp: Move fast link training detect to set_bridge Thierry Escande 2018-01-15 17:16 ` [PATCH 30/40] drm/rockchip: Flush PSR before committing modeset disables/enables Thierry Escande 2018-01-16 4:02 ` Tomasz Figa 2018-01-15 17:16 ` [PATCH 31/40] drm/bridge: analogix_dp: Allow master driver to cleanup in unbind Thierry Escande 2018-01-15 17:16 ` [PATCH 32/40] drm/bridge: analogix_dp: Add analogix_dp_shutdown Thierry Escande 2018-01-15 17:16 ` [PATCH 33/40] drm/rockchip: analogix_dp: Wire the shutdown callback to disable PSR Thierry Escande 2018-01-15 17:16 ` Thierry Escande 2018-01-15 17:16 ` [PATCH 34/40] drm/bridge: analogix_dp: Reorder plat_data->power_off to happen sooner Thierry Escande 2018-01-15 17:16 ` Thierry Escande 2018-01-15 17:16 ` [PATCH 35/40] drm/bridge: analogix_dp: Properly log AUX CH errors Thierry Escande 2018-01-15 17:16 ` Thierry Escande 2018-01-15 17:16 ` [PATCH 36/40] drm/bridge: analogix_dp: Properly disable aux chan retries on rockchip Thierry Escande 2018-01-15 17:16 ` Thierry Escande 2018-01-15 17:16 ` [PATCH 37/40] drm/panel: simple: Change mode for Sharp lq123p1jx31 Thierry Escande 2018-01-15 17:16 ` Thierry Escande 2018-01-15 17:16 ` [PATCH 38/40] drm/rockchip: pre dither down when output bpc is 8bit Thierry Escande 2018-01-15 17:16 ` [PATCH 39/40] drm/rockchip: analogix_dp: Fix invalid implementation of unbind Thierry Escande 2018-01-16 2:10 ` Tomasz Figa 2018-01-16 2:10 ` Tomasz Figa 2018-01-15 17:16 ` [PATCH 40/40] drm/bridge: analogix_dp: Split the platform-specific poweron in two parts Thierry Escande
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20180115171614.14474-11-thierry.escande@collabora.com \ --to=thierry.escande@collabora.com \ --cc=airlied@linux.ie \ --cc=architt@codeaurora.org \ --cc=dianders@chromium.org \ --cc=dri-devel@lists.freedesktop.org \ --cc=hjc@rock-chips.com \ --cc=hl@rock-chips.com \ --cc=hshi@chromium.org \ --cc=inki.dae@samsung.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-rockchip@lists.infradead.org \ --cc=mark.yao@rock-chips.com \ --cc=orjan.eide@arm.com \ --cc=seanpaul@chromium.org \ --cc=tfiga@chromium.org \ --cc=thierry.reding@gmail.com \ --cc=wzz@rock-chips.com \ --cc=ykk@rock-chips.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.