Merge branch 'master'
[deliverable/linux.git] / drivers / video / nvidia / nvidia.c
1 /*
2 * linux/drivers/video/nvidia/nvidia.c - nVidia fb driver
3 *
4 * Copyright 2004 Antonino Daplas <adaplas@pol.net>
5 *
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file COPYING in the main directory of this archive
8 * for more details.
9 *
10 */
11
12 #include <linux/config.h>
13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
16 #include <linux/string.h>
17 #include <linux/mm.h>
18 #include <linux/tty.h>
19 #include <linux/slab.h>
20 #include <linux/delay.h>
21 #include <linux/fb.h>
22 #include <linux/init.h>
23 #include <linux/pci.h>
24 #ifdef CONFIG_MTRR
25 #include <asm/mtrr.h>
26 #endif
27 #ifdef CONFIG_PPC_OF
28 #include <asm/prom.h>
29 #include <asm/pci-bridge.h>
30 #endif
31 #ifdef CONFIG_PMAC_BACKLIGHT
32 #include <asm/backlight.h>
33 #endif
34
35 #include "nv_local.h"
36 #include "nv_type.h"
37 #include "nv_proto.h"
38 #include "nv_dma.h"
39
40 #ifndef CONFIG_PCI /* sanity check */
41 #error This driver requires PCI support.
42 #endif
43
44 #undef CONFIG_FB_NVIDIA_DEBUG
45 #ifdef CONFIG_FB_NVIDIA_DEBUG
46 #define NVTRACE printk
47 #else
48 #define NVTRACE if (0) printk
49 #endif
50
51 #define NVTRACE_ENTER(...) NVTRACE("%s START\n", __FUNCTION__)
52 #define NVTRACE_LEAVE(...) NVTRACE("%s END\n", __FUNCTION__)
53
54 #ifdef CONFIG_FB_NVIDIA_DEBUG
55 #define assert(expr) \
56 if (!(expr)) { \
57 printk( "Assertion failed! %s,%s,%s,line=%d\n",\
58 #expr,__FILE__,__FUNCTION__,__LINE__); \
59 BUG(); \
60 }
61 #else
62 #define assert(expr)
63 #endif
64
65 #define PFX "nvidiafb: "
66
67 /* HW cursor parameters */
68 #define MAX_CURS 32
69
70 static struct pci_device_id nvidiafb_pci_tbl[] = {
71 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT,
72 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
73 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT2,
74 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
75 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_UTNT2,
76 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
77 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT_UNKNOWN,
78 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
79 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_VTNT2,
80 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
81 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_UVTNT2,
82 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
83 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_ITNT2,
84 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
85 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_SDR,
86 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
87 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_DDR,
88 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
89 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO,
90 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
91 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX,
92 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
93 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX2,
94 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
95 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GO,
96 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
97 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO2_MXR,
98 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
99 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS,
100 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
101 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS2,
102 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
103 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_ULTRA,
104 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
105 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO2_PRO,
106 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
107 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_460,
108 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
109 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440,
110 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
111 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_420,
112 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
113 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440_SE,
114 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
115 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO,
116 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
117 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO,
118 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
119 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_460_GO,
120 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
121 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO_M32,
122 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
123 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_500XGL,
124 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
125 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO_M64,
126 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
127 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_200,
128 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
129 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_550XGL,
130 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
131 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_500_GOGL,
132 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
133 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_410_GO_M16,
134 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
135 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440_8X,
136 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
137 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440SE_8X,
138 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
139 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_420_8X,
140 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
141 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_448_GO,
142 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
143 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_488_GO,
144 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
145 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_580_XGL,
146 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
147 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_MAC,
148 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
149 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_280_NVS,
150 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
151 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_380_XGL,
152 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
153 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_IGEFORCE2,
154 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
155 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3,
156 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
157 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3_1,
158 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
159 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3_2,
160 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
161 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_DDC,
162 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
163 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4600,
164 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
165 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4400,
166 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
167 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4200,
168 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
169 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL,
170 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
171 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL,
172 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
173 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL,
174 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
175 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800,
176 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
177 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800_8X,
178 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
179 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800SE,
180 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
181 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_4200_GO,
182 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
183 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_980_XGL,
184 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
185 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_780_XGL,
186 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
187 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_700_GOGL,
188 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
189 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5800_ULTRA,
190 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
191 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5800,
192 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
193 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_2000,
194 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
195 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1000,
196 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
197 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600_ULTRA,
198 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
199 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600,
200 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
201 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600SE,
202 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
203 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5600,
204 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
205 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5650,
206 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
207 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO700,
208 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
209 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200,
210 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
211 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200_ULTRA,
212 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
213 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200_1,
214 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
215 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200SE,
216 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
217 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5200,
218 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
219 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5250,
220 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
221 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5250_32,
222 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
223 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO_5200,
224 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
225 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_NVS_280_PCI,
226 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
227 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_500,
228 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
229 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5300,
230 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
231 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5100,
232 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
233 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900_ULTRA,
234 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
235 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900,
236 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
237 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900XT,
238 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
239 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5950_ULTRA,
240 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
241 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_3000,
242 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
243 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700_ULTRA,
244 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
245 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700,
246 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
247 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700LE,
248 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
249 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700VE,
250 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
251 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_1,
252 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
253 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_2,
254 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
255 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO1000,
256 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
257 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100,
258 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
259 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5500,
260 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
261 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5100,
262 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
263 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_700,
264 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
265 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900ZT,
266 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
267 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800_ULTRA,
268 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
269 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800,
270 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
271 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800_LE,
272 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
273 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800_GT,
274 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
275 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_4000,
276 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
277 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6600_GT,
278 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
279 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6600,
280 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
281 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6610_XL,
282 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
283 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_540,
284 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
285 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6200,
286 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
287 {PCI_VENDOR_ID_NVIDIA, 0x0252,
288 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
289 {PCI_VENDOR_ID_NVIDIA, 0x0313,
290 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
291 {PCI_VENDOR_ID_NVIDIA, 0x0316,
292 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
293 {PCI_VENDOR_ID_NVIDIA, 0x0317,
294 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
295 {PCI_VENDOR_ID_NVIDIA, 0x031D,
296 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
297 {PCI_VENDOR_ID_NVIDIA, 0x031E,
298 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
299 {PCI_VENDOR_ID_NVIDIA, 0x031F,
300 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
301 {PCI_VENDOR_ID_NVIDIA, 0x0329,
302 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
303 {PCI_VENDOR_ID_NVIDIA, 0x032F,
304 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
305 {PCI_VENDOR_ID_NVIDIA, 0x0345,
306 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
307 {PCI_VENDOR_ID_NVIDIA, 0x0349,
308 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
309 {PCI_VENDOR_ID_NVIDIA, 0x034B,
310 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
311 {PCI_VENDOR_ID_NVIDIA, 0x034F,
312 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
313 {PCI_VENDOR_ID_NVIDIA, 0x00c0,
314 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
315 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_GEFORCE_6800A,
316 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
317 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_GEFORCE_6800A_LE,
318 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
319 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_GEFORCE_GO_6800,
320 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
321 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_GEFORCE_GO_6800_ULTRA,
322 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
323 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_QUADRO_FX_GO1400,
324 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
325 {PCI_VENDOR_ID_NVIDIA, 0x00cd,
326 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
327 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_QUADRO_FX_1400,
328 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
329 {PCI_VENDOR_ID_NVIDIA, 0x0142,
330 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
331 {PCI_VENDOR_ID_NVIDIA, 0x0143,
332 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
333 {PCI_VENDOR_ID_NVIDIA, 0x0144,
334 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
335 {PCI_VENDOR_ID_NVIDIA, 0x0145,
336 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
337 {PCI_VENDOR_ID_NVIDIA, 0x0146,
338 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
339 {PCI_VENDOR_ID_NVIDIA, 0x0147,
340 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
341 {PCI_VENDOR_ID_NVIDIA, 0x0148,
342 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
343 {PCI_VENDOR_ID_NVIDIA, 0x0149,
344 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
345 {PCI_VENDOR_ID_NVIDIA, 0x014b,
346 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
347 {PCI_VENDOR_ID_NVIDIA, 0x14c,
348 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
349 {PCI_VENDOR_ID_NVIDIA, 0x014d,
350 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
351 {PCI_VENDOR_ID_NVIDIA, 0x0160,
352 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
353 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6200_TURBOCACHE,
354 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
355 {PCI_VENDOR_ID_NVIDIA, 0x0162,
356 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
357 {PCI_VENDOR_ID_NVIDIA, 0x0163,
358 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
359 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_6200,
360 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
361 {PCI_VENDOR_ID_NVIDIA, 0x0165,
362 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
363 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_6250,
364 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
365 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_6200_1,
366 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
367 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_6250_1,
368 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
369 {PCI_VENDOR_ID_NVIDIA, 0x0169,
370 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
371 {PCI_VENDOR_ID_NVIDIA, 0x016b,
372 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
373 {PCI_VENDOR_ID_NVIDIA, 0x016c,
374 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
375 {PCI_VENDOR_ID_NVIDIA, 0x016d,
376 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
377 {PCI_VENDOR_ID_NVIDIA, 0x016e,
378 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
379 {PCI_VENDOR_ID_NVIDIA, 0x0210,
380 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
381 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800B,
382 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
383 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800B_LE,
384 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
385 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800B_GT,
386 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
387 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_7800_GT,
388 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
389 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_7800_GTX,
390 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
391 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_7800,
392 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
393 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_7800_GTX,
394 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
395 {PCI_VENDOR_ID_NVIDIA, 0x021d,
396 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
397 {PCI_VENDOR_ID_NVIDIA, 0x021e,
398 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
399 {PCI_VENDOR_ID_NVIDIA, 0x0220,
400 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
401 {PCI_VENDOR_ID_NVIDIA, 0x0221,
402 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
403 {PCI_VENDOR_ID_NVIDIA, 0x0222,
404 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
405 {PCI_VENDOR_ID_NVIDIA, 0x0228,
406 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
407 {0,} /* terminate list */
408 };
409
410 MODULE_DEVICE_TABLE(pci, nvidiafb_pci_tbl);
411
412 /* command line data, set in nvidiafb_setup() */
413 static int flatpanel __devinitdata = -1; /* Autodetect later */
414 static int forceCRTC __devinitdata = -1;
415 static int hwcur __devinitdata = 0;
416 static int noaccel __devinitdata = 0;
417 static int noscale __devinitdata = 0;
418 static int paneltweak __devinitdata = 0;
419 static int vram __devinitdata = 0;
420 #ifdef CONFIG_MTRR
421 static int nomtrr __devinitdata = 0;
422 #endif
423
424 static char *mode_option __devinitdata = NULL;
425
426 static struct fb_fix_screeninfo __devinitdata nvidiafb_fix = {
427 .type = FB_TYPE_PACKED_PIXELS,
428 .xpanstep = 8,
429 .ypanstep = 1,
430 };
431
432 static struct fb_var_screeninfo __devinitdata nvidiafb_default_var = {
433 .xres = 640,
434 .yres = 480,
435 .xres_virtual = 640,
436 .yres_virtual = 480,
437 .bits_per_pixel = 8,
438 .red = {0, 8, 0},
439 .green = {0, 8, 0},
440 .blue = {0, 8, 0},
441 .transp = {0, 0, 0},
442 .activate = FB_ACTIVATE_NOW,
443 .height = -1,
444 .width = -1,
445 .pixclock = 39721,
446 .left_margin = 40,
447 .right_margin = 24,
448 .upper_margin = 32,
449 .lower_margin = 11,
450 .hsync_len = 96,
451 .vsync_len = 2,
452 .vmode = FB_VMODE_NONINTERLACED
453 };
454
455 /*
456 * Backlight control
457 */
458 #ifdef CONFIG_PMAC_BACKLIGHT
459
460 static int nvidia_backlight_levels[] = {
461 0x158,
462 0x192,
463 0x1c6,
464 0x200,
465 0x234,
466 0x268,
467 0x2a2,
468 0x2d6,
469 0x310,
470 0x344,
471 0x378,
472 0x3b2,
473 0x3e6,
474 0x41a,
475 0x454,
476 0x534,
477 };
478
479 /* ------------------------------------------------------------------------- *
480 *
481 * Backlight operations
482 *
483 * ------------------------------------------------------------------------- */
484
485 static int nvidia_set_backlight_enable(int on, int level, void *data)
486 {
487 struct nvidia_par *par = (struct nvidia_par *)data;
488 u32 tmp_pcrt, tmp_pmc, fpcontrol;
489
490 tmp_pmc = NV_RD32(par->PMC, 0x10F0) & 0x0000FFFF;
491 tmp_pcrt = NV_RD32(par->PCRTC0, 0x081C) & 0xFFFFFFFC;
492 fpcontrol = NV_RD32(par->PRAMDAC, 0x0848) & 0xCFFFFFCC;
493
494 if (on && (level > BACKLIGHT_OFF)) {
495 tmp_pcrt |= 0x1;
496 tmp_pmc |= (1 << 31); // backlight bit
497 tmp_pmc |= nvidia_backlight_levels[level - 1] << 16;
498 }
499
500 if (on)
501 fpcontrol |= par->fpSyncs;
502 else
503 fpcontrol |= 0x20000022;
504
505 NV_WR32(par->PCRTC0, 0x081C, tmp_pcrt);
506 NV_WR32(par->PMC, 0x10F0, tmp_pmc);
507 NV_WR32(par->PRAMDAC, 0x848, fpcontrol);
508
509 return 0;
510 }
511
512 static int nvidia_set_backlight_level(int level, void *data)
513 {
514 return nvidia_set_backlight_enable(1, level, data);
515 }
516
517 static struct backlight_controller nvidia_backlight_controller = {
518 nvidia_set_backlight_enable,
519 nvidia_set_backlight_level
520 };
521
522 #endif /* CONFIG_PMAC_BACKLIGHT */
523
524 static void nvidiafb_load_cursor_image(struct nvidia_par *par, u8 * data8,
525 u16 bg, u16 fg, u32 w, u32 h)
526 {
527 u32 *data = (u32 *) data8;
528 int i, j, k = 0;
529 u32 b, tmp;
530
531 w = (w + 1) & ~1;
532
533 for (i = 0; i < h; i++) {
534 b = *data++;
535 reverse_order(&b);
536
537 for (j = 0; j < w / 2; j++) {
538 tmp = 0;
539 #if defined (__BIG_ENDIAN)
540 tmp = (b & (1 << 31)) ? fg << 16 : bg << 16;
541 b <<= 1;
542 tmp |= (b & (1 << 31)) ? fg : bg;
543 b <<= 1;
544 #else
545 tmp = (b & 1) ? fg : bg;
546 b >>= 1;
547 tmp |= (b & 1) ? fg << 16 : bg << 16;
548 b >>= 1;
549 #endif
550 NV_WR32(&par->CURSOR[k++], 0, tmp);
551 }
552 k += (MAX_CURS - w) / 2;
553 }
554 }
555
556 static void nvidia_write_clut(struct nvidia_par *par,
557 u8 regnum, u8 red, u8 green, u8 blue)
558 {
559 NVWriteDacMask(par, 0xff);
560 NVWriteDacWriteAddr(par, regnum);
561 NVWriteDacData(par, red);
562 NVWriteDacData(par, green);
563 NVWriteDacData(par, blue);
564 }
565
566 static void nvidia_read_clut(struct nvidia_par *par,
567 u8 regnum, u8 * red, u8 * green, u8 * blue)
568 {
569 NVWriteDacMask(par, 0xff);
570 NVWriteDacReadAddr(par, regnum);
571 *red = NVReadDacData(par);
572 *green = NVReadDacData(par);
573 *blue = NVReadDacData(par);
574 }
575
576 static int nvidia_panel_tweak(struct nvidia_par *par,
577 struct _riva_hw_state *state)
578 {
579 int tweak = 0;
580
581 if (par->paneltweak) {
582 tweak = par->paneltweak;
583 } else {
584 /* begin flat panel hacks */
585 /* This is unfortunate, but some chips need this register
586 tweaked or else you get artifacts where adjacent pixels are
587 swapped. There are no hard rules for what to set here so all
588 we can do is experiment and apply hacks. */
589
590 if(((par->Chipset & 0xffff) == 0x0328) && (state->bpp == 32)) {
591 /* At least one NV34 laptop needs this workaround. */
592 tweak = -1;
593 }
594
595 if((par->Chipset & 0xfff0) == 0x0310) {
596 tweak = 1;
597 }
598 /* end flat panel hacks */
599 }
600
601 return tweak;
602 }
603
604 static void nvidia_save_vga(struct nvidia_par *par,
605 struct _riva_hw_state *state)
606 {
607 int i;
608
609 NVTRACE_ENTER();
610 NVLockUnlock(par, 0);
611
612 NVUnloadStateExt(par, state);
613
614 state->misc_output = NVReadMiscOut(par);
615
616 for (i = 0; i < NUM_CRT_REGS; i++)
617 state->crtc[i] = NVReadCrtc(par, i);
618
619 for (i = 0; i < NUM_ATC_REGS; i++)
620 state->attr[i] = NVReadAttr(par, i);
621
622 for (i = 0; i < NUM_GRC_REGS; i++)
623 state->gra[i] = NVReadGr(par, i);
624
625 for (i = 0; i < NUM_SEQ_REGS; i++)
626 state->seq[i] = NVReadSeq(par, i);
627 NVTRACE_LEAVE();
628 }
629
630 static void nvidia_write_regs(struct nvidia_par *par)
631 {
632 struct _riva_hw_state *state = &par->ModeReg;
633 int i;
634
635 NVTRACE_ENTER();
636 NVWriteCrtc(par, 0x11, 0x00);
637
638 NVLockUnlock(par, 0);
639
640 NVLoadStateExt(par, state);
641
642 NVWriteMiscOut(par, state->misc_output);
643
644 for (i = 0; i < NUM_CRT_REGS; i++) {
645 switch (i) {
646 case 0x19:
647 case 0x20 ... 0x40:
648 break;
649 default:
650 NVWriteCrtc(par, i, state->crtc[i]);
651 }
652 }
653
654 for (i = 0; i < NUM_ATC_REGS; i++)
655 NVWriteAttr(par, i, state->attr[i]);
656
657 for (i = 0; i < NUM_GRC_REGS; i++)
658 NVWriteGr(par, i, state->gra[i]);
659
660 for (i = 0; i < NUM_SEQ_REGS; i++)
661 NVWriteSeq(par, i, state->seq[i]);
662 NVTRACE_LEAVE();
663 }
664
665 static int nvidia_calc_regs(struct fb_info *info)
666 {
667 struct nvidia_par *par = info->par;
668 struct _riva_hw_state *state = &par->ModeReg;
669 int i, depth = fb_get_color_depth(&info->var, &info->fix);
670 int h_display = info->var.xres / 8 - 1;
671 int h_start = (info->var.xres + info->var.right_margin) / 8 - 1;
672 int h_end = (info->var.xres + info->var.right_margin +
673 info->var.hsync_len) / 8 - 1;
674 int h_total = (info->var.xres + info->var.right_margin +
675 info->var.hsync_len + info->var.left_margin) / 8 - 5;
676 int h_blank_s = h_display;
677 int h_blank_e = h_total + 4;
678 int v_display = info->var.yres - 1;
679 int v_start = info->var.yres + info->var.lower_margin - 1;
680 int v_end = (info->var.yres + info->var.lower_margin +
681 info->var.vsync_len) - 1;
682 int v_total = (info->var.yres + info->var.lower_margin +
683 info->var.vsync_len + info->var.upper_margin) - 2;
684 int v_blank_s = v_display;
685 int v_blank_e = v_total + 1;
686
687 /*
688 * Set all CRTC values.
689 */
690
691 if (info->var.vmode & FB_VMODE_INTERLACED)
692 v_total |= 1;
693
694 if (par->FlatPanel == 1) {
695 v_start = v_total - 3;
696 v_end = v_total - 2;
697 v_blank_s = v_start;
698 h_start = h_total - 5;
699 h_end = h_total - 2;
700 h_blank_e = h_total + 4;
701 }
702
703 state->crtc[0x0] = Set8Bits(h_total);
704 state->crtc[0x1] = Set8Bits(h_display);
705 state->crtc[0x2] = Set8Bits(h_blank_s);
706 state->crtc[0x3] = SetBitField(h_blank_e, 4: 0, 4:0)
707 | SetBit(7);
708 state->crtc[0x4] = Set8Bits(h_start);
709 state->crtc[0x5] = SetBitField(h_blank_e, 5: 5, 7:7)
710 | SetBitField(h_end, 4: 0, 4:0);
711 state->crtc[0x6] = SetBitField(v_total, 7: 0, 7:0);
712 state->crtc[0x7] = SetBitField(v_total, 8: 8, 0:0)
713 | SetBitField(v_display, 8: 8, 1:1)
714 | SetBitField(v_start, 8: 8, 2:2)
715 | SetBitField(v_blank_s, 8: 8, 3:3)
716 | SetBit(4)
717 | SetBitField(v_total, 9: 9, 5:5)
718 | SetBitField(v_display, 9: 9, 6:6)
719 | SetBitField(v_start, 9: 9, 7:7);
720 state->crtc[0x9] = SetBitField(v_blank_s, 9: 9, 5:5)
721 | SetBit(6)
722 | ((info->var.vmode & FB_VMODE_DOUBLE) ? 0x80 : 0x00);
723 state->crtc[0x10] = Set8Bits(v_start);
724 state->crtc[0x11] = SetBitField(v_end, 3: 0, 3:0) | SetBit(5);
725 state->crtc[0x12] = Set8Bits(v_display);
726 state->crtc[0x13] = ((info->var.xres_virtual / 8) *
727 (info->var.bits_per_pixel / 8));
728 state->crtc[0x15] = Set8Bits(v_blank_s);
729 state->crtc[0x16] = Set8Bits(v_blank_e);
730
731 state->attr[0x10] = 0x01;
732
733 if (par->Television)
734 state->attr[0x11] = 0x00;
735
736 state->screen = SetBitField(h_blank_e, 6: 6, 4:4)
737 | SetBitField(v_blank_s, 10: 10, 3:3)
738 | SetBitField(v_start, 10: 10, 2:2)
739 | SetBitField(v_display, 10: 10, 1:1)
740 | SetBitField(v_total, 10: 10, 0:0);
741
742 state->horiz = SetBitField(h_total, 8: 8, 0:0)
743 | SetBitField(h_display, 8: 8, 1:1)
744 | SetBitField(h_blank_s, 8: 8, 2:2)
745 | SetBitField(h_start, 8: 8, 3:3);
746
747 state->extra = SetBitField(v_total, 11: 11, 0:0)
748 | SetBitField(v_display, 11: 11, 2:2)
749 | SetBitField(v_start, 11: 11, 4:4)
750 | SetBitField(v_blank_s, 11: 11, 6:6);
751
752 if (info->var.vmode & FB_VMODE_INTERLACED) {
753 h_total = (h_total >> 1) & ~1;
754 state->interlace = Set8Bits(h_total);
755 state->horiz |= SetBitField(h_total, 8: 8, 4:4);
756 } else {
757 state->interlace = 0xff; /* interlace off */
758 }
759
760 /*
761 * Calculate the extended registers.
762 */
763
764 if (depth < 24)
765 i = depth;
766 else
767 i = 32;
768
769 if (par->Architecture >= NV_ARCH_10)
770 par->CURSOR = (volatile u32 __iomem *)(info->screen_base +
771 par->CursorStart);
772
773 if (info->var.sync & FB_SYNC_HOR_HIGH_ACT)
774 state->misc_output &= ~0x40;
775 else
776 state->misc_output |= 0x40;
777 if (info->var.sync & FB_SYNC_VERT_HIGH_ACT)
778 state->misc_output &= ~0x80;
779 else
780 state->misc_output |= 0x80;
781
782 NVCalcStateExt(par, state, i, info->var.xres_virtual,
783 info->var.xres, info->var.yres_virtual,
784 1000000000 / info->var.pixclock, info->var.vmode);
785
786 state->scale = NV_RD32(par->PRAMDAC, 0x00000848) & 0xfff000ff;
787 if (par->FlatPanel == 1) {
788 state->pixel |= (1 << 7);
789
790 if (!par->fpScaler || (par->fpWidth <= info->var.xres)
791 || (par->fpHeight <= info->var.yres)) {
792 state->scale |= (1 << 8);
793 }
794
795 if (!par->crtcSync_read) {
796 state->crtcSync = NV_RD32(par->PRAMDAC, 0x0828);
797 par->crtcSync_read = 1;
798 }
799
800 par->PanelTweak = nvidia_panel_tweak(par, state);
801 }
802
803 state->vpll = state->pll;
804 state->vpll2 = state->pll;
805 state->vpllB = state->pllB;
806 state->vpll2B = state->pllB;
807
808 VGA_WR08(par->PCIO, 0x03D4, 0x1C);
809 state->fifo = VGA_RD08(par->PCIO, 0x03D5) & ~(1<<5);
810
811 if (par->CRTCnumber) {
812 state->head = NV_RD32(par->PCRTC0, 0x00000860) & ~0x00001000;
813 state->head2 = NV_RD32(par->PCRTC0, 0x00002860) | 0x00001000;
814 state->crtcOwner = 3;
815 state->pllsel |= 0x20000800;
816 state->vpll = NV_RD32(par->PRAMDAC0, 0x00000508);
817 if (par->twoStagePLL)
818 state->vpllB = NV_RD32(par->PRAMDAC0, 0x00000578);
819 } else if (par->twoHeads) {
820 state->head = NV_RD32(par->PCRTC0, 0x00000860) | 0x00001000;
821 state->head2 = NV_RD32(par->PCRTC0, 0x00002860) & ~0x00001000;
822 state->crtcOwner = 0;
823 state->vpll2 = NV_RD32(par->PRAMDAC0, 0x0520);
824 if (par->twoStagePLL)
825 state->vpll2B = NV_RD32(par->PRAMDAC0, 0x057C);
826 }
827
828 state->cursorConfig = 0x00000100;
829
830 if (info->var.vmode & FB_VMODE_DOUBLE)
831 state->cursorConfig |= (1 << 4);
832
833 if (par->alphaCursor) {
834 if ((par->Chipset & 0x0ff0) != 0x0110)
835 state->cursorConfig |= 0x04011000;
836 else
837 state->cursorConfig |= 0x14011000;
838 state->general |= (1 << 29);
839 } else
840 state->cursorConfig |= 0x02000000;
841
842 if (par->twoHeads) {
843 if ((par->Chipset & 0x0ff0) == 0x0110) {
844 state->dither = NV_RD32(par->PRAMDAC, 0x0528) &
845 ~0x00010000;
846 if (par->FPDither)
847 state->dither |= 0x00010000;
848 } else {
849 state->dither = NV_RD32(par->PRAMDAC, 0x083C) & ~1;
850 if (par->FPDither)
851 state->dither |= 1;
852 }
853 }
854
855 state->timingH = 0;
856 state->timingV = 0;
857 state->displayV = info->var.xres;
858
859 return 0;
860 }
861
862 static void nvidia_init_vga(struct fb_info *info)
863 {
864 struct nvidia_par *par = info->par;
865 struct _riva_hw_state *state = &par->ModeReg;
866 int i;
867
868 for (i = 0; i < 0x10; i++)
869 state->attr[i] = i;
870 state->attr[0x10] = 0x41;
871 state->attr[0x11] = 0x01;
872 state->attr[0x12] = 0x0f;
873 state->attr[0x13] = 0x00;
874 state->attr[0x14] = 0x00;
875
876 memset(state->crtc, 0x00, NUM_CRT_REGS);
877 state->crtc[0x0a] = 0x20;
878 state->crtc[0x17] = 0xe3;
879 state->crtc[0x18] = 0xff;
880 state->crtc[0x28] = 0x40;
881
882 memset(state->gra, 0x00, NUM_GRC_REGS);
883 state->gra[0x05] = 0x40;
884 state->gra[0x06] = 0x05;
885 state->gra[0x07] = 0x0f;
886 state->gra[0x08] = 0xff;
887
888 state->seq[0x00] = 0x03;
889 state->seq[0x01] = 0x01;
890 state->seq[0x02] = 0x0f;
891 state->seq[0x03] = 0x00;
892 state->seq[0x04] = 0x0e;
893
894 state->misc_output = 0xeb;
895 }
896
897 static int nvidiafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
898 {
899 struct nvidia_par *par = info->par;
900 u8 data[MAX_CURS * MAX_CURS / 8];
901 int i, set = cursor->set;
902 u16 fg, bg;
903
904 if (cursor->image.width > MAX_CURS || cursor->image.height > MAX_CURS)
905 return -ENXIO;
906
907 NVShowHideCursor(par, 0);
908
909 if (par->cursor_reset) {
910 set = FB_CUR_SETALL;
911 par->cursor_reset = 0;
912 }
913
914 if (set & FB_CUR_SETSIZE)
915 memset_io(par->CURSOR, 0, MAX_CURS * MAX_CURS * 2);
916
917 if (set & FB_CUR_SETPOS) {
918 u32 xx, yy, temp;
919
920 yy = cursor->image.dy - info->var.yoffset;
921 xx = cursor->image.dx - info->var.xoffset;
922 temp = xx & 0xFFFF;
923 temp |= yy << 16;
924
925 NV_WR32(par->PRAMDAC, 0x0000300, temp);
926 }
927
928 if (set & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP | FB_CUR_SETIMAGE)) {
929 u32 bg_idx = cursor->image.bg_color;
930 u32 fg_idx = cursor->image.fg_color;
931 u32 s_pitch = (cursor->image.width + 7) >> 3;
932 u32 d_pitch = MAX_CURS / 8;
933 u8 *dat = (u8 *) cursor->image.data;
934 u8 *msk = (u8 *) cursor->mask;
935 u8 *src;
936
937 src = kmalloc(s_pitch * cursor->image.height, GFP_ATOMIC);
938
939 if (src) {
940 switch (cursor->rop) {
941 case ROP_XOR:
942 for (i = 0; i < s_pitch * cursor->image.height; i++)
943 src[i] = dat[i] ^ msk[i];
944 break;
945 case ROP_COPY:
946 default:
947 for (i = 0; i < s_pitch * cursor->image.height; i++)
948 src[i] = dat[i] & msk[i];
949 break;
950 }
951
952 fb_pad_aligned_buffer(data, d_pitch, src, s_pitch,
953 cursor->image.height);
954
955 bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) |
956 ((info->cmap.green[bg_idx] & 0xf8) << 2) |
957 ((info->cmap.blue[bg_idx] & 0xf8) >> 3) | 1 << 15;
958
959 fg = ((info->cmap.red[fg_idx] & 0xf8) << 7) |
960 ((info->cmap.green[fg_idx] & 0xf8) << 2) |
961 ((info->cmap.blue[fg_idx] & 0xf8) >> 3) | 1 << 15;
962
963 NVLockUnlock(par, 0);
964
965 nvidiafb_load_cursor_image(par, data, bg, fg,
966 cursor->image.width,
967 cursor->image.height);
968 kfree(src);
969 }
970 }
971
972 if (cursor->enable)
973 NVShowHideCursor(par, 1);
974
975 return 0;
976 }
977
978 static int nvidiafb_set_par(struct fb_info *info)
979 {
980 struct nvidia_par *par = info->par;
981
982 NVTRACE_ENTER();
983
984 NVLockUnlock(par, 1);
985 if (!par->FlatPanel || (info->var.bits_per_pixel != 24) ||
986 !par->twoHeads)
987 par->FPDither = 0;
988
989 info->fix.visual = (info->var.bits_per_pixel == 8) ?
990 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
991
992 nvidia_init_vga(info);
993 nvidia_calc_regs(info);
994 nvidia_write_regs(par);
995
996 NVLockUnlock(par, 0);
997 if (par->twoHeads) {
998 VGA_WR08(par->PCIO, 0x03D4, 0x44);
999 VGA_WR08(par->PCIO, 0x03D5, par->ModeReg.crtcOwner);
1000 NVLockUnlock(par, 0);
1001 }
1002
1003 NVWriteCrtc(par, 0x11, 0x00);
1004 info->fix.line_length = (info->var.xres_virtual *
1005 info->var.bits_per_pixel) >> 3;
1006 if (info->var.accel_flags) {
1007 info->fbops->fb_imageblit = nvidiafb_imageblit;
1008 info->fbops->fb_fillrect = nvidiafb_fillrect;
1009 info->fbops->fb_copyarea = nvidiafb_copyarea;
1010 info->fbops->fb_sync = nvidiafb_sync;
1011 info->pixmap.scan_align = 4;
1012 info->flags &= ~FBINFO_HWACCEL_DISABLED;
1013 NVResetGraphics(info);
1014 } else {
1015 info->fbops->fb_imageblit = cfb_imageblit;
1016 info->fbops->fb_fillrect = cfb_fillrect;
1017 info->fbops->fb_copyarea = cfb_copyarea;
1018 info->fbops->fb_sync = NULL;
1019 info->pixmap.scan_align = 1;
1020 info->flags |= FBINFO_HWACCEL_DISABLED;
1021 }
1022
1023 par->cursor_reset = 1;
1024
1025 NVWriteCrtc(par, 0x11, 0xff);
1026
1027 NVTRACE_LEAVE();
1028 return 0;
1029 }
1030
1031 static int nvidiafb_setcolreg(unsigned regno, unsigned red, unsigned green,
1032 unsigned blue, unsigned transp,
1033 struct fb_info *info)
1034 {
1035 struct nvidia_par *par = info->par;
1036 int i;
1037
1038 NVTRACE_ENTER();
1039 if (regno >= (1 << info->var.green.length))
1040 return -EINVAL;
1041
1042 if (info->var.grayscale) {
1043 /* gray = 0.30*R + 0.59*G + 0.11*B */
1044 red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8;
1045 }
1046
1047 if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
1048 ((u32 *) info->pseudo_palette)[regno] =
1049 (regno << info->var.red.offset) |
1050 (regno << info->var.green.offset) |
1051 (regno << info->var.blue.offset);
1052 }
1053
1054 switch (info->var.bits_per_pixel) {
1055 case 8:
1056 /* "transparent" stuff is completely ignored. */
1057 nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
1058 break;
1059 case 16:
1060 if (info->var.green.length == 5) {
1061 for (i = 0; i < 8; i++) {
1062 nvidia_write_clut(par, regno * 8 + i, red >> 8,
1063 green >> 8, blue >> 8);
1064 }
1065 } else {
1066 u8 r, g, b;
1067
1068 if (regno < 32) {
1069 for (i = 0; i < 8; i++) {
1070 nvidia_write_clut(par, regno * 8 + i,
1071 red >> 8, green >> 8,
1072 blue >> 8);
1073 }
1074 }
1075
1076 nvidia_read_clut(par, regno * 4, &r, &g, &b);
1077
1078 for (i = 0; i < 4; i++)
1079 nvidia_write_clut(par, regno * 4 + i, r,
1080 green >> 8, b);
1081 }
1082 break;
1083 case 32:
1084 nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
1085 break;
1086 default:
1087 /* do nothing */
1088 break;
1089 }
1090
1091 NVTRACE_LEAVE();
1092 return 0;
1093 }
1094
1095 static int nvidiafb_check_var(struct fb_var_screeninfo *var,
1096 struct fb_info *info)
1097 {
1098 struct nvidia_par *par = info->par;
1099 int memlen, vramlen, mode_valid = 0;
1100 int pitch, err = 0;
1101
1102 NVTRACE_ENTER();
1103
1104 var->transp.offset = 0;
1105 var->transp.length = 0;
1106
1107 var->xres &= ~7;
1108
1109 if (var->bits_per_pixel <= 8)
1110 var->bits_per_pixel = 8;
1111 else if (var->bits_per_pixel <= 16)
1112 var->bits_per_pixel = 16;
1113 else
1114 var->bits_per_pixel = 32;
1115
1116 switch (var->bits_per_pixel) {
1117 case 8:
1118 var->red.offset = 0;
1119 var->red.length = 8;
1120 var->green.offset = 0;
1121 var->green.length = 8;
1122 var->blue.offset = 0;
1123 var->blue.length = 8;
1124 var->transp.offset = 0;
1125 var->transp.length = 0;
1126 break;
1127 case 16:
1128 var->green.length = (var->green.length < 6) ? 5 : 6;
1129 var->red.length = 5;
1130 var->blue.length = 5;
1131 var->transp.length = 6 - var->green.length;
1132 var->blue.offset = 0;
1133 var->green.offset = 5;
1134 var->red.offset = 5 + var->green.length;
1135 var->transp.offset = (5 + var->red.offset) & 15;
1136 break;
1137 case 32: /* RGBA 8888 */
1138 var->red.offset = 16;
1139 var->red.length = 8;
1140 var->green.offset = 8;
1141 var->green.length = 8;
1142 var->blue.offset = 0;
1143 var->blue.length = 8;
1144 var->transp.length = 8;
1145 var->transp.offset = 24;
1146 break;
1147 }
1148
1149 var->red.msb_right = 0;
1150 var->green.msb_right = 0;
1151 var->blue.msb_right = 0;
1152 var->transp.msb_right = 0;
1153
1154 if (!info->monspecs.hfmax || !info->monspecs.vfmax ||
1155 !info->monspecs.dclkmax || !fb_validate_mode(var, info))
1156 mode_valid = 1;
1157
1158 /* calculate modeline if supported by monitor */
1159 if (!mode_valid && info->monspecs.gtf) {
1160 if (!fb_get_mode(FB_MAXTIMINGS, 0, var, info))
1161 mode_valid = 1;
1162 }
1163
1164 if (!mode_valid) {
1165 struct fb_videomode *mode;
1166
1167 mode = fb_find_best_mode(var, &info->modelist);
1168 if (mode) {
1169 fb_videomode_to_var(var, mode);
1170 mode_valid = 1;
1171 }
1172 }
1173
1174 if (!mode_valid && info->monspecs.modedb_len)
1175 return -EINVAL;
1176
1177 if (par->fpWidth && par->fpHeight && (par->fpWidth < var->xres ||
1178 par->fpHeight < var->yres))
1179 return -EINVAL;
1180
1181 if (var->yres_virtual < var->yres)
1182 var->yres_virtual = var->yres;
1183
1184 if (var->xres_virtual < var->xres)
1185 var->xres_virtual = var->xres;
1186
1187 var->xres_virtual = (var->xres_virtual + 63) & ~63;
1188
1189 vramlen = info->screen_size;
1190 pitch = ((var->xres_virtual * var->bits_per_pixel) + 7) / 8;
1191 memlen = pitch * var->yres_virtual;
1192
1193 if (memlen > vramlen) {
1194 var->yres_virtual = vramlen / pitch;
1195
1196 if (var->yres_virtual < var->yres) {
1197 var->yres_virtual = var->yres;
1198 var->xres_virtual = vramlen / var->yres_virtual;
1199 var->xres_virtual /= var->bits_per_pixel / 8;
1200 var->xres_virtual &= ~63;
1201 pitch = (var->xres_virtual *
1202 var->bits_per_pixel + 7) / 8;
1203 memlen = pitch * var->yres;
1204
1205 if (var->xres_virtual < var->xres) {
1206 printk("nvidiafb: required video memory, "
1207 "%d bytes, for %dx%d-%d (virtual) "
1208 "is out of range\n",
1209 memlen, var->xres_virtual,
1210 var->yres_virtual, var->bits_per_pixel);
1211 err = -ENOMEM;
1212 }
1213 }
1214 }
1215
1216 if (var->accel_flags) {
1217 if (var->yres_virtual > 0x7fff)
1218 var->yres_virtual = 0x7fff;
1219 if (var->xres_virtual > 0x7fff)
1220 var->xres_virtual = 0x7fff;
1221 }
1222
1223 var->xres_virtual &= ~63;
1224
1225 NVTRACE_LEAVE();
1226
1227 return err;
1228 }
1229
1230 static int nvidiafb_pan_display(struct fb_var_screeninfo *var,
1231 struct fb_info *info)
1232 {
1233 struct nvidia_par *par = info->par;
1234 u32 total;
1235
1236 total = info->var.yoffset * info->fix.line_length + info->var.xoffset;
1237
1238 NVSetStartAddress(par, total);
1239
1240 return 0;
1241 }
1242
1243 static int nvidiafb_blank(int blank, struct fb_info *info)
1244 {
1245 struct nvidia_par *par = info->par;
1246 unsigned char tmp, vesa;
1247
1248 tmp = NVReadSeq(par, 0x01) & ~0x20; /* screen on/off */
1249 vesa = NVReadCrtc(par, 0x1a) & ~0xc0; /* sync on/off */
1250
1251 NVTRACE_ENTER();
1252
1253 if (blank)
1254 tmp |= 0x20;
1255
1256 switch (blank) {
1257 case FB_BLANK_UNBLANK:
1258 case FB_BLANK_NORMAL:
1259 break;
1260 case FB_BLANK_VSYNC_SUSPEND:
1261 vesa |= 0x80;
1262 break;
1263 case FB_BLANK_HSYNC_SUSPEND:
1264 vesa |= 0x40;
1265 break;
1266 case FB_BLANK_POWERDOWN:
1267 vesa |= 0xc0;
1268 break;
1269 }
1270
1271 NVWriteSeq(par, 0x01, tmp);
1272 NVWriteCrtc(par, 0x1a, vesa);
1273
1274 #ifdef CONFIG_PMAC_BACKLIGHT
1275 if (par->FlatPanel && _machine == _MACH_Pmac) {
1276 set_backlight_enable(!blank);
1277 }
1278 #endif
1279
1280 NVTRACE_LEAVE();
1281
1282 return 0;
1283 }
1284
1285 static struct fb_ops nvidia_fb_ops = {
1286 .owner = THIS_MODULE,
1287 .fb_check_var = nvidiafb_check_var,
1288 .fb_set_par = nvidiafb_set_par,
1289 .fb_setcolreg = nvidiafb_setcolreg,
1290 .fb_pan_display = nvidiafb_pan_display,
1291 .fb_blank = nvidiafb_blank,
1292 .fb_fillrect = nvidiafb_fillrect,
1293 .fb_copyarea = nvidiafb_copyarea,
1294 .fb_imageblit = nvidiafb_imageblit,
1295 .fb_cursor = nvidiafb_cursor,
1296 .fb_sync = nvidiafb_sync,
1297 };
1298
1299 static int __devinit nvidia_set_fbinfo(struct fb_info *info)
1300 {
1301 struct fb_monspecs *specs = &info->monspecs;
1302 struct fb_videomode modedb;
1303 struct nvidia_par *par = info->par;
1304 int lpitch;
1305
1306 NVTRACE_ENTER();
1307 info->flags = FBINFO_DEFAULT
1308 | FBINFO_HWACCEL_IMAGEBLIT
1309 | FBINFO_HWACCEL_FILLRECT
1310 | FBINFO_HWACCEL_COPYAREA
1311 | FBINFO_HWACCEL_YPAN;
1312
1313 fb_videomode_to_modelist(info->monspecs.modedb,
1314 info->monspecs.modedb_len, &info->modelist);
1315 fb_var_to_videomode(&modedb, &nvidiafb_default_var);
1316
1317 if (specs->modedb != NULL) {
1318 /* get preferred timing */
1319 if (specs->misc & FB_MISC_1ST_DETAIL) {
1320 int i;
1321
1322 for (i = 0; i < specs->modedb_len; i++) {
1323 if (specs->modedb[i].flag & FB_MODE_IS_FIRST) {
1324 modedb = specs->modedb[i];
1325 break;
1326 }
1327 }
1328 } else {
1329 /* otherwise, get first mode in database */
1330 modedb = specs->modedb[0];
1331 }
1332
1333 fb_videomode_to_var(&nvidiafb_default_var, &modedb);
1334 nvidiafb_default_var.bits_per_pixel = 8;
1335 } else if (par->fpWidth && par->fpHeight) {
1336 char buf[16];
1337
1338 memset(buf, 0, 16);
1339 snprintf(buf, 15, "%dx%dMR", par->fpWidth, par->fpHeight);
1340 fb_find_mode(&nvidiafb_default_var, info, buf, specs->modedb,
1341 specs->modedb_len, &modedb, 8);
1342 }
1343
1344 if (mode_option)
1345 fb_find_mode(&nvidiafb_default_var, info, mode_option,
1346 specs->modedb, specs->modedb_len, &modedb, 8);
1347
1348 info->var = nvidiafb_default_var;
1349 info->fix.visual = (info->var.bits_per_pixel == 8) ?
1350 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1351 info->pseudo_palette = par->pseudo_palette;
1352 fb_alloc_cmap(&info->cmap, 256, 0);
1353 fb_destroy_modedb(info->monspecs.modedb);
1354 info->monspecs.modedb = NULL;
1355
1356 /* maximize virtual vertical length */
1357 lpitch = info->var.xres_virtual *
1358 ((info->var.bits_per_pixel + 7) >> 3);
1359 info->var.yres_virtual = info->screen_size / lpitch;
1360
1361 info->pixmap.scan_align = 4;
1362 info->pixmap.buf_align = 4;
1363 info->pixmap.access_align = 32;
1364 info->pixmap.size = 8 * 1024;
1365 info->pixmap.flags = FB_PIXMAP_SYSTEM;
1366
1367 if (!hwcur)
1368 info->fbops->fb_cursor = soft_cursor;
1369
1370 info->var.accel_flags = (!noaccel);
1371
1372 switch (par->Architecture) {
1373 case NV_ARCH_04:
1374 info->fix.accel = FB_ACCEL_NV4;
1375 break;
1376 case NV_ARCH_10:
1377 info->fix.accel = FB_ACCEL_NV_10;
1378 break;
1379 case NV_ARCH_20:
1380 info->fix.accel = FB_ACCEL_NV_20;
1381 break;
1382 case NV_ARCH_30:
1383 info->fix.accel = FB_ACCEL_NV_30;
1384 break;
1385 case NV_ARCH_40:
1386 info->fix.accel = FB_ACCEL_NV_40;
1387 break;
1388 }
1389
1390 NVTRACE_LEAVE();
1391
1392 return nvidiafb_check_var(&info->var, info);
1393 }
1394
1395 static u32 __devinit nvidia_get_arch(struct pci_dev *pd)
1396 {
1397 u32 arch = 0;
1398
1399 switch (pd->device & 0x0ff0) {
1400 case 0x0100: /* GeForce 256 */
1401 case 0x0110: /* GeForce2 MX */
1402 case 0x0150: /* GeForce2 */
1403 case 0x0170: /* GeForce4 MX */
1404 case 0x0180: /* GeForce4 MX (8x AGP) */
1405 case 0x01A0: /* nForce */
1406 case 0x01F0: /* nForce2 */
1407 arch = NV_ARCH_10;
1408 break;
1409 case 0x0200: /* GeForce3 */
1410 case 0x0250: /* GeForce4 Ti */
1411 case 0x0280: /* GeForce4 Ti (8x AGP) */
1412 arch = NV_ARCH_20;
1413 break;
1414 case 0x0300: /* GeForceFX 5800 */
1415 case 0x0310: /* GeForceFX 5600 */
1416 case 0x0320: /* GeForceFX 5200 */
1417 case 0x0330: /* GeForceFX 5900 */
1418 case 0x0340: /* GeForceFX 5700 */
1419 arch = NV_ARCH_30;
1420 break;
1421 case 0x0040:
1422 case 0x00C0:
1423 case 0x0120:
1424 case 0x0130:
1425 case 0x0140:
1426 case 0x0160:
1427 case 0x01D0:
1428 case 0x0090:
1429 case 0x0210:
1430 case 0x0220:
1431 case 0x0230:
1432 arch = NV_ARCH_40;
1433 break;
1434 case 0x0020: /* TNT, TNT2 */
1435 arch = NV_ARCH_04;
1436 break;
1437 default: /* unknown architecture */
1438 break;
1439 }
1440
1441 return arch;
1442 }
1443
1444 static int __devinit nvidiafb_probe(struct pci_dev *pd,
1445 const struct pci_device_id *ent)
1446 {
1447 struct nvidia_par *par;
1448 struct fb_info *info;
1449 unsigned short cmd;
1450
1451
1452 NVTRACE_ENTER();
1453 assert(pd != NULL);
1454
1455 info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
1456
1457 if (!info)
1458 goto err_out;
1459
1460 par = (struct nvidia_par *)info->par;
1461 par->pci_dev = pd;
1462
1463 info->pixmap.addr = kmalloc(8 * 1024, GFP_KERNEL);
1464
1465 if (info->pixmap.addr == NULL)
1466 goto err_out_kfree;
1467
1468 memset(info->pixmap.addr, 0, 8 * 1024);
1469
1470 if (pci_enable_device(pd)) {
1471 printk(KERN_ERR PFX "cannot enable PCI device\n");
1472 goto err_out_enable;
1473 }
1474
1475 if (pci_request_regions(pd, "nvidiafb")) {
1476 printk(KERN_ERR PFX "cannot request PCI regions\n");
1477 goto err_out_request;
1478 }
1479
1480 par->Architecture = nvidia_get_arch(pd);
1481
1482 par->Chipset = (pd->vendor << 16) | pd->device;
1483 printk(KERN_INFO PFX "nVidia device/chipset %X\n", par->Chipset);
1484
1485 if (par->Architecture == 0) {
1486 printk(KERN_ERR PFX "unknown NV_ARCH\n");
1487 goto err_out_free_base0;
1488 }
1489
1490 sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
1491
1492 par->FlatPanel = flatpanel;
1493
1494 if (flatpanel == 1)
1495 printk(KERN_INFO PFX "flatpanel support enabled\n");
1496
1497 par->CRTCnumber = forceCRTC;
1498 par->FpScale = (!noscale);
1499 par->paneltweak = paneltweak;
1500
1501 /* enable IO and mem if not already done */
1502 pci_read_config_word(pd, PCI_COMMAND, &cmd);
1503 cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
1504 pci_write_config_word(pd, PCI_COMMAND, cmd);
1505
1506 nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
1507 nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
1508 nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
1509
1510 par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
1511
1512 if (!par->REGS) {
1513 printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
1514 goto err_out_free_base0;
1515 }
1516
1517 NVCommonSetup(info);
1518
1519 par->FbAddress = nvidiafb_fix.smem_start;
1520 par->FbMapSize = par->RamAmountKBytes * 1024;
1521 if (vram && vram * 1024 * 1024 < par->FbMapSize)
1522 par->FbMapSize = vram * 1024 * 1024;
1523
1524 /* Limit amount of vram to 64 MB */
1525 if (par->FbMapSize > 64 * 1024 * 1024)
1526 par->FbMapSize = 64 * 1024 * 1024;
1527
1528 par->FbUsableSize = par->FbMapSize - (128 * 1024);
1529 par->ScratchBufferSize = (par->Architecture < NV_ARCH_10) ? 8 * 1024 :
1530 16 * 1024;
1531 par->ScratchBufferStart = par->FbUsableSize - par->ScratchBufferSize;
1532 info->screen_base = ioremap(nvidiafb_fix.smem_start, par->FbMapSize);
1533 info->screen_size = par->FbUsableSize;
1534 nvidiafb_fix.smem_len = par->RamAmountKBytes * 1024;
1535
1536 if (!info->screen_base) {
1537 printk(KERN_ERR PFX "cannot ioremap FB base\n");
1538 goto err_out_free_base1;
1539 }
1540
1541 par->FbStart = info->screen_base;
1542
1543 #ifdef CONFIG_MTRR
1544 if (!nomtrr) {
1545 par->mtrr.vram = mtrr_add(nvidiafb_fix.smem_start,
1546 par->RamAmountKBytes * 1024,
1547 MTRR_TYPE_WRCOMB, 1);
1548 if (par->mtrr.vram < 0) {
1549 printk(KERN_ERR PFX "unable to setup MTRR\n");
1550 } else {
1551 par->mtrr.vram_valid = 1;
1552 /* let there be speed */
1553 printk(KERN_INFO PFX "MTRR set to ON\n");
1554 }
1555 }
1556 #endif /* CONFIG_MTRR */
1557
1558 info->fbops = &nvidia_fb_ops;
1559 info->fix = nvidiafb_fix;
1560
1561 if (nvidia_set_fbinfo(info) < 0) {
1562 printk(KERN_ERR PFX "error setting initial video mode\n");
1563 goto err_out_iounmap_fb;
1564 }
1565
1566 nvidia_save_vga(par, &par->SavedReg);
1567
1568 if (register_framebuffer(info) < 0) {
1569 printk(KERN_ERR PFX "error registering nVidia framebuffer\n");
1570 goto err_out_iounmap_fb;
1571 }
1572
1573 pci_set_drvdata(pd, info);
1574
1575 printk(KERN_INFO PFX
1576 "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
1577 info->fix.id,
1578 par->FbMapSize / (1024 * 1024), info->fix.smem_start);
1579 #ifdef CONFIG_PMAC_BACKLIGHT
1580 if (par->FlatPanel && _machine == _MACH_Pmac)
1581 register_backlight_controller(&nvidia_backlight_controller,
1582 par, "mnca");
1583 #endif
1584 NVTRACE_LEAVE();
1585 return 0;
1586
1587 err_out_iounmap_fb:
1588 iounmap(info->screen_base);
1589 err_out_free_base1:
1590 fb_destroy_modedb(info->monspecs.modedb);
1591 nvidia_delete_i2c_busses(par);
1592 iounmap(par->REGS);
1593 err_out_free_base0:
1594 pci_release_regions(pd);
1595 err_out_request:
1596 pci_disable_device(pd);
1597 err_out_enable:
1598 kfree(info->pixmap.addr);
1599 err_out_kfree:
1600 framebuffer_release(info);
1601 err_out:
1602 return -ENODEV;
1603 }
1604
1605 static void __exit nvidiafb_remove(struct pci_dev *pd)
1606 {
1607 struct fb_info *info = pci_get_drvdata(pd);
1608 struct nvidia_par *par = info->par;
1609
1610 NVTRACE_ENTER();
1611 if (!info)
1612 return;
1613
1614 unregister_framebuffer(info);
1615 #ifdef CONFIG_MTRR
1616 if (par->mtrr.vram_valid)
1617 mtrr_del(par->mtrr.vram, info->fix.smem_start,
1618 info->fix.smem_len);
1619 #endif /* CONFIG_MTRR */
1620
1621 iounmap(info->screen_base);
1622 fb_destroy_modedb(info->monspecs.modedb);
1623 nvidia_delete_i2c_busses(par);
1624 iounmap(par->REGS);
1625 pci_release_regions(pd);
1626 pci_disable_device(pd);
1627 kfree(info->pixmap.addr);
1628 framebuffer_release(info);
1629 pci_set_drvdata(pd, NULL);
1630 NVTRACE_LEAVE();
1631 }
1632
1633 /* ------------------------------------------------------------------------- *
1634 *
1635 * initialization
1636 *
1637 * ------------------------------------------------------------------------- */
1638
1639 #ifndef MODULE
1640 static int __devinit nvidiafb_setup(char *options)
1641 {
1642 char *this_opt;
1643
1644 NVTRACE_ENTER();
1645 if (!options || !*options)
1646 return 0;
1647
1648 while ((this_opt = strsep(&options, ",")) != NULL) {
1649 if (!strncmp(this_opt, "forceCRTC", 9)) {
1650 char *p;
1651
1652 p = this_opt + 9;
1653 if (!*p || !*(++p))
1654 continue;
1655 forceCRTC = *p - '0';
1656 if (forceCRTC < 0 || forceCRTC > 1)
1657 forceCRTC = -1;
1658 } else if (!strncmp(this_opt, "flatpanel", 9)) {
1659 flatpanel = 1;
1660 } else if (!strncmp(this_opt, "hwcur", 5)) {
1661 hwcur = 1;
1662 } else if (!strncmp(this_opt, "noaccel", 6)) {
1663 noaccel = 1;
1664 } else if (!strncmp(this_opt, "noscale", 7)) {
1665 noscale = 1;
1666 } else if (!strncmp(this_opt, "paneltweak:", 11)) {
1667 paneltweak = simple_strtoul(this_opt+11, NULL, 0);
1668 } else if (!strncmp(this_opt, "vram:", 5)) {
1669 vram = simple_strtoul(this_opt+5, NULL, 0);
1670 #ifdef CONFIG_MTRR
1671 } else if (!strncmp(this_opt, "nomtrr", 6)) {
1672 nomtrr = 1;
1673 #endif
1674 } else
1675 mode_option = this_opt;
1676 }
1677 NVTRACE_LEAVE();
1678 return 0;
1679 }
1680 #endif /* !MODULE */
1681
1682 static struct pci_driver nvidiafb_driver = {
1683 .name = "nvidiafb",
1684 .id_table = nvidiafb_pci_tbl,
1685 .probe = nvidiafb_probe,
1686 .remove = __exit_p(nvidiafb_remove),
1687 };
1688
1689 /* ------------------------------------------------------------------------- *
1690 *
1691 * modularization
1692 *
1693 * ------------------------------------------------------------------------- */
1694
1695 static int __devinit nvidiafb_init(void)
1696 {
1697 #ifndef MODULE
1698 char *option = NULL;
1699
1700 if (fb_get_options("nvidiafb", &option))
1701 return -ENODEV;
1702 nvidiafb_setup(option);
1703 #endif
1704 return pci_register_driver(&nvidiafb_driver);
1705 }
1706
1707 module_init(nvidiafb_init);
1708
1709 #ifdef MODULE
1710 static void __exit nvidiafb_exit(void)
1711 {
1712 pci_unregister_driver(&nvidiafb_driver);
1713 }
1714
1715 module_exit(nvidiafb_exit);
1716
1717 module_param(flatpanel, int, 0);
1718 MODULE_PARM_DESC(flatpanel,
1719 "Enables experimental flat panel support for some chipsets. "
1720 "(0 or 1=enabled) (default=0)");
1721 module_param(hwcur, int, 0);
1722 MODULE_PARM_DESC(hwcur,
1723 "Enables hardware cursor implementation. (0 or 1=enabled) "
1724 "(default=0)");
1725 module_param(noaccel, int, 0);
1726 MODULE_PARM_DESC(noaccel,
1727 "Disables hardware acceleration. (0 or 1=disable) "
1728 "(default=0)");
1729 module_param(noscale, int, 0);
1730 MODULE_PARM_DESC(noscale,
1731 "Disables screen scaleing. (0 or 1=disable) "
1732 "(default=0, do scaling)");
1733 module_param(paneltweak, int, 0);
1734 MODULE_PARM_DESC(paneltweak,
1735 "Tweak display settings for flatpanels. "
1736 "(default=0, no tweaks)");
1737 module_param(forceCRTC, int, 0);
1738 MODULE_PARM_DESC(forceCRTC,
1739 "Forces usage of a particular CRTC in case autodetection "
1740 "fails. (0 or 1) (default=autodetect)");
1741 module_param(vram, int, 0);
1742 MODULE_PARM_DESC(vram,
1743 "amount of framebuffer memory to remap in MiB"
1744 "(default=0 - remap entire memory)");
1745 #ifdef CONFIG_MTRR
1746 module_param(nomtrr, bool, 0);
1747 MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) "
1748 "(default=0)");
1749 #endif
1750
1751 MODULE_AUTHOR("Antonino Daplas");
1752 MODULE_DESCRIPTION("Framebuffer driver for nVidia graphics chipset");
1753 MODULE_LICENSE("GPL");
1754 #endif /* MODULE */
1755
This page took 0.069787 seconds and 6 git commands to generate.