]> git.pld-linux.org Git - packages/kernel.git/blame - linux-tdfxfb-fixes.patch
- added description of djurban's branch
[packages/kernel.git] / linux-tdfxfb-fixes.patch
CommitLineData
df9c51aa
JB
1This patch contains:
2* fix for hardware cursor
3 (Voodoo4/Voodoo5 specific problem? bottom 48 lines contained random data
4 if cursor start address was not aligned down to even page boundary...)
5* fix for logo colours
6 (I'm not sure about hardware, but at least this driver doesn't support colour
7 lookup tables in 16/24/32bpp, so visual must be TRUECOLOR, not DIRECTCOLOR)
8* interlace support (works on Voodoo4 (50 Hz only?), problably Voodoo[35] too)
9* partial doublescan support (hardware cursor still doesn't work correctly,
10 but such modes doesn't just turn monitor out-of-sync)
11
12 -- Jakub Bogusz <qboosh@pld.org.pl>
13
14--- linux-2.4.20/drivers/video/tdfxfb.c.orig Mon Feb 25 20:38:07 2002
15+++ linux-2.4.20/drivers/video/tdfxfb.c Mon Dec 2 23:19:54 2002
16@@ -208,6 +208,7 @@
17 #define VGAINIT1_MASK 0x1fffff
18 #define VIDCFG_VIDPROC_ENABLE BIT(0)
19 #define VIDCFG_CURS_X11 BIT(1)
20+#define VIDCFG_INTERLACE BIT(3)
21 #define VIDCFG_HALF_MODE BIT(4)
22 #define VIDCFG_DESK_ENABLE BIT(7)
23 #define VIDCFG_CLUT_BYPASS BIT(10)
24@@ -238,6 +239,7 @@
25 #define TDFXF_VSYNC_ACT_LOW 0x08
26 #define TDFXF_LINE_DOUBLE 0x10
27 #define TDFXF_VIDEO_ENABLE 0x20
28+#define TDFXF_INTERLACE 0x40
29
30 #define TDFXF_HSYNC_MASK 0x03
31 #define TDFXF_VSYNC_MASK 0x0c
32@@ -1321,10 +1323,17 @@
33 hbs = hd;
34 hbe = ht;
35
36- vd = par->vdispend - 1;
37- vs = par->vsyncsta - 1;
38- ve = par->vsyncend - 1;
39- vt = par->vtotal - 2;
40+ if (par->video & TDFXF_LINE_DOUBLE) {
41+ vd = (par->vdispend << 1) - 1;
42+ vs = (par->vsyncsta << 1) - 1;
43+ ve = (par->vsyncend << 1) - 1;
44+ vt = (par->vtotal << 1) - 2;
45+ } else {
46+ vd = par->vdispend - 1;
47+ vs = par->vsyncsta - 1;
48+ ve = par->vsyncend - 1;
49+ vt = par->vtotal - 2;
50+ }
51 vbs = vd;
52 vbe = vt;
53
54@@ -1429,9 +1438,6 @@
55 VGAINIT0_EXTSHIFTOUT;
56 reg.vgainit1 = tdfx_inl(VGAINIT1) & 0x1fffff;
57
58- fb_info.cursor.enable=reg.vidcfg | VIDCFG_HWCURSOR_ENABLE;
59- fb_info.cursor.disable=reg.vidcfg;
60-
61 reg.stride = par->width*cpp;
62 reg.cursloc = 0;
63
64@@ -1450,9 +1456,20 @@
65 reg.gfxpll = do_calc_pll(..., &fout);
66 #endif
67
68- reg.screensize = par->width | (par->height << 12);
69- reg.vidcfg &= ~VIDCFG_HALF_MODE;
70+ if (par->video & TDFXF_LINE_DOUBLE) {
71+ reg.screensize = par->width | (par->height << 13);
72+ reg.vidcfg |= VIDCFG_HALF_MODE;
73+ reg.crt[0x09] |= 0x80;
74+ } else {
75+ reg.screensize = par->width | (par->height << 12);
76+ reg.vidcfg &= ~VIDCFG_HALF_MODE;
77+ }
78+ if (par->video & TDFXF_INTERLACE)
79+ reg.vidcfg |= VIDCFG_INTERLACE;
80
81+ fb_info.cursor.enable=reg.vidcfg | VIDCFG_HWCURSOR_ENABLE;
82+ fb_info.cursor.disable=reg.vidcfg;
83+
84 reg.miscinit0 = tdfx_inl(MISCINIT0);
85
86 #if defined(__BIG_ENDIAN)
87@@ -1496,11 +1513,6 @@
88 return -EINVAL;
89 }
90
91- if((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
92- DPRINTK("interlace not supported\n");
93- return -EINVAL;
94- }
95-
96 if(var->xoffset) {
97 DPRINTK("xoffset not supported\n");
98 return -EINVAL;
99@@ -1516,9 +1528,10 @@
100 return -EINVAL;
101 }
102
103- /* fixme: does Voodoo3 support interlace? Banshee doesn't */
104- if((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
105- DPRINTK("interlace not supported\n");
106+ /* Banshee doesn't support interlace, but Voodoo4 and probably Voodoo3 do. */
107+ if(((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED)
108+ && (i->dev == PCI_DEVICE_ID_3DFX_BANSHEE)) {
109+ DPRINTK("interlace not supported on Banshee\n");
110 return -EINVAL;
111 }
112
113@@ -1578,6 +1591,8 @@
114 par->video |= TDFXF_VSYNC_ACT_LOW;
115 if((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE)
116 par->video |= TDFXF_LINE_DOUBLE;
117+ else if((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED)
118+ par->video |= TDFXF_INTERLACE;
119 if(var->activate == FB_ACTIVATE_NOW)
120 par->video |= TDFXF_VIDEO_ENABLE;
121 }
122@@ -1639,6 +1654,8 @@
123 v.sync |= FB_SYNC_VERT_HIGH_ACT;
124 if(par->video & TDFXF_LINE_DOUBLE)
125 v.vmode = FB_VMODE_DOUBLE;
126+ else if(par->video & TDFXF_INTERLACE)
127+ v.vmode = FB_VMODE_INTERLACED;
128 *var = v;
129 return 0;
130 }
131@@ -1672,7 +1689,7 @@
132 fix->line_length = par->lpitch;
133 fix->visual = (par->bpp == 8)
134 ? FB_VISUAL_PSEUDOCOLOR
135- : FB_VISUAL_DIRECTCOLOR;
136+ : FB_VISUAL_TRUECOLOR;
137
138 fix->xpanstep = 0;
139 fix->ypanstep = nopan ? 0 : 1;
140@@ -2386,7 +2403,9 @@
141 static void tdfxfb_hwcursor_init(void)
142 {
143 unsigned int start;
144- start = (fb_info.bufbase_size-1024) & PAGE_MASK;
145+ start = (fb_info.bufbase_size-1024) & (PAGE_MASK << 1);
146+ /* even page boundary - on Voodoo4 4500 bottom 48 lines
147+ * contained trash when just page boundary was used... */
148 fb_info.bufbase_size=start;
149 fb_info.cursor.cursorimage=fb_info.bufbase_size;
150 printk("tdfxfb: reserving 1024 bytes for the hwcursor at %p\n",
This page took 0.19835 seconds and 4 git commands to generate.