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

Re: [Linux-fbdev-devel] [PATCH] Add tdfx palette hack to offb driver



> Attached is a patch (against 2.4.20) which adds a palette hack for Voodoo3/4/5 
> cards to the offb driver. It's tested and working here on a Voodoo3 and a 
> Voodoo4. I'd welcome comments, though. Particularly, I think the probing for 
> a Voodoo card may be a bit shaky. Basically I'm match the OF name with the 
> pattern "3Dfx,Voodoo*". This may cause problems if there are Voodoo1 or 2 
> cards available with OF drivers, and so need tightening up.

I have updated the patch against 2.6.0. Could you test it before I commit 
it to my tree.

--- /usr/src/linus-2.6/drivers/video/offb.c	2004-01-05 14:54:57.000000000 -0800
+++ offb.c	2004-01-06 13:21:32.000000000 -0800
@@ -43,6 +43,7 @@
 	cmap_M3B,		/* ATI Rage Mobility M3 Head B */
 	cmap_radeon,		/* ATI Radeon */
 	cmap_gxt2000,		/* IBM GXT2000 */
+	cmap_3dfx,		/* 3Dfx Voodoo3/4/5 */
 };
 
 struct offb_par {
@@ -149,6 +150,18 @@
 		out_le32((unsigned *) par->cmap_adr + regno,
 			 (red << 16 | green << 8 | blue));
 		break;
+	case cmap_3dfx:
+		/* Wait for 3 slots in the FIFO */
+		while((in_le32((unsigned *) par->cmap_adr) & 0x1F) < 3);
+		/* Is the desktop using the upper 256 entries of 
+		 * the CLUT ? */
+		if ((in_le32((unsigned *) par->cmap_adr + 0x5C) & 1 << 12))
+			regno += 256;
+		/* Stuff the palette index and data */
+		out_le32((unsigned *)(par->cmap_adr + 0x50), regno);
+		out_le32((unsigned *)(par->cmap_adr + 0x54),
+			 (red << 16 | green << 8 | blue));
+		break;	
 	}
 
 	if (regno < 16)
@@ -175,7 +188,7 @@
 static int offb_blank(int blank, struct fb_info *info)
 {
 	struct offb_par *par = (struct offb_par *) info->par;
-	int i, j;
+	int i, j, regno;
 
 	if (!par->cmap_adr)
 		return 0;
@@ -233,6 +246,20 @@
 				out_le32((unsigned *) par->cmap_adr + i,
 					 0);
 				break;
+			case cmap_3dfx:
+				/* Wait for 3 slots in the FIFO */
+				while((in_le32((unsigned *) par->cmap_adr) & 0x1F) < 3);
+				/* Is the desktop using the upper 256 
+				 * entries of the CLUT ? */
+				regno = (in_le32((unsigned *) par->cmap_adr +
+							0x5C) & 1 << 12) ?
+							i+256 : i;
+				/* Stuff the palette index and data */
+				out_le32((unsigned *)(par->cmap_adr + 0x50), 
+							regno);
+				out_le32((unsigned *)(par->cmap_adr + 0x54),
+							0);
+				break;
 			}
 	} else
 		fb_set_cmap(&info->cmap, 1, info);
@@ -466,6 +493,10 @@
 			unsigned long regbase = dp->addrs[0].address;
 			par->cmap_adr = ioremap(regbase + 0x6000, 0x1000);
 			par->cmap_type = cmap_gxt2000;
+		} else if (!strncmp(name, "3Dfx,Voodoo", 11)) {
+			unsigned long regbase = dp->addrs[2].address;
+			par->cmap_adr = ioremap(regbase, 0xff);
+			par->cmap_type = cmap_3dfx;
 		}
 		fix->visual = par->cmap_adr ? FB_VISUAL_PSEUDOCOLOR
 		    : FB_VISUAL_STATIC_PSEUDOCOLOR;

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


この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」