Commit dfedad61 authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Greg Kroah-Hartman

offb: Fix setting of the pseudo-palette for >8bpp

commit 1bb0b7d2 upstream.

When using a >8bpp framebuffer, offb advertises truecolor, not directcolor,
and doesn't touch the color map even if it has a corresponding access method
for the real hardware.

Thus it needs to set the pseudo-palette with all 3 components of the color,
like other truecolor framebuffers, not with copies of the color index like
a directcolor framebuffer would do.

This went unnoticed for a long time because it's pretty hard to get offb
to kick in with anything but 8bpp (old BootX under MacOS will do that and
qemu does it).
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 2289fb57
...@@ -100,36 +100,32 @@ static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, ...@@ -100,36 +100,32 @@ static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
u_int transp, struct fb_info *info) u_int transp, struct fb_info *info)
{ {
struct offb_par *par = (struct offb_par *) info->par; struct offb_par *par = (struct offb_par *) info->par;
int i, depth;
u32 *pal = info->pseudo_palette; if (info->fix.visual == FB_VISUAL_TRUECOLOR) {
u32 *pal = info->pseudo_palette;
depth = info->var.bits_per_pixel; u32 cr = red >> (16 - info->var.red.length);
if (depth == 16) u32 cg = green >> (16 - info->var.green.length);
depth = (info->var.green.length == 5) ? 15 : 16; u32 cb = blue >> (16 - info->var.blue.length);
u32 value;
if (regno > 255 ||
(depth == 16 && regno > 63) || if (regno >= 16)
(depth == 15 && regno > 31)) return -EINVAL;
return 1;
value = (cr << info->var.red.offset) |
if (regno < 16) { (cg << info->var.green.offset) |
switch (depth) { (cb << info->var.blue.offset);
case 15: if (info->var.transp.length > 0) {
pal[regno] = (regno << 10) | (regno << 5) | regno; u32 mask = (1 << info->var.transp.length) - 1;
break; mask <<= info->var.transp.offset;
case 16: value |= mask;
pal[regno] = (regno << 11) | (regno << 5) | regno;
break;
case 24:
pal[regno] = (regno << 16) | (regno << 8) | regno;
break;
case 32:
i = (regno << 8) | regno;
pal[regno] = (i << 16) | i;
break;
} }
pal[regno] = value;
return 0;
} }
if (regno > 255)
return -EINVAL;
red >>= 8; red >>= 8;
green >>= 8; green >>= 8;
blue >>= 8; blue >>= 8;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment