[RX51] workaround lines issue (#309)
This works around the lines issue using a patch from Ti: https://lkml.org/lkml/2017/6/30/163
This commit is contained in:
parent
ea575334e9
commit
b0d7e1b483
2 changed files with 120 additions and 2 deletions
|
@ -0,0 +1,116 @@
|
|||
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
|
||||
@@ -36,12 +36,15 @@ struct omap_crtc {
|
||||
|
||||
struct videomode vm;
|
||||
|
||||
- bool ignore_digit_sync_lost;
|
||||
+ bool ignore_sync_lost;
|
||||
|
||||
bool enabled;
|
||||
bool pending;
|
||||
wait_queue_head_t pending_wait;
|
||||
struct drm_pending_vblank_event *event;
|
||||
+
|
||||
+ struct work_struct error_work;
|
||||
+ u32 error_channels;
|
||||
};
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
@@ -157,7 +160,7 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
|
||||
* Digit output produces some sync lost interrupts during the
|
||||
* first frame when enabling, so we need to ignore those.
|
||||
*/
|
||||
- omap_crtc->ignore_digit_sync_lost = true;
|
||||
+ omap_crtc->ignore_sync_lost = true;
|
||||
}
|
||||
|
||||
framedone_irq = priv->dispc_ops->mgr_get_framedone_irq(channel);
|
||||
@@ -191,7 +194,7 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
|
||||
}
|
||||
|
||||
if (omap_crtc->channel == OMAP_DSS_CHANNEL_DIGIT) {
|
||||
- omap_crtc->ignore_digit_sync_lost = false;
|
||||
+ omap_crtc->ignore_sync_lost = false;
|
||||
/* make sure the irq handler sees the value above */
|
||||
mb();
|
||||
}
|
||||
@@ -263,17 +266,65 @@ static const struct dss_mgr_ops mgr_ops = {
|
||||
* Setup, Flush and Page Flip
|
||||
*/
|
||||
|
||||
+static void omap_crtc_error_worker(struct work_struct *work)
|
||||
+{
|
||||
+ struct omap_crtc *omap_crtc = container_of(work, struct omap_crtc, error_work);
|
||||
+ struct drm_crtc *crtc = &omap_crtc->base;
|
||||
+ struct drm_device *dev = omap_crtc->base.dev;
|
||||
+ struct omap_drm_private *priv = dev->dev_private;
|
||||
+
|
||||
+ drm_modeset_lock(&crtc->mutex, NULL);
|
||||
+
|
||||
+ dev_warn(dev->dev, "sync lost on %s, enabling & disabling...\n",
|
||||
+ omap_crtc->name);
|
||||
+
|
||||
+ priv->dispc_ops->mgr_enable(omap_crtc->channel, false);
|
||||
+
|
||||
+ msleep(50);
|
||||
+ dev_warn(dev->dev, "sync lost enabling %s\n",
|
||||
+ omap_crtc->name);
|
||||
+
|
||||
+ priv->dispc_ops->mgr_enable(omap_crtc->channel, true);
|
||||
+
|
||||
+ msleep(50);
|
||||
+
|
||||
+ dev_warn(dev->dev, "sync lost recovery done on on %s\n",
|
||||
+ omap_crtc->name);
|
||||
+
|
||||
+ omap_crtc->ignore_sync_lost = false;
|
||||
+ /* make sure the irq handler sees the value above */
|
||||
+ mb();
|
||||
+
|
||||
+ drm_modeset_unlock(&crtc->mutex);
|
||||
+}
|
||||
+
|
||||
void omap_crtc_error_irq(struct drm_crtc *crtc, uint32_t irqstatus)
|
||||
{
|
||||
struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
|
||||
+ struct drm_device *dev = omap_crtc->base.dev;
|
||||
+ struct omap_drm_private *priv = dev->dev_private;
|
||||
+ enum omap_channel channel = omap_crtc_channel(crtc);
|
||||
+ u32 sync_lost_irq;
|
||||
+ bool sync_lost;
|
||||
+
|
||||
+ sync_lost_irq = priv->dispc_ops->mgr_get_sync_lost_irq(channel);
|
||||
|
||||
- if (omap_crtc->ignore_digit_sync_lost) {
|
||||
- irqstatus &= ~DISPC_IRQ_SYNC_LOST_DIGIT;
|
||||
- if (!irqstatus)
|
||||
- return;
|
||||
+ sync_lost = irqstatus & sync_lost_irq;
|
||||
+
|
||||
+ if (sync_lost) {
|
||||
+ if (omap_crtc->ignore_sync_lost) {
|
||||
+ irqstatus &= ~sync_lost_irq;
|
||||
+ } else {
|
||||
+ /* error worker will set this to false */
|
||||
+ omap_crtc->ignore_sync_lost = true;
|
||||
+ schedule_work(&omap_crtc->error_work);
|
||||
+ }
|
||||
}
|
||||
|
||||
- DRM_ERROR_RATELIMITED("%s: errors: %08x\n", omap_crtc->name, irqstatus);
|
||||
+ if (!irqstatus)
|
||||
+ return;
|
||||
+
|
||||
+ printk("%s: errors: %08x\n", omap_crtc->name, irqstatus);
|
||||
}
|
||||
|
||||
void omap_crtc_vblank_irq(struct drm_crtc *crtc)
|
||||
@@ -612,6 +663,8 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
|
||||
|
||||
init_waitqueue_head(&omap_crtc->pending_wait);
|
||||
|
||||
+ INIT_WORK(&omap_crtc->error_work, omap_crtc_error_worker);
|
||||
+
|
||||
omap_crtc->channel = channel;
|
||||
omap_crtc->name = channel_names[channel];
|
|
@ -15,7 +15,7 @@ pkgname=linux-${_flavor}
|
|||
|
||||
pkgver=4.12.4
|
||||
_kernver=${pkgver}
|
||||
pkgrel=2
|
||||
pkgrel=3
|
||||
|
||||
arch="all"
|
||||
pkgdesc="Mainline Linux for pmOS supported chipsets (OMAP)"
|
||||
|
@ -28,6 +28,7 @@ source="
|
|||
https://cdn.kernel.org/pub/linux/kernel/v${pkgver%%.*}.x/linux-$_kernver.tar.xz
|
||||
config-${_flavor}.armhf
|
||||
config-${_flavor}.x86_64
|
||||
0001-rx51-drm-regression-workaround.patch
|
||||
"
|
||||
subpackages="$pkgname-dev::$CBUILD_ARCH"
|
||||
license="GPL2"
|
||||
|
@ -172,4 +173,5 @@ dev() {
|
|||
|
||||
sha512sums="beb3c7644f12925301aedcc0cfc347cd086ce0486d3a4fe5a59fd4e00452c5495cec1eb7a294b83bd0d4a55238077d0b3766824b70e92e9b211b3f3146b6cc68 linux-4.12.4.tar.xz
|
||||
3f4435ce0cf227e4ba64aa7153c913370c53069e34a376e453786d601b5a73706a3f44b002fab1b10a72dc94e896c1d8fb462c2b78e62ed69c468d98aa7220da config-postmarketos.armhf
|
||||
c2bdaf8885dab4c3d3f96d856179138fed2d33cadcb9b33997238c8395a13eb8cb2b35f5f887339c5b47b34c8aa1bcd121059987601c1908103b66c23da478f0 config-postmarketos.x86_64"
|
||||
c2bdaf8885dab4c3d3f96d856179138fed2d33cadcb9b33997238c8395a13eb8cb2b35f5f887339c5b47b34c8aa1bcd121059987601c1908103b66c23da478f0 config-postmarketos.x86_64
|
||||
17c48bb7b4218297bd2be6faa5b6570ce1560a33385237a9962c0884d782c9a722a25a30077b6721d2943a9b98c29dcad6adfef718b0163c559c19a79519319b 0001-rx51-drm-regression-workaround.patch"
|
||||
|
|
Loading…
Reference in a new issue