All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sandy Huang <hjc@rock-chips.com>
To: Thierry Escande <thierry.escande@collabora.com>,
	Archit Taneja <architt@codeaurora.org>,
	Inki Dae <inki.dae@samsung.com>,
	Thierry Reding <thierry.reding@gmail.com>,
	Sean Paul <seanpaul@chromium.org>,
	David Airlie <airlied@linux.ie>, Tomasz Figa <tfiga@chromium.org>
Cc: "Zain Wang" <wzz@rock-chips.com>, "Lin Huang" <hl@rock-chips.com>,
	"Douglas Anderson" <dianders@chromium.org>,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	linux-rockchip@lists.infradead.org,
	"Ørjan Eide" <orjan.eide@arm.com>,
	"Haixia Shi" <hshi@chromium.org>
Subject: Re: [PATCH v2 10/43] drm/rockchip: add mutex vop lock
Date: Tue, 30 Jan 2018 10:55:36 +0800	[thread overview]
Message-ID: <0545286d-cbd7-d24b-bb83-315029a20836@rock-chips.com> (raw)
In-Reply-To: <20180126131710.7622-11-thierry.escande@collabora.com>



在 2018/1/26 21:16, Thierry Escande 写道:
> 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);
> 


Reviewed-by: Sandy huang <hjc@rock-chips.com>

WARNING: multiple messages have this Message-ID (diff)
From: Sandy Huang <hjc@rock-chips.com>
To: Thierry Escande <thierry.escande@collabora.com>,
	Archit Taneja <architt@codeaurora.org>,
	Inki Dae <inki.dae@samsung.com>,
	Thierry Reding <thierry.reding@gmail.com>,
	Sean Paul <seanpaul@chromium.org>,
	David Airlie <airlied@linux.ie>, Tomasz Figa <tfiga@chromium.org>
Cc: "Zain Wang" <wzz@rock-chips.com>, "Lin Huang" <hl@rock-chips.com>,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	"Douglas Anderson" <dianders@chromium.org>,
	linux-rockchip@lists.infradead.org,
	"Ørjan Eide" <orjan.eide@arm.com>,
	"Haixia Shi" <hshi@chromium.org>
Subject: Re: [PATCH v2 10/43] drm/rockchip: add mutex vop lock
Date: Tue, 30 Jan 2018 10:55:36 +0800	[thread overview]
Message-ID: <0545286d-cbd7-d24b-bb83-315029a20836@rock-chips.com> (raw)
In-Reply-To: <20180126131710.7622-11-thierry.escande@collabora.com>



在 2018/1/26 21:16, Thierry Escande 写道:
> 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);
> 


Reviewed-by: Sandy huang <hjc@rock-chips.com>

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2018-01-30  2:55 UTC|newest]

