Re: tdfxfb fixes - take 2
Hello,
I'd already made a patch, 1 or 2 years ago, here is it, hope that help.
nicod
--
Nicolas Dimitrijevic - Sengena SARL - http://www.sengena.com
tel: (33)4 91 40 46 50
--- linux/drivers/video/tdfxfb.orig.c Sat Dec 14 13:54:48 2002
+++ linux/drivers/video/tdfxfb.c Sun Dec 15 12:43:42 2002
@@ -168,6 +168,7 @@
#define COMMAND_2D (0x00100000 + 0x70)
#define LAUNCH_2D (0x00100000 + 0x80)
+#define LFBMODE (0x00200000 + 0x114)
#define COMMAND_3D (0x00200000 + 0x120)
/* register bitfields (not all, only as needed) */
@@ -287,6 +288,9 @@
unsigned long srcbase;
unsigned long dstbase;
unsigned long miscinit0;
+#if defined(__BIG_ENDIAN)
+ unsigned long lfbmode;
+#endif
};
struct tdfxfb_par {
@@ -762,7 +766,11 @@
tdfx_outl(SRCXY, 0);
tdfx_outl(DSTXY, xx | (yy << 16));
tdfx_outl(COMMAND_2D, COMMAND_2D_H2S_BITBLT | (ROP_COPY << 24));
+#if defined(__BIG_ENDIAN)
+ tdfx_outl(SRCFORMAT, 0x400000 | BIT(20));
+#else
tdfx_outl(SRCFORMAT, 0x400000);
+#endif
tdfx_outl(DSTFORMAT, fmt);
tdfx_outl(DSTSIZE, fontwidth(p) | (fontheight(p) << 16));
i=fontheight(p);
@@ -820,7 +828,11 @@
tdfx_outl(COMMAND_3D, COMMAND_3D_NOP);
tdfx_outl(COLORFORE, fgx);
tdfx_outl(COLORBACK, bgx);
+#if defined(__BIG_ENDIAN)
+ tdfx_outl(SRCFORMAT, 0x400000 | BIT(20));
+#else
tdfx_outl(SRCFORMAT, 0x400000);
+#endif
tdfx_outl(DSTFORMAT, fmt);
tdfx_outl(DSTSIZE, w | (h << 16));
tdfx_outl(SRCXY, 0);
@@ -953,6 +965,10 @@
tdfx_outl(VIDPROCCFG, reg->vidcfg);
tdfx_outl(VGAINIT1, reg->vgainit1);
tdfx_outl(MISCINIT0, reg->miscinit0);
+#if defined(__BIG_ENDIAN)
+ banshee_make_room(1);
+ tdfx_outl(LFBMODE, reg->lfbmode);
+#endif
banshee_make_room(8);
tdfx_outl(SRCBASE, reg->srcbase);
@@ -1466,11 +1482,20 @@
reg.miscinit0 |= (1 << 31);
break;
case 24:
+ reg.miscinit0 &= ~(1 << 30);
+ reg.miscinit0 &= ~(1 << 31);
+ break;
case 32:
reg.miscinit0 |= (1 << 30);
reg.miscinit0 &= ~(1 << 31);
break;
}
+
+ reg.lfbmode = tdfx_inl(LFBMODE);
+ reg.lfbmode &= ~(1 << 12);
+ reg.lfbmode |= (1 << 11);
+ reg.lfbmode &= ~(1 << 10);
+ reg.lfbmode &= ~(1 << 9);
#endif
do_write_regs(®);
@@ -1620,10 +1645,17 @@
v.blue.length = 5;
break;
case 24:
+#if defined(__BIG_ENDIAN)
+ v.red.offset=0;
+ v.green.offset=8;
+ v.blue.offset=16;
+#else
v.red.offset=16;
v.green.offset=8;
v.blue.offset=0;
+#endif
v.red.length = v.green.length = v.blue.length = 8;
+ break;
case 32:
v.red.offset = 16;
v.green.offset = 8;
@@ -2348,9 +2380,7 @@
tdfxfb_createcursorshape(p);
xline = ~((1 << (32 - fb_info.cursor.w)) - 1);
-#ifdef __LITTLE_ENDIAN
xline = swab32(xline);
-#endif
cursorbase=(u8*)fb_info.bufbase_virt;
h=fb_info.cursor.cursorimage;
Reply to: