Linux 2.6.17.7
[linux/fpc-iii.git] / drivers / video / nvidia / nvidia.c
blob093ab9977c7ce843bc222e478d142c0aa57ff0d9
1 /*
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
8 * for more details.
12 #include <linux/config.h>
13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
16 #include <linux/string.h>
17 #include <linux/mm.h>
18 #include <linux/tty.h>
19 #include <linux/slab.h>
20 #include <linux/delay.h>
21 #include <linux/fb.h>
22 #include <linux/init.h>
23 #include <linux/pci.h>
24 #include <linux/console.h>
25 #ifdef CONFIG_MTRR
26 #include <asm/mtrr.h>
27 #endif
28 #ifdef CONFIG_PPC_OF
29 #include <asm/prom.h>
30 #include <asm/pci-bridge.h>
31 #endif
32 #ifdef CONFIG_PMAC_BACKLIGHT
33 #include <asm/machdep.h>
34 #include <asm/backlight.h>
35 #endif
37 #include "nv_local.h"
38 #include "nv_type.h"
39 #include "nv_proto.h"
40 #include "nv_dma.h"
42 #ifndef CONFIG_PCI /* sanity check */
43 #error This driver requires PCI support.
44 #endif
46 #undef CONFIG_FB_NVIDIA_DEBUG
47 #ifdef CONFIG_FB_NVIDIA_DEBUG
48 #define NVTRACE printk
49 #else
50 #define NVTRACE if (0) printk
51 #endif
53 #define NVTRACE_ENTER(...) NVTRACE("%s START\n", __FUNCTION__)
54 #define NVTRACE_LEAVE(...) NVTRACE("%s END\n", __FUNCTION__)
56 #ifdef CONFIG_FB_NVIDIA_DEBUG
57 #define assert(expr) \
58 if (!(expr)) { \
59 printk( "Assertion failed! %s,%s,%s,line=%d\n",\
60 #expr,__FILE__,__FUNCTION__,__LINE__); \
61 BUG(); \
63 #else
64 #define assert(expr)
65 #endif
67 #define PFX "nvidiafb: "
69 /* HW cursor parameters */
70 #define MAX_CURS 32
72 static struct pci_device_id nvidiafb_pci_tbl[] = {
73 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT,
74 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
75 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT2,
76 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
77 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_UTNT2,
78 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
79 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT_UNKNOWN,
80 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
81 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_VTNT2,
82 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
83 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_UVTNT2,
84 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
85 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_ITNT2,
86 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
87 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_SDR,
88 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
89 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_DDR,
90 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
91 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO,
92 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
93 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX,
94 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
95 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX2,
96 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
97 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GO,
98 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
99 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO2_MXR,
100 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
101 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS,
102 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
103 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS2,
104 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
105 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_ULTRA,
106 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
107 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO2_PRO,
108 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
109 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_460,
110 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
111 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440,
112 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
113 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_420,
114 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
115 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440_SE,
116 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
117 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO,
118 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
119 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO,
120 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
121 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_460_GO,
122 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
123 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO_M32,
124 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
125 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_500XGL,
126 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
127 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO_M64,
128 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
129 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_200,
130 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
131 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_550XGL,
132 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
133 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_500_GOGL,
134 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
135 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_410_GO_M16,
136 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
137 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440_8X,
138 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
139 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440SE_8X,
140 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
141 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_420_8X,
142 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
143 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_4000,
144 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
145 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_448_GO,
146 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
147 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_488_GO,
148 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
149 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_580_XGL,
150 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
151 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_MAC,
152 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
153 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_280_NVS,
154 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
155 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_380_XGL,
156 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
157 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_IGEFORCE2,
158 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
159 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3,
160 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
161 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3_1,
162 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
163 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3_2,
164 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
165 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_DDC,
166 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
167 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4600,
168 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
169 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4400,
170 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
171 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4200,
172 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
173 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL,
174 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
175 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL,
176 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
177 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL,
178 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
179 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800,
180 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
181 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800_8X,
182 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
183 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800SE,
184 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
185 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_4200_GO,
186 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
187 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_980_XGL,
188 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
189 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_780_XGL,
190 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
191 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_700_GOGL,
192 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
193 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5800_ULTRA,
194 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
195 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5800,
196 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
197 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_2000,
198 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
199 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1000,
200 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
201 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600_ULTRA,
202 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
203 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600,
204 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
205 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600SE,
206 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
207 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5600,
208 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
209 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5650,
210 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
211 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO700,
212 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
213 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200,
214 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
215 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200_ULTRA,
216 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
217 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200_1,
218 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
219 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200SE,
220 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
221 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5200,
222 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
223 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5250,
224 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
225 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5250_32,
226 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
227 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO_5200,
228 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
229 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_NVS_280_PCI,
230 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
231 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_500,
232 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
233 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5300,
234 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
235 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5100,
236 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
237 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900_ULTRA,
238 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
239 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900,
240 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
241 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900XT,
242 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
243 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5950_ULTRA,
244 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
245 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_3000,
246 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
247 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700_ULTRA,
248 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
249 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700,
250 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
251 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700LE,
252 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
253 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700VE,
254 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
255 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_1,
256 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
257 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_2,
258 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
259 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO1000,
260 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
261 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100,
262 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
263 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5500,
264 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
265 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5100,
266 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
267 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_700,
268 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
269 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900ZT,
270 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
271 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800_ULTRA,
272 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
273 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800,
274 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
275 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800_LE,
276 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
277 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800_GT,
278 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
279 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_4000,
280 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
281 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6600_GT,
282 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
283 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6600,
284 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
285 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6610_XL,
286 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
287 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_FX_540,
288 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
289 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6200,
290 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
291 {PCI_VENDOR_ID_NVIDIA, PCIE_DEVICE_ID_NVIDIA_GEFORCE_6800_ALT1,
292 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
293 {PCI_VENDOR_ID_NVIDIA, PCIE_DEVICE_ID_NVIDIA_GEFORCE_6600_ALT1,
294 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
295 {PCI_VENDOR_ID_NVIDIA, PCIE_DEVICE_ID_NVIDIA_GEFORCE_6600_ALT2,
296 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
297 {PCI_VENDOR_ID_NVIDIA, PCIE_DEVICE_ID_NVIDIA_GEFORCE_6200_ALT1,
298 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
299 {PCI_VENDOR_ID_NVIDIA, PCIE_DEVICE_ID_NVIDIA_GEFORCE_6800_GT,
300 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
301 {PCI_VENDOR_ID_NVIDIA, PCIE_DEVICE_ID_NVIDIA_QUADRO_NVS280,
302 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
303 {PCI_VENDOR_ID_NVIDIA, 0x0252,
304 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
305 {PCI_VENDOR_ID_NVIDIA, 0x0313,
306 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
307 {PCI_VENDOR_ID_NVIDIA, 0x0316,
308 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
309 {PCI_VENDOR_ID_NVIDIA, 0x0317,
310 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
311 {PCI_VENDOR_ID_NVIDIA, 0x031D,
312 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
313 {PCI_VENDOR_ID_NVIDIA, 0x031E,
314 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
315 {PCI_VENDOR_ID_NVIDIA, 0x031F,
316 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
317 {PCI_VENDOR_ID_NVIDIA, 0x0329,
318 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
319 {PCI_VENDOR_ID_NVIDIA, 0x032F,
320 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
321 {PCI_VENDOR_ID_NVIDIA, 0x0345,
322 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
323 {PCI_VENDOR_ID_NVIDIA, 0x0349,
324 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
325 {PCI_VENDOR_ID_NVIDIA, 0x034B,
326 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
327 {PCI_VENDOR_ID_NVIDIA, 0x034F,
328 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
329 {PCI_VENDOR_ID_NVIDIA, 0x00c0,
330 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
331 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_GEFORCE_6800A,
332 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
333 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_GEFORCE_6800A_LE,
334 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
335 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_GEFORCE_GO_6800,
336 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
337 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_GEFORCE_GO_6800_ULTRA,
338 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
339 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_QUADRO_FX_GO1400,
340 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
341 {PCI_VENDOR_ID_NVIDIA, 0x00cd,
342 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
343 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_QUADRO_FX_1400,
344 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
345 {PCI_VENDOR_ID_NVIDIA, 0x0142,
346 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
347 {PCI_VENDOR_ID_NVIDIA, 0x0143,
348 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
349 {PCI_VENDOR_ID_NVIDIA, 0x0144,
350 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
351 {PCI_VENDOR_ID_NVIDIA, 0x0145,
352 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
353 {PCI_VENDOR_ID_NVIDIA, 0x0146,
354 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
355 {PCI_VENDOR_ID_NVIDIA, 0x0147,
356 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
357 {PCI_VENDOR_ID_NVIDIA, 0x0148,
358 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
359 {PCI_VENDOR_ID_NVIDIA, 0x0149,
360 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
361 {PCI_VENDOR_ID_NVIDIA, 0x014b,
362 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
363 {PCI_VENDOR_ID_NVIDIA, 0x14c,
364 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
365 {PCI_VENDOR_ID_NVIDIA, 0x014d,
366 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
367 {PCI_VENDOR_ID_NVIDIA, 0x0160,
368 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
369 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6200_TURBOCACHE,
370 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
371 {PCI_VENDOR_ID_NVIDIA, 0x0162,
372 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
373 {PCI_VENDOR_ID_NVIDIA, 0x0163,
374 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
375 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_6200,
376 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
377 {PCI_VENDOR_ID_NVIDIA, 0x0165,
378 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
379 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_6250,
380 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
381 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_6200_1,
382 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
383 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_6250_1,
384 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
385 {PCI_VENDOR_ID_NVIDIA, 0x0169,
386 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
387 {PCI_VENDOR_ID_NVIDIA, 0x016b,
388 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
389 {PCI_VENDOR_ID_NVIDIA, 0x016c,
390 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
391 {PCI_VENDOR_ID_NVIDIA, 0x016d,
392 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
393 {PCI_VENDOR_ID_NVIDIA, 0x016e,
394 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
395 {PCI_VENDOR_ID_NVIDIA, 0x0210,
396 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
397 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800B,
398 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
399 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800B_LE,
400 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
401 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_6800B_GT,
402 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
403 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_7800_GT,
404 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
405 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_7800_GTX,
406 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
407 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_7800,
408 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
409 {PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_GO_7800_GTX,
410 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
411 {PCI_VENDOR_ID_NVIDIA, 0x021d,
412 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
413 {PCI_VENDOR_ID_NVIDIA, 0x021e,
414 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
415 {PCI_VENDOR_ID_NVIDIA, 0x0220,
416 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
417 {PCI_VENDOR_ID_NVIDIA, 0x0221,
418 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
419 {PCI_VENDOR_ID_NVIDIA, 0x0222,
420 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
421 {PCI_VENDOR_ID_NVIDIA, 0x0228,
422 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
423 {0,} /* terminate list */
426 MODULE_DEVICE_TABLE(pci, nvidiafb_pci_tbl);
428 /* command line data, set in nvidiafb_setup() */
429 static int flatpanel __devinitdata = -1; /* Autodetect later */
430 static int fpdither __devinitdata = -1;
431 static int forceCRTC __devinitdata = -1;
432 static int hwcur __devinitdata = 0;
433 static int noaccel __devinitdata = 0;
434 static int noscale __devinitdata = 0;
435 static int paneltweak __devinitdata = 0;
436 static int vram __devinitdata = 0;
437 static int bpp __devinitdata = 8;
438 #ifdef CONFIG_MTRR
439 static int nomtrr __devinitdata = 0;
440 #endif
442 static char *mode_option __devinitdata = NULL;
444 static struct fb_fix_screeninfo __devinitdata nvidiafb_fix = {
445 .type = FB_TYPE_PACKED_PIXELS,
446 .xpanstep = 8,
447 .ypanstep = 1,
450 static struct fb_var_screeninfo __devinitdata nvidiafb_default_var = {
451 .xres = 640,
452 .yres = 480,
453 .xres_virtual = 640,
454 .yres_virtual = 480,
455 .bits_per_pixel = 8,
456 .red = {0, 8, 0},
457 .green = {0, 8, 0},
458 .blue = {0, 8, 0},
459 .transp = {0, 0, 0},
460 .activate = FB_ACTIVATE_NOW,
461 .height = -1,
462 .width = -1,
463 .pixclock = 39721,
464 .left_margin = 40,
465 .right_margin = 24,
466 .upper_margin = 32,
467 .lower_margin = 11,
468 .hsync_len = 96,
469 .vsync_len = 2,
470 .vmode = FB_VMODE_NONINTERLACED
474 * Backlight control
476 #ifdef CONFIG_PMAC_BACKLIGHT
478 static int nvidia_backlight_levels[] = {
479 0x158,
480 0x192,
481 0x1c6,
482 0x200,
483 0x234,
484 0x268,
485 0x2a2,
486 0x2d6,
487 0x310,
488 0x344,
489 0x378,
490 0x3b2,
491 0x3e6,
492 0x41a,
493 0x454,
494 0x534,
497 /* ------------------------------------------------------------------------- *
499 * Backlight operations
501 * ------------------------------------------------------------------------- */
503 static int nvidia_set_backlight_enable(int on, int level, void *data)
505 struct nvidia_par *par = data;
506 u32 tmp_pcrt, tmp_pmc, fpcontrol;
508 tmp_pmc = NV_RD32(par->PMC, 0x10F0) & 0x0000FFFF;
509 tmp_pcrt = NV_RD32(par->PCRTC0, 0x081C) & 0xFFFFFFFC;
510 fpcontrol = NV_RD32(par->PRAMDAC, 0x0848) & 0xCFFFFFCC;
512 if (on && (level > BACKLIGHT_OFF)) {
513 tmp_pcrt |= 0x1;
514 tmp_pmc |= (1 << 31); // backlight bit
515 tmp_pmc |= nvidia_backlight_levels[level - 1] << 16;
518 if (on)
519 fpcontrol |= par->fpSyncs;
520 else
521 fpcontrol |= 0x20000022;
523 NV_WR32(par->PCRTC0, 0x081C, tmp_pcrt);
524 NV_WR32(par->PMC, 0x10F0, tmp_pmc);
525 NV_WR32(par->PRAMDAC, 0x848, fpcontrol);
527 return 0;
530 static int nvidia_set_backlight_level(int level, void *data)
532 return nvidia_set_backlight_enable(1, level, data);
535 static struct backlight_controller nvidia_backlight_controller = {
536 nvidia_set_backlight_enable,
537 nvidia_set_backlight_level
540 #endif /* CONFIG_PMAC_BACKLIGHT */
542 static void nvidiafb_load_cursor_image(struct nvidia_par *par, u8 * data8,
543 u16 bg, u16 fg, u32 w, u32 h)
545 u32 *data = (u32 *) data8;
546 int i, j, k = 0;
547 u32 b, tmp;
549 w = (w + 1) & ~1;
551 for (i = 0; i < h; i++) {
552 b = *data++;
553 reverse_order(&b);
555 for (j = 0; j < w / 2; j++) {
556 tmp = 0;
557 #if defined (__BIG_ENDIAN)
558 tmp = (b & (1 << 31)) ? fg << 16 : bg << 16;
559 b <<= 1;
560 tmp |= (b & (1 << 31)) ? fg : bg;
561 b <<= 1;
562 #else
563 tmp = (b & 1) ? fg : bg;
564 b >>= 1;
565 tmp |= (b & 1) ? fg << 16 : bg << 16;
566 b >>= 1;
567 #endif
568 NV_WR32(&par->CURSOR[k++], 0, tmp);
570 k += (MAX_CURS - w) / 2;
574 static void nvidia_write_clut(struct nvidia_par *par,
575 u8 regnum, u8 red, u8 green, u8 blue)
577 NVWriteDacMask(par, 0xff);
578 NVWriteDacWriteAddr(par, regnum);
579 NVWriteDacData(par, red);
580 NVWriteDacData(par, green);
581 NVWriteDacData(par, blue);
584 static void nvidia_read_clut(struct nvidia_par *par,
585 u8 regnum, u8 * red, u8 * green, u8 * blue)
587 NVWriteDacMask(par, 0xff);
588 NVWriteDacReadAddr(par, regnum);
589 *red = NVReadDacData(par);
590 *green = NVReadDacData(par);
591 *blue = NVReadDacData(par);
594 static int nvidia_panel_tweak(struct nvidia_par *par,
595 struct _riva_hw_state *state)
597 int tweak = 0;
599 if (par->paneltweak) {
600 tweak = par->paneltweak;
601 } else {
602 /* begin flat panel hacks */
603 /* This is unfortunate, but some chips need this register
604 tweaked or else you get artifacts where adjacent pixels are
605 swapped. There are no hard rules for what to set here so all
606 we can do is experiment and apply hacks. */
608 if(((par->Chipset & 0xffff) == 0x0328) && (state->bpp == 32)) {
609 /* At least one NV34 laptop needs this workaround. */
610 tweak = -1;
613 if((par->Chipset & 0xfff0) == 0x0310) {
614 tweak = 1;
616 /* end flat panel hacks */
619 return tweak;
622 static void nvidia_vga_protect(struct nvidia_par *par, int on)
624 unsigned char tmp;
626 if (on) {
628 * Turn off screen and disable sequencer.
630 tmp = NVReadSeq(par, 0x01);
632 NVWriteSeq(par, 0x00, 0x01); /* Synchronous Reset */
633 NVWriteSeq(par, 0x01, tmp | 0x20); /* disable the display */
634 } else {
636 * Reenable sequencer, then turn on screen.
639 tmp = NVReadSeq(par, 0x01);
641 NVWriteSeq(par, 0x01, tmp & ~0x20); /* reenable display */
642 NVWriteSeq(par, 0x00, 0x03); /* End Reset */
646 static void nvidia_save_vga(struct nvidia_par *par,
647 struct _riva_hw_state *state)
649 int i;
651 NVTRACE_ENTER();
652 NVLockUnlock(par, 0);
654 NVUnloadStateExt(par, state);
656 state->misc_output = NVReadMiscOut(par);
658 for (i = 0; i < NUM_CRT_REGS; i++)
659 state->crtc[i] = NVReadCrtc(par, i);
661 for (i = 0; i < NUM_ATC_REGS; i++)
662 state->attr[i] = NVReadAttr(par, i);
664 for (i = 0; i < NUM_GRC_REGS; i++)
665 state->gra[i] = NVReadGr(par, i);
667 for (i = 0; i < NUM_SEQ_REGS; i++)
668 state->seq[i] = NVReadSeq(par, i);
669 NVTRACE_LEAVE();
672 #undef DUMP_REG
674 static void nvidia_write_regs(struct nvidia_par *par,
675 struct _riva_hw_state *state)
677 int i;
679 NVTRACE_ENTER();
681 NVLoadStateExt(par, state);
683 NVWriteMiscOut(par, state->misc_output);
685 for (i = 1; i < NUM_SEQ_REGS; i++) {
686 #ifdef DUMP_REG
687 printk(" SEQ[%02x] = %08x\n", i, state->seq[i]);
688 #endif
689 NVWriteSeq(par, i, state->seq[i]);
692 /* Ensure CRTC registers 0-7 are unlocked by clearing bit 7 of CRTC[17] */
693 NVWriteCrtc(par, 0x11, state->crtc[0x11] & ~0x80);
695 for (i = 0; i < NUM_CRT_REGS; i++) {
696 switch (i) {
697 case 0x19:
698 case 0x20 ... 0x40:
699 break;
700 default:
701 #ifdef DUMP_REG
702 printk("CRTC[%02x] = %08x\n", i, state->crtc[i]);
703 #endif
704 NVWriteCrtc(par, i, state->crtc[i]);
708 for (i = 0; i < NUM_GRC_REGS; i++) {
709 #ifdef DUMP_REG
710 printk(" GRA[%02x] = %08x\n", i, state->gra[i]);
711 #endif
712 NVWriteGr(par, i, state->gra[i]);
715 for (i = 0; i < NUM_ATC_REGS; i++) {
716 #ifdef DUMP_REG
717 printk("ATTR[%02x] = %08x\n", i, state->attr[i]);
718 #endif
719 NVWriteAttr(par, i, state->attr[i]);
722 NVTRACE_LEAVE();
725 static int nvidia_calc_regs(struct fb_info *info)
727 struct nvidia_par *par = info->par;
728 struct _riva_hw_state *state = &par->ModeReg;
729 int i, depth = fb_get_color_depth(&info->var, &info->fix);
730 int h_display = info->var.xres / 8 - 1;
731 int h_start = (info->var.xres + info->var.right_margin) / 8 - 1;
732 int h_end = (info->var.xres + info->var.right_margin +
733 info->var.hsync_len) / 8 - 1;
734 int h_total = (info->var.xres + info->var.right_margin +
735 info->var.hsync_len + info->var.left_margin) / 8 - 5;
736 int h_blank_s = h_display;
737 int h_blank_e = h_total + 4;
738 int v_display = info->var.yres - 1;
739 int v_start = info->var.yres + info->var.lower_margin - 1;
740 int v_end = (info->var.yres + info->var.lower_margin +
741 info->var.vsync_len) - 1;
742 int v_total = (info->var.yres + info->var.lower_margin +
743 info->var.vsync_len + info->var.upper_margin) - 2;
744 int v_blank_s = v_display;
745 int v_blank_e = v_total + 1;
748 * Set all CRTC values.
751 if (info->var.vmode & FB_VMODE_INTERLACED)
752 v_total |= 1;
754 if (par->FlatPanel == 1) {
755 v_start = v_total - 3;
756 v_end = v_total - 2;
757 v_blank_s = v_start;
758 h_start = h_total - 5;
759 h_end = h_total - 2;
760 h_blank_e = h_total + 4;
763 state->crtc[0x0] = Set8Bits(h_total);
764 state->crtc[0x1] = Set8Bits(h_display);
765 state->crtc[0x2] = Set8Bits(h_blank_s);
766 state->crtc[0x3] = SetBitField(h_blank_e, 4: 0, 4:0)
767 | SetBit(7);
768 state->crtc[0x4] = Set8Bits(h_start);
769 state->crtc[0x5] = SetBitField(h_blank_e, 5: 5, 7:7)
770 | SetBitField(h_end, 4: 0, 4:0);
771 state->crtc[0x6] = SetBitField(v_total, 7: 0, 7:0);
772 state->crtc[0x7] = SetBitField(v_total, 8: 8, 0:0)
773 | SetBitField(v_display, 8: 8, 1:1)
774 | SetBitField(v_start, 8: 8, 2:2)
775 | SetBitField(v_blank_s, 8: 8, 3:3)
776 | SetBit(4)
777 | SetBitField(v_total, 9: 9, 5:5)
778 | SetBitField(v_display, 9: 9, 6:6)
779 | SetBitField(v_start, 9: 9, 7:7);
780 state->crtc[0x9] = SetBitField(v_blank_s, 9: 9, 5:5)
781 | SetBit(6)
782 | ((info->var.vmode & FB_VMODE_DOUBLE) ? 0x80 : 0x00);
783 state->crtc[0x10] = Set8Bits(v_start);
784 state->crtc[0x11] = SetBitField(v_end, 3: 0, 3:0) | SetBit(5);
785 state->crtc[0x12] = Set8Bits(v_display);
786 state->crtc[0x13] = ((info->var.xres_virtual / 8) *
787 (info->var.bits_per_pixel / 8));
788 state->crtc[0x15] = Set8Bits(v_blank_s);
789 state->crtc[0x16] = Set8Bits(v_blank_e);
791 state->attr[0x10] = 0x01;
793 if (par->Television)
794 state->attr[0x11] = 0x00;
796 state->screen = SetBitField(h_blank_e, 6: 6, 4:4)
797 | SetBitField(v_blank_s, 10: 10, 3:3)
798 | SetBitField(v_start, 10: 10, 2:2)
799 | SetBitField(v_display, 10: 10, 1:1)
800 | SetBitField(v_total, 10: 10, 0:0);
802 state->horiz = SetBitField(h_total, 8: 8, 0:0)
803 | SetBitField(h_display, 8: 8, 1:1)
804 | SetBitField(h_blank_s, 8: 8, 2:2)
805 | SetBitField(h_start, 8: 8, 3:3);
807 state->extra = SetBitField(v_total, 11: 11, 0:0)
808 | SetBitField(v_display, 11: 11, 2:2)
809 | SetBitField(v_start, 11: 11, 4:4)
810 | SetBitField(v_blank_s, 11: 11, 6:6);
812 if (info->var.vmode & FB_VMODE_INTERLACED) {
813 h_total = (h_total >> 1) & ~1;
814 state->interlace = Set8Bits(h_total);
815 state->horiz |= SetBitField(h_total, 8: 8, 4:4);
816 } else {
817 state->interlace = 0xff; /* interlace off */
821 * Calculate the extended registers.
824 if (depth < 24)
825 i = depth;
826 else
827 i = 32;
829 if (par->Architecture >= NV_ARCH_10)
830 par->CURSOR = (volatile u32 __iomem *)(info->screen_base +
831 par->CursorStart);
833 if (info->var.sync & FB_SYNC_HOR_HIGH_ACT)
834 state->misc_output &= ~0x40;
835 else
836 state->misc_output |= 0x40;
837 if (info->var.sync & FB_SYNC_VERT_HIGH_ACT)
838 state->misc_output &= ~0x80;
839 else
840 state->misc_output |= 0x80;
842 NVCalcStateExt(par, state, i, info->var.xres_virtual,
843 info->var.xres, info->var.yres_virtual,
844 1000000000 / info->var.pixclock, info->var.vmode);
846 state->scale = NV_RD32(par->PRAMDAC, 0x00000848) & 0xfff000ff;
847 if (par->FlatPanel == 1) {
848 state->pixel |= (1 << 7);
850 if (!par->fpScaler || (par->fpWidth <= info->var.xres)
851 || (par->fpHeight <= info->var.yres)) {
852 state->scale |= (1 << 8);
855 if (!par->crtcSync_read) {
856 state->crtcSync = NV_RD32(par->PRAMDAC, 0x0828);
857 par->crtcSync_read = 1;
860 par->PanelTweak = nvidia_panel_tweak(par, state);
863 state->vpll = state->pll;
864 state->vpll2 = state->pll;
865 state->vpllB = state->pllB;
866 state->vpll2B = state->pllB;
868 VGA_WR08(par->PCIO, 0x03D4, 0x1C);
869 state->fifo = VGA_RD08(par->PCIO, 0x03D5) & ~(1<<5);
871 if (par->CRTCnumber) {
872 state->head = NV_RD32(par->PCRTC0, 0x00000860) & ~0x00001000;
873 state->head2 = NV_RD32(par->PCRTC0, 0x00002860) | 0x00001000;
874 state->crtcOwner = 3;
875 state->pllsel |= 0x20000800;
876 state->vpll = NV_RD32(par->PRAMDAC0, 0x00000508);
877 if (par->twoStagePLL)
878 state->vpllB = NV_RD32(par->PRAMDAC0, 0x00000578);
879 } else if (par->twoHeads) {
880 state->head = NV_RD32(par->PCRTC0, 0x00000860) | 0x00001000;
881 state->head2 = NV_RD32(par->PCRTC0, 0x00002860) & ~0x00001000;
882 state->crtcOwner = 0;
883 state->vpll2 = NV_RD32(par->PRAMDAC0, 0x0520);
884 if (par->twoStagePLL)
885 state->vpll2B = NV_RD32(par->PRAMDAC0, 0x057C);
888 state->cursorConfig = 0x00000100;
890 if (info->var.vmode & FB_VMODE_DOUBLE)
891 state->cursorConfig |= (1 << 4);
893 if (par->alphaCursor) {
894 if ((par->Chipset & 0x0ff0) != 0x0110)
895 state->cursorConfig |= 0x04011000;
896 else
897 state->cursorConfig |= 0x14011000;
898 state->general |= (1 << 29);
899 } else
900 state->cursorConfig |= 0x02000000;
902 if (par->twoHeads) {
903 if ((par->Chipset & 0x0ff0) == 0x0110) {
904 state->dither = NV_RD32(par->PRAMDAC, 0x0528) &
905 ~0x00010000;
906 if (par->FPDither)
907 state->dither |= 0x00010000;
908 } else {
909 state->dither = NV_RD32(par->PRAMDAC, 0x083C) & ~1;
910 if (par->FPDither)
911 state->dither |= 1;
915 state->timingH = 0;
916 state->timingV = 0;
917 state->displayV = info->var.xres;
919 return 0;
922 static void nvidia_init_vga(struct fb_info *info)
924 struct nvidia_par *par = info->par;
925 struct _riva_hw_state *state = &par->ModeReg;
926 int i;
928 for (i = 0; i < 0x10; i++)
929 state->attr[i] = i;
930 state->attr[0x10] = 0x41;
931 state->attr[0x11] = 0xff;
932 state->attr[0x12] = 0x0f;
933 state->attr[0x13] = 0x00;
934 state->attr[0x14] = 0x00;
936 memset(state->crtc, 0x00, NUM_CRT_REGS);
937 state->crtc[0x0a] = 0x20;
938 state->crtc[0x17] = 0xe3;
939 state->crtc[0x18] = 0xff;
940 state->crtc[0x28] = 0x40;
942 memset(state->gra, 0x00, NUM_GRC_REGS);
943 state->gra[0x05] = 0x40;
944 state->gra[0x06] = 0x05;
945 state->gra[0x07] = 0x0f;
946 state->gra[0x08] = 0xff;
948 state->seq[0x00] = 0x03;
949 state->seq[0x01] = 0x01;
950 state->seq[0x02] = 0x0f;
951 state->seq[0x03] = 0x00;
952 state->seq[0x04] = 0x0e;
954 state->misc_output = 0xeb;
957 static int nvidiafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
959 struct nvidia_par *par = info->par;
960 u8 data[MAX_CURS * MAX_CURS / 8];
961 int i, set = cursor->set;
962 u16 fg, bg;
964 if (cursor->image.width > MAX_CURS || cursor->image.height > MAX_CURS)
965 return -ENXIO;
967 NVShowHideCursor(par, 0);
969 if (par->cursor_reset) {
970 set = FB_CUR_SETALL;
971 par->cursor_reset = 0;
974 if (set & FB_CUR_SETSIZE)
975 memset_io(par->CURSOR, 0, MAX_CURS * MAX_CURS * 2);
977 if (set & FB_CUR_SETPOS) {
978 u32 xx, yy, temp;
980 yy = cursor->image.dy - info->var.yoffset;
981 xx = cursor->image.dx - info->var.xoffset;
982 temp = xx & 0xFFFF;
983 temp |= yy << 16;
985 NV_WR32(par->PRAMDAC, 0x0000300, temp);
988 if (set & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP | FB_CUR_SETIMAGE)) {
989 u32 bg_idx = cursor->image.bg_color;
990 u32 fg_idx = cursor->image.fg_color;
991 u32 s_pitch = (cursor->image.width + 7) >> 3;
992 u32 d_pitch = MAX_CURS / 8;
993 u8 *dat = (u8 *) cursor->image.data;
994 u8 *msk = (u8 *) cursor->mask;
995 u8 *src;
997 src = kmalloc(s_pitch * cursor->image.height, GFP_ATOMIC);
999 if (src) {
1000 switch (cursor->rop) {
1001 case ROP_XOR:
1002 for (i = 0; i < s_pitch * cursor->image.height; i++)
1003 src[i] = dat[i] ^ msk[i];
1004 break;
1005 case ROP_COPY:
1006 default:
1007 for (i = 0; i < s_pitch * cursor->image.height; i++)
1008 src[i] = dat[i] & msk[i];
1009 break;
1012 fb_pad_aligned_buffer(data, d_pitch, src, s_pitch,
1013 cursor->image.height);
1015 bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) |
1016 ((info->cmap.green[bg_idx] & 0xf8) << 2) |
1017 ((info->cmap.blue[bg_idx] & 0xf8) >> 3) | 1 << 15;
1019 fg = ((info->cmap.red[fg_idx] & 0xf8) << 7) |
1020 ((info->cmap.green[fg_idx] & 0xf8) << 2) |
1021 ((info->cmap.blue[fg_idx] & 0xf8) >> 3) | 1 << 15;
1023 NVLockUnlock(par, 0);
1025 nvidiafb_load_cursor_image(par, data, bg, fg,
1026 cursor->image.width,
1027 cursor->image.height);
1028 kfree(src);
1032 if (cursor->enable)
1033 NVShowHideCursor(par, 1);
1035 return 0;
1038 static int nvidiafb_set_par(struct fb_info *info)
1040 struct nvidia_par *par = info->par;
1042 NVTRACE_ENTER();
1044 NVLockUnlock(par, 1);
1045 if (!par->FlatPanel || !par->twoHeads)
1046 par->FPDither = 0;
1048 if (par->FPDither < 0) {
1049 if ((par->Chipset & 0x0ff0) == 0x0110)
1050 par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x0528)
1051 & 0x00010000);
1052 else
1053 par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x083C) & 1);
1054 printk(KERN_INFO PFX "Flat panel dithering %s\n",
1055 par->FPDither ? "enabled" : "disabled");
1058 info->fix.visual = (info->var.bits_per_pixel == 8) ?
1059 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1061 nvidia_init_vga(info);
1062 nvidia_calc_regs(info);
1064 NVLockUnlock(par, 0);
1065 if (par->twoHeads) {
1066 VGA_WR08(par->PCIO, 0x03D4, 0x44);
1067 VGA_WR08(par->PCIO, 0x03D5, par->ModeReg.crtcOwner);
1068 NVLockUnlock(par, 0);
1071 nvidia_vga_protect(par, 1);
1073 nvidia_write_regs(par, &par->ModeReg);
1074 NVSetStartAddress(par, 0);
1076 #if defined (__BIG_ENDIAN)
1077 /* turn on LFB swapping */
1079 unsigned char tmp;
1081 VGA_WR08(par->PCIO, 0x3d4, 0x46);
1082 tmp = VGA_RD08(par->PCIO, 0x3d5);
1083 tmp |= (1 << 7);
1084 VGA_WR08(par->PCIO, 0x3d5, tmp);
1086 #endif
1088 info->fix.line_length = (info->var.xres_virtual *
1089 info->var.bits_per_pixel) >> 3;
1090 if (info->var.accel_flags) {
1091 info->fbops->fb_imageblit = nvidiafb_imageblit;
1092 info->fbops->fb_fillrect = nvidiafb_fillrect;
1093 info->fbops->fb_copyarea = nvidiafb_copyarea;
1094 info->fbops->fb_sync = nvidiafb_sync;
1095 info->pixmap.scan_align = 4;
1096 info->flags &= ~FBINFO_HWACCEL_DISABLED;
1097 NVResetGraphics(info);
1098 } else {
1099 info->fbops->fb_imageblit = cfb_imageblit;
1100 info->fbops->fb_fillrect = cfb_fillrect;
1101 info->fbops->fb_copyarea = cfb_copyarea;
1102 info->fbops->fb_sync = NULL;
1103 info->pixmap.scan_align = 1;
1104 info->flags |= FBINFO_HWACCEL_DISABLED;
1107 par->cursor_reset = 1;
1109 nvidia_vga_protect(par, 0);
1111 NVTRACE_LEAVE();
1112 return 0;
1115 static int nvidiafb_setcolreg(unsigned regno, unsigned red, unsigned green,
1116 unsigned blue, unsigned transp,
1117 struct fb_info *info)
1119 struct nvidia_par *par = info->par;
1120 int i;
1122 NVTRACE_ENTER();
1123 if (regno >= (1 << info->var.green.length))
1124 return -EINVAL;
1126 if (info->var.grayscale) {
1127 /* gray = 0.30*R + 0.59*G + 0.11*B */
1128 red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8;
1131 if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
1132 ((u32 *) info->pseudo_palette)[regno] =
1133 (regno << info->var.red.offset) |
1134 (regno << info->var.green.offset) |
1135 (regno << info->var.blue.offset);
1138 switch (info->var.bits_per_pixel) {
1139 case 8:
1140 /* "transparent" stuff is completely ignored. */
1141 nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
1142 break;
1143 case 16:
1144 if (info->var.green.length == 5) {
1145 for (i = 0; i < 8; i++) {
1146 nvidia_write_clut(par, regno * 8 + i, red >> 8,
1147 green >> 8, blue >> 8);
1149 } else {
1150 u8 r, g, b;
1152 if (regno < 32) {
1153 for (i = 0; i < 8; i++) {
1154 nvidia_write_clut(par, regno * 8 + i,
1155 red >> 8, green >> 8,
1156 blue >> 8);
1160 nvidia_read_clut(par, regno * 4, &r, &g, &b);
1162 for (i = 0; i < 4; i++)
1163 nvidia_write_clut(par, regno * 4 + i, r,
1164 green >> 8, b);
1166 break;
1167 case 32:
1168 nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8);
1169 break;
1170 default:
1171 /* do nothing */
1172 break;
1175 NVTRACE_LEAVE();
1176 return 0;
1179 static int nvidiafb_check_var(struct fb_var_screeninfo *var,
1180 struct fb_info *info)
1182 struct nvidia_par *par = info->par;
1183 int memlen, vramlen, mode_valid = 0;
1184 int pitch, err = 0;
1186 NVTRACE_ENTER();
1188 var->transp.offset = 0;
1189 var->transp.length = 0;
1191 var->xres &= ~7;
1193 if (var->bits_per_pixel <= 8)
1194 var->bits_per_pixel = 8;
1195 else if (var->bits_per_pixel <= 16)
1196 var->bits_per_pixel = 16;
1197 else
1198 var->bits_per_pixel = 32;
1200 switch (var->bits_per_pixel) {
1201 case 8:
1202 var->red.offset = 0;
1203 var->red.length = 8;
1204 var->green.offset = 0;
1205 var->green.length = 8;
1206 var->blue.offset = 0;
1207 var->blue.length = 8;
1208 var->transp.offset = 0;
1209 var->transp.length = 0;
1210 break;
1211 case 16:
1212 var->green.length = (var->green.length < 6) ? 5 : 6;
1213 var->red.length = 5;
1214 var->blue.length = 5;
1215 var->transp.length = 6 - var->green.length;
1216 var->blue.offset = 0;
1217 var->green.offset = 5;
1218 var->red.offset = 5 + var->green.length;
1219 var->transp.offset = (5 + var->red.offset) & 15;
1220 break;
1221 case 32: /* RGBA 8888 */
1222 var->red.offset = 16;
1223 var->red.length = 8;
1224 var->green.offset = 8;
1225 var->green.length = 8;
1226 var->blue.offset = 0;
1227 var->blue.length = 8;
1228 var->transp.length = 8;
1229 var->transp.offset = 24;
1230 break;
1233 var->red.msb_right = 0;
1234 var->green.msb_right = 0;
1235 var->blue.msb_right = 0;
1236 var->transp.msb_right = 0;
1238 if (!info->monspecs.hfmax || !info->monspecs.vfmax ||
1239 !info->monspecs.dclkmax || !fb_validate_mode(var, info))
1240 mode_valid = 1;
1242 /* calculate modeline if supported by monitor */
1243 if (!mode_valid && info->monspecs.gtf) {
1244 if (!fb_get_mode(FB_MAXTIMINGS, 0, var, info))
1245 mode_valid = 1;
1248 if (!mode_valid) {
1249 struct fb_videomode *mode;
1251 mode = fb_find_best_mode(var, &info->modelist);
1252 if (mode) {
1253 fb_videomode_to_var(var, mode);
1254 mode_valid = 1;
1258 if (!mode_valid && info->monspecs.modedb_len)
1259 return -EINVAL;
1261 if (par->fpWidth && par->fpHeight && (par->fpWidth < var->xres ||
1262 par->fpHeight < var->yres))
1263 return -EINVAL;
1265 if (var->yres_virtual < var->yres)
1266 var->yres_virtual = var->yres;
1268 if (var->xres_virtual < var->xres)
1269 var->xres_virtual = var->xres;
1271 var->xres_virtual = (var->xres_virtual + 63) & ~63;
1273 vramlen = info->screen_size;
1274 pitch = ((var->xres_virtual * var->bits_per_pixel) + 7) / 8;
1275 memlen = pitch * var->yres_virtual;
1277 if (memlen > vramlen) {
1278 var->yres_virtual = vramlen / pitch;
1280 if (var->yres_virtual < var->yres) {
1281 var->yres_virtual = var->yres;
1282 var->xres_virtual = vramlen / var->yres_virtual;
1283 var->xres_virtual /= var->bits_per_pixel / 8;
1284 var->xres_virtual &= ~63;
1285 pitch = (var->xres_virtual *
1286 var->bits_per_pixel + 7) / 8;
1287 memlen = pitch * var->yres;
1289 if (var->xres_virtual < var->xres) {
1290 printk("nvidiafb: required video memory, "
1291 "%d bytes, for %dx%d-%d (virtual) "
1292 "is out of range\n",
1293 memlen, var->xres_virtual,
1294 var->yres_virtual, var->bits_per_pixel);
1295 err = -ENOMEM;
1300 if (var->accel_flags) {
1301 if (var->yres_virtual > 0x7fff)
1302 var->yres_virtual = 0x7fff;
1303 if (var->xres_virtual > 0x7fff)
1304 var->xres_virtual = 0x7fff;
1307 var->xres_virtual &= ~63;
1309 NVTRACE_LEAVE();
1311 return err;
1314 static int nvidiafb_pan_display(struct fb_var_screeninfo *var,
1315 struct fb_info *info)
1317 struct nvidia_par *par = info->par;
1318 u32 total;
1320 total = var->yoffset * info->fix.line_length + var->xoffset;
1322 NVSetStartAddress(par, total);
1324 return 0;
1327 static int nvidiafb_blank(int blank, struct fb_info *info)
1329 struct nvidia_par *par = info->par;
1330 unsigned char tmp, vesa;
1332 tmp = NVReadSeq(par, 0x01) & ~0x20; /* screen on/off */
1333 vesa = NVReadCrtc(par, 0x1a) & ~0xc0; /* sync on/off */
1335 NVTRACE_ENTER();
1337 if (blank)
1338 tmp |= 0x20;
1340 switch (blank) {
1341 case FB_BLANK_UNBLANK:
1342 case FB_BLANK_NORMAL:
1343 break;
1344 case FB_BLANK_VSYNC_SUSPEND:
1345 vesa |= 0x80;
1346 break;
1347 case FB_BLANK_HSYNC_SUSPEND:
1348 vesa |= 0x40;
1349 break;
1350 case FB_BLANK_POWERDOWN:
1351 vesa |= 0xc0;
1352 break;
1355 NVWriteSeq(par, 0x01, tmp);
1356 NVWriteCrtc(par, 0x1a, vesa);
1358 #ifdef CONFIG_PMAC_BACKLIGHT
1359 if (par->FlatPanel && machine_is(powermac)) {
1360 set_backlight_enable(!blank);
1362 #endif
1364 NVTRACE_LEAVE();
1366 return 0;
1369 static struct fb_ops nvidia_fb_ops = {
1370 .owner = THIS_MODULE,
1371 .fb_check_var = nvidiafb_check_var,
1372 .fb_set_par = nvidiafb_set_par,
1373 .fb_setcolreg = nvidiafb_setcolreg,
1374 .fb_pan_display = nvidiafb_pan_display,
1375 .fb_blank = nvidiafb_blank,
1376 .fb_fillrect = nvidiafb_fillrect,
1377 .fb_copyarea = nvidiafb_copyarea,
1378 .fb_imageblit = nvidiafb_imageblit,
1379 .fb_cursor = nvidiafb_cursor,
1380 .fb_sync = nvidiafb_sync,
1383 #ifdef CONFIG_PM
1384 static int nvidiafb_suspend(struct pci_dev *dev, pm_message_t state)
1386 struct fb_info *info = pci_get_drvdata(dev);
1387 struct nvidia_par *par = info->par;
1389 acquire_console_sem();
1390 par->pm_state = state.event;
1392 if (state.event == PM_EVENT_FREEZE) {
1393 dev->dev.power.power_state = state;
1394 } else {
1395 fb_set_suspend(info, 1);
1396 nvidiafb_blank(FB_BLANK_POWERDOWN, info);
1397 nvidia_write_regs(par, &par->SavedReg);
1398 pci_save_state(dev);
1399 pci_disable_device(dev);
1400 pci_set_power_state(dev, pci_choose_state(dev, state));
1403 release_console_sem();
1404 return 0;
1407 static int nvidiafb_resume(struct pci_dev *dev)
1409 struct fb_info *info = pci_get_drvdata(dev);
1410 struct nvidia_par *par = info->par;
1412 acquire_console_sem();
1413 pci_set_power_state(dev, PCI_D0);
1415 if (par->pm_state != PM_EVENT_FREEZE) {
1416 pci_restore_state(dev);
1417 pci_enable_device(dev);
1418 pci_set_master(dev);
1421 par->pm_state = PM_EVENT_ON;
1422 nvidiafb_set_par(info);
1423 fb_set_suspend (info, 0);
1424 nvidiafb_blank(FB_BLANK_UNBLANK, info);
1426 release_console_sem();
1427 return 0;
1429 #else
1430 #define nvidiafb_suspend NULL
1431 #define nvidiafb_resume NULL
1432 #endif
1434 static int __devinit nvidia_set_fbinfo(struct fb_info *info)
1436 struct fb_monspecs *specs = &info->monspecs;
1437 struct fb_videomode modedb;
1438 struct nvidia_par *par = info->par;
1439 int lpitch;
1441 NVTRACE_ENTER();
1442 info->flags = FBINFO_DEFAULT
1443 | FBINFO_HWACCEL_IMAGEBLIT
1444 | FBINFO_HWACCEL_FILLRECT
1445 | FBINFO_HWACCEL_COPYAREA
1446 | FBINFO_HWACCEL_YPAN;
1448 fb_videomode_to_modelist(info->monspecs.modedb,
1449 info->monspecs.modedb_len, &info->modelist);
1450 fb_var_to_videomode(&modedb, &nvidiafb_default_var);
1452 switch (bpp) {
1453 case 0 ... 8:
1454 bpp = 8;
1455 break;
1456 case 9 ... 16:
1457 bpp = 16;
1458 break;
1459 default:
1460 bpp = 32;
1461 break;
1464 if (specs->modedb != NULL) {
1465 struct fb_videomode *modedb;
1467 modedb = fb_find_best_display(specs, &info->modelist);
1468 fb_videomode_to_var(&nvidiafb_default_var, modedb);
1469 nvidiafb_default_var.bits_per_pixel = bpp;
1470 } else if (par->fpWidth && par->fpHeight) {
1471 char buf[16];
1473 memset(buf, 0, 16);
1474 snprintf(buf, 15, "%dx%dMR", par->fpWidth, par->fpHeight);
1475 fb_find_mode(&nvidiafb_default_var, info, buf, specs->modedb,
1476 specs->modedb_len, &modedb, bpp);
1479 if (mode_option)
1480 fb_find_mode(&nvidiafb_default_var, info, mode_option,
1481 specs->modedb, specs->modedb_len, &modedb, bpp);
1483 info->var = nvidiafb_default_var;
1484 info->fix.visual = (info->var.bits_per_pixel == 8) ?
1485 FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
1486 info->pseudo_palette = par->pseudo_palette;
1487 fb_alloc_cmap(&info->cmap, 256, 0);
1488 fb_destroy_modedb(info->monspecs.modedb);
1489 info->monspecs.modedb = NULL;
1491 /* maximize virtual vertical length */
1492 lpitch = info->var.xres_virtual *
1493 ((info->var.bits_per_pixel + 7) >> 3);
1494 info->var.yres_virtual = info->screen_size / lpitch;
1496 info->pixmap.scan_align = 4;
1497 info->pixmap.buf_align = 4;
1498 info->pixmap.access_align = 32;
1499 info->pixmap.size = 8 * 1024;
1500 info->pixmap.flags = FB_PIXMAP_SYSTEM;
1502 if (!hwcur)
1503 info->fbops->fb_cursor = NULL;
1505 info->var.accel_flags = (!noaccel);
1507 switch (par->Architecture) {
1508 case NV_ARCH_04:
1509 info->fix.accel = FB_ACCEL_NV4;
1510 break;
1511 case NV_ARCH_10:
1512 info->fix.accel = FB_ACCEL_NV_10;
1513 break;
1514 case NV_ARCH_20:
1515 info->fix.accel = FB_ACCEL_NV_20;
1516 break;
1517 case NV_ARCH_30:
1518 info->fix.accel = FB_ACCEL_NV_30;
1519 break;
1520 case NV_ARCH_40:
1521 info->fix.accel = FB_ACCEL_NV_40;
1522 break;
1525 NVTRACE_LEAVE();
1527 return nvidiafb_check_var(&info->var, info);
1530 static u32 __devinit nvidia_get_chipset(struct fb_info *info)
1532 struct nvidia_par *par = info->par;
1533 u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
1535 printk("nvidiafb: PCI id - %x\n", id);
1536 if ((id & 0xfff0) == 0x00f0) {
1537 /* pci-e */
1538 printk("nvidiafb: PCI-E card\n");
1539 id = NV_RD32(par->REGS, 0x1800);
1541 if ((id & 0x0000ffff) == 0x000010DE)
1542 id = 0x10DE0000 | (id >> 16);
1543 else if ((id & 0xffff0000) == 0xDE100000) /* wrong endian */
1544 id = 0x10DE0000 | ((id << 8) & 0x0000ff00) |
1545 ((id >> 8) & 0x000000ff);
1548 printk("nvidiafb: Actual id - %x\n", id);
1549 return id;
1552 static u32 __devinit nvidia_get_arch(struct fb_info *info)
1554 struct nvidia_par *par = info->par;
1555 u32 arch = 0;
1557 switch (par->Chipset & 0x0ff0) {
1558 case 0x0100: /* GeForce 256 */
1559 case 0x0110: /* GeForce2 MX */
1560 case 0x0150: /* GeForce2 */
1561 case 0x0170: /* GeForce4 MX */
1562 case 0x0180: /* GeForce4 MX (8x AGP) */
1563 case 0x01A0: /* nForce */
1564 case 0x01F0: /* nForce2 */
1565 arch = NV_ARCH_10;
1566 break;
1567 case 0x0200: /* GeForce3 */
1568 case 0x0250: /* GeForce4 Ti */
1569 case 0x0280: /* GeForce4 Ti (8x AGP) */
1570 arch = NV_ARCH_20;
1571 break;
1572 case 0x0300: /* GeForceFX 5800 */
1573 case 0x0310: /* GeForceFX 5600 */
1574 case 0x0320: /* GeForceFX 5200 */
1575 case 0x0330: /* GeForceFX 5900 */
1576 case 0x0340: /* GeForceFX 5700 */
1577 arch = NV_ARCH_30;
1578 break;
1579 case 0x0040:
1580 case 0x00C0:
1581 case 0x0120:
1582 case 0x0130:
1583 case 0x0140:
1584 case 0x0160:
1585 case 0x01D0:
1586 case 0x0090:
1587 case 0x0210:
1588 case 0x0220:
1589 case 0x0230:
1590 case 0x0290:
1591 case 0x0390:
1592 arch = NV_ARCH_40;
1593 break;
1594 case 0x0020: /* TNT, TNT2 */
1595 arch = NV_ARCH_04;
1596 break;
1597 default: /* unknown architecture */
1598 break;
1601 return arch;
1604 static int __devinit nvidiafb_probe(struct pci_dev *pd,
1605 const struct pci_device_id *ent)
1607 struct nvidia_par *par;
1608 struct fb_info *info;
1609 unsigned short cmd;
1612 NVTRACE_ENTER();
1613 assert(pd != NULL);
1615 info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
1617 if (!info)
1618 goto err_out;
1620 par = info->par;
1621 par->pci_dev = pd;
1623 info->pixmap.addr = kmalloc(8 * 1024, GFP_KERNEL);
1625 if (info->pixmap.addr == NULL)
1626 goto err_out_kfree;
1628 memset(info->pixmap.addr, 0, 8 * 1024);
1630 if (pci_enable_device(pd)) {
1631 printk(KERN_ERR PFX "cannot enable PCI device\n");
1632 goto err_out_enable;
1635 if (pci_request_regions(pd, "nvidiafb")) {
1636 printk(KERN_ERR PFX "cannot request PCI regions\n");
1637 goto err_out_request;
1640 par->FlatPanel = flatpanel;
1641 if (flatpanel == 1)
1642 printk(KERN_INFO PFX "flatpanel support enabled\n");
1643 par->FPDither = fpdither;
1645 par->CRTCnumber = forceCRTC;
1646 par->FpScale = (!noscale);
1647 par->paneltweak = paneltweak;
1649 /* enable IO and mem if not already done */
1650 pci_read_config_word(pd, PCI_COMMAND, &cmd);
1651 cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
1652 pci_write_config_word(pd, PCI_COMMAND, cmd);
1654 nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
1655 nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
1656 nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
1658 par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
1660 if (!par->REGS) {
1661 printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
1662 goto err_out_free_base0;
1665 par->Chipset = nvidia_get_chipset(info);
1666 printk(KERN_INFO PFX "nVidia device/chipset %X\n", par->Chipset);
1667 par->Architecture = nvidia_get_arch(info);
1669 if (par->Architecture == 0) {
1670 printk(KERN_ERR PFX "unknown NV_ARCH\n");
1671 goto err_out_arch;
1674 sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
1676 if (NVCommonSetup(info))
1677 goto err_out_arch;
1679 par->FbAddress = nvidiafb_fix.smem_start;
1680 par->FbMapSize = par->RamAmountKBytes * 1024;
1681 if (vram && vram * 1024 * 1024 < par->FbMapSize)
1682 par->FbMapSize = vram * 1024 * 1024;
1684 /* Limit amount of vram to 64 MB */
1685 if (par->FbMapSize > 64 * 1024 * 1024)
1686 par->FbMapSize = 64 * 1024 * 1024;
1688 if(par->Architecture >= NV_ARCH_40)
1689 par->FbUsableSize = par->FbMapSize - (560 * 1024);
1690 else
1691 par->FbUsableSize = par->FbMapSize - (128 * 1024);
1692 par->ScratchBufferSize = (par->Architecture < NV_ARCH_10) ? 8 * 1024 :
1693 16 * 1024;
1694 par->ScratchBufferStart = par->FbUsableSize - par->ScratchBufferSize;
1695 par->CursorStart = par->FbUsableSize + (32 * 1024);
1697 info->screen_base = ioremap(nvidiafb_fix.smem_start, par->FbMapSize);
1698 info->screen_size = par->FbUsableSize;
1699 nvidiafb_fix.smem_len = par->RamAmountKBytes * 1024;
1701 if (!info->screen_base) {
1702 printk(KERN_ERR PFX "cannot ioremap FB base\n");
1703 goto err_out_free_base1;
1706 par->FbStart = info->screen_base;
1708 #ifdef CONFIG_MTRR
1709 if (!nomtrr) {
1710 par->mtrr.vram = mtrr_add(nvidiafb_fix.smem_start,
1711 par->RamAmountKBytes * 1024,
1712 MTRR_TYPE_WRCOMB, 1);
1713 if (par->mtrr.vram < 0) {
1714 printk(KERN_ERR PFX "unable to setup MTRR\n");
1715 } else {
1716 par->mtrr.vram_valid = 1;
1717 /* let there be speed */
1718 printk(KERN_INFO PFX "MTRR set to ON\n");
1721 #endif /* CONFIG_MTRR */
1723 info->fbops = &nvidia_fb_ops;
1724 info->fix = nvidiafb_fix;
1726 if (nvidia_set_fbinfo(info) < 0) {
1727 printk(KERN_ERR PFX "error setting initial video mode\n");
1728 goto err_out_iounmap_fb;
1731 nvidia_save_vga(par, &par->SavedReg);
1733 if (register_framebuffer(info) < 0) {
1734 printk(KERN_ERR PFX "error registering nVidia framebuffer\n");
1735 goto err_out_iounmap_fb;
1738 pci_set_drvdata(pd, info);
1740 printk(KERN_INFO PFX
1741 "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
1742 info->fix.id,
1743 par->FbMapSize / (1024 * 1024), info->fix.smem_start);
1744 #ifdef CONFIG_PMAC_BACKLIGHT
1745 if (par->FlatPanel && machine_is(powermac))
1746 register_backlight_controller(&nvidia_backlight_controller,
1747 par, "mnca");
1748 #endif
1749 NVTRACE_LEAVE();
1750 return 0;
1752 err_out_iounmap_fb:
1753 iounmap(info->screen_base);
1754 err_out_free_base1:
1755 fb_destroy_modedb(info->monspecs.modedb);
1756 nvidia_delete_i2c_busses(par);
1757 err_out_arch:
1758 iounmap(par->REGS);
1759 err_out_free_base0:
1760 pci_release_regions(pd);
1761 err_out_request:
1762 pci_disable_device(pd);
1763 err_out_enable:
1764 kfree(info->pixmap.addr);
1765 err_out_kfree:
1766 framebuffer_release(info);
1767 err_out:
1768 return -ENODEV;
1771 static void __exit nvidiafb_remove(struct pci_dev *pd)
1773 struct fb_info *info = pci_get_drvdata(pd);
1774 struct nvidia_par *par = info->par;
1776 NVTRACE_ENTER();
1778 unregister_framebuffer(info);
1779 #ifdef CONFIG_MTRR
1780 if (par->mtrr.vram_valid)
1781 mtrr_del(par->mtrr.vram, info->fix.smem_start,
1782 info->fix.smem_len);
1783 #endif /* CONFIG_MTRR */
1785 iounmap(info->screen_base);
1786 fb_destroy_modedb(info->monspecs.modedb);
1787 nvidia_delete_i2c_busses(par);
1788 iounmap(par->REGS);
1789 pci_release_regions(pd);
1790 pci_disable_device(pd);
1791 kfree(info->pixmap.addr);
1792 framebuffer_release(info);
1793 pci_set_drvdata(pd, NULL);
1794 NVTRACE_LEAVE();
1797 /* ------------------------------------------------------------------------- *
1799 * initialization
1801 * ------------------------------------------------------------------------- */
1803 #ifndef MODULE
1804 static int __devinit nvidiafb_setup(char *options)
1806 char *this_opt;
1808 NVTRACE_ENTER();
1809 if (!options || !*options)
1810 return 0;
1812 while ((this_opt = strsep(&options, ",")) != NULL) {
1813 if (!strncmp(this_opt, "forceCRTC", 9)) {
1814 char *p;
1816 p = this_opt + 9;
1817 if (!*p || !*(++p))
1818 continue;
1819 forceCRTC = *p - '0';
1820 if (forceCRTC < 0 || forceCRTC > 1)
1821 forceCRTC = -1;
1822 } else if (!strncmp(this_opt, "flatpanel", 9)) {
1823 flatpanel = 1;
1824 } else if (!strncmp(this_opt, "hwcur", 5)) {
1825 hwcur = 1;
1826 } else if (!strncmp(this_opt, "noaccel", 6)) {
1827 noaccel = 1;
1828 } else if (!strncmp(this_opt, "noscale", 7)) {
1829 noscale = 1;
1830 } else if (!strncmp(this_opt, "paneltweak:", 11)) {
1831 paneltweak = simple_strtoul(this_opt+11, NULL, 0);
1832 } else if (!strncmp(this_opt, "vram:", 5)) {
1833 vram = simple_strtoul(this_opt+5, NULL, 0);
1834 #ifdef CONFIG_MTRR
1835 } else if (!strncmp(this_opt, "nomtrr", 6)) {
1836 nomtrr = 1;
1837 #endif
1838 } else if (!strncmp(this_opt, "fpdither:", 9)) {
1839 fpdither = simple_strtol(this_opt+9, NULL, 0);
1840 } else if (!strncmp(this_opt, "bpp:", 4)) {
1841 bpp = simple_strtoul(this_opt+4, NULL, 0);
1842 } else
1843 mode_option = this_opt;
1845 NVTRACE_LEAVE();
1846 return 0;
1848 #endif /* !MODULE */
1850 static struct pci_driver nvidiafb_driver = {
1851 .name = "nvidiafb",
1852 .id_table = nvidiafb_pci_tbl,
1853 .probe = nvidiafb_probe,
1854 .suspend = nvidiafb_suspend,
1855 .resume = nvidiafb_resume,
1856 .remove = __exit_p(nvidiafb_remove),
1859 /* ------------------------------------------------------------------------- *
1861 * modularization
1863 * ------------------------------------------------------------------------- */
1865 static int __devinit nvidiafb_init(void)
1867 #ifndef MODULE
1868 char *option = NULL;
1870 if (fb_get_options("nvidiafb", &option))
1871 return -ENODEV;
1872 nvidiafb_setup(option);
1873 #endif
1874 return pci_register_driver(&nvidiafb_driver);
1877 module_init(nvidiafb_init);
1879 #ifdef MODULE
1880 static void __exit nvidiafb_exit(void)
1882 pci_unregister_driver(&nvidiafb_driver);
1885 module_exit(nvidiafb_exit);
1887 module_param(flatpanel, int, 0);
1888 MODULE_PARM_DESC(flatpanel,
1889 "Enables experimental flat panel support for some chipsets. "
1890 "(0=disabled, 1=enabled, -1=autodetect) (default=-1)");
1891 module_param(fpdither, int, 0);
1892 MODULE_PARM_DESC(fpdither,
1893 "Enables dithering of flat panel for 6 bits panels. "
1894 "(0=disabled, 1=enabled, -1=autodetect) (default=-1)");
1895 module_param(hwcur, int, 0);
1896 MODULE_PARM_DESC(hwcur,
1897 "Enables hardware cursor implementation. (0 or 1=enabled) "
1898 "(default=0)");
1899 module_param(noaccel, int, 0);
1900 MODULE_PARM_DESC(noaccel,
1901 "Disables hardware acceleration. (0 or 1=disable) "
1902 "(default=0)");
1903 module_param(noscale, int, 0);
1904 MODULE_PARM_DESC(noscale,
1905 "Disables screen scaleing. (0 or 1=disable) "
1906 "(default=0, do scaling)");
1907 module_param(paneltweak, int, 0);
1908 MODULE_PARM_DESC(paneltweak,
1909 "Tweak display settings for flatpanels. "
1910 "(default=0, no tweaks)");
1911 module_param(forceCRTC, int, 0);
1912 MODULE_PARM_DESC(forceCRTC,
1913 "Forces usage of a particular CRTC in case autodetection "
1914 "fails. (0 or 1) (default=autodetect)");
1915 module_param(vram, int, 0);
1916 MODULE_PARM_DESC(vram,
1917 "amount of framebuffer memory to remap in MiB"
1918 "(default=0 - remap entire memory)");
1919 module_param(mode_option, charp, 0);
1920 MODULE_PARM_DESC(mode_option, "Specify initial video mode");
1921 module_param(bpp, int, 0);
1922 MODULE_PARM_DESC(bpp, "pixel width in bits"
1923 "(default=8)");
1924 #ifdef CONFIG_MTRR
1925 module_param(nomtrr, bool, 0);
1926 MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) "
1927 "(default=0)");
1928 #endif
1930 MODULE_AUTHOR("Antonino Daplas");
1931 MODULE_DESCRIPTION("Framebuffer driver for nVidia graphics chipset");
1932 MODULE_LICENSE("GPL");
1933 #endif /* MODULE */