2 * linux/drivers/video/nvidia/nvidia.c - nVidia fb driver
4 * Copyright 2004 Antonino Daplas <adaplas@pol.net>
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file COPYING in the main directory of this archive
12 #include <linux/config.h>
13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
16 #include <linux/string.h>
18 #include <linux/tty.h>
19 #include <linux/slab.h>
20 #include <linux/delay.h>
22 #include <linux/init.h>
23 #include <linux/pci.h>
24 #include <linux/console.h>
30 #include <asm/pci-bridge.h>
32 #ifdef CONFIG_PMAC_BACKLIGHT
33 #include <asm/machdep.h>
34 #include <asm/backlight.h>
42 #ifndef CONFIG_PCI /* sanity check */
43 #error This driver requires PCI support.
46 #undef CONFIG_FB_NVIDIA_DEBUG
47 #ifdef CONFIG_FB_NVIDIA_DEBUG
48 #define NVTRACE printk
50 #define NVTRACE if (0) printk
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) \
59 printk( "Assertion failed! %s,%s,%s,line=%d\n",\
60 #expr,__FILE__,__FUNCTION__,__LINE__); \
67 #define PFX "nvidiafb: "
69 /* HW cursor parameters */
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;
439 static int nomtrr __devinitdata
= 0;
442 static char *mode_option __devinitdata
= NULL
;
444 static struct fb_fix_screeninfo __devinitdata nvidiafb_fix
= {
445 .type
= FB_TYPE_PACKED_PIXELS
,
450 static struct fb_var_screeninfo __devinitdata nvidiafb_default_var
= {
460 .activate
= FB_ACTIVATE_NOW
,
470 .vmode
= FB_VMODE_NONINTERLACED
476 #ifdef CONFIG_PMAC_BACKLIGHT
478 static int nvidia_backlight_levels
[] = {
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
)) {
514 tmp_pmc
|= (1 << 31); // backlight bit
515 tmp_pmc
|= nvidia_backlight_levels
[level
- 1] << 16;
519 fpcontrol
|= par
->fpSyncs
;
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
);
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
;
551 for (i
= 0; i
< h
; i
++) {
555 for (j
= 0; j
< w
/ 2; j
++) {
557 #if defined (__BIG_ENDIAN)
558 tmp
= (b
& (1 << 31)) ? fg
<< 16 : bg
<< 16;
560 tmp
|= (b
& (1 << 31)) ? fg
: bg
;
563 tmp
= (b
& 1) ? fg
: bg
;
565 tmp
|= (b
& 1) ? fg
<< 16 : bg
<< 16;
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
)
599 if (par
->paneltweak
) {
600 tweak
= par
->paneltweak
;
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. */
613 if((par
->Chipset
& 0xfff0) == 0x0310) {
616 /* end flat panel hacks */
622 static void nvidia_vga_protect(struct nvidia_par
*par
, int 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 */
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
)
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
);
674 static void nvidia_write_regs(struct nvidia_par
*par
,
675 struct _riva_hw_state
*state
)
681 NVLoadStateExt(par
, state
);
683 NVWriteMiscOut(par
, state
->misc_output
);
685 for (i
= 1; i
< NUM_SEQ_REGS
; i
++) {
687 printk(" SEQ[%02x] = %08x\n", i
, state
->seq
[i
]);
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
++) {
702 printk("CRTC[%02x] = %08x\n", i
, state
->crtc
[i
]);
704 NVWriteCrtc(par
, i
, state
->crtc
[i
]);
708 for (i
= 0; i
< NUM_GRC_REGS
; i
++) {
710 printk(" GRA[%02x] = %08x\n", i
, state
->gra
[i
]);
712 NVWriteGr(par
, i
, state
->gra
[i
]);
715 for (i
= 0; i
< NUM_ATC_REGS
; i
++) {
717 printk("ATTR[%02x] = %08x\n", i
, state
->attr
[i
]);
719 NVWriteAttr(par
, i
, state
->attr
[i
]);
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
)
754 if (par
->FlatPanel
== 1) {
755 v_start
= v_total
- 3;
758 h_start
= h_total
- 5;
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)
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)
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)
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;
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);
817 state
->interlace
= 0xff; /* interlace off */
821 * Calculate the extended registers.
829 if (par
->Architecture
>= NV_ARCH_10
)
830 par
->CURSOR
= (volatile u32 __iomem
*)(info
->screen_base
+
833 if (info
->var
.sync
& FB_SYNC_HOR_HIGH_ACT
)
834 state
->misc_output
&= ~0x40;
836 state
->misc_output
|= 0x40;
837 if (info
->var
.sync
& FB_SYNC_VERT_HIGH_ACT
)
838 state
->misc_output
&= ~0x80;
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;
897 state
->cursorConfig
|= 0x14011000;
898 state
->general
|= (1 << 29);
900 state
->cursorConfig
|= 0x02000000;
903 if ((par
->Chipset
& 0x0ff0) == 0x0110) {
904 state
->dither
= NV_RD32(par
->PRAMDAC
, 0x0528) &
907 state
->dither
|= 0x00010000;
909 state
->dither
= NV_RD32(par
->PRAMDAC
, 0x083C) & ~1;
917 state
->displayV
= info
->var
.xres
;
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
;
928 for (i
= 0; i
< 0x10; 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
;
964 if (cursor
->image
.width
> MAX_CURS
|| cursor
->image
.height
> MAX_CURS
)
967 NVShowHideCursor(par
, 0);
969 if (par
->cursor_reset
) {
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
) {
980 yy
= cursor
->image
.dy
- info
->var
.yoffset
;
981 xx
= cursor
->image
.dx
- info
->var
.xoffset
;
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
;
997 src
= kmalloc(s_pitch
* cursor
->image
.height
, GFP_ATOMIC
);
1000 switch (cursor
->rop
) {
1002 for (i
= 0; i
< s_pitch
* cursor
->image
.height
; i
++)
1003 src
[i
] = dat
[i
] ^ msk
[i
];
1007 for (i
= 0; i
< s_pitch
* cursor
->image
.height
; i
++)
1008 src
[i
] = dat
[i
] & msk
[i
];
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
);
1033 NVShowHideCursor(par
, 1);
1038 static int nvidiafb_set_par(struct fb_info
*info
)
1040 struct nvidia_par
*par
= info
->par
;
1044 NVLockUnlock(par
, 1);
1045 if (!par
->FlatPanel
|| !par
->twoHeads
)
1048 if (par
->FPDither
< 0) {
1049 if ((par
->Chipset
& 0x0ff0) == 0x0110)
1050 par
->FPDither
= !!(NV_RD32(par
->PRAMDAC
, 0x0528)
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 */
1081 VGA_WR08(par
->PCIO
, 0x3d4, 0x46);
1082 tmp
= VGA_RD08(par
->PCIO
, 0x3d5);
1084 VGA_WR08(par
->PCIO
, 0x3d5, tmp
);
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
);
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);
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
;
1123 if (regno
>= (1 << info
->var
.green
.length
))
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
) {
1140 /* "transparent" stuff is completely ignored. */
1141 nvidia_write_clut(par
, regno
, red
>> 8, green
>> 8, blue
>> 8);
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);
1153 for (i
= 0; i
< 8; i
++) {
1154 nvidia_write_clut(par
, regno
* 8 + i
,
1155 red
>> 8, green
>> 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
,
1168 nvidia_write_clut(par
, regno
, red
>> 8, green
>> 8, blue
>> 8);
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;
1188 var
->transp
.offset
= 0;
1189 var
->transp
.length
= 0;
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;
1198 var
->bits_per_pixel
= 32;
1200 switch (var
->bits_per_pixel
) {
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;
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;
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;
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
))
1242 /* calculate modeline if supported by monitor */
1243 if (!mode_valid
&& info
->monspecs
.gtf
) {
1244 if (!fb_get_mode(FB_MAXTIMINGS
, 0, var
, info
))
1249 struct fb_videomode
*mode
;
1251 mode
= fb_find_best_mode(var
, &info
->modelist
);
1253 fb_videomode_to_var(var
, mode
);
1258 if (!mode_valid
&& info
->monspecs
.modedb_len
)
1261 if (par
->fpWidth
&& par
->fpHeight
&& (par
->fpWidth
< var
->xres
||
1262 par
->fpHeight
< var
->yres
))
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
);
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;
1314 static int nvidiafb_pan_display(struct fb_var_screeninfo
*var
,
1315 struct fb_info
*info
)
1317 struct nvidia_par
*par
= info
->par
;
1320 total
= var
->yoffset
* info
->fix
.line_length
+ var
->xoffset
;
1322 NVSetStartAddress(par
, total
);
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 */
1341 case FB_BLANK_UNBLANK
:
1342 case FB_BLANK_NORMAL
:
1344 case FB_BLANK_VSYNC_SUSPEND
:
1347 case FB_BLANK_HSYNC_SUSPEND
:
1350 case FB_BLANK_POWERDOWN
:
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
);
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
,
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
;
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();
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();
1430 #define nvidiafb_suspend NULL
1431 #define nvidiafb_resume NULL
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
;
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
);
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
) {
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
);
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
;
1503 info
->fbops
->fb_cursor
= NULL
;
1505 info
->var
.accel_flags
= (!noaccel
);
1507 switch (par
->Architecture
) {
1509 info
->fix
.accel
= FB_ACCEL_NV4
;
1512 info
->fix
.accel
= FB_ACCEL_NV_10
;
1515 info
->fix
.accel
= FB_ACCEL_NV_20
;
1518 info
->fix
.accel
= FB_ACCEL_NV_30
;
1521 info
->fix
.accel
= FB_ACCEL_NV_40
;
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) {
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
);
1552 static u32 __devinit
nvidia_get_arch(struct fb_info
*info
)
1554 struct nvidia_par
*par
= info
->par
;
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 */
1567 case 0x0200: /* GeForce3 */
1568 case 0x0250: /* GeForce4 Ti */
1569 case 0x0280: /* GeForce4 Ti (8x AGP) */
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 */
1594 case 0x0020: /* TNT, TNT2 */
1597 default: /* unknown architecture */
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
;
1615 info
= framebuffer_alloc(sizeof(struct nvidia_par
), &pd
->dev
);
1623 info
->pixmap
.addr
= kmalloc(8 * 1024, GFP_KERNEL
);
1625 if (info
->pixmap
.addr
== NULL
)
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
;
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
);
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");
1674 sprintf(nvidiafb_fix
.id
, "NV%x", (pd
->device
& 0x0ff0) >> 4);
1676 if (NVCommonSetup(info
))
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);
1691 par
->FbUsableSize
= par
->FbMapSize
- (128 * 1024);
1692 par
->ScratchBufferSize
= (par
->Architecture
< NV_ARCH_10
) ? 8 * 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
;
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");
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",
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
,
1753 iounmap(info
->screen_base
);
1755 fb_destroy_modedb(info
->monspecs
.modedb
);
1756 nvidia_delete_i2c_busses(par
);
1760 pci_release_regions(pd
);
1762 pci_disable_device(pd
);
1764 kfree(info
->pixmap
.addr
);
1766 framebuffer_release(info
);
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
;
1778 unregister_framebuffer(info
);
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
);
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
);
1797 /* ------------------------------------------------------------------------- *
1801 * ------------------------------------------------------------------------- */
1804 static int __devinit
nvidiafb_setup(char *options
)
1809 if (!options
|| !*options
)
1812 while ((this_opt
= strsep(&options
, ",")) != NULL
) {
1813 if (!strncmp(this_opt
, "forceCRTC", 9)) {
1819 forceCRTC
= *p
- '0';
1820 if (forceCRTC
< 0 || forceCRTC
> 1)
1822 } else if (!strncmp(this_opt
, "flatpanel", 9)) {
1824 } else if (!strncmp(this_opt
, "hwcur", 5)) {
1826 } else if (!strncmp(this_opt
, "noaccel", 6)) {
1828 } else if (!strncmp(this_opt
, "noscale", 7)) {
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);
1835 } else if (!strncmp(this_opt
, "nomtrr", 6)) {
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);
1843 mode_option
= this_opt
;
1848 #endif /* !MODULE */
1850 static struct pci_driver nvidiafb_driver
= {
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 /* ------------------------------------------------------------------------- *
1863 * ------------------------------------------------------------------------- */
1865 static int __devinit
nvidiafb_init(void)
1868 char *option
= NULL
;
1870 if (fb_get_options("nvidiafb", &option
))
1872 nvidiafb_setup(option
);
1874 return pci_register_driver(&nvidiafb_driver
);
1877 module_init(nvidiafb_init
);
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) "
1899 module_param(noaccel
, int, 0);
1900 MODULE_PARM_DESC(noaccel
,
1901 "Disables hardware acceleration. (0 or 1=disable) "
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"
1925 module_param(nomtrr
, bool, 0);
1926 MODULE_PARM_DESC(nomtrr
, "Disables MTRR support (0 or 1=disabled) "
1930 MODULE_AUTHOR("Antonino Daplas");
1931 MODULE_DESCRIPTION("Framebuffer driver for nVidia graphics chipset");
1932 MODULE_LICENSE("GPL");