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>
24 #include <linux/console.h>
30 #include <asm/pci-bridge.h>
32 #ifdef CONFIG_PMAC_BACKLIGHT
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_vga_protect(struct nvidia_par *par, int on)
625 * Turn off screen and disable sequencer.
627 tmp = NVReadSeq(par, 0x01);
629 NVWriteSeq(par, 0x00, 0x01); /* Synchronous Reset */
630 NVWriteSeq(par, 0x01, tmp | 0x20); /* disable the display */
633 * Reenable sequencer, then turn on screen.
636 tmp = NVReadSeq(par, 0x01);
638 NVWriteSeq(par, 0x01, tmp & ~0x20); /* reenable display */
639 NVWriteSeq(par, 0x00, 0x03); /* End Reset */
643 static void nvidia_save_vga(struct nvidia_par *par,
644 struct _riva_hw_state *state)
649 NVLockUnlock(par, 0);
651 NVUnloadStateExt(par, state);
653 state->misc_output = NVReadMiscOut(par);
655 for (i = 0; i < NUM_CRT_REGS; i++)
656 state->crtc[i] = NVReadCrtc(par, i);
658 for (i = 0; i < NUM_ATC_REGS; i++)
659 state->attr[i] = NVReadAttr(par, i);
661 for (i = 0; i < NUM_GRC_REGS; i++)
662 state->gra[i] = NVReadGr(par, i);
664 for (i = 0; i < NUM_SEQ_REGS; i++)
665 state->seq[i] = NVReadSeq(par, i);
671 static void nvidia_write_regs(struct nvidia_par *par,
672 struct _riva_hw_state *state)
678 NVLoadStateExt(par, state);
680 NVWriteMiscOut(par, state->misc_output);
682 for (i = 1; i < NUM_SEQ_REGS; i++) {
684 printk(" SEQ[%02x] = %08x\n", i, state->seq[i]);
686 NVWriteSeq(par, i, state->seq[i]);
689 /* Ensure CRTC registers 0-7 are unlocked by clearing bit 7 of CRTC[17] */
690 NVWriteCrtc(par, 0x11, state->crtc[0x11] & ~0x80);
692 for (i = 0; i < NUM_CRT_REGS; i++) {
699 printk("CRTC[%02x] = %08x\n", i, state->crtc[i]);
701 NVWriteCrtc(par, i, state->crtc[i]);
705 for (i = 0; i < NUM_GRC_REGS; i++) {
707 printk(" GRA[%02x] = %08x\n", i, state->gra[i]);
709 NVWriteGr(par, i, state->gra[i]);
712 for (i = 0; i < NUM_ATC_REGS; i++) {
714 printk("ATTR[%02x] = %08x\n", i, state->attr[i]);
716 NVWriteAttr(par, i, state->attr[i]);
722 static int nvidia_calc_regs(struct fb_info *info)
724 struct nvidia_par *par = info->par;
725 struct _riva_hw_state *state = &par->ModeReg;
726 int i, depth = fb_get_color_depth(&info->var, &info->fix);
727 int h_display = info->var.xres / 8 - 1;
728 int h_start = (info->var.xres + info->var.right_margin) / 8 - 1;
729 int h_end = (info->var.xres + info->var.right_margin +
730 info->var.hsync_len) / 8 - 1;
731 int h_total = (info->var.xres + info->var.right_margin +
732 info->var.hsync_len + info->var.left_margin) / 8 - 5;
733 int h_blank_s = h_display;
734 int h_blank_e = h_total + 4;
735 int v_display = info->var.yres - 1;
736 int v_start = info->var.yres + info->var.lower_margin - 1;
737 int v_end = (info->var.yres + info->var.lower_margin +
738 info->var.vsync_len) - 1;
739 int v_total = (info->var.yres + info->var.lower_margin +
740 info->var.vsync_len + info->var.upper_margin) - 2;
741 int v_blank_s = v_display;
742 int v_blank_e = v_total + 1;
745 * Set all CRTC values.
748 if (info->var.vmode & FB_VMODE_INTERLACED)
751 if (par->FlatPanel == 1) {
752 v_start = v_total - 3;
755 h_start = h_total - 5;
757 h_blank_e = h_total + 4;
760 state->crtc[0x0] = Set8Bits(h_total);
761 state->crtc[0x1] = Set8Bits(h_display);
762 state->crtc[0x2] = Set8Bits(h_blank_s);
763 state->crtc[0x3] = SetBitField(h_blank_e, 4: 0, 4:0)
765 state->crtc[0x4] = Set8Bits(h_start);
766 state->crtc[0x5] = SetBitField(h_blank_e, 5: 5, 7:7)
767 | SetBitField(h_end, 4: 0, 4:0);
768 state->crtc[0x6] = SetBitField(v_total, 7: 0, 7:0);
769 state->crtc[0x7] = SetBitField(v_total, 8: 8, 0:0)
770 | SetBitField(v_display, 8: 8, 1:1)
771 | SetBitField(v_start, 8: 8, 2:2)
772 | SetBitField(v_blank_s, 8: 8, 3:3)
774 | SetBitField(v_total, 9: 9, 5:5)
775 | SetBitField(v_display, 9: 9, 6:6)
776 | SetBitField(v_start, 9: 9, 7:7);
777 state->crtc[0x9] = SetBitField(v_blank_s, 9: 9, 5:5)
779 | ((info->var.vmode & FB_VMODE_DOUBLE) ? 0x80 : 0x00);
780 state->crtc[0x10] = Set8Bits(v_start);
781 state->crtc[0x11] = SetBitField(v_end, 3: 0, 3:0) | SetBit(5);
782 state->crtc[0x12] = Set8Bits(v_display);
783 state->crtc[0x13] = ((info->var.xres_virtual / 8) *
784 (info->var.bits_per_pixel / 8));
785 state->crtc[0x15] = Set8Bits(v_blank_s);
786 state->crtc[0x16] = Set8Bits(v_blank_e);
788 state->attr[0x10] = 0x01;
791 state->attr[0x11] = 0x00;
793 state->screen = SetBitField(h_blank_e, 6: 6, 4:4)
794 | SetBitField(v_blank_s, 10: 10, 3:3)
795 | SetBitField(v_start, 10: 10, 2:2)
796 | SetBitField(v_display, 10: 10, 1:1)
797 | SetBitField(v_total, 10: 10, 0:0);
799 state->horiz = SetBitField(h_total, 8: 8, 0:0)
800 | SetBitField(h_display, 8: 8, 1:1)
801 | SetBitField(h_blank_s, 8: 8, 2:2)
802 | SetBitField(h_start, 8: 8, 3:3);
804 state->extra = SetBitField(v_total, 11: 11, 0:0)
805 | SetBitField(v_display, 11: 11, 2:2)
806 | SetBitField(v_start, 11: 11, 4:4)
807 | SetBitField(v_blank_s, 11: 11, 6:6);
809 if (info->var.vmode & FB_VMODE_INTERLACED) {
810 h_total = (h_total >> 1) & ~1;
811 state->interlace = Set8Bits(h_total);
812 state->horiz |= SetBitField(h_total, 8: 8, 4:4);
814 state->interlace = 0xff; /* interlace off */
818 * Calculate the extended registers.
826 if (par->Architecture >= NV_ARCH_10)
827 par->CURSOR = (volatile u32 __iomem *)(info->screen_base +
830 if (info->var.sync & FB_SYNC_HOR_HIGH_ACT)
831 state->misc_output &= ~0x40;
833 state->misc_output |= 0x40;
834 if (info->var.sync & FB_SYNC_VERT_HIGH_ACT)
835 state->misc_output &= ~0x80;
837 state->misc_output |= 0x80;
839 NVCalcStateExt(par, state, i, info->var.xres_virtual,
840 info->var.xres, info->var.yres_virtual,
841 1000000000 / info->var.pixclock, info->var.vmode);
843 state->scale = NV_RD32(par->PRAMDAC, 0x00000848) & 0xfff000ff;
844 if (par->FlatPanel == 1) {
845 state->pixel |= (1 << 7);
847 if (!par->fpScaler || (par->fpWidth <= info->var.xres)
848 || (par->fpHeight <= info->var.yres)) {
849 state->scale |= (1 << 8);
852 if (!par->crtcSync_read) {
853 state->crtcSync = NV_RD32(par->PRAMDAC, 0x0828);
854 par->crtcSync_read = 1;
857 par->PanelTweak = nvidia_panel_tweak(par, state);
860 state->vpll = state->pll;
861 state->vpll2 = state->pll;
862 state->vpllB = state->pllB;
863 state->vpll2B = state->pllB;
865 VGA_WR08(par->PCIO, 0x03D4, 0x1C);
866 state->fifo = VGA_RD08(par->PCIO, 0x03D5) & ~(1<<5);
868 if (par->CRTCnumber) {
869 state->head = NV_RD32(par->PCRTC0, 0x00000860) & ~0x00001000;
870 state->head2 = NV_RD32(par->PCRTC0, 0x00002860) | 0x00001000;
871 state->crtcOwner = 3;
872 state->pllsel |= 0x20000800;
873 state->vpll = NV_RD32(par->PRAMDAC0, 0x00000508);
874 if (par->twoStagePLL)
875 state->vpllB = NV_RD32(par->PRAMDAC0, 0x00000578);
876 } else if (par->twoHeads) {
877 state->head = NV_RD32(par->PCRTC0, 0x00000860) | 0x00001000;
878 state->head2 = NV_RD32(par->PCRTC0, 0x00002860) & ~0x00001000;
879 state->crtcOwner = 0;
880 state->vpll2 = NV_RD32(par->PRAMDAC0, 0x0520);
881 if (par->twoStagePLL)
882 state->vpll2B = NV_RD32(par->PRAMDAC0, 0x057C);
885 state->cursorConfig = 0x00000100;
887 if (info->var.vmode & FB_VMODE_DOUBLE)
888 state->cursorConfig |= (1 << 4);
890 if (par->alphaCursor) {
891 if ((par->Chipset & 0x0ff0) != 0x0110)
892 state->cursorConfig |= 0x04011000;
894 state->cursorConfig |= 0x14011000;
895 state->general |= (1 << 29);
897 state->cursorConfig |= 0x02000000;
900 if ((par->Chipset & 0x0ff0) == 0x0110) {
901 state->dither = NV_RD32(par->PRAMDAC, 0x0528) &
904 state->dither |= 0x00010000;
906 state->dither = NV_RD32(par->PRAMDAC, 0x083C) & ~1;
914 state->displayV = info->var.xres;
919 static void nvidia_init_vga(struct fb_info *info)
921 struct nvidia_par *par = info->par;
922 struct _riva_hw_state *state = &par->ModeReg;
925 for (i = 0; i < 0x10; i++)
927 state->attr[0x10] = 0x41;
928 state->attr[0x11] = 0xff;
929 state->attr[0x12] = 0x0f;
930 state->attr[0x13] = 0x00;
931 state->attr[0x14] = 0x00;
933 memset(state->crtc, 0x00, NUM_CRT_REGS);
934 state->crtc[0x0a] = 0x20;
935 state->crtc[0x17] = 0xe3;
936 state->crtc[0x18] = 0xff;
937 state->crtc[0x28] = 0x40;
939 memset(state->gra, 0x00, NUM_GRC_REGS);
940 state->gra[0x05] = 0x40;
941 state->gra[0x06] = 0x05;
942 state->gra[0x07] = 0x0f;
943 state->gra[0x08] = 0xff;
945 state->seq[0x00] = 0x03;
946 state->seq[0x01] = 0x01;
947 state->seq[0x02] = 0x0f;
948 state->seq[0x03] = 0x00;
949 state->seq[0x04] = 0x0e;
951 state->misc_output = 0xeb;
954 static int nvidiafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
956 struct nvidia_par *par = info->par;
957 u8 data[MAX_CURS * MAX_CURS / 8];
958 int i, set = cursor->set;
961 if (cursor->image.width > MAX_CURS || cursor->image.height > MAX_CURS)
964 NVShowHideCursor(par, 0);
966 if (par->cursor_reset) {
968 par->cursor_reset = 0;
971 if (set & FB_CUR_SETSIZE)
972 memset_io(par->CURSOR, 0, MAX_CURS * MAX_CURS * 2);
974 if (set & FB_CUR_SETPOS) {
977 yy = cursor->image.dy - info->var.yoffset;
978 xx = cursor->image.dx - info->var.xoffset;
982 NV_WR32(par->PRAMDAC, 0x0000300, temp);
985 if (set & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP | FB_CUR_SETIMAGE)) {
986 u32 bg_idx = cursor->image.bg_color;
987 u32 fg_idx = cursor->image.fg_color;
988 u32 s_pitch = (cursor->image.width + 7) >> 3;
989 u32 d_pitch = MAX_CURS / 8;
990 u8 *dat = (u8 *) cursor->image.data;
991 u8 *msk = (u8 *) cursor->mask;
994 src = kmalloc(s_pitch * cursor->image.height, GFP_ATOMIC);
997 switch (cursor->rop) {
999 for (i = 0; i < s_pitch * cursor->image.height; i++)
1000 src[i] = dat[i] ^ msk[i];
1004 for (i = 0; i < s_pitch * cursor->image.height; i++)
1005 src[i] = dat[i] & msk[i];
1009 fb_pad_aligned_buffer(data, d_pitch, src, s_pitch,
1010 cursor->image.height);
1012 bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) |
1013 ((info->cmap.green[bg_idx] & 0xf8) << 2) |
1014 ((info->cmap.blue[bg_idx] & 0xf8) >> 3) | 1 << 15;
1016 fg = ((info->cmap.red[fg_idx] & 0xf8) << 7) |
1017 ((info->cmap.green[fg_idx] & 0xf8) << 2) |
1018 ((info->cmap.blue[fg_idx] & 0xf8) >> 3) | 1 << 15;
1020 NVLockUnlock(par, 0);
1022 nvidiafb_load_cursor_image(par, data, bg, fg,
1023 cursor->image.width,
1024 cursor->image.height);
1030 NVShowHideCursor(par, 1);
1035 static int nvidiafb_set_par(struct fb_info *info)
1037 struct nvidia_par *par = info->par;
1041 NVLockUnlock(par, 1);
1042 if (!par->FlatPanel || !par->twoHeads)
1045 if (par->FPDither < 0) {
1046 if ((par->Chipset & 0x0ff0) == 0x0110)
1047 par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x0528)
1050 par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x083C) & 1);
1051 printk(KERN_INFO PFX "Flat panel dithering %s\n",
1052 par->FPDither ? "enabled" : "disabled");
1055 info->fix.visual = (info->var.bits_per_pixel == 8) ?
1056 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1058 nvidia_init_vga(info);
1059 nvidia_calc_regs(info);
1061 NVLockUnlock(par, 0);
1062 if (par->twoHeads) {
1063 VGA_WR08(par->PCIO, 0x03D4, 0x44);
1064 VGA_WR08(par->PCIO, 0x03D5, par->ModeReg.crtcOwner);
1065 NVLockUnlock(par, 0);
1068 nvidia_vga_protect(par, 1);
1070 nvidia_write_regs(par, &par->ModeReg);
1071 NVSetStartAddress(par, 0);
1073 #if defined (__BIG_ENDIAN)
1074 /* turn on LFB swapping */
1078 VGA_WR08(par->PCIO, 0x3d4, 0x46);
1079 tmp = VGA_RD08(par->PCIO, 0x3d5);
1081 VGA_WR08(par->PCIO, 0x3d5, tmp);
1085 info->fix.line_length = (info->var.xres_virtual *
1086 info->var.bits_per_pixel) >> 3;
1087 if (info->var.accel_flags) {
1088 info->fbops->fb_imageblit = nvidiafb_imageblit;
1089 info->fbops->fb_fillrect = nvidiafb_fillrect;
1090 info->fbops->fb_copyarea = nvidiafb_copyarea;
1091 info->fbops->fb_sync = nvidiafb_sync;
1092 info->pixmap.scan_align = 4;
1093 info->flags &= ~FBINFO_HWACCEL_DISABLED;
1094 NVResetGraphics(info);
1096 info->fbops->fb_imageblit = cfb_imageblit;
1097 info->fbops->fb_fillrect = cfb_fillrect;
1098 info->fbops->fb_copyarea = cfb_copyarea;
1099 info->fbops->fb_sync = NULL;
1100 info->pixmap.scan_align = 1;
1101 info->flags |= FBINFO_HWACCEL_DISABLED;
1104 par->cursor_reset = 1;
1106 nvidia_vga_protect(par, 0);
1112 static int nvidiafb_setcolreg(unsigned regno, unsigned red, unsigned green,
1113 unsigned blue, unsigned transp,
1114 struct fb_info *info)
1116 struct nvidia_par *par = info->par;
1120 if (regno >= (1 << info->var.green.length))
1123 if (info->var.grayscale) {
1124 /* gray = 0.30*R + 0.59*G + 0.11*B */
1125 red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8;
1128 if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
1129 ((u32 *) info->pseudo_palette)[regno] =
1130 (regno << info->var.red.offset) |
1131 (regno << info->var.green.offset) |
1132 (regno << info->var.blue.offset);
1135 switch (info->var.bits_per_pixel) {
1137 /* "transparent" stuff is completely ignored. */
1138 nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
1141 if (info->var.green.length == 5) {
1142 for (i = 0; i < 8; i++) {
1143 nvidia_write_clut(par, regno * 8 + i, red >> 8,
1144 green >> 8, blue >> 8);
1150 for (i = 0; i < 8; i++) {
1151 nvidia_write_clut(par, regno * 8 + i,
1152 red >> 8, green >> 8,
1157 nvidia_read_clut(par, regno * 4, &r, &g, &b);
1159 for (i = 0; i < 4; i++)
1160 nvidia_write_clut(par, regno * 4 + i, r,
1165 nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
1176 static int nvidiafb_check_var(struct fb_var_screeninfo *var,
1177 struct fb_info *info)
1179 struct nvidia_par *par = info->par;
1180 int memlen, vramlen, mode_valid = 0;
1185 var->transp.offset = 0;
1186 var->transp.length = 0;
1190 if (var->bits_per_pixel <= 8)
1191 var->bits_per_pixel = 8;
1192 else if (var->bits_per_pixel <= 16)
1193 var->bits_per_pixel = 16;
1195 var->bits_per_pixel = 32;
1197 switch (var->bits_per_pixel) {
1199 var->red.offset = 0;
1200 var->red.length = 8;
1201 var->green.offset = 0;
1202 var->green.length = 8;
1203 var->blue.offset = 0;
1204 var->blue.length = 8;
1205 var->transp.offset = 0;
1206 var->transp.length = 0;
1209 var->green.length = (var->green.length < 6) ? 5 : 6;
1210 var->red.length = 5;
1211 var->blue.length = 5;
1212 var->transp.length = 6 - var->green.length;
1213 var->blue.offset = 0;
1214 var->green.offset = 5;
1215 var->red.offset = 5 + var->green.length;
1216 var->transp.offset = (5 + var->red.offset) & 15;
1218 case 32: /* RGBA 8888 */
1219 var->red.offset = 16;
1220 var->red.length = 8;
1221 var->green.offset = 8;
1222 var->green.length = 8;
1223 var->blue.offset = 0;
1224 var->blue.length = 8;
1225 var->transp.length = 8;
1226 var->transp.offset = 24;
1230 var->red.msb_right = 0;
1231 var->green.msb_right = 0;
1232 var->blue.msb_right = 0;
1233 var->transp.msb_right = 0;
1235 if (!info->monspecs.hfmax || !info->monspecs.vfmax ||
1236 !info->monspecs.dclkmax || !fb_validate_mode(var, info))
1239 /* calculate modeline if supported by monitor */
1240 if (!mode_valid && info->monspecs.gtf) {
1241 if (!fb_get_mode(FB_MAXTIMINGS, 0, var, info))
1246 struct fb_videomode *mode;
1248 mode = fb_find_best_mode(var, &info->modelist);
1250 fb_videomode_to_var(var, mode);
1255 if (!mode_valid && info->monspecs.modedb_len)
1258 if (par->fpWidth && par->fpHeight && (par->fpWidth < var->xres ||
1259 par->fpHeight < var->yres))
1262 if (var->yres_virtual < var->yres)
1263 var->yres_virtual = var->yres;
1265 if (var->xres_virtual < var->xres)
1266 var->xres_virtual = var->xres;
1268 var->xres_virtual = (var->xres_virtual + 63) & ~63;
1270 vramlen = info->screen_size;
1271 pitch = ((var->xres_virtual * var->bits_per_pixel) + 7) / 8;
1272 memlen = pitch * var->yres_virtual;
1274 if (memlen > vramlen) {
1275 var->yres_virtual = vramlen / pitch;
1277 if (var->yres_virtual < var->yres) {
1278 var->yres_virtual = var->yres;
1279 var->xres_virtual = vramlen / var->yres_virtual;
1280 var->xres_virtual /= var->bits_per_pixel / 8;
1281 var->xres_virtual &= ~63;
1282 pitch = (var->xres_virtual *
1283 var->bits_per_pixel + 7) / 8;
1284 memlen = pitch * var->yres;
1286 if (var->xres_virtual < var->xres) {
1287 printk("nvidiafb: required video memory, "
1288 "%d bytes, for %dx%d-%d (virtual) "
1289 "is out of range\n",
1290 memlen, var->xres_virtual,
1291 var->yres_virtual, var->bits_per_pixel);
1297 if (var->accel_flags) {
1298 if (var->yres_virtual > 0x7fff)
1299 var->yres_virtual = 0x7fff;
1300 if (var->xres_virtual > 0x7fff)
1301 var->xres_virtual = 0x7fff;
1304 var->xres_virtual &= ~63;
1311 static int nvidiafb_pan_display(struct fb_var_screeninfo *var,
1312 struct fb_info *info)
1314 struct nvidia_par *par = info->par;
1317 total = var->yoffset * info->fix.line_length + var->xoffset;
1319 NVSetStartAddress(par, total);
1324 static int nvidiafb_blank(int blank, struct fb_info *info)
1326 struct nvidia_par *par = info->par;
1327 unsigned char tmp, vesa;
1329 tmp = NVReadSeq(par, 0x01) & ~0x20; /* screen on/off */
1330 vesa = NVReadCrtc(par, 0x1a) & ~0xc0; /* sync on/off */
1338 case FB_BLANK_UNBLANK:
1339 case FB_BLANK_NORMAL:
1341 case FB_BLANK_VSYNC_SUSPEND:
1344 case FB_BLANK_HSYNC_SUSPEND:
1347 case FB_BLANK_POWERDOWN:
1352 NVWriteSeq(par, 0x01, tmp);
1353 NVWriteCrtc(par, 0x1a, vesa);
1355 #ifdef CONFIG_PMAC_BACKLIGHT
1356 if (par->FlatPanel && _machine == _MACH_Pmac) {
1357 set_backlight_enable(!blank);
1366 static struct fb_ops nvidia_fb_ops = {
1367 .owner = THIS_MODULE,
1368 .fb_check_var = nvidiafb_check_var,
1369 .fb_set_par = nvidiafb_set_par,
1370 .fb_setcolreg = nvidiafb_setcolreg,
1371 .fb_pan_display = nvidiafb_pan_display,
1372 .fb_blank = nvidiafb_blank,
1373 .fb_fillrect = nvidiafb_fillrect,
1374 .fb_copyarea = nvidiafb_copyarea,
1375 .fb_imageblit = nvidiafb_imageblit,
1376 .fb_cursor = nvidiafb_cursor,
1377 .fb_sync = nvidiafb_sync,
1381 static int nvidiafb_suspend(struct pci_dev *dev, pm_message_t state)
1383 struct fb_info *info = pci_get_drvdata(dev);
1384 struct nvidia_par *par = info->par;
1386 acquire_console_sem();
1387 par->pm_state = state.event;
1389 if (state.event == PM_EVENT_FREEZE) {
1390 dev->dev.power.power_state = state;
1392 fb_set_suspend(info, 1);
1393 nvidiafb_blank(FB_BLANK_POWERDOWN, info);
1394 nvidia_write_regs(par, &par->SavedReg);
1395 pci_save_state(dev);
1396 pci_disable_device(dev);
1397 pci_set_power_state(dev, pci_choose_state(dev, state));
1400 release_console_sem();
1404 static int nvidiafb_resume(struct pci_dev *dev)
1406 struct fb_info *info = pci_get_drvdata(dev);
1407 struct nvidia_par *par = info->par;
1409 acquire_console_sem();
1410 pci_set_power_state(dev, PCI_D0);
1412 if (par->pm_state != PM_EVENT_FREEZE) {
1413 pci_restore_state(dev);
1414 pci_enable_device(dev);
1415 pci_set_master(dev);
1418 par->pm_state = PM_EVENT_ON;
1419 nvidiafb_set_par(info);
1420 fb_set_suspend (info, 0);
1421 nvidiafb_blank(FB_BLANK_UNBLANK, info);
1423 release_console_sem();
1427 #define nvidiafb_suspend NULL
1428 #define nvidiafb_resume NULL
1431 static int __devinit nvidia_set_fbinfo(struct fb_info *info)
1433 struct fb_monspecs *specs = &info->monspecs;
1434 struct fb_videomode modedb;
1435 struct nvidia_par *par = info->par;
1439 info->flags = FBINFO_DEFAULT
1440 | FBINFO_HWACCEL_IMAGEBLIT
1441 | FBINFO_HWACCEL_FILLRECT
1442 | FBINFO_HWACCEL_COPYAREA
1443 | FBINFO_HWACCEL_YPAN;
1445 fb_videomode_to_modelist(info->monspecs.modedb,
1446 info->monspecs.modedb_len, &info->modelist);
1447 fb_var_to_videomode(&modedb, &nvidiafb_default_var);
1461 if (specs->modedb != NULL) {
1462 struct fb_videomode *modedb;
1464 modedb = fb_find_best_display(specs, &info->modelist);
1465 fb_videomode_to_var(&nvidiafb_default_var, modedb);
1466 nvidiafb_default_var.bits_per_pixel = bpp;
1467 } else if (par->fpWidth && par->fpHeight) {
1471 snprintf(buf, 15, "%dx%dMR", par->fpWidth, par->fpHeight);
1472 fb_find_mode(&nvidiafb_default_var, info, buf, specs->modedb,
1473 specs->modedb_len, &modedb, bpp);
1477 fb_find_mode(&nvidiafb_default_var, info, mode_option,
1478 specs->modedb, specs->modedb_len, &modedb, bpp);
1480 info->var = nvidiafb_default_var;
1481 info->fix.visual = (info->var.bits_per_pixel == 8) ?
1482 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1483 info->pseudo_palette = par->pseudo_palette;
1484 fb_alloc_cmap(&info->cmap, 256, 0);
1485 fb_destroy_modedb(info->monspecs.modedb);
1486 info->monspecs.modedb = NULL;
1488 /* maximize virtual vertical length */
1489 lpitch = info->var.xres_virtual *
1490 ((info->var.bits_per_pixel + 7) >> 3);
1491 info->var.yres_virtual = info->screen_size / lpitch;
1493 info->pixmap.scan_align = 4;
1494 info->pixmap.buf_align = 4;
1495 info->pixmap.access_align = 32;
1496 info->pixmap.size = 8 * 1024;
1497 info->pixmap.flags = FB_PIXMAP_SYSTEM;
1500 info->fbops->fb_cursor = NULL;
1502 info->var.accel_flags = (!noaccel);
1504 switch (par->Architecture) {
1506 info->fix.accel = FB_ACCEL_NV4;
1509 info->fix.accel = FB_ACCEL_NV_10;
1512 info->fix.accel = FB_ACCEL_NV_20;
1515 info->fix.accel = FB_ACCEL_NV_30;
1518 info->fix.accel = FB_ACCEL_NV_40;
1524 return nvidiafb_check_var(&info->var, info);
1527 static u32 __devinit nvidia_get_chipset(struct fb_info *info)
1529 struct nvidia_par *par = info->par;
1530 u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
1532 printk("nvidiafb: PCI id - %x\n", id);
1533 if ((id & 0xfff0) == 0x00f0) {
1535 printk("nvidiafb: PCI-E card\n");
1536 id = NV_RD32(par->REGS, 0x1800);
1538 if ((id & 0x0000ffff) == 0x000010DE)
1539 id = 0x10DE0000 | (id >> 16);
1540 else if ((id & 0xffff0000) == 0xDE100000) /* wrong endian */
1541 id = 0x10DE0000 | ((id << 8) & 0x0000ff00) |
1542 ((id >> 8) & 0x000000ff);
1545 printk("nvidiafb: Actual id - %x\n", id);
1549 static u32 __devinit nvidia_get_arch(struct fb_info *info)
1551 struct nvidia_par *par = info->par;
1554 switch (par->Chipset & 0x0ff0) {
1555 case 0x0100: /* GeForce 256 */
1556 case 0x0110: /* GeForce2 MX */
1557 case 0x0150: /* GeForce2 */
1558 case 0x0170: /* GeForce4 MX */
1559 case 0x0180: /* GeForce4 MX (8x AGP) */
1560 case 0x01A0: /* nForce */
1561 case 0x01F0: /* nForce2 */
1564 case 0x0200: /* GeForce3 */
1565 case 0x0250: /* GeForce4 Ti */
1566 case 0x0280: /* GeForce4 Ti (8x AGP) */
1569 case 0x0300: /* GeForceFX 5800 */
1570 case 0x0310: /* GeForceFX 5600 */
1571 case 0x0320: /* GeForceFX 5200 */
1572 case 0x0330: /* GeForceFX 5900 */
1573 case 0x0340: /* GeForceFX 5700 */
1591 case 0x0020: /* TNT, TNT2 */
1594 default: /* unknown architecture */
1601 static int __devinit nvidiafb_probe(struct pci_dev *pd,
1602 const struct pci_device_id *ent)
1604 struct nvidia_par *par;
1605 struct fb_info *info;
1612 info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
1620 info->pixmap.addr = kmalloc(8 * 1024, GFP_KERNEL);
1622 if (info->pixmap.addr == NULL)
1625 memset(info->pixmap.addr, 0, 8 * 1024);
1627 if (pci_enable_device(pd)) {
1628 printk(KERN_ERR PFX "cannot enable PCI device\n");
1629 goto err_out_enable;
1632 if (pci_request_regions(pd, "nvidiafb")) {
1633 printk(KERN_ERR PFX "cannot request PCI regions\n");
1634 goto err_out_request;
1637 par->FlatPanel = flatpanel;
1639 printk(KERN_INFO PFX "flatpanel support enabled\n");
1640 par->FPDither = fpdither;
1642 par->CRTCnumber = forceCRTC;
1643 par->FpScale = (!noscale);
1644 par->paneltweak = paneltweak;
1646 /* enable IO and mem if not already done */
1647 pci_read_config_word(pd, PCI_COMMAND, &cmd);
1648 cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
1649 pci_write_config_word(pd, PCI_COMMAND, cmd);
1651 nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
1652 nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
1653 nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
1655 par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
1658 printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
1659 goto err_out_free_base0;
1662 par->Chipset = nvidia_get_chipset(info);
1663 printk(KERN_INFO PFX "nVidia device/chipset %X\n", par->Chipset);
1664 par->Architecture = nvidia_get_arch(info);
1666 if (par->Architecture == 0) {
1667 printk(KERN_ERR PFX "unknown NV_ARCH\n");
1671 sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
1673 if (NVCommonSetup(info))
1676 par->FbAddress = nvidiafb_fix.smem_start;
1677 par->FbMapSize = par->RamAmountKBytes * 1024;
1678 if (vram && vram * 1024 * 1024 < par->FbMapSize)
1679 par->FbMapSize = vram * 1024 * 1024;
1681 /* Limit amount of vram to 64 MB */
1682 if (par->FbMapSize > 64 * 1024 * 1024)
1683 par->FbMapSize = 64 * 1024 * 1024;
1685 if(par->Architecture >= NV_ARCH_40)
1686 par->FbUsableSize = par->FbMapSize - (560 * 1024);
1688 par->FbUsableSize = par->FbMapSize - (128 * 1024);
1689 par->ScratchBufferSize = (par->Architecture < NV_ARCH_10) ? 8 * 1024 :
1691 par->ScratchBufferStart = par->FbUsableSize - par->ScratchBufferSize;
1692 par->CursorStart = par->FbUsableSize + (32 * 1024);
1694 info->screen_base = ioremap(nvidiafb_fix.smem_start, par->FbMapSize);
1695 info->screen_size = par->FbUsableSize;
1696 nvidiafb_fix.smem_len = par->RamAmountKBytes * 1024;
1698 if (!info->screen_base) {
1699 printk(KERN_ERR PFX "cannot ioremap FB base\n");
1700 goto err_out_free_base1;
1703 par->FbStart = info->screen_base;
1707 par->mtrr.vram = mtrr_add(nvidiafb_fix.smem_start,
1708 par->RamAmountKBytes * 1024,
1709 MTRR_TYPE_WRCOMB, 1);
1710 if (par->mtrr.vram < 0) {
1711 printk(KERN_ERR PFX "unable to setup MTRR\n");
1713 par->mtrr.vram_valid = 1;
1714 /* let there be speed */
1715 printk(KERN_INFO PFX "MTRR set to ON\n");
1718 #endif /* CONFIG_MTRR */
1720 info->fbops = &nvidia_fb_ops;
1721 info->fix = nvidiafb_fix;
1723 if (nvidia_set_fbinfo(info) < 0) {
1724 printk(KERN_ERR PFX "error setting initial video mode\n");
1725 goto err_out_iounmap_fb;
1728 nvidia_save_vga(par, &par->SavedReg);
1730 if (register_framebuffer(info) < 0) {
1731 printk(KERN_ERR PFX "error registering nVidia framebuffer\n");
1732 goto err_out_iounmap_fb;
1735 pci_set_drvdata(pd, info);
1737 printk(KERN_INFO PFX
1738 "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
1740 par->FbMapSize / (1024 * 1024), info->fix.smem_start);
1741 #ifdef CONFIG_PMAC_BACKLIGHT
1742 if (par->FlatPanel && _machine == _MACH_Pmac)
1743 register_backlight_controller(&nvidia_backlight_controller,
1750 iounmap(info->screen_base);
1752 fb_destroy_modedb(info->monspecs.modedb);
1753 nvidia_delete_i2c_busses(par);
1757 pci_release_regions(pd);
1759 pci_disable_device(pd);
1761 kfree(info->pixmap.addr);
1763 framebuffer_release(info);
1768 static void __exit nvidiafb_remove(struct pci_dev *pd)
1770 struct fb_info *info = pci_get_drvdata(pd);
1771 struct nvidia_par *par = info->par;
1775 unregister_framebuffer(info);
1777 if (par->mtrr.vram_valid)
1778 mtrr_del(par->mtrr.vram, info->fix.smem_start,
1779 info->fix.smem_len);
1780 #endif /* CONFIG_MTRR */
1782 iounmap(info->screen_base);
1783 fb_destroy_modedb(info->monspecs.modedb);
1784 nvidia_delete_i2c_busses(par);
1786 pci_release_regions(pd);
1787 pci_disable_device(pd);
1788 kfree(info->pixmap.addr);
1789 framebuffer_release(info);
1790 pci_set_drvdata(pd, NULL);
1794 /* ------------------------------------------------------------------------- *
1798 * ------------------------------------------------------------------------- */
1801 static int __devinit nvidiafb_setup(char *options)
1806 if (!options || !*options)
1809 while ((this_opt = strsep(&options, ",")) != NULL) {
1810 if (!strncmp(this_opt, "forceCRTC", 9)) {
1816 forceCRTC = *p - '0';
1817 if (forceCRTC < 0 || forceCRTC > 1)
1819 } else if (!strncmp(this_opt, "flatpanel", 9)) {
1821 } else if (!strncmp(this_opt, "hwcur", 5)) {
1823 } else if (!strncmp(this_opt, "noaccel", 6)) {
1825 } else if (!strncmp(this_opt, "noscale", 7)) {
1827 } else if (!strncmp(this_opt, "paneltweak:", 11)) {
1828 paneltweak = simple_strtoul(this_opt+11, NULL, 0);
1829 } else if (!strncmp(this_opt, "vram:", 5)) {
1830 vram = simple_strtoul(this_opt+5, NULL, 0);
1832 } else if (!strncmp(this_opt, "nomtrr", 6)) {
1835 } else if (!strncmp(this_opt, "fpdither:", 9)) {
1836 fpdither = simple_strtol(this_opt+9, NULL, 0);
1837 } else if (!strncmp(this_opt, "bpp:", 4)) {
1838 bpp = simple_strtoul(this_opt+4, NULL, 0);
1840 mode_option = this_opt;
1845 #endif /* !MODULE */
1847 static struct pci_driver nvidiafb_driver = {
1849 .id_table = nvidiafb_pci_tbl,
1850 .probe = nvidiafb_probe,
1851 .suspend = nvidiafb_suspend,
1852 .resume = nvidiafb_resume,
1853 .remove = __exit_p(nvidiafb_remove),
1856 /* ------------------------------------------------------------------------- *
1860 * ------------------------------------------------------------------------- */
1862 static int __devinit nvidiafb_init(void)
1865 char *option = NULL;
1867 if (fb_get_options("nvidiafb", &option))
1869 nvidiafb_setup(option);
1871 return pci_register_driver(&nvidiafb_driver);
1874 module_init(nvidiafb_init);
1877 static void __exit nvidiafb_exit(void)
1879 pci_unregister_driver(&nvidiafb_driver);
1882 module_exit(nvidiafb_exit);
1884 module_param(flatpanel, int, 0);
1885 MODULE_PARM_DESC(flatpanel,
1886 "Enables experimental flat panel support for some chipsets. "
1887 "(0=disabled, 1=enabled, -1=autodetect) (default=-1)");
1888 module_param(fpdither, int, 0);
1889 MODULE_PARM_DESC(fpdither,
1890 "Enables dithering of flat panel for 6 bits panels. "
1891 "(0=disabled, 1=enabled, -1=autodetect) (default=-1)");
1892 module_param(hwcur, int, 0);
1893 MODULE_PARM_DESC(hwcur,
1894 "Enables hardware cursor implementation. (0 or 1=enabled) "
1896 module_param(noaccel, int, 0);
1897 MODULE_PARM_DESC(noaccel,
1898 "Disables hardware acceleration. (0 or 1=disable) "
1900 module_param(noscale, int, 0);
1901 MODULE_PARM_DESC(noscale,
1902 "Disables screen scaleing. (0 or 1=disable) "
1903 "(default=0, do scaling)");
1904 module_param(paneltweak, int, 0);
1905 MODULE_PARM_DESC(paneltweak,
1906 "Tweak display settings for flatpanels. "
1907 "(default=0, no tweaks)");
1908 module_param(forceCRTC, int, 0);
1909 MODULE_PARM_DESC(forceCRTC,
1910 "Forces usage of a particular CRTC in case autodetection "
1911 "fails. (0 or 1) (default=autodetect)");
1912 module_param(vram, int, 0);
1913 MODULE_PARM_DESC(vram,
1914 "amount of framebuffer memory to remap in MiB"
1915 "(default=0 - remap entire memory)");
1916 module_param(mode_option, charp, 0);
1917 MODULE_PARM_DESC(mode_option, "Specify initial video mode");
1918 module_param(bpp, int, 0);
1919 MODULE_PARM_DESC(bpp, "pixel width in bits"
1922 module_param(nomtrr, bool, 0);
1923 MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) "
1927 MODULE_AUTHOR("Antonino Daplas");
1928 MODULE_DESCRIPTION("Framebuffer driver for nVidia graphics chipset");
1929 MODULE_LICENSE("GPL");