On 20/04/17 09:27, Tomi Valkeinen wrote: > On 19/04/17 18:49, Jyri Sarha wrote: >> On 04/19/17 16:35, Tomi Valkeinen wrote: >>> I was able to reproduce on my very old omap3 beagleboard. Looks very >>> much like a omap3 DSS HW bug to me. The unfortunate thing is that even >>> reverting the patch won't remove the issue, if the userspace happens to >>> configure things in certain order. >>> >>> It looks to me that if the DSS output is enabled without an overlay (the >>> primary plane, normally), DSS gets stuck into a bad state, and only >>> reboot helps (because we can't reset, there's no omap hwmod reset >>> framework). >>> >>> But there should be nothing wrong with that setup, and if there's first >>> been a successful display enable, then later we can enable the DSS >>> without any planes. >> >> If that is the case, then maybe we could just enable errata i734 (the >> gamma bug) work a round for omap3 too. The work a round makes an >> artificial minimal display setup with GFX plane for one frame, with >> outputs masked, so it could be exactly what we need. > > Yep, that did come to my mind and I tested it yesterday. However, I > failed to realize there's the WA init part, and I only made sure the > dispc_errata_i734_wa() is called. > > Now that I set the bit in the dispc features, it indeed seems to fix the > issue. > > Below is a hack patch for people to try out. It's based on today's > linux-next, but should apply to more or less any semi-recent kernel. If > it works for others, I'll create a proper patch, which drops the > has_gamma_i734_bug flag and always does the WA. There was also an issue with the analog tv out, it rejected all videomodes. I've attached WIP patches. I still see sync losts in the case I don't have display aliases set and the analog tv out happens to be the first output. Same would probably happen if I had the aliases, and the tv was set as display0. Tomi
From 3c14a42991ae2c00589a6ea46b2a4976ae85149c Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen <tomi.valkeinen@xxxxxx> Date: Thu, 20 Apr 2017 11:10:34 +0300 Subject: [PATCH 1/2] dss: remove export of venc modes --- drivers/gpu/drm/omapdrm/dss/omapdss.h | 7 ------- drivers/gpu/drm/omapdrm/dss/venc.c | 6 ++---- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h index b19dae1fd6c5..441ba707fad8 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -299,13 +299,6 @@ struct omap_dss_dsi_config { enum omap_dss_dsi_trans_mode trans_mode; }; -/* Hardcoded videomodes for tv. Venc only uses these to - * identify the mode, and does not actually use the configs - * itself. However, the configs should be something that - * a normal monitor can also show */ -extern const struct videomode omap_dss_pal_vm; -extern const struct videomode omap_dss_ntsc_vm; - struct omap_dss_cpr_coefs { s16 rr, rg, rb; s16 gr, gg, gb; diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c index 19d14957f566..ab5e3f256644 100644 --- a/drivers/gpu/drm/omapdrm/dss/venc.c +++ b/drivers/gpu/drm/omapdrm/dss/venc.c @@ -263,7 +263,7 @@ static const struct venc_config venc_config_pal_bdghi = { .fid_ext_start_y__fid_ext_offset_y = 0x01380005, }; -const struct videomode omap_dss_pal_vm = { +static const struct videomode omap_dss_pal_vm = { .hactive = 720, .vactive = 574, .pixelclock = 13500000, @@ -279,9 +279,8 @@ const struct videomode omap_dss_pal_vm = { DISPLAY_FLAGS_PIXDATA_POSEDGE | DISPLAY_FLAGS_SYNC_NEGEDGE, }; -EXPORT_SYMBOL(omap_dss_pal_vm); -const struct videomode omap_dss_ntsc_vm = { +static const struct videomode omap_dss_ntsc_vm = { .hactive = 720, .vactive = 482, .pixelclock = 13500000, @@ -297,7 +296,6 @@ const struct videomode omap_dss_ntsc_vm = { DISPLAY_FLAGS_PIXDATA_POSEDGE | DISPLAY_FLAGS_SYNC_NEGEDGE, }; -EXPORT_SYMBOL(omap_dss_ntsc_vm); static struct { struct platform_device *pdev; -- 2.7.4
From cf9bf220292f189e0efa71a58eb6375e915774fb Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen <tomi.valkeinen@xxxxxx> Date: Thu, 20 Apr 2017 11:21:33 +0300 Subject: [PATCH 2/2] venc: fix modecheck --- drivers/gpu/drm/omapdrm/dss/venc.c | 66 ++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c index ab5e3f256644..a01c2f3bd1ea 100644 --- a/drivers/gpu/drm/omapdrm/dss/venc.c +++ b/drivers/gpu/drm/omapdrm/dss/venc.c @@ -263,6 +263,13 @@ static const struct venc_config venc_config_pal_bdghi = { .fid_ext_start_y__fid_ext_offset_y = 0x01380005, }; +enum venc_videomode +{ + VENC_MODE_UNKNOWN, + VENC_MODE_PAL, + VENC_MODE_NTSC, +}; + static const struct videomode omap_dss_pal_vm = { .hactive = 720, .vactive = 574, @@ -297,6 +304,24 @@ static const struct videomode omap_dss_ntsc_vm = { DISPLAY_FLAGS_SYNC_NEGEDGE, }; +static enum venc_videomode venc_get_videomode(const struct videomode *vm) +{ + if (!(vm->flags & DISPLAY_FLAGS_INTERLACED)) + return VENC_MODE_UNKNOWN; + + if (vm->pixelclock == omap_dss_pal_vm.pixelclock && + vm->hactive == omap_dss_pal_vm.hactive && + vm->vactive == omap_dss_pal_vm.vactive) + return VENC_MODE_PAL; + + if (vm->pixelclock == omap_dss_ntsc_vm.pixelclock && + vm->hactive == omap_dss_ntsc_vm.hactive && + vm->vactive == omap_dss_ntsc_vm.vactive) + return VENC_MODE_NTSC; + + return VENC_MODE_UNKNOWN; +} + static struct { struct platform_device *pdev; void __iomem *base; @@ -422,14 +447,14 @@ static void venc_runtime_put(void) static const struct venc_config *venc_timings_to_config(struct videomode *vm) { - if (memcmp(&omap_dss_pal_vm, vm, sizeof(*vm)) == 0) + switch (venc_get_videomode(vm)) { + default: + WARN_ON_ONCE(1); + case VENC_MODE_PAL: return &venc_config_pal_trm; - - if (memcmp(&omap_dss_ntsc_vm, vm, sizeof(*vm)) == 0) + case VENC_MODE_NTSC: return &venc_config_ntsc_trm; - - BUG(); - return NULL; + } } static int venc_power_on(struct omap_dss_device *dssdev) @@ -540,15 +565,28 @@ static void venc_display_disable(struct omap_dss_device *dssdev) static void venc_set_timings(struct omap_dss_device *dssdev, struct videomode *vm) { + struct videomode actual_vm; + DSSDBG("venc_set_timings\n"); mutex_lock(&venc.venc_lock); + switch (venc_get_videomode(vm)) { + default: + WARN_ON_ONCE(1); + case VENC_MODE_PAL: + actual_vm = omap_dss_pal_vm; + break; + case VENC_MODE_NTSC: + actual_vm = omap_dss_ntsc_vm; + break; + } + /* Reset WSS data when the TV standard changes. */ - if (memcmp(&venc.vm, vm, sizeof(*vm))) + if (memcmp(&venc.vm, &actual_vm, sizeof(actual_vm))) venc.wss_data = 0; - venc.vm = *vm; + venc.vm = actual_vm; dispc_set_tv_pclk(13500000); @@ -560,13 +598,13 @@ static int venc_check_timings(struct omap_dss_device *dssdev, { DSSDBG("venc_check_timings\n"); - if (memcmp(&omap_dss_pal_vm, vm, sizeof(*vm)) == 0) + switch (venc_get_videomode(vm)) { + case VENC_MODE_PAL: + case VENC_MODE_NTSC: return 0; - - if (memcmp(&omap_dss_ntsc_vm, vm, sizeof(*vm)) == 0) - return 0; - - return -EINVAL; + default: + return -EINVAL; + } } static void venc_get_timings(struct omap_dss_device *dssdev, -- 2.7.4
Attachment:
signature.asc
Description: OpenPGP digital signature