2 * linux/drivers/video/nvidia/nvidia.c - nVidia fb driver
4 * Copyright 2004 Antonino Daplas <adaplas@pol.net>
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
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>
18 #include <linux/tty.h>
19 #include <linux/slab.h>
20 #include <linux/delay.h>
22 #include <linux/init.h>
23 #include <linux/pci.h>
29 #include <asm/pci-bridge.h>
31 #ifdef CONFIG_PMAC_BACKLIGHT
32 #include <asm/machdep.h>
33 #include <asm/backlight.h>
41 #ifndef CONFIG_PCI /* sanity check */
42 #error This driver requires PCI support.
45 #undef CONFIG_FB_NVIDIA_DEBUG
46 #ifdef CONFIG_FB_NVIDIA_DEBUG
47 #define NVTRACE printk
49 #define NVTRACE if (0) printk
52 #define NVTRACE_ENTER(...) NVTRACE("%s START\n", __FUNCTION__)
53 #define NVTRACE_LEAVE(...) NVTRACE("%s END\n", __FUNCTION__)
55 #ifdef CONFIG_FB_NVIDIA_DEBUG
56 #define assert(expr) \
58 printk( "Assertion failed! %s,%s,%s,line=%d\n",\
59 #expr,__FILE__,__FUNCTION__,__LINE__); \
66 #define PFX "nvidiafb: "
68 /* HW cursor parameters */
71 static struct pci_device_id nvidiafb_pci_tbl[] = {
72 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT,
73 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
74 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT2,
75 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
76 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_UTNT2,
77 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
78 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT_UNKNOWN,
79 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
80 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_VTNT2,
81 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
82 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_UVTNT2,
83 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
84 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_ITNT2,
85 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
86 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_SDR,
87 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
88 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_DDR,
89 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
90 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO,
91 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
92 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX,
93 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
94 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX2,
95 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
96 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GO,
97 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
98 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO2_MXR,
99 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
100 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS,
101 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
102 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS2,
103 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
104 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_ULTRA,
105 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
106 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO2_PRO,
107 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
108 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_460,
109 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
110 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440,
111 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
112 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_420,
113 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
114 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440_SE,
115 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
116 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO,
117 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
118 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO,
119 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
120 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_460_GO,
121 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
122 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO_M32,
123 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
124 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_500XGL,
125 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
126 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO_M64,
127 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
128 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_200,
129 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
130 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_550XGL,
131 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
132 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_500_GOGL,
133 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
134 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_410_GO_M16,
135 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
136 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440_8X,
137 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
138 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440SE_8X,
139 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
140 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_420_8X,
141 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
142 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_4000,
143 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
144 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_448_GO,
145 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
146 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_488_GO,
147 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
148 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_580_XGL,
149 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
150 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_MAC,
151 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
152 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_280_NVS,
153 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
154 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_380_XGL,
155 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
156 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_IGEFORCE2,
157 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
158 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3,
159 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
160 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3_1,
161 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
162 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3_2,
163 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
164 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_DDC,
165 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
166 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4600,
167 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
168 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4400,
169 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
170 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4200,
171 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
172 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL,
173 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
174 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL,
175 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
176 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL,
177 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
178 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800,
179 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
180 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800_8X,
181 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
182 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800SE,
183 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
184 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_4200_GO,
185 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
186 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_980_XGL,
187 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
188 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_780_XGL,
189 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
190 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_700_GOGL,
191 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
192 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5800_ULTRA,
193 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
194 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5800,
195 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
196 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_2000,
197 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
198 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1000,
199 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
200 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600_ULTRA,
201 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
202 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600,
203 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
204 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600SE,
205 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
206 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5600,
207 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
208 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5650,
209 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
210 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO700,
211 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
212 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200,
213 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
214 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200_ULTRA,
215 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
216 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200_1,
217 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
218 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200SE,
219 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
220 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5200,
221 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
222 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5250,
223 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
224 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5250_32,
225 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
226 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO_5200,
227 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
228 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_NVS_280_PCI,
229 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
230 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_500,
231 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
232 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5300,
233 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
234 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5100,
235 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
236 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900_ULTRA,
237 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
238 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900,
239 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
240 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900XT,
241 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
242 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5950_ULTRA,
243 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
244 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_3000,
245 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
246 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700_ULTRA,
247 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
248 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700,
249 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
250 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700LE,
251 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
252 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700VE,
253 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
254 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_1,
255 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
256 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_2,
257 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
258 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO1000,
259 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
260 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100,
261 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
262 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5500,
263 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
264 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5100,
265 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
266 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_700,
267 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
268 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900ZT,
269 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
270 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800_ULTRA,
271 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
272 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800,
273 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
274 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800_LE,
275 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
276 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800_GT,
277 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
278 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_4000,
279 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
280 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6600_GT,
281 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
282 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6600,
283 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
284 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6610_XL,
285 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
286 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_540,
287 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
288 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6200,
289 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
290 {PCI_VENDOR_ID_NVIDIA, PCIE_DEVICE_ID_NVIDIA_GEFORCE_6800_ALT1,
291 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
292 {PCI_VENDOR_ID_NVIDIA, PCIE_DEVICE_ID_NVIDIA_GEFORCE_6600_ALT1,
293 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
294 {PCI_VENDOR_ID_NVIDIA, PCIE_DEVICE_ID_NVIDIA_GEFORCE_6600_ALT2,
295 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
296 {PCI_VENDOR_ID_NVIDIA, PCIE_DEVICE_ID_NVIDIA_GEFORCE_6200_ALT1,
297 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
298 {PCI_VENDOR_ID_NVIDIA, PCIE_DEVICE_ID_NVIDIA_GEFORCE_6800_GT,
299 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
300 {PCI_VENDOR_ID_NVIDIA, 0x0252,
301 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
302 {PCI_VENDOR_ID_NVIDIA, 0x0313,
303 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
304 {PCI_VENDOR_ID_NVIDIA, 0x0316,
305 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
306 {PCI_VENDOR_ID_NVIDIA, 0x0317,
307 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
308 {PCI_VENDOR_ID_NVIDIA, 0x031D,
309 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
310 {PCI_VENDOR_ID_NVIDIA, 0x031E,
311 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
312 {PCI_VENDOR_ID_NVIDIA, 0x031F,
313 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
314 {PCI_VENDOR_ID_NVIDIA, 0x0329,
315 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
316 {PCI_VENDOR_ID_NVIDIA, 0x032F,
317 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
318 {PCI_VENDOR_ID_NVIDIA, 0x0345,
319 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
320 {PCI_VENDOR_ID_NVIDIA, 0x0349,
321 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
322 {PCI_VENDOR_ID_NVIDIA, 0x034B,
323 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
324 {PCI_VENDOR_ID_NVIDIA, 0x034F,
325 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
326 {PCI_VENDOR_ID_NVIDIA, 0x00c0,
327 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
328 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_GEFORCE_6800A,
329 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
330 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_GEFORCE_6800A_LE,
331 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
332 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_GEFORCE_GO_6800,
333 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
334 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_GEFORCE_GO_6800_ULTRA,
335 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
336 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_QUADRO_FX_GO1400,
337 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
338 {PCI_VENDOR_ID_NVIDIA, 0x00cd,
339 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
340 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_QUADRO_FX_1400,
341 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
342 {PCI_VENDOR_ID_NVIDIA, 0x0142,
343 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
344 {PCI_VENDOR_ID_NVIDIA, 0x0143,
345 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
346 {PCI_VENDOR_ID_NVIDIA, 0x0144,
347 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
348 {PCI_VENDOR_ID_NVIDIA, 0x0145,
349 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
350 {PCI_VENDOR_ID_NVIDIA, 0x0146,
351 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
352 {PCI_VENDOR_ID_NVIDIA, 0x0147,
353 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
354 {PCI_VENDOR_ID_NVIDIA, 0x0148,
355 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
356 {PCI_VENDOR_ID_NVIDIA, 0x0149,
357 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
358 {PCI_VENDOR_ID_NVIDIA, 0x014b,
359 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
360 {PCI_VENDOR_ID_NVIDIA, 0x14c,
361 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
362 {PCI_VENDOR_ID_NVIDIA, 0x014d,
363 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
364 {PCI_VENDOR_ID_NVIDIA, 0x0160,
365 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
366 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6200_TURBOCACHE,
367 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
368 {PCI_VENDOR_ID_NVIDIA, 0x0162,
369 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
370 {PCI_VENDOR_ID_NVIDIA, 0x0163,
371 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
372 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_6200,
373 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
374 {PCI_VENDOR_ID_NVIDIA, 0x0165,
375 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
376 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_6250,
377 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
378 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_6200_1,
379 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
380 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_6250_1,
381 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
382 {PCI_VENDOR_ID_NVIDIA, 0x0169,
383 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
384 {PCI_VENDOR_ID_NVIDIA, 0x016b,
385 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
386 {PCI_VENDOR_ID_NVIDIA, 0x016c,
387 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
388 {PCI_VENDOR_ID_NVIDIA, 0x016d,
389 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
390 {PCI_VENDOR_ID_NVIDIA, 0x016e,
391 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
392 {PCI_VENDOR_ID_NVIDIA, 0x0210,
393 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
394 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800B,
395 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
396 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800B_LE,
397 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
398 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800B_GT,
399 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
400 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_7800_GT,
401 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
402 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_7800_GTX,
403 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
404 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_7800,
405 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
406 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_7800_GTX,
407 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
408 {PCI_VENDOR_ID_NVIDIA, 0x021d,
409 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
410 {PCI_VENDOR_ID_NVIDIA, 0x021e,
411 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
412 {PCI_VENDOR_ID_NVIDIA, 0x0220,
413 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
414 {PCI_VENDOR_ID_NVIDIA, 0x0221,
415 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
416 {PCI_VENDOR_ID_NVIDIA, 0x0222,
417 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
418 {PCI_VENDOR_ID_NVIDIA, 0x0228,
419 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
420 {0,} /* terminate list */
423 MODULE_DEVICE_TABLE(pci, nvidiafb_pci_tbl);
425 /* command line data, set in nvidiafb_setup() */
426 static int flatpanel __devinitdata = -1; /* Autodetect later */
427 static int fpdither __devinitdata = -1;
428 static int forceCRTC __devinitdata = -1;
429 static int hwcur __devinitdata = 0;
430 static int noaccel __devinitdata = 0;
431 static int noscale __devinitdata = 0;
432 static int paneltweak __devinitdata = 0;
433 static int vram __devinitdata = 0;
434 static int bpp __devinitdata = 8;
436 static int nomtrr __devinitdata = 0;
439 static char *mode_option __devinitdata = NULL;
441 static struct fb_fix_screeninfo __devinitdata nvidiafb_fix = {
442 .type = FB_TYPE_PACKED_PIXELS,
447 static struct fb_var_screeninfo __devinitdata nvidiafb_default_var = {
457 .activate = FB_ACTIVATE_NOW,
467 .vmode = FB_VMODE_NONINTERLACED
473 #ifdef CONFIG_PMAC_BACKLIGHT
475 static int nvidia_backlight_levels[] = {
494 /* ------------------------------------------------------------------------- *
496 * Backlight operations
498 * ------------------------------------------------------------------------- */
500 static int nvidia_set_backlight_enable(int on, int level, void *data)
502 struct nvidia_par *par = data;
503 u32 tmp_pcrt, tmp_pmc, fpcontrol;
505 tmp_pmc = NV_RD32(par->PMC, 0x10F0) & 0x0000FFFF;
506 tmp_pcrt = NV_RD32(par->PCRTC0, 0x081C) & 0xFFFFFFFC;
507 fpcontrol = NV_RD32(par->PRAMDAC, 0x0848) & 0xCFFFFFCC;
509 if (on && (level > BACKLIGHT_OFF)) {
511 tmp_pmc |= (1 << 31); // backlight bit
512 tmp_pmc |= nvidia_backlight_levels[level - 1] << 16;
516 fpcontrol |= par->fpSyncs;
518 fpcontrol |= 0x20000022;
520 NV_WR32(par->PCRTC0, 0x081C, tmp_pcrt);
521 NV_WR32(par->PMC, 0x10F0, tmp_pmc);
522 NV_WR32(par->PRAMDAC, 0x848, fpcontrol);
527 static int nvidia_set_backlight_level(int level, void *data)
529 return nvidia_set_backlight_enable(1, level, data);
532 static struct backlight_controller nvidia_backlight_controller = {
533 nvidia_set_backlight_enable,
534 nvidia_set_backlight_level
537 #endif /* CONFIG_PMAC_BACKLIGHT */
539 static void nvidiafb_load_cursor_image(struct nvidia_par *par, u8 * data8,
540 u16 bg, u16 fg, u32 w, u32 h)
542 u32 *data = (u32 *) data8;
548 for (i = 0; i < h; i++) {
552 for (j = 0; j < w / 2; j++) {
554 #if defined (__BIG_ENDIAN)
555 tmp = (b & (1 << 31)) ? fg << 16 : bg << 16;
557 tmp |= (b & (1 << 31)) ? fg : bg;
560 tmp = (b & 1) ? fg : bg;
562 tmp |= (b & 1) ? fg << 16 : bg << 16;
565 NV_WR32(&par->CURSOR[k++], 0, tmp);
567 k += (MAX_CURS - w) / 2;
571 static void nvidia_write_clut(struct nvidia_par *par,
572 u8 regnum, u8 red, u8 green, u8 blue)
574 NVWriteDacMask(par, 0xff);
575 NVWriteDacWriteAddr(par, regnum);
576 NVWriteDacData(par, red);
577 NVWriteDacData(par, green);
578 NVWriteDacData(par, blue);
581 static void nvidia_read_clut(struct nvidia_par *par,
582 u8 regnum, u8 * red, u8 * green, u8 * blue)
584 NVWriteDacMask(par, 0xff);
585 NVWriteDacReadAddr(par, regnum);
586 *red = NVReadDacData(par);
587 *green = NVReadDacData(par);
588 *blue = NVReadDacData(par);
591 static int nvidia_panel_tweak(struct nvidia_par *par,
592 struct _riva_hw_state *state)
596 if (par->paneltweak) {
597 tweak = par->paneltweak;
599 /* begin flat panel hacks */
600 /* This is unfortunate, but some chips need this register
601 tweaked or else you get artifacts where adjacent pixels are
602 swapped. There are no hard rules for what to set here so all
603 we can do is experiment and apply hacks. */
605 if(((par->Chipset & 0xffff) == 0x0328) && (state->bpp == 32)) {
606 /* At least one NV34 laptop needs this workaround. */
610 if((par->Chipset & 0xfff0) == 0x0310) {
613 /* end flat panel hacks */
619 static void nvidia_save_vga(struct nvidia_par *par,
620 struct _riva_hw_state *state)
625 NVLockUnlock(par, 0);
627 NVUnloadStateExt(par, state);
629 state->misc_output = NVReadMiscOut(par);
631 for (i = 0; i < NUM_CRT_REGS; i++)
632 state->crtc[i] = NVReadCrtc(par, i);
634 for (i = 0; i < NUM_ATC_REGS; i++)
635 state->attr[i] = NVReadAttr(par, i);
637 for (i = 0; i < NUM_GRC_REGS; i++)
638 state->gra[i] = NVReadGr(par, i);
640 for (i = 0; i < NUM_SEQ_REGS; i++)
641 state->seq[i] = NVReadSeq(par, i);
647 static void nvidia_write_regs(struct nvidia_par *par)
649 struct _riva_hw_state *state = &par->ModeReg;
654 NVLoadStateExt(par, state);
656 NVWriteMiscOut(par, state->misc_output);
658 for (i = 1; i < NUM_SEQ_REGS; i++) {
660 printk(" SEQ[%02x] = %08x\n", i, state->seq[i]);
662 NVWriteSeq(par, i, state->seq[i]);
665 /* Ensure CRTC registers 0-7 are unlocked by clearing bit 7 of CRTC[17] */
666 NVWriteCrtc(par, 0x11, state->crtc[0x11] & ~0x80);
668 for (i = 0; i < NUM_CRT_REGS; i++) {
675 printk("CRTC[%02x] = %08x\n", i, state->crtc[i]);
677 NVWriteCrtc(par, i, state->crtc[i]);
681 for (i = 0; i < NUM_GRC_REGS; i++) {
683 printk(" GRA[%02x] = %08x\n", i, state->gra[i]);
685 NVWriteGr(par, i, state->gra[i]);
688 for (i = 0; i < NUM_ATC_REGS; i++) {
690 printk("ATTR[%02x] = %08x\n", i, state->attr[i]);
692 NVWriteAttr(par, i, state->attr[i]);
698 static void nvidia_vga_protect(struct nvidia_par *par, int on)
704 * Turn off screen and disable sequencer.
706 tmp = NVReadSeq(par, 0x01);
708 NVWriteSeq(par, 0x00, 0x01); /* Synchronous Reset */
709 NVWriteSeq(par, 0x01, tmp | 0x20); /* disable the display */
712 * Reenable sequencer, then turn on screen.
715 tmp = NVReadSeq(par, 0x01);
717 NVWriteSeq(par, 0x01, tmp & ~0x20); /* reenable display */
718 NVWriteSeq(par, 0x00, 0x03); /* End Reset */
724 static int nvidia_calc_regs(struct fb_info *info)
726 struct nvidia_par *par = info->par;
727 struct _riva_hw_state *state = &par->ModeReg;
728 int i, depth = fb_get_color_depth(&info->var, &info->fix);
729 int h_display = info->var.xres / 8 - 1;
730 int h_start = (info->var.xres + info->var.right_margin) / 8 - 1;
731 int h_end = (info->var.xres + info->var.right_margin +
732 info->var.hsync_len) / 8 - 1;
733 int h_total = (info->var.xres + info->var.right_margin +
734 info->var.hsync_len + info->var.left_margin) / 8 - 5;
735 int h_blank_s = h_display;
736 int h_blank_e = h_total + 4;
737 int v_display = info->var.yres - 1;
738 int v_start = info->var.yres + info->var.lower_margin - 1;
739 int v_end = (info->var.yres + info->var.lower_margin +
740 info->var.vsync_len) - 1;
741 int v_total = (info->var.yres + info->var.lower_margin +
742 info->var.vsync_len + info->var.upper_margin) - 2;
743 int v_blank_s = v_display;
744 int v_blank_e = v_total + 1;
747 * Set all CRTC values.
750 if (info->var.vmode & FB_VMODE_INTERLACED)
753 if (par->FlatPanel == 1) {
754 v_start = v_total - 3;
757 h_start = h_total - 5;
759 h_blank_e = h_total + 4;
762 state->crtc[0x0] = Set8Bits(h_total);
763 state->crtc[0x1] = Set8Bits(h_display);
764 state->crtc[0x2] = Set8Bits(h_blank_s);
765 state->crtc[0x3] = SetBitField(h_blank_e, 4: 0, 4:0)
767 state->crtc[0x4] = Set8Bits(h_start);
768 state->crtc[0x5] = SetBitField(h_blank_e, 5: 5, 7:7)
769 | SetBitField(h_end, 4: 0, 4:0);
770 state->crtc[0x6] = SetBitField(v_total, 7: 0, 7:0);
771 state->crtc[0x7] = SetBitField(v_total, 8: 8, 0:0)
772 | SetBitField(v_display, 8: 8, 1:1)
773 | SetBitField(v_start, 8: 8, 2:2)
774 | SetBitField(v_blank_s, 8: 8, 3:3)
776 | SetBitField(v_total, 9: 9, 5:5)
777 | SetBitField(v_display, 9: 9, 6:6)
778 | SetBitField(v_start, 9: 9, 7:7);
779 state->crtc[0x9] = SetBitField(v_blank_s, 9: 9, 5:5)
781 | ((info->var.vmode & FB_VMODE_DOUBLE) ? 0x80 : 0x00);
782 state->crtc[0x10] = Set8Bits(v_start);
783 state->crtc[0x11] = SetBitField(v_end, 3: 0, 3:0) | SetBit(5);
784 state->crtc[0x12] = Set8Bits(v_display);
785 state->crtc[0x13] = ((info->var.xres_virtual / 8) *
786 (info->var.bits_per_pixel / 8));
787 state->crtc[0x15] = Set8Bits(v_blank_s);
788 state->crtc[0x16] = Set8Bits(v_blank_e);
790 state->attr[0x10] = 0x01;
793 state->attr[0x11] = 0x00;
795 state->screen = SetBitField(h_blank_e, 6: 6, 4:4)
796 | SetBitField(v_blank_s, 10: 10, 3:3)
797 | SetBitField(v_start, 10: 10, 2:2)
798 | SetBitField(v_display, 10: 10, 1:1)
799 | SetBitField(v_total, 10: 10, 0:0);
801 state->horiz = SetBitField(h_total, 8: 8, 0:0)
802 | SetBitField(h_display, 8: 8, 1:1)
803 | SetBitField(h_blank_s, 8: 8, 2:2)
804 | SetBitField(h_start, 8: 8, 3:3);
806 state->extra = SetBitField(v_total, 11: 11, 0:0)
807 | SetBitField(v_display, 11: 11, 2:2)
808 | SetBitField(v_start, 11: 11, 4:4)
809 | SetBitField(v_blank_s, 11: 11, 6:6);
811 if (info->var.vmode & FB_VMODE_INTERLACED) {
812 h_total = (h_total >> 1) & ~1;
813 state->interlace = Set8Bits(h_total);
814 state->horiz |= SetBitField(h_total, 8: 8, 4:4);
816 state->interlace = 0xff; /* interlace off */
820 * Calculate the extended registers.
828 if (par->Architecture >= NV_ARCH_10)
829 par->CURSOR = (volatile u32 __iomem *)(info->screen_base +
832 if (info->var.sync & FB_SYNC_HOR_HIGH_ACT)
833 state->misc_output &= ~0x40;
835 state->misc_output |= 0x40;
836 if (info->var.sync & FB_SYNC_VERT_HIGH_ACT)
837 state->misc_output &= ~0x80;
839 state->misc_output |= 0x80;
841 NVCalcStateExt(par, state, i, info->var.xres_virtual,
842 info->var.xres, info->var.yres_virtual,
843 1000000000 / info->var.pixclock, info->var.vmode);
845 state->scale = NV_RD32(par->PRAMDAC, 0x00000848) & 0xfff000ff;
846 if (par->FlatPanel == 1) {
847 state->pixel |= (1 << 7);
849 if (!par->fpScaler || (par->fpWidth <= info->var.xres)
850 || (par->fpHeight <= info->var.yres)) {
851 state->scale |= (1 << 8);
854 if (!par->crtcSync_read) {
855 state->crtcSync = NV_RD32(par->PRAMDAC, 0x0828);
856 par->crtcSync_read = 1;
859 par->PanelTweak = nvidia_panel_tweak(par, state);
862 state->vpll = state->pll;
863 state->vpll2 = state->pll;
864 state->vpllB = state->pllB;
865 state->vpll2B = state->pllB;
867 VGA_WR08(par->PCIO, 0x03D4, 0x1C);
868 state->fifo = VGA_RD08(par->PCIO, 0x03D5) & ~(1<<5);
870 if (par->CRTCnumber) {
871 state->head = NV_RD32(par->PCRTC0, 0x00000860) & ~0x00001000;
872 state->head2 = NV_RD32(par->PCRTC0, 0x00002860) | 0x00001000;
873 state->crtcOwner = 3;
874 state->pllsel |= 0x20000800;
875 state->vpll = NV_RD32(par->PRAMDAC0, 0x00000508);
876 if (par->twoStagePLL)
877 state->vpllB = NV_RD32(par->PRAMDAC0, 0x00000578);
878 } else if (par->twoHeads) {
879 state->head = NV_RD32(par->PCRTC0, 0x00000860) | 0x00001000;
880 state->head2 = NV_RD32(par->PCRTC0, 0x00002860) & ~0x00001000;
881 state->crtcOwner = 0;
882 state->vpll2 = NV_RD32(par->PRAMDAC0, 0x0520);
883 if (par->twoStagePLL)
884 state->vpll2B = NV_RD32(par->PRAMDAC0, 0x057C);
887 state->cursorConfig = 0x00000100;
889 if (info->var.vmode & FB_VMODE_DOUBLE)
890 state->cursorConfig |= (1 << 4);
892 if (par->alphaCursor) {
893 if ((par->Chipset & 0x0ff0) != 0x0110)
894 state->cursorConfig |= 0x04011000;
896 state->cursorConfig |= 0x14011000;
897 state->general |= (1 << 29);
899 state->cursorConfig |= 0x02000000;
902 if ((par->Chipset & 0x0ff0) == 0x0110) {
903 state->dither = NV_RD32(par->PRAMDAC, 0x0528) &
906 state->dither |= 0x00010000;
908 state->dither = NV_RD32(par->PRAMDAC, 0x083C) & ~1;
916 state->displayV = info->var.xres;
921 static void nvidia_init_vga(struct fb_info *info)
923 struct nvidia_par *par = info->par;
924 struct _riva_hw_state *state = &par->ModeReg;
927 for (i = 0; i < 0x10; i++)
929 state->attr[0x10] = 0x41;
930 state->attr[0x11] = 0xff;
931 state->attr[0x12] = 0x0f;
932 state->attr[0x13] = 0x00;
933 state->attr[0x14] = 0x00;
935 memset(state->crtc, 0x00, NUM_CRT_REGS);
936 state->crtc[0x0a] = 0x20;
937 state->crtc[0x17] = 0xe3;
938 state->crtc[0x18] = 0xff;
939 state->crtc[0x28] = 0x40;
941 memset(state->gra, 0x00, NUM_GRC_REGS);
942 state->gra[0x05] = 0x40;
943 state->gra[0x06] = 0x05;
944 state->gra[0x07] = 0x0f;
945 state->gra[0x08] = 0xff;
947 state->seq[0x00] = 0x03;
948 state->seq[0x01] = 0x01;
949 state->seq[0x02] = 0x0f;
950 state->seq[0x03] = 0x00;
951 state->seq[0x04] = 0x0e;
953 state->misc_output = 0xeb;
956 static int nvidiafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
958 struct nvidia_par *par = info->par;
959 u8 data[MAX_CURS * MAX_CURS / 8];
960 int i, set = cursor->set;
963 if (cursor->image.width > MAX_CURS || cursor->image.height > MAX_CURS)
966 NVShowHideCursor(par, 0);
968 if (par->cursor_reset) {
970 par->cursor_reset = 0;
973 if (set & FB_CUR_SETSIZE)
974 memset_io(par->CURSOR, 0, MAX_CURS * MAX_CURS * 2);
976 if (set & FB_CUR_SETPOS) {
979 yy = cursor->image.dy - info->var.yoffset;
980 xx = cursor->image.dx - info->var.xoffset;
984 NV_WR32(par->PRAMDAC, 0x0000300, temp);
987 if (set & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP | FB_CUR_SETIMAGE)) {
988 u32 bg_idx = cursor->image.bg_color;
989 u32 fg_idx = cursor->image.fg_color;
990 u32 s_pitch = (cursor->image.width + 7) >> 3;
991 u32 d_pitch = MAX_CURS / 8;
992 u8 *dat = (u8 *) cursor->image.data;
993 u8 *msk = (u8 *) cursor->mask;
996 src = kmalloc(s_pitch * cursor->image.height, GFP_ATOMIC);
999 switch (cursor->rop) {
1001 for (i = 0; i < s_pitch * cursor->image.height; i++)
1002 src[i] = dat[i] ^ msk[i];
1006 for (i = 0; i < s_pitch * cursor->image.height; i++)
1007 src[i] = dat[i] & msk[i];
1011 fb_pad_aligned_buffer(data, d_pitch, src, s_pitch,
1012 cursor->image.height);
1014 bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) |
1015 ((info->cmap.green[bg_idx] & 0xf8) << 2) |
1016 ((info->cmap.blue[bg_idx] & 0xf8) >> 3) | 1 << 15;
1018 fg = ((info->cmap.red[fg_idx] & 0xf8) << 7) |
1019 ((info->cmap.green[fg_idx] & 0xf8) << 2) |
1020 ((info->cmap.blue[fg_idx] & 0xf8) >> 3) | 1 << 15;
1022 NVLockUnlock(par, 0);
1024 nvidiafb_load_cursor_image(par, data, bg, fg,
1025 cursor->image.width,
1026 cursor->image.height);
1032 NVShowHideCursor(par, 1);
1037 static int nvidiafb_set_par(struct fb_info *info)
1039 struct nvidia_par *par = info->par;
1043 NVLockUnlock(par, 1);
1044 if (!par->FlatPanel || !par->twoHeads)
1047 if (par->FPDither < 0) {
1048 if ((par->Chipset & 0x0ff0) == 0x0110)
1049 par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x0528)
1052 par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x083C) & 1);
1053 printk(KERN_INFO PFX "Flat panel dithering %s\n",
1054 par->FPDither ? "enabled" : "disabled");
1057 info->fix.visual = (info->var.bits_per_pixel == 8) ?
1058 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1060 nvidia_init_vga(info);
1061 nvidia_calc_regs(info);
1063 NVLockUnlock(par, 0);
1064 if (par->twoHeads) {
1065 VGA_WR08(par->PCIO, 0x03D4, 0x44);
1066 VGA_WR08(par->PCIO, 0x03D5, par->ModeReg.crtcOwner);
1067 NVLockUnlock(par, 0);
1070 nvidia_vga_protect(par, 1);
1072 nvidia_write_regs(par);
1074 #if defined (__BIG_ENDIAN)
1075 /* turn on LFB swapping */
1079 VGA_WR08(par->PCIO, 0x3d4, 0x46);
1080 tmp = VGA_RD08(par->PCIO, 0x3d5);
1082 VGA_WR08(par->PCIO, 0x3d5, tmp);
1086 info->fix.line_length = (info->var.xres_virtual *
1087 info->var.bits_per_pixel) >> 3;
1088 if (info->var.accel_flags) {
1089 info->fbops->fb_imageblit = nvidiafb_imageblit;
1090 info->fbops->fb_fillrect = nvidiafb_fillrect;
1091 info->fbops->fb_copyarea = nvidiafb_copyarea;
1092 info->fbops->fb_sync = nvidiafb_sync;
1093 info->pixmap.scan_align = 4;
1094 info->flags &= ~FBINFO_HWACCEL_DISABLED;
1095 NVResetGraphics(info);
1097 info->fbops->fb_imageblit = cfb_imageblit;
1098 info->fbops->fb_fillrect = cfb_fillrect;
1099 info->fbops->fb_copyarea = cfb_copyarea;
1100 info->fbops->fb_sync = NULL;
1101 info->pixmap.scan_align = 1;
1102 info->flags |= FBINFO_HWACCEL_DISABLED;
1105 par->cursor_reset = 1;
1107 nvidia_vga_protect(par, 0);
1113 static int nvidiafb_setcolreg(unsigned regno, unsigned red, unsigned green,
1114 unsigned blue, unsigned transp,
1115 struct fb_info *info)
1117 struct nvidia_par *par = info->par;
1121 if (regno >= (1 << info->var.green.length))
1124 if (info->var.grayscale) {
1125 /* gray = 0.30*R + 0.59*G + 0.11*B */
1126 red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8;
1129 if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
1130 ((u32 *) info->pseudo_palette)[regno] =
1131 (regno << info->var.red.offset) |
1132 (regno << info->var.green.offset) |
1133 (regno << info->var.blue.offset);
1136 switch (info->var.bits_per_pixel) {
1138 /* "transparent" stuff is completely ignored. */
1139 nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
1142 if (info->var.green.length == 5) {
1143 for (i = 0; i < 8; i++) {
1144 nvidia_write_clut(par, regno * 8 + i, red >> 8,
1145 green >> 8, blue >> 8);
1151 for (i = 0; i < 8; i++) {
1152 nvidia_write_clut(par, regno * 8 + i,
1153 red >> 8, green >> 8,
1158 nvidia_read_clut(par, regno * 4, &r, &g, &b);
1160 for (i = 0; i < 4; i++)
1161 nvidia_write_clut(par, regno * 4 + i, r,
1166 nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
1177 static int nvidiafb_check_var(struct fb_var_screeninfo *var,
1178 struct fb_info *info)
1180 struct nvidia_par *par = info->par;
1181 int memlen, vramlen, mode_valid = 0;
1186 var->transp.offset = 0;
1187 var->transp.length = 0;
1191 if (var->bits_per_pixel <= 8)
1192 var->bits_per_pixel = 8;
1193 else if (var->bits_per_pixel <= 16)
1194 var->bits_per_pixel = 16;
1196 var->bits_per_pixel = 32;
1198 switch (var->bits_per_pixel) {
1200 var->red.offset = 0;
1201 var->red.length = 8;
1202 var->green.offset = 0;
1203 var->green.length = 8;
1204 var->blue.offset = 0;
1205 var->blue.length = 8;
1206 var->transp.offset = 0;
1207 var->transp.length = 0;
1210 var->green.length = (var->green.length < 6) ? 5 : 6;
1211 var->red.length = 5;
1212 var->blue.length = 5;
1213 var->transp.length = 6 - var->green.length;
1214 var->blue.offset = 0;
1215 var->green.offset = 5;
1216 var->red.offset = 5 + var->green.length;
1217 var->transp.offset = (5 + var->red.offset) & 15;
1219 case 32: /* RGBA 8888 */
1220 var->red.offset = 16;
1221 var->red.length = 8;
1222 var->green.offset = 8;
1223 var->green.length = 8;
1224 var->blue.offset = 0;
1225 var->blue.length = 8;
1226 var->transp.length = 8;
1227 var->transp.offset = 24;
1231 var->red.msb_right = 0;
1232 var->green.msb_right = 0;
1233 var->blue.msb_right = 0;
1234 var->transp.msb_right = 0;
1236 if (!info->monspecs.hfmax || !info->monspecs.vfmax ||
1237 !info->monspecs.dclkmax || !fb_validate_mode(var, info))
1240 /* calculate modeline if supported by monitor */
1241 if (!mode_valid && info->monspecs.gtf) {
1242 if (!fb_get_mode(FB_MAXTIMINGS, 0, var, info))
1247 struct fb_videomode *mode;
1249 mode = fb_find_best_mode(var, &info->modelist);
1251 fb_videomode_to_var(var, mode);
1256 if (!mode_valid && info->monspecs.modedb_len)
1259 if (par->fpWidth && par->fpHeight && (par->fpWidth < var->xres ||
1260 par->fpHeight < var->yres))
1263 if (var->yres_virtual < var->yres)
1264 var->yres_virtual = var->yres;
1266 if (var->xres_virtual < var->xres)
1267 var->xres_virtual = var->xres;
1269 var->xres_virtual = (var->xres_virtual + 63) & ~63;
1271 vramlen = info->screen_size;
1272 pitch = ((var->xres_virtual * var->bits_per_pixel) + 7) / 8;
1273 memlen = pitch * var->yres_virtual;
1275 if (memlen > vramlen) {
1276 var->yres_virtual = vramlen / pitch;
1278 if (var->yres_virtual < var->yres) {
1279 var->yres_virtual = var->yres;
1280 var->xres_virtual = vramlen / var->yres_virtual;
1281 var->xres_virtual /= var->bits_per_pixel / 8;
1282 var->xres_virtual &= ~63;
1283 pitch = (var->xres_virtual *
1284 var->bits_per_pixel + 7) / 8;
1285 memlen = pitch * var->yres;
1287 if (var->xres_virtual < var->xres) {
1288 printk("nvidiafb: required video memory, "
1289 "%d bytes, for %dx%d-%d (virtual) "
1290 "is out of range\n",
1291 memlen, var->xres_virtual,
1292 var->yres_virtual, var->bits_per_pixel);
1298 if (var->accel_flags) {
1299 if (var->yres_virtual > 0x7fff)
1300 var->yres_virtual = 0x7fff;
1301 if (var->xres_virtual > 0x7fff)
1302 var->xres_virtual = 0x7fff;
1305 var->xres_virtual &= ~63;
1312 static int nvidiafb_pan_display(struct fb_var_screeninfo *var,
1313 struct fb_info *info)
1315 struct nvidia_par *par = info->par;
1318 total = var->yoffset * info->fix.line_length + var->xoffset;
1320 NVSetStartAddress(par, total);
1325 static int nvidiafb_blank(int blank, struct fb_info *info)
1327 struct nvidia_par *par = info->par;
1328 unsigned char tmp, vesa;
1330 tmp = NVReadSeq(par, 0x01) & ~0x20; /* screen on/off */
1331 vesa = NVReadCrtc(par, 0x1a) & ~0xc0; /* sync on/off */
1339 case FB_BLANK_UNBLANK:
1340 case FB_BLANK_NORMAL:
1342 case FB_BLANK_VSYNC_SUSPEND:
1345 case FB_BLANK_HSYNC_SUSPEND:
1348 case FB_BLANK_POWERDOWN:
1353 NVWriteSeq(par, 0x01, tmp);
1354 NVWriteCrtc(par, 0x1a, vesa);
1356 #ifdef CONFIG_PMAC_BACKLIGHT
1357 if (par->FlatPanel && machine_is(powermac)) {
1358 set_backlight_enable(!blank);
1367 static struct fb_ops nvidia_fb_ops = {
1368 .owner = THIS_MODULE,
1369 .fb_check_var = nvidiafb_check_var,
1370 .fb_set_par = nvidiafb_set_par,
1371 .fb_setcolreg = nvidiafb_setcolreg,
1372 .fb_pan_display = nvidiafb_pan_display,
1373 .fb_blank = nvidiafb_blank,
1374 .fb_fillrect = nvidiafb_fillrect,
1375 .fb_copyarea = nvidiafb_copyarea,
1376 .fb_imageblit = nvidiafb_imageblit,
1377 .fb_cursor = nvidiafb_cursor,
1378 .fb_sync = nvidiafb_sync,
1381 static int __devinit nvidia_set_fbinfo(struct fb_info *info)
1383 struct fb_monspecs *specs = &info->monspecs;
1384 struct fb_videomode modedb;
1385 struct nvidia_par *par = info->par;
1389 info->flags = FBINFO_DEFAULT
1390 | FBINFO_HWACCEL_IMAGEBLIT
1391 | FBINFO_HWACCEL_FILLRECT
1392 | FBINFO_HWACCEL_COPYAREA
1393 | FBINFO_HWACCEL_YPAN;
1395 fb_videomode_to_modelist(info->monspecs.modedb,
1396 info->monspecs.modedb_len, &info->modelist);
1397 fb_var_to_videomode(&modedb, &nvidiafb_default_var);
1411 if (specs->modedb != NULL) {
1412 struct fb_videomode *modedb;
1414 modedb = fb_find_best_display(specs, &info->modelist);
1415 fb_videomode_to_var(&nvidiafb_default_var, modedb);
1416 nvidiafb_default_var.bits_per_pixel = bpp;
1417 } else if (par->fpWidth && par->fpHeight) {
1421 snprintf(buf, 15, "%dx%dMR", par->fpWidth, par->fpHeight);
1422 fb_find_mode(&nvidiafb_default_var, info, buf, specs->modedb,
1423 specs->modedb_len, &modedb, bpp);
1427 fb_find_mode(&nvidiafb_default_var, info, mode_option,
1428 specs->modedb, specs->modedb_len, &modedb, bpp);
1430 info->var = nvidiafb_default_var;
1431 info->fix.visual = (info->var.bits_per_pixel == 8) ?
1432 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1433 info->pseudo_palette = par->pseudo_palette;
1434 fb_alloc_cmap(&info->cmap, 256, 0);
1435 fb_destroy_modedb(info->monspecs.modedb);
1436 info->monspecs.modedb = NULL;
1438 /* maximize virtual vertical length */
1439 lpitch = info->var.xres_virtual *
1440 ((info->var.bits_per_pixel + 7) >> 3);
1441 info->var.yres_virtual = info->screen_size / lpitch;
1443 info->pixmap.scan_align = 4;
1444 info->pixmap.buf_align = 4;
1445 info->pixmap.access_align = 32;
1446 info->pixmap.size = 8 * 1024;
1447 info->pixmap.flags = FB_PIXMAP_SYSTEM;
1450 info->fbops->fb_cursor = NULL;
1452 info->var.accel_flags = (!noaccel);
1454 switch (par->Architecture) {
1456 info->fix.accel = FB_ACCEL_NV4;
1459 info->fix.accel = FB_ACCEL_NV_10;
1462 info->fix.accel = FB_ACCEL_NV_20;
1465 info->fix.accel = FB_ACCEL_NV_30;
1468 info->fix.accel = FB_ACCEL_NV_40;
1474 return nvidiafb_check_var(&info->var, info);
1477 static u32 __devinit nvidia_get_chipset(struct fb_info *info)
1479 struct nvidia_par *par = info->par;
1480 u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
1482 printk("nvidiafb: PCI id - %x\n", id);
1483 if ((id & 0xfff0) == 0x00f0) {
1485 printk("nvidiafb: PCI-E card\n");
1486 id = NV_RD32(par->REGS, 0x1800);
1488 if ((id & 0x0000ffff) == 0x000010DE)
1489 id = 0x10DE0000 | (id >> 16);
1490 else if ((id & 0xffff0000) == 0xDE100000) /* wrong endian */
1491 id = 0x10DE0000 | ((id << 8) & 0x0000ff00) |
1492 ((id >> 8) & 0x000000ff);
1495 printk("nvidiafb: Actual id - %x\n", id);
1499 static u32 __devinit nvidia_get_arch(struct fb_info *info)
1501 struct nvidia_par *par = info->par;
1504 switch (par->Chipset & 0x0ff0) {
1505 case 0x0100: /* GeForce 256 */
1506 case 0x0110: /* GeForce2 MX */
1507 case 0x0150: /* GeForce2 */
1508 case 0x0170: /* GeForce4 MX */
1509 case 0x0180: /* GeForce4 MX (8x AGP) */
1510 case 0x01A0: /* nForce */
1511 case 0x01F0: /* nForce2 */
1514 case 0x0200: /* GeForce3 */
1515 case 0x0250: /* GeForce4 Ti */
1516 case 0x0280: /* GeForce4 Ti (8x AGP) */
1519 case 0x0300: /* GeForceFX 5800 */
1520 case 0x0310: /* GeForceFX 5600 */
1521 case 0x0320: /* GeForceFX 5200 */
1522 case 0x0330: /* GeForceFX 5900 */
1523 case 0x0340: /* GeForceFX 5700 */
1541 case 0x0020: /* TNT, TNT2 */
1544 default: /* unknown architecture */
1551 static int __devinit nvidiafb_probe(struct pci_dev *pd,
1552 const struct pci_device_id *ent)
1554 struct nvidia_par *par;
1555 struct fb_info *info;
1562 info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
1570 info->pixmap.addr = kmalloc(8 * 1024, GFP_KERNEL);
1572 if (info->pixmap.addr == NULL)
1575 memset(info->pixmap.addr, 0, 8 * 1024);
1577 if (pci_enable_device(pd)) {
1578 printk(KERN_ERR PFX "cannot enable PCI device\n");
1579 goto err_out_enable;
1582 if (pci_request_regions(pd, "nvidiafb")) {
1583 printk(KERN_ERR PFX "cannot request PCI regions\n");
1584 goto err_out_request;
1587 par->FlatPanel = flatpanel;
1589 printk(KERN_INFO PFX "flatpanel support enabled\n");
1590 par->FPDither = fpdither;
1592 par->CRTCnumber = forceCRTC;
1593 par->FpScale = (!noscale);
1594 par->paneltweak = paneltweak;
1596 /* enable IO and mem if not already done */
1597 pci_read_config_word(pd, PCI_COMMAND, &cmd);
1598 cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
1599 pci_write_config_word(pd, PCI_COMMAND, cmd);
1601 nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
1602 nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
1603 nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
1605 par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
1608 printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
1609 goto err_out_free_base0;
1612 par->Chipset = nvidia_get_chipset(info);
1613 printk(KERN_INFO PFX "nVidia device/chipset %X\n", par->Chipset);
1614 par->Architecture = nvidia_get_arch(info);
1616 if (par->Architecture == 0) {
1617 printk(KERN_ERR PFX "unknown NV_ARCH\n");
1621 sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
1623 if (NVCommonSetup(info))
1626 par->FbAddress = nvidiafb_fix.smem_start;
1627 par->FbMapSize = par->RamAmountKBytes * 1024;
1628 if (vram && vram * 1024 * 1024 < par->FbMapSize)
1629 par->FbMapSize = vram * 1024 * 1024;
1631 /* Limit amount of vram to 64 MB */
1632 if (par->FbMapSize > 64 * 1024 * 1024)
1633 par->FbMapSize = 64 * 1024 * 1024;
1635 if(par->Architecture >= NV_ARCH_40)
1636 par->FbUsableSize = par->FbMapSize - (560 * 1024);
1638 par->FbUsableSize = par->FbMapSize - (128 * 1024);
1639 par->ScratchBufferSize = (par->Architecture < NV_ARCH_10) ? 8 * 1024 :
1641 par->ScratchBufferStart = par->FbUsableSize - par->ScratchBufferSize;
1642 par->CursorStart = par->FbUsableSize + (32 * 1024);
1644 info->screen_base = ioremap(nvidiafb_fix.smem_start, par->FbMapSize);
1645 info->screen_size = par->FbUsableSize;
1646 nvidiafb_fix.smem_len = par->RamAmountKBytes * 1024;
1648 if (!info->screen_base) {
1649 printk(KERN_ERR PFX "cannot ioremap FB base\n");
1650 goto err_out_free_base1;
1653 par->FbStart = info->screen_base;
1657 par->mtrr.vram = mtrr_add(nvidiafb_fix.smem_start,
1658 par->RamAmountKBytes * 1024,
1659 MTRR_TYPE_WRCOMB, 1);
1660 if (par->mtrr.vram < 0) {
1661 printk(KERN_ERR PFX "unable to setup MTRR\n");
1663 par->mtrr.vram_valid = 1;
1664 /* let there be speed */
1665 printk(KERN_INFO PFX "MTRR set to ON\n");
1668 #endif /* CONFIG_MTRR */
1670 info->fbops = &nvidia_fb_ops;
1671 info->fix = nvidiafb_fix;
1673 if (nvidia_set_fbinfo(info) < 0) {
1674 printk(KERN_ERR PFX "error setting initial video mode\n");
1675 goto err_out_iounmap_fb;
1678 nvidia_save_vga(par, &par->SavedReg);
1680 if (register_framebuffer(info) < 0) {
1681 printk(KERN_ERR PFX "error registering nVidia framebuffer\n");
1682 goto err_out_iounmap_fb;
1685 pci_set_drvdata(pd, info);
1687 printk(KERN_INFO PFX
1688 "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
1690 par->FbMapSize / (1024 * 1024), info->fix.smem_start);
1691 #ifdef CONFIG_PMAC_BACKLIGHT
1692 if (par->FlatPanel && machine_is(powermac))
1693 register_backlight_controller(&nvidia_backlight_controller,
1700 iounmap(info->screen_base);
1702 fb_destroy_modedb(info->monspecs.modedb);
1703 nvidia_delete_i2c_busses(par);
1707 pci_release_regions(pd);
1709 pci_disable_device(pd);
1711 kfree(info->pixmap.addr);
1713 framebuffer_release(info);
1718 static void __exit nvidiafb_remove(struct pci_dev *pd)
1720 struct fb_info *info = pci_get_drvdata(pd);
1721 struct nvidia_par *par = info->par;
1727 unregister_framebuffer(info);
1729 if (par->mtrr.vram_valid)
1730 mtrr_del(par->mtrr.vram, info->fix.smem_start,
1731 info->fix.smem_len);
1732 #endif /* CONFIG_MTRR */
1734 iounmap(info->screen_base);
1735 fb_destroy_modedb(info->monspecs.modedb);
1736 nvidia_delete_i2c_busses(par);
1738 pci_release_regions(pd);
1739 pci_disable_device(pd);
1740 kfree(info->pixmap.addr);
1741 framebuffer_release(info);
1742 pci_set_drvdata(pd, NULL);
1746 /* ------------------------------------------------------------------------- *
1750 * ------------------------------------------------------------------------- */
1753 static int __devinit nvidiafb_setup(char *options)
1758 if (!options || !*options)
1761 while ((this_opt = strsep(&options, ",")) != NULL) {
1762 if (!strncmp(this_opt, "forceCRTC", 9)) {
1768 forceCRTC = *p - '0';
1769 if (forceCRTC < 0 || forceCRTC > 1)
1771 } else if (!strncmp(this_opt, "flatpanel", 9)) {
1773 } else if (!strncmp(this_opt, "hwcur", 5)) {
1775 } else if (!strncmp(this_opt, "noaccel", 6)) {
1777 } else if (!strncmp(this_opt, "noscale", 7)) {
1779 } else if (!strncmp(this_opt, "paneltweak:", 11)) {
1780 paneltweak = simple_strtoul(this_opt+11, NULL, 0);
1781 } else if (!strncmp(this_opt, "vram:", 5)) {
1782 vram = simple_strtoul(this_opt+5, NULL, 0);
1784 } else if (!strncmp(this_opt, "nomtrr", 6)) {
1787 } else if (!strncmp(this_opt, "fpdither:", 9)) {
1788 fpdither = simple_strtol(this_opt+9, NULL, 0);
1789 } else if (!strncmp(this_opt, "bpp:", 4)) {
1790 bpp = simple_strtoul(this_opt+4, NULL, 0);
1792 mode_option = this_opt;
1797 #endif /* !MODULE */
1799 static struct pci_driver nvidiafb_driver = {
1801 .id_table = nvidiafb_pci_tbl,
1802 .probe = nvidiafb_probe,
1803 .remove = __exit_p(nvidiafb_remove),
1806 /* ------------------------------------------------------------------------- *
1810 * ------------------------------------------------------------------------- */
1812 static int __devinit nvidiafb_init(void)
1815 char *option = NULL;
1817 if (fb_get_options("nvidiafb", &option))
1819 nvidiafb_setup(option);
1821 return pci_register_driver(&nvidiafb_driver);
1824 module_init(nvidiafb_init);
1827 static void __exit nvidiafb_exit(void)
1829 pci_unregister_driver(&nvidiafb_driver);
1832 module_exit(nvidiafb_exit);
1834 module_param(flatpanel, int, 0);
1835 MODULE_PARM_DESC(flatpanel,
1836 "Enables experimental flat panel support for some chipsets. "
1837 "(0=disabled, 1=enabled, -1=autodetect) (default=-1)");
1838 module_param(fpdither, int, 0);
1839 MODULE_PARM_DESC(fpdither,
1840 "Enables dithering of flat panel for 6 bits panels. "
1841 "(0=disabled, 1=enabled, -1=autodetect) (default=-1)");
1842 module_param(hwcur, int, 0);
1843 MODULE_PARM_DESC(hwcur,
1844 "Enables hardware cursor implementation. (0 or 1=enabled) "
1846 module_param(noaccel, int, 0);
1847 MODULE_PARM_DESC(noaccel,
1848 "Disables hardware acceleration. (0 or 1=disable) "
1850 module_param(noscale, int, 0);
1851 MODULE_PARM_DESC(noscale,
1852 "Disables screen scaleing. (0 or 1=disable) "
1853 "(default=0, do scaling)");
1854 module_param(paneltweak, int, 0);
1855 MODULE_PARM_DESC(paneltweak,
1856 "Tweak display settings for flatpanels. "
1857 "(default=0, no tweaks)");
1858 module_param(forceCRTC, int, 0);
1859 MODULE_PARM_DESC(forceCRTC,
1860 "Forces usage of a particular CRTC in case autodetection "
1861 "fails. (0 or 1) (default=autodetect)");
1862 module_param(vram, int, 0);
1863 MODULE_PARM_DESC(vram,
1864 "amount of framebuffer memory to remap in MiB"
1865 "(default=0 - remap entire memory)");
1866 module_param(mode_option, charp, 0);
1867 MODULE_PARM_DESC(mode_option, "Specify initial video mode");
1868 module_param(bpp, int, 0);
1869 MODULE_PARM_DESC(bpp, "pixel width in bits"
1872 module_param(nomtrr, bool, 0);
1873 MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) "
1877 MODULE_AUTHOR("Antonino Daplas");
1878 MODULE_DESCRIPTION("Framebuffer driver for nVidia graphics chipset");
1879 MODULE_LICENSE("GPL");