Thread overview: 96+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-26 13:16 [PATCH v2 00/43] DRM Rockchip rk3399 (Kevin) Thierry Escande
2018-01-26 13:16 ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 01/43] drm/rockchip: Get rid of unnecessary struct fields Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-29 20:44   ` Sean Paul
2018-01-30  2:21   ` Sandy Huang
2018-01-26 13:16 ` [PATCH v2 02/43] drm/rockchip: support prime import sg table Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-30  2:40   ` Sandy Huang
2018-01-30  2:40     ` Sandy Huang
2018-01-26 13:16 ` [PATCH v2 03/43] drm/rockchip: Respect page offset for PRIME mmap calls Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-30  2:42   ` Sandy Huang
2018-01-26 13:16 ` [PATCH v2 04/43] drm/bridge: analogix_dp: set psr activate/deactivate when enable/disable bridge Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 05/43] drm/bridge: analogix_dp: Don't power bridge in analogix_dp_bind Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 06/43] drm/rockchip: Don't use atomic constructs for psr Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 07/43] drm/bridge: analogix_dp: detect Sink PSR state after configuring the PSR Thierry Escande
2018-01-26 13:16 ` [PATCH v2 08/43] drm/rockchip: Remove analogix psr worker Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 09/43] drm/bridge: analogix_dp: Don't change psr while bridge is disabled Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 10/43] drm/rockchip: add mutex vop lock Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-30  2:55   ` Sandy Huang [this message]
2018-01-30  2:55     ` Sandy Huang
2018-01-26 13:16 ` [PATCH v2 11/43] drm/bridge: analogix_dp: add fast link train for eDP Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 12/43] drm/rockchip: Only wait for panel ACK on PSR entry Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 13/43] drm/bridge: analogix_dp: Move enable video into config_video() Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 14/43] drm/bridge: analogix_dp: Check AUX_EN status when doing AUX transfer Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 15/43] drm/bridge: analogix_dp: Don't use fast link training when panel just powered up Thierry Escande
2018-01-26 13:16 ` [PATCH v2 16/43] drm/bridge: analogix_dp: Retry bridge enable when it failed Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 17/43] drm/bridge: analogix_dp: Wait for HPD signal before configuring link Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 18/43] drm/bridge: analogix_dp: Set PD_INC_BG first when powering up edp phy Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 19/43] drm/bridge: analogix_dp: Ensure edp is disabled when shutting down the panel Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 20/43] drm/bridge: analogix_dp: Extend hpd check time to 100ms Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-29 21:02   ` Sean Paul
2018-01-26 13:16 ` [PATCH v2 21/43] drm/bridge: analogix_dp: Fix incorrect usage of enhanced mode Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 22/43] drm/bridge: analogix_dp: Check dpcd write/read status Thierry Escande
2018-01-29 21:14   ` Sean Paul
2018-01-29 21:31     ` Sean Paul
2018-01-29 21:31       ` Sean Paul
2018-01-26 13:16 ` [PATCH v2 23/43] drm/bridge: analogix_dp: Fix AUX_PD bit for Rockchip Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 24/43] drm/bridge: analogix_dp: Reset aux channel if an error occurred Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-29 21:27   ` Sean Paul
2018-01-26 13:16 ` [PATCH v2 25/43] drm/rockchip: Restore psr->state when enable/disable psr failed Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 26/43] drm/bridge: analogix_dp: Don't use ANALOGIX_DP_PLL_CTL to control pll Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 27/43] drm/bridge: analogix_dp: Fix timeout of video streamclk config Thierry Escande
2018-01-26 13:16 ` [PATCH v2 28/43] drm/bridge: analogix_dp: Fix incorrect operations with register ANALOGIX_DP_FUNC_EN_1 Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-29 21:35   ` Sean Paul
2018-01-29 21:35     ` Sean Paul
2018-01-26 13:16 ` [PATCH v2 29/43] drm/bridge: analogix_dp: Move fast link training detect to set_bridge Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-29 21:38   ` Sean Paul
2018-01-29 21:38     ` Sean Paul
2018-01-26 13:16 ` [PATCH v2 30/43] drm/bridge: analogix_dp: Reorder plat_data->power_off to happen sooner Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 31/43] drm/bridge: analogix_dp: Properly log AUX CH errors Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:16 ` [PATCH v2 32/43] drm/bridge: analogix_dp: Properly disable aux chan retries on rockchip Thierry Escande
2018-01-26 13:16   ` Thierry Escande
2018-01-26 13:17 ` [PATCH v2 33/43] drm/panel: simple: Change mode for Sharp lq123p1jx31 Thierry Escande
2018-01-26 13:17 ` [PATCH v2 34/43] drm/rockchip: pre dither down when output bpc is 8bit Thierry Escande
2018-01-26 13:17   ` Thierry Escande
2018-01-26 13:17 ` [PATCH v2 35/43] drm/bridge: analogix_dp: Split the platform-specific poweron in two parts Thierry Escande
2018-01-26 13:17   ` Thierry Escande
2018-01-26 13:17 ` [PATCH v2 36/43] drm/rockchip: analogix_dp: Do not call Analogix code before bind Thierry Escande
2018-01-26 13:17   ` Thierry Escande
2018-01-26 13:17 ` [PATCH v2 37/43] drm/rockchip: Disable PSR on input events Thierry Escande
2018-01-29 21:44   ` Sean Paul
2018-01-26 13:17 ` [PATCH v2 38/43] drm/rockchip: Cancel PSR enable work before changing the state Thierry Escande
2018-01-26 13:17 ` [PATCH v2 39/43] drm/rockchip: psr: Avoid redundant calls to .set() callback Thierry Escande
2018-01-26 13:17 ` [PATCH v2 40/43] drm/rockchip: psr: Sanitize semantics of allow/disallow API Thierry Escande
2018-01-26 13:17 ` [PATCH v2 41/43] drm/rockchip: Disable PSR from reboot notifier Thierry Escande
2018-01-26 13:17 ` [PATCH v2 42/43] drm/rockchip: Disallow PSR for the whole atomic commit Thierry Escande
2018-01-26 13:17 ` [PATCH v2 43/43] drm/rockchip: psr: Remove flush by CRTC Thierry Escande
2018-01-28  0:41 ` [PATCH v2 00/43] DRM Rockchip rk3399 (Kevin) Emil Renner Berthing
2018-01-29 21:51 ` Sean Paul
2018-01-29 21:51   ` Sean Paul

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=0545286d-cbd7-d24b-bb83-315029a20836@rock-chips.com \
    --to=hjc@rock-chips.com \
    --cc=airlied@linux.ie \
    --cc=architt@codeaurora.org \
    --cc=dianders@chromium.org \
    --cc=dri-devel@lists.freedesktop.org \
    --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=orjan.eide@arm.com \
    --cc=seanpaul@chromium.org \
    --cc=tfiga@chromium.org \
    --cc=thierry.escande@collabora.com \
    --cc=thierry.reding@gmail.com \
    --cc=wzz@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: link
Be 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.