From: John Stultz <john.stultz@linaro.org>
To: lkml <linux-kernel@vger.kernel.org>
Cc: Da Lv <lvda3@hisilicon.com>, Rongrong Zou <zourongrong@gmail.com>,
Xinliang Liu <z.liuxinliang@hisilicon.com>,
David Airlie <airlied@linux.ie>, Daniel Vetter <daniel@ffwll.ch>,
dri-devel <dri-devel@lists.freedesktop.org>,
Sam Ravnborg <sam@ravnborg.org>,
Yidong Lin <linyidong@huawei.com>,
John Stultz <john.stultz@linaro.org>
Subject: [PATCH v5 01/25] drm: kirin: Fix for hikey620 display offset problem
Date: Tue, 20 Aug 2019 23:06:02 +0000 [thread overview]
Message-ID: <20190820230626.23253-2-john.stultz@linaro.org> (raw)
In-Reply-To: <20190820230626.23253-1-john.stultz@linaro.org>
From: Da Lv <lvda3@hisilicon.com>
The original HiKey (620) board has had a long running issue
where when using a 1080p montior, the display would occasionally
blink and come come back with a horizontal offset (usually also
shifting the colors, depending on the value of the offset%4).
After lots of analysis by HiSi developers, they found the issue
was due to when running at 1080p, it was possible to hit the
device memory bandwidth limits, which could cause the DSI signal
to get out of sync.
Unfortunately the DSI logic doesn't have the ability to
automatically recover from this situation, but we can get a an
LDI underflow interrupt when it happens.
To then correct the issue, when we get an LDI underflow irq, we
we can simply suspend and resume the display, which resets the
hardware.
Thus, this patch enables the ldi underflow interrupt, and
initializes a workqueue that is used to suspend/resume the
display to recover. Then when the irq occurs we clear it and
schedule the workqueue to reset display engine.
Cc: Rongrong Zou <zourongrong@gmail.com>
Cc: Xinliang Liu <z.liuxinliang@hisilicon.com>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: dri-devel <dri-devel@lists.freedesktop.org>
Cc: Sam Ravnborg <sam@ravnborg.org>
Acked-by: Xinliang Liu <z.liuxinliang@hisilicon.com>
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Da Lv <lvda3@hisilicon.com>
Signed-off-by: Yidong Lin <linyidong@huawei.com>
[jstultz: Reworded the commit message, checkpatch cleanups]
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
v2: Minor cleanups
v3: Rename workqueue entry for clarity (suggested by Sam)
---
.../gpu/drm/hisilicon/kirin/kirin_ade_reg.h | 1 +
.../gpu/drm/hisilicon/kirin/kirin_drm_ade.c | 22 +++++++++++++++++++
2 files changed, 23 insertions(+)
diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_ade_reg.h b/drivers/gpu/drm/hisilicon/kirin/kirin_ade_reg.h
index e2ac09894a6d..0da860200410 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_ade_reg.h
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_ade_reg.h
@@ -83,6 +83,7 @@
#define VSIZE_OFST 20
#define LDI_INT_EN 0x741C
#define FRAME_END_INT_EN_OFST 1
+#define UNDERFLOW_INT_EN_OFST 2
#define LDI_CTRL 0x7420
#define BPP_OFST 3
#define DATA_GATE_EN BIT(2)
diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
index 0df1afdf319d..d972342527b8 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
@@ -58,6 +58,7 @@ struct ade_hw_ctx {
struct ade_crtc {
struct drm_crtc base;
struct ade_hw_ctx *ctx;
+ struct work_struct display_reset_wq;
bool enable;
u32 out_format;
};
@@ -176,6 +177,7 @@ static void ade_init(struct ade_hw_ctx *ctx)
*/
ade_update_bits(base + ADE_CTRL, FRM_END_START_OFST,
FRM_END_START_MASK, REG_EFFECTIVE_IN_ADEEN_FRMEND);
+ ade_update_bits(base + LDI_INT_EN, UNDERFLOW_INT_EN_OFST, MASK(1), 1);
}
static bool ade_crtc_mode_fixup(struct drm_crtc *crtc,
@@ -345,6 +347,17 @@ static void ade_crtc_disable_vblank(struct drm_crtc *crtc)
MASK(1), 0);
}
+static void drm_underflow_wq(struct work_struct *work)
+{
+ struct ade_crtc *acrtc = container_of(work, struct ade_crtc,
+ display_reset_wq);
+ struct drm_device *drm_dev = (&acrtc->base)->dev;
+ struct drm_atomic_state *state;
+
+ state = drm_atomic_helper_suspend(drm_dev);
+ drm_atomic_helper_resume(drm_dev, state);
+}
+
static irqreturn_t ade_irq_handler(int irq, void *data)
{
struct ade_crtc *acrtc = data;
@@ -362,6 +375,12 @@ static irqreturn_t ade_irq_handler(int irq, void *data)
MASK(1), 1);
drm_crtc_handle_vblank(crtc);
}
+ if (status & BIT(UNDERFLOW_INT_EN_OFST)) {
+ ade_update_bits(base + LDI_INT_CLR, UNDERFLOW_INT_EN_OFST,
+ MASK(1), 1);
+ DRM_ERROR("LDI underflow!");
+ schedule_work(&acrtc->display_reset_wq);
+ }
return IRQ_HANDLED;
}
@@ -1038,6 +1057,9 @@ static int ade_drm_init(struct platform_device *pdev)
/* vblank irq init */
ret = devm_request_irq(dev->dev, ctx->irq, ade_irq_handler,
IRQF_SHARED, dev->driver->name, acrtc);
+
+ INIT_WORK(&acrtc->display_reset_wq, drm_underflow_wq);
+
if (ret)
return ret;
--
2.17.1
next prev parent reply other threads:[~2019-08-20 23:08 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-20 23:06 [PATCH v5 00/25] drm: Kirin driver cleanups to prep for Kirin960 support John Stultz
2019-08-20 23:06 ` John Stultz [this message]
2019-08-20 23:06 ` [PATCH v5 02/25] drm: kirin: Remove HISI_KIRIN_DW_DSI config option John Stultz
2019-08-20 23:06 ` [PATCH v5 03/25] drm: kirin: Remove unreachable return John Stultz
2019-08-20 23:06 ` [PATCH v5 04/25] drm: kirin: Remove uncessary parameter indirection John Stultz
2019-08-20 23:06 ` [PATCH v5 05/25] drm: kirin: Remove out_format from ade_crtc John Stultz
2019-08-20 23:06 ` [PATCH v5 06/25] drm: kirin: Rename ade_plane to kirin_plane John Stultz
2019-08-20 23:06 ` [PATCH v5 07/25] drm: kirin: Rename ade_crtc to kirin_crtc John Stultz
2019-08-20 23:06 ` [PATCH v5 08/25] drm: kirin: Dynamically allocate the hw_ctx John Stultz
2019-08-20 23:06 ` [PATCH v5 09/25] drm: kirin: Move request irq handle in ade hw ctx alloc John Stultz
2019-08-20 23:06 ` [PATCH v5 10/25] drm: kirin: Move workqueue to ade_hw_ctx structure John Stultz
2019-08-20 23:06 ` [PATCH v5 11/25] drm: kirin: Move kirin_crtc, kirin_plane, kirin_format to kirin_drm_drv.h John Stultz
2019-08-20 23:06 ` [PATCH v5 12/25] drm: kirin: Reanme dc_ops to kirin_drm_data John Stultz
2019-08-20 23:06 ` [PATCH v5 13/25] drm: kirin: Move ade crtc/plane help functions to driver_data John Stultz
2019-08-20 23:06 ` [PATCH v5 14/25] drm: kirin: Move channel formats to driver data John Stultz
2019-08-20 23:06 ` [PATCH v5 15/25] drm: kirin: Move mode config function to driver_data John Stultz
2019-08-20 23:06 ` [PATCH v5 16/25] drm: kirin: Move plane number and primay plane in driver data John Stultz
2019-08-20 23:06 ` [PATCH v5 17/25] drm: kirin: Move config max_width and max_height to " John Stultz
2019-08-20 23:06 ` [PATCH v5 18/25] drm: kirin: Move drm driver " John Stultz
2019-08-20 23:06 ` [PATCH v5 19/25] drm: kirin: Add register connect helper functions in drm init John Stultz
2020-04-07 8:02 ` Daniel Vetter
2019-08-20 23:06 ` [PATCH v5 20/25] drm: kirin: Rename plane_init and crtc_init John Stultz
2019-08-20 23:06 ` [PATCH v5 21/25] drm: kirin: Fix dev->driver_data setting John Stultz
2019-08-20 23:06 ` [PATCH v5 22/25] drm: kirin: Make driver_data variable non-global John Stultz
2019-08-20 23:06 ` [PATCH v5 23/25] drm: kirin: Add alloc_hw_ctx/clean_hw_ctx ops in driver data John Stultz
2019-08-20 23:06 ` [PATCH v5 24/25] drm: kirin: Pass driver data to crtc init and plane init John Stultz
2019-08-20 23:06 ` [PATCH v5 25/25] drm: kirin: Move ade drm init to kirin drm drv John Stultz
2019-08-21 18:04 ` [PATCH v5 00/25] drm: Kirin driver cleanups to prep for Kirin960 support Sam Ravnborg
2019-08-21 19:13 ` John Stultz
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=20190820230626.23253-2-john.stultz@linaro.org \
--to=john.stultz@linaro.org \
--cc=airlied@linux.ie \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linyidong@huawei.com \
--cc=lvda3@hisilicon.com \
--cc=sam@ravnborg.org \
--cc=z.liuxinliang@hisilicon.com \
--cc=zourongrong@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox