--- drivers/video/offb.orig 2003-03-14 13:49:21.000000000 -0500 +++ drivers/video/offb.c 2003-03-18 23:37:35.000000000 -0500 @@ -53,7 +53,8 @@ cmap_M3A, /* ATI Rage Mobility M3 Head A */ cmap_M3B, /* ATI Rage Mobility M3 Head B */ cmap_radeon, /* ATI Radeon */ - cmap_gxt2000 /* IBM GXT2000 */ + cmap_gxt2000, /* IBM GXT2000 */ + cmap_3dfx /* 3Dfx Voodoo3/4/5 */ }; struct fb_info_offb { @@ -462,6 +463,10 @@ unsigned long regbase = dp->addrs[0].address; info->cmap_adr = ioremap(regbase + 0x6000, 0x1000); info->cmap_type = cmap_gxt2000; + } else if (!strncmp( name, "3Dfx,Voodoo", 11)) { + unsigned long regbase = dp->addrs[2].address; + info->cmap_adr = ioremap( regbase, 0xFF ); + info->cmap_type = cmap_3dfx; } fix->visual = info->cmap_adr ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_STATIC_PSEUDOCOLOR; @@ -679,6 +684,7 @@ if (blank) for (i = 0; i < 256; i++) { switch(info2->cmap_type) { + int regno; case cmap_m64: *info2->cmap_adr = i; mach_eieio(); @@ -711,6 +717,16 @@ case cmap_gxt2000: out_le32((unsigned *)info2->cmap_adr + i, 0); break; + case cmap_3dfx: + /* Wait for three slots in the FIFO (is this necessary?) */ + while((in_le32((unsigned *)info2->cmap_adr) & 0x1F) < 3 ); + /* Is the desktop using the upper 256 entries of the CLUT? */ + regno = (in_le32((unsigned *)info2->cmap_adr + 0x5C) & 1<<12) ? + i+256 : i; + /* Stuff the palette index and data */ + out_le32((unsigned *)(info2->cmap_adr + 0x50), regno); + out_le32((unsigned *)(info2->cmap_adr + 0x54), 0); + break; } } else @@ -800,6 +816,17 @@ out_le32((unsigned *)info2->cmap_adr + regno, (red << 16 | green << 8 | blue)); break; + case cmap_3dfx: + /* Wait for three slots in the FIFO (is this necessary?) */ + while((in_le32((unsigned *)info2->cmap_adr) & 0x1F) < 3 ); + /* Is the desktop using the upper 256 entries of the CLUT */ + if((in_le32((unsigned *)info2->cmap_adr + 0x5C) & 1<<12)) + regno += 256; + /* Stuff the palette index and data */ + out_le32((unsigned *)(info2->cmap_adr + 0x50), regno); + out_le32((unsigned *)(info2->cmap_adr + 0x54), + (red << 16 | green << 8 | blue)); + break; } if (regno < 16)