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