On Fri, Jan 12, 2018 at 10:08:49PM +0100, Daniel Vetter wrote:
On Fri, Jan 12, 2018 at 3:08 PM, Sean Paul seanpaul@chromium.org wrote:
On Fri, Jan 12, 2018 at 4:48 AM, Daniel Vetter daniel.vetter@ffwll.ch wrote:
[Fair warning: This is pure conjecture right now.]
In
commit b8e2b0199cc377617dc238f5106352c06dcd3fa2 Author: Peter Rosin peda@axentia.se Date: Tue Jul 4 12:36:57 2017 +0200
drm/fb-helper: factor out pseudo-palette
Peter extracted the pseudo palette computation, but seems to have done an off-by-one. I spotted that +1, but then noticed that we've passed start++ to (now gone) setcolreg function, so it seemed to all match up. Except post vs. pre-increment ftw.
Result is that the palette is off-by-one, and the forground color (slot 0) ends up black, rendering a fairly unreadable console.
What baffles me is that on some systems it still seems to work somehow, which lead us all down a wild goose chase trying to add load_lut calls back in in various places (which was also intentionally removed, but really doesn't seem to be the real root cause).
Fixes: b8e2b0199cc3 ("drm/fb-helper: factor out pseudo-palette") Cc: Peter Rosin peda@axenita.se Cc: Daniel Vetter daniel.vetter@ffwll.ch Cc: Daniel Vetter daniel.vetter@intel.com Cc: Gustavo Padovan gustavo@padovan.org Cc: Sean Paul seanpaul@chromium.org Cc: David Airlie airlied@linux.ie Cc: dri-devel@lists.freedesktop.org Cc: stable@vger.kernel.org # v4.14+ Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=198123 Reported-by: Deposite Pirate dpirate@metalpunks.info Reported-by: Bill Fraser bill.fraser@gmail.com Cc: Deposite Pirate dpirate@metalpunks.info Cc: Bill Fraser bill.fraser@gmail.com Cc: Michel Dänzer michel@daenzer.net Signed-off-by: Daniel Vetter daniel.vetter@intel.com
drivers/gpu/drm/drm_fb_helper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 035784ddd133..1c3a200c4a10 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -1295,7 +1295,7 @@ static int setcmap_pseudo_palette(struct fb_cmap *cmap, struct fb_info *info) mask <<= info->var.transp.offset; value |= mask; }
palette[cmap->start + i] = value;
palette[cmap->start] = value;
I don't think this is equivalent to what was there before. Before there we set palette[cmap->start]->palette[cmap->start + cmap->len - 1], now we're only setting palette[cmap->start].
In the previous version (before Peter's change), we wrote palette[cmap->start] twice. So while there is an off-by-one bug, I don't think this fixes the issue.
Well this patch is complete nonsense, no idea what I was thinking ...
[Sending this out since it's in my tree and I'll forget soon]
Equivalent behavior would be:
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 035784ddd133..df6709768723 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -1295,7 +1295,8 @@ static int setcmap_pseudo_palette(struct fb_cmap *cmap, struct fb_info *info) mask <<= info->var.transp.offset; value |= mask; } - palette[cmap->start + i] = value; + if (i > 0) + palette[cmap->start + i - 1] = value; }
return 0;
-Daniel
Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch