[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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(&reg);
@@ -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: