summaryrefslogtreecommitdiff
path: root/drivers/video/tridentfb.c
diff options
context:
space:
mode:
authorAntonino A. Daplas <adaplas@gmail.com>2005-08-01 19:46:44 +0400
committerLinus Torvalds <torvalds@g5.osdl.org>2005-08-01 21:07:13 +0400
commit8dad46cf38c029248d1331b6a97b2999e0751cfa (patch)
treeee0930bbbe84729fad902c3d30054c1f1dcb5faf /drivers/video/tridentfb.c
parent6cb54819d7b1867053e2dfd8c0ca3a8dc65a7eff (diff)
downloadlinux-8dad46cf38c029248d1331b6a97b2999e0751cfa.tar.xz
[PATCH] tridentfb: Fix scrolling artifacts if acceleration is enabled
Reported by: Jochen Hein (Bugzilla Bug 4386) booting leaves the end of long lines in the last line on screen when scrolling. When X is running, scrolling puts garbage on the screen (looks like X data) Console switch fixes the screen. Behaviour seems to be identical with noaccel and without on the video=tridentfb parameter in lilo.conf. This bug was explained by: Knut_Petersen Acceleration is broken for all BLADE 3D chips for all versions of kernel 2.6 except for 32bit modes. Most important reason is that the u32 col parameter of the graphics engine needs the color value replicated to all u8 of the u32 (8bit modes) and to both u16 of the u32. Fix color value passed to graphics engine, verified by the reporter. Signed-off-by: Antonino Daplas <adaplas@pol.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/video/tridentfb.c')
-rw-r--r--drivers/video/tridentfb.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/video/tridentfb.c b/drivers/video/tridentfb.c
index da8004e5d03d..64aa78c5da79 100644
--- a/drivers/video/tridentfb.c
+++ b/drivers/video/tridentfb.c
@@ -454,13 +454,16 @@ static struct accel_switch accel_image = {
static void tridentfb_fillrect(struct fb_info * info, const struct fb_fillrect *fr)
{
int bpp = info->var.bits_per_pixel;
- int col;
+ int col = 0;
switch (bpp) {
default:
- case 8: col = fr->color;
+ case 8: col |= fr->color;
+ col |= col << 8;
+ col |= col << 16;
break;
case 16: col = ((u32 *)(info->pseudo_palette))[fr->color];
+
break;
case 32: col = ((u32 *)(info->pseudo_palette))[fr->color];
break;
@@ -882,8 +885,9 @@ static int tridentfb_set_par(struct fb_info *info)
write3X4(GraphEngReg, 0x80); //enable GE for text acceleration
-// if (info->var.accel_flags & FB_ACCELF_TEXT)
-//FIXME acc->init_accel(info->var.xres,bpp);
+#ifdef CONFIG_FB_TRIDENT_ACCEL
+ acc->init_accel(info->var.xres,bpp);
+#endif
switch (bpp) {
case 8: tmp = 0x00; break;
@@ -981,12 +985,14 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green,
t_outb(green>>10,0x3C9);
t_outb(blue>>10,0x3C9);
- } else
- if (bpp == 16) /* RGB 565 */
- ((u32*)info->pseudo_palette)[regno] = (red & 0xF800) |
- ((green & 0xFC00) >> 5) | ((blue & 0xF800) >> 11);
- else
- if (bpp == 32) /* ARGB 8888 */
+ } else if (bpp == 16) { /* RGB 565 */
+ u32 col;
+
+ col = (red & 0xF800) | ((green & 0xFC00) >> 5) |
+ ((blue & 0xF800) >> 11);
+ col |= col << 16;
+ ((u32 *)(info->pseudo_palette))[regno] = col;
+ } else if (bpp == 32) /* ARGB 8888 */
((u32*)info->pseudo_palette)[regno] =
((transp & 0xFF00) <<16) |
((red & 0xFF00) << 8) |