lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1400073709-15012-1-git-send-email-tiwai@suse.de>
Date:	Wed, 14 May 2014 15:21:49 +0200
From:	Takashi Iwai <tiwai@...e.de>
To:	Tomi Valkeinen <tomi.valkeinen@...com>
Cc:	Jean-Christophe Plagniol-Villard <plagnioj@...osoft.com>,
	Cedric Le Goater <clg@...ibm.com>,
	linux-fbdev@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: [PATCH] offb: Fix little-endian support

Although the color palette was corrected for little endian by the
commit  [e1edf18b: offb: Add palette hack for little endian], the
graphics mode is still shown in psychedelic colors.  For fixing this
properly, we rather need to correct the RGB offsets depending on
endianess.

Since the RGB base offsets are corrected, we don't need the hack for
pallette color entries.  This patch reverts that, too.

Signed-off-by: Takashi Iwai <tiwai@...e.de>
---
 drivers/video/fbdev/offb.c | 51 +++++++++++++++++++++++++++++-----------------
 1 file changed, 32 insertions(+), 19 deletions(-)

diff --git a/drivers/video/fbdev/offb.c b/drivers/video/fbdev/offb.c
index 7d44d669d5b6..0224a62aa49d 100644
--- a/drivers/video/fbdev/offb.c
+++ b/drivers/video/fbdev/offb.c
@@ -93,13 +93,6 @@ extern boot_infos_t *boot_infos;
 
 #define FB_RIGHT_POS(p, bpp)         (fb_be_math(p) ? 0 : (32 - (bpp)))
 
-static inline u32 offb_cmap_byteswap(struct fb_info *info, u32 value)
-{
-	u32 bpp = info->var.bits_per_pixel;
-
-	return cpu_to_be32(value) >> FB_RIGHT_POS(info, bpp);
-}
-
     /*
      *  Set a single color register. The values supplied are already
      *  rounded down to the hardware's capabilities (according to the
@@ -129,7 +122,7 @@ static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
 			mask <<= info->var.transp.offset;
 			value |= mask;
 		}
-		pal[regno] = offb_cmap_byteswap(info, value);
+		pal[regno] = value;
 		return 0;
 	}
 
@@ -451,6 +444,8 @@ static void __init offb_init_fb(const char *name, const char *full_name,
 	else
 		fix->visual = FB_VISUAL_TRUECOLOR;
 
+	info->flags = FBINFO_DEFAULT | FBINFO_MISC_FIRMWARE | foreign_endian;
+
 	var->xoffset = var->yoffset = 0;
 	switch (depth) {
 	case 8:
@@ -466,35 +461,54 @@ static void __init offb_init_fb(const char *name, const char *full_name,
 		break;
 	case 15:		/* RGB 555 */
 		var->bits_per_pixel = 16;
-		var->red.offset = 10;
+		if (fb_be_math(info)) {
+			var->red.offset = 10;
+			var->green.offset = 5;
+			var->blue.offset = 0;
+		} else {
+			var->red.offset = 0;
+			var->green.offset = 5;
+			var->blue.offset = 10;
+		}
 		var->red.length = 5;
-		var->green.offset = 5;
 		var->green.length = 5;
-		var->blue.offset = 0;
 		var->blue.length = 5;
 		var->transp.offset = 0;
 		var->transp.length = 0;
 		break;
 	case 16:		/* RGB 565 */
 		var->bits_per_pixel = 16;
-		var->red.offset = 11;
+		if (fb_be_math(info)) {
+			var->red.offset = 11;
+			var->green.offset = 5;
+			var->blue.offset = 0;
+		} else {
+			var->red.offset = 0;
+			var->green.offset = 5;
+			var->blue.offset = 11;
+		}
 		var->red.length = 5;
-		var->green.offset = 5;
 		var->green.length = 6;
-		var->blue.offset = 0;
 		var->blue.length = 5;
 		var->transp.offset = 0;
 		var->transp.length = 0;
 		break;
 	case 32:		/* RGB 888 */
 		var->bits_per_pixel = 32;
-		var->red.offset = 16;
+		if (fb_be_math(info)) {
+			var->red.offset = 16;
+			var->green.offset = 8;
+			var->blue.offset = 0;
+			var->transp.offset = 24;
+		} else {
+			var->red.offset = 8;
+			var->green.offset = 16;
+			var->blue.offset = 24;
+			var->transp.offset = 0;
+		}
 		var->red.length = 8;
-		var->green.offset = 8;
 		var->green.length = 8;
-		var->blue.offset = 0;
 		var->blue.length = 8;
-		var->transp.offset = 24;
 		var->transp.length = 8;
 		break;
 	}
@@ -521,7 +535,6 @@ static void __init offb_init_fb(const char *name, const char *full_name,
 	info->fbops = &offb_ops;
 	info->screen_base = ioremap(address, fix->smem_len);
 	info->pseudo_palette = (void *) (info + 1);
-	info->flags = FBINFO_DEFAULT | FBINFO_MISC_FIRMWARE | foreign_endian;
 
 	fb_alloc_cmap(&info->cmap, 256, 0);
 
-- 
1.9.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