]>
Commit | Line | Data |
---|---|---|
df9c51aa JB |
1 | This 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", |