diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_hw.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_hw.c | 435 |
1 files changed, 90 insertions, 345 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_hw.c b/drivers/gpu/drm/nouveau/nouveau_hw.c index 6eabc2ea0c7d..617a06ffdb46 100644 --- a/drivers/gpu/drm/nouveau/nouveau_hw.c +++ b/drivers/gpu/drm/nouveau/nouveau_hw.c | |||
@@ -23,9 +23,13 @@ | |||
23 | */ | 23 | */ |
24 | 24 | ||
25 | #include <drm/drmP.h> | 25 | #include <drm/drmP.h> |
26 | #include "nouveau_drv.h" | 26 | #include "nouveau_drm.h" |
27 | #include "nouveau_hw.h" | 27 | #include "nouveau_hw.h" |
28 | 28 | ||
29 | #include <subdev/bios/pll.h> | ||
30 | #include <subdev/clock.h> | ||
31 | #include <subdev/timer.h> | ||
32 | |||
29 | #define CHIPSET_NFORCE 0x01a0 | 33 | #define CHIPSET_NFORCE 0x01a0 |
30 | #define CHIPSET_NFORCE2 0x01f0 | 34 | #define CHIPSET_NFORCE2 0x01f0 |
31 | 35 | ||
@@ -82,12 +86,12 @@ NVReadVgaGr(struct drm_device *dev, int head, uint8_t index) | |||
82 | void | 86 | void |
83 | NVSetOwner(struct drm_device *dev, int owner) | 87 | NVSetOwner(struct drm_device *dev, int owner) |
84 | { | 88 | { |
85 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 89 | struct nouveau_drm *drm = nouveau_drm(dev); |
86 | 90 | ||
87 | if (owner == 1) | 91 | if (owner == 1) |
88 | owner *= 3; | 92 | owner *= 3; |
89 | 93 | ||
90 | if (dev_priv->chipset == 0x11) { | 94 | if (nv_device(drm->device)->chipset == 0x11) { |
91 | /* This might seem stupid, but the blob does it and | 95 | /* This might seem stupid, but the blob does it and |
92 | * omitting it often locks the system up. | 96 | * omitting it often locks the system up. |
93 | */ | 97 | */ |
@@ -98,7 +102,7 @@ NVSetOwner(struct drm_device *dev, int owner) | |||
98 | /* CR44 is always changed on CRTC0 */ | 102 | /* CR44 is always changed on CRTC0 */ |
99 | NVWriteVgaCrtc(dev, 0, NV_CIO_CRE_44, owner); | 103 | NVWriteVgaCrtc(dev, 0, NV_CIO_CRE_44, owner); |
100 | 104 | ||
101 | if (dev_priv->chipset == 0x11) { /* set me harder */ | 105 | if (nv_device(drm->device)->chipset == 0x11) { /* set me harder */ |
102 | NVWriteVgaCrtc(dev, 0, NV_CIO_CRE_2E, owner); | 106 | NVWriteVgaCrtc(dev, 0, NV_CIO_CRE_2E, owner); |
103 | NVWriteVgaCrtc(dev, 0, NV_CIO_CRE_2E, owner); | 107 | NVWriteVgaCrtc(dev, 0, NV_CIO_CRE_2E, owner); |
104 | } | 108 | } |
@@ -123,270 +127,6 @@ NVBlankScreen(struct drm_device *dev, int head, bool blank) | |||
123 | } | 127 | } |
124 | 128 | ||
125 | /* | 129 | /* |
126 | * PLL setting | ||
127 | */ | ||
128 | |||
129 | static int | ||
130 | powerctrl_1_shift(int chip_version, int reg) | ||
131 | { | ||
132 | int shift = -4; | ||
133 | |||
134 | if (chip_version < 0x17 || chip_version == 0x1a || chip_version == 0x20) | ||
135 | return shift; | ||
136 | |||
137 | switch (reg) { | ||
138 | case NV_RAMDAC_VPLL2: | ||
139 | shift += 4; | ||
140 | case NV_PRAMDAC_VPLL_COEFF: | ||
141 | shift += 4; | ||
142 | case NV_PRAMDAC_MPLL_COEFF: | ||
143 | shift += 4; | ||
144 | case NV_PRAMDAC_NVPLL_COEFF: | ||
145 | shift += 4; | ||
146 | } | ||
147 | |||
148 | /* | ||
149 | * the shift for vpll regs is only used for nv3x chips with a single | ||
150 | * stage pll | ||
151 | */ | ||
152 | if (shift > 4 && (chip_version < 0x32 || chip_version == 0x35 || | ||
153 | chip_version == 0x36 || chip_version >= 0x40)) | ||
154 | shift = -4; | ||
155 | |||
156 | return shift; | ||
157 | } | ||
158 | |||
159 | static void | ||
160 | setPLL_single(struct drm_device *dev, uint32_t reg, struct nouveau_pll_vals *pv) | ||
161 | { | ||
162 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
163 | int chip_version = dev_priv->vbios.chip_version; | ||
164 | uint32_t oldpll = NVReadRAMDAC(dev, 0, reg); | ||
165 | int oldN = (oldpll >> 8) & 0xff, oldM = oldpll & 0xff; | ||
166 | uint32_t pll = (oldpll & 0xfff80000) | pv->log2P << 16 | pv->NM1; | ||
167 | uint32_t saved_powerctrl_1 = 0; | ||
168 | int shift_powerctrl_1 = powerctrl_1_shift(chip_version, reg); | ||
169 | |||
170 | if (oldpll == pll) | ||
171 | return; /* already set */ | ||
172 | |||
173 | if (shift_powerctrl_1 >= 0) { | ||
174 | saved_powerctrl_1 = nvReadMC(dev, NV_PBUS_POWERCTRL_1); | ||
175 | nvWriteMC(dev, NV_PBUS_POWERCTRL_1, | ||
176 | (saved_powerctrl_1 & ~(0xf << shift_powerctrl_1)) | | ||
177 | 1 << shift_powerctrl_1); | ||
178 | } | ||
179 | |||
180 | if (oldM && pv->M1 && (oldN / oldM < pv->N1 / pv->M1)) | ||
181 | /* upclock -- write new post divider first */ | ||
182 | NVWriteRAMDAC(dev, 0, reg, pv->log2P << 16 | (oldpll & 0xffff)); | ||
183 | else | ||
184 | /* downclock -- write new NM first */ | ||
185 | NVWriteRAMDAC(dev, 0, reg, (oldpll & 0xffff0000) | pv->NM1); | ||
186 | |||
187 | if (chip_version < 0x17 && chip_version != 0x11) | ||
188 | /* wait a bit on older chips */ | ||
189 | msleep(64); | ||
190 | NVReadRAMDAC(dev, 0, reg); | ||
191 | |||
192 | /* then write the other half as well */ | ||
193 | NVWriteRAMDAC(dev, 0, reg, pll); | ||
194 | |||
195 | if (shift_powerctrl_1 >= 0) | ||
196 | nvWriteMC(dev, NV_PBUS_POWERCTRL_1, saved_powerctrl_1); | ||
197 | } | ||
198 | |||
199 | static uint32_t | ||
200 | new_ramdac580(uint32_t reg1, bool ss, uint32_t ramdac580) | ||
201 | { | ||
202 | bool head_a = (reg1 == NV_PRAMDAC_VPLL_COEFF); | ||
203 | |||
204 | if (ss) /* single stage pll mode */ | ||
205 | ramdac580 |= head_a ? NV_RAMDAC_580_VPLL1_ACTIVE : | ||
206 | NV_RAMDAC_580_VPLL2_ACTIVE; | ||
207 | else | ||
208 | ramdac580 &= head_a ? ~NV_RAMDAC_580_VPLL1_ACTIVE : | ||
209 | ~NV_RAMDAC_580_VPLL2_ACTIVE; | ||
210 | |||
211 | return ramdac580; | ||
212 | } | ||
213 | |||
214 | static void | ||
215 | setPLL_double_highregs(struct drm_device *dev, uint32_t reg1, | ||
216 | struct nouveau_pll_vals *pv) | ||
217 | { | ||
218 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
219 | int chip_version = dev_priv->vbios.chip_version; | ||
220 | bool nv3035 = chip_version == 0x30 || chip_version == 0x35; | ||
221 | uint32_t reg2 = reg1 + ((reg1 == NV_RAMDAC_VPLL2) ? 0x5c : 0x70); | ||
222 | uint32_t oldpll1 = NVReadRAMDAC(dev, 0, reg1); | ||
223 | uint32_t oldpll2 = !nv3035 ? NVReadRAMDAC(dev, 0, reg2) : 0; | ||
224 | uint32_t pll1 = (oldpll1 & 0xfff80000) | pv->log2P << 16 | pv->NM1; | ||
225 | uint32_t pll2 = (oldpll2 & 0x7fff0000) | 1 << 31 | pv->NM2; | ||
226 | uint32_t oldramdac580 = 0, ramdac580 = 0; | ||
227 | bool single_stage = !pv->NM2 || pv->N2 == pv->M2; /* nv41+ only */ | ||
228 | uint32_t saved_powerctrl_1 = 0, savedc040 = 0; | ||
229 | int shift_powerctrl_1 = powerctrl_1_shift(chip_version, reg1); | ||
230 | |||
231 | /* model specific additions to generic pll1 and pll2 set up above */ | ||
232 | if (nv3035) { | ||
233 | pll1 = (pll1 & 0xfcc7ffff) | (pv->N2 & 0x18) << 21 | | ||
234 | (pv->N2 & 0x7) << 19 | 8 << 4 | (pv->M2 & 7) << 4; | ||
235 | pll2 = 0; | ||
236 | } | ||
237 | if (chip_version > 0x40 && reg1 >= NV_PRAMDAC_VPLL_COEFF) { /* !nv40 */ | ||
238 | oldramdac580 = NVReadRAMDAC(dev, 0, NV_PRAMDAC_580); | ||
239 | ramdac580 = new_ramdac580(reg1, single_stage, oldramdac580); | ||
240 | if (oldramdac580 != ramdac580) | ||
241 | oldpll1 = ~0; /* force mismatch */ | ||
242 | if (single_stage) | ||
243 | /* magic value used by nvidia in single stage mode */ | ||
244 | pll2 |= 0x011f; | ||
245 | } | ||
246 | if (chip_version > 0x70) | ||
247 | /* magic bits set by the blob (but not the bios) on g71-73 */ | ||
248 | pll1 = (pll1 & 0x7fffffff) | (single_stage ? 0x4 : 0xc) << 28; | ||
249 | |||
250 | if (oldpll1 == pll1 && oldpll2 == pll2) | ||
251 | return; /* already set */ | ||
252 | |||
253 | if (shift_powerctrl_1 >= 0) { | ||
254 | saved_powerctrl_1 = nvReadMC(dev, NV_PBUS_POWERCTRL_1); | ||
255 | nvWriteMC(dev, NV_PBUS_POWERCTRL_1, | ||
256 | (saved_powerctrl_1 & ~(0xf << shift_powerctrl_1)) | | ||
257 | 1 << shift_powerctrl_1); | ||
258 | } | ||
259 | |||
260 | if (chip_version >= 0x40) { | ||
261 | int shift_c040 = 14; | ||
262 | |||
263 | switch (reg1) { | ||
264 | case NV_PRAMDAC_MPLL_COEFF: | ||
265 | shift_c040 += 2; | ||
266 | case NV_PRAMDAC_NVPLL_COEFF: | ||
267 | shift_c040 += 2; | ||
268 | case NV_RAMDAC_VPLL2: | ||
269 | shift_c040 += 2; | ||
270 | case NV_PRAMDAC_VPLL_COEFF: | ||
271 | shift_c040 += 2; | ||
272 | } | ||
273 | |||
274 | savedc040 = nvReadMC(dev, 0xc040); | ||
275 | if (shift_c040 != 14) | ||
276 | nvWriteMC(dev, 0xc040, savedc040 & ~(3 << shift_c040)); | ||
277 | } | ||
278 | |||
279 | if (oldramdac580 != ramdac580) | ||
280 | NVWriteRAMDAC(dev, 0, NV_PRAMDAC_580, ramdac580); | ||
281 | |||
282 | if (!nv3035) | ||
283 | NVWriteRAMDAC(dev, 0, reg2, pll2); | ||
284 | NVWriteRAMDAC(dev, 0, reg1, pll1); | ||
285 | |||
286 | if (shift_powerctrl_1 >= 0) | ||
287 | nvWriteMC(dev, NV_PBUS_POWERCTRL_1, saved_powerctrl_1); | ||
288 | if (chip_version >= 0x40) | ||
289 | nvWriteMC(dev, 0xc040, savedc040); | ||
290 | } | ||
291 | |||
292 | static void | ||
293 | setPLL_double_lowregs(struct drm_device *dev, uint32_t NMNMreg, | ||
294 | struct nouveau_pll_vals *pv) | ||
295 | { | ||
296 | /* When setting PLLs, there is a merry game of disabling and enabling | ||
297 | * various bits of hardware during the process. This function is a | ||
298 | * synthesis of six nv4x traces, nearly each card doing a subtly | ||
299 | * different thing. With luck all the necessary bits for each card are | ||
300 | * combined herein. Without luck it deviates from each card's formula | ||
301 | * so as to not work on any :) | ||
302 | */ | ||
303 | |||
304 | uint32_t Preg = NMNMreg - 4; | ||
305 | bool mpll = Preg == 0x4020; | ||
306 | uint32_t oldPval = nvReadMC(dev, Preg); | ||
307 | uint32_t NMNM = pv->NM2 << 16 | pv->NM1; | ||
308 | uint32_t Pval = (oldPval & (mpll ? ~(0x77 << 16) : ~(7 << 16))) | | ||
309 | 0xc << 28 | pv->log2P << 16; | ||
310 | uint32_t saved4600 = 0; | ||
311 | /* some cards have different maskc040s */ | ||
312 | uint32_t maskc040 = ~(3 << 14), savedc040; | ||
313 | bool single_stage = !pv->NM2 || pv->N2 == pv->M2; | ||
314 | |||
315 | if (nvReadMC(dev, NMNMreg) == NMNM && (oldPval & 0xc0070000) == Pval) | ||
316 | return; | ||
317 | |||
318 | if (Preg == 0x4000) | ||
319 | maskc040 = ~0x333; | ||
320 | if (Preg == 0x4058) | ||
321 | maskc040 = ~(0xc << 24); | ||
322 | |||
323 | if (mpll) { | ||
324 | struct pll_lims pll_lim; | ||
325 | uint8_t Pval2; | ||
326 | |||
327 | if (get_pll_limits(dev, Preg, &pll_lim)) | ||
328 | return; | ||
329 | |||
330 | Pval2 = pv->log2P + pll_lim.log2p_bias; | ||
331 | if (Pval2 > pll_lim.max_log2p) | ||
332 | Pval2 = pll_lim.max_log2p; | ||
333 | Pval |= 1 << 28 | Pval2 << 20; | ||
334 | |||
335 | saved4600 = nvReadMC(dev, 0x4600); | ||
336 | nvWriteMC(dev, 0x4600, saved4600 | 8 << 28); | ||
337 | } | ||
338 | if (single_stage) | ||
339 | Pval |= mpll ? 1 << 12 : 1 << 8; | ||
340 | |||
341 | nvWriteMC(dev, Preg, oldPval | 1 << 28); | ||
342 | nvWriteMC(dev, Preg, Pval & ~(4 << 28)); | ||
343 | if (mpll) { | ||
344 | Pval |= 8 << 20; | ||
345 | nvWriteMC(dev, 0x4020, Pval & ~(0xc << 28)); | ||
346 | nvWriteMC(dev, 0x4038, Pval & ~(0xc << 28)); | ||
347 | } | ||
348 | |||
349 | savedc040 = nvReadMC(dev, 0xc040); | ||
350 | nvWriteMC(dev, 0xc040, savedc040 & maskc040); | ||
351 | |||
352 | nvWriteMC(dev, NMNMreg, NMNM); | ||
353 | if (NMNMreg == 0x4024) | ||
354 | nvWriteMC(dev, 0x403c, NMNM); | ||
355 | |||
356 | nvWriteMC(dev, Preg, Pval); | ||
357 | if (mpll) { | ||
358 | Pval &= ~(8 << 20); | ||
359 | nvWriteMC(dev, 0x4020, Pval); | ||
360 | nvWriteMC(dev, 0x4038, Pval); | ||
361 | nvWriteMC(dev, 0x4600, saved4600); | ||
362 | } | ||
363 | |||
364 | nvWriteMC(dev, 0xc040, savedc040); | ||
365 | |||
366 | if (mpll) { | ||
367 | nvWriteMC(dev, 0x4020, Pval & ~(1 << 28)); | ||
368 | nvWriteMC(dev, 0x4038, Pval & ~(1 << 28)); | ||
369 | } | ||
370 | } | ||
371 | |||
372 | void | ||
373 | nouveau_hw_setpll(struct drm_device *dev, uint32_t reg1, | ||
374 | struct nouveau_pll_vals *pv) | ||
375 | { | ||
376 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
377 | int cv = dev_priv->vbios.chip_version; | ||
378 | |||
379 | if (cv == 0x30 || cv == 0x31 || cv == 0x35 || cv == 0x36 || | ||
380 | cv >= 0x40) { | ||
381 | if (reg1 > 0x405c) | ||
382 | setPLL_double_highregs(dev, reg1, pv); | ||
383 | else | ||
384 | setPLL_double_lowregs(dev, reg1, pv); | ||
385 | } else | ||
386 | setPLL_single(dev, reg1, pv); | ||
387 | } | ||
388 | |||
389 | /* | ||
390 | * PLL getting | 130 | * PLL getting |
391 | */ | 131 | */ |
392 | 132 | ||
@@ -394,7 +134,7 @@ static void | |||
394 | nouveau_hw_decode_pll(struct drm_device *dev, uint32_t reg1, uint32_t pll1, | 134 | nouveau_hw_decode_pll(struct drm_device *dev, uint32_t reg1, uint32_t pll1, |
395 | uint32_t pll2, struct nouveau_pll_vals *pllvals) | 135 | uint32_t pll2, struct nouveau_pll_vals *pllvals) |
396 | { | 136 | { |
397 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 137 | struct nouveau_drm *drm = nouveau_drm(dev); |
398 | 138 | ||
399 | /* to force parsing as single stage (i.e. nv40 vplls) pass pll2 as 0 */ | 139 | /* to force parsing as single stage (i.e. nv40 vplls) pass pll2 as 0 */ |
400 | 140 | ||
@@ -411,7 +151,7 @@ nouveau_hw_decode_pll(struct drm_device *dev, uint32_t reg1, uint32_t pll1, | |||
411 | pllvals->NM1 = pll1 & 0xffff; | 151 | pllvals->NM1 = pll1 & 0xffff; |
412 | if (nv_two_reg_pll(dev) && pll2 & NV31_RAMDAC_ENABLE_VCO2) | 152 | if (nv_two_reg_pll(dev) && pll2 & NV31_RAMDAC_ENABLE_VCO2) |
413 | pllvals->NM2 = pll2 & 0xffff; | 153 | pllvals->NM2 = pll2 & 0xffff; |
414 | else if (dev_priv->chipset == 0x30 || dev_priv->chipset == 0x35) { | 154 | else if (nv_device(drm->device)->chipset == 0x30 || nv_device(drm->device)->chipset == 0x35) { |
415 | pllvals->M1 &= 0xf; /* only 4 bits */ | 155 | pllvals->M1 &= 0xf; /* only 4 bits */ |
416 | if (pll1 & NV30_RAMDAC_ENABLE_VCO2) { | 156 | if (pll1 & NV30_RAMDAC_ENABLE_VCO2) { |
417 | pllvals->M2 = (pll1 >> 4) & 0x7; | 157 | pllvals->M2 = (pll1 >> 4) & 0x7; |
@@ -423,28 +163,30 @@ nouveau_hw_decode_pll(struct drm_device *dev, uint32_t reg1, uint32_t pll1, | |||
423 | } | 163 | } |
424 | 164 | ||
425 | int | 165 | int |
426 | nouveau_hw_get_pllvals(struct drm_device *dev, enum pll_types plltype, | 166 | nouveau_hw_get_pllvals(struct drm_device *dev, enum nvbios_pll_type plltype, |
427 | struct nouveau_pll_vals *pllvals) | 167 | struct nouveau_pll_vals *pllvals) |
428 | { | 168 | { |
429 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 169 | struct nouveau_drm *drm = nouveau_drm(dev); |
430 | uint32_t reg1 = get_pll_register(dev, plltype), pll1, pll2 = 0; | 170 | struct nouveau_device *device = nv_device(drm->device); |
431 | struct pll_lims pll_lim; | 171 | struct nouveau_bios *bios = nouveau_bios(device); |
172 | uint32_t reg1, pll1, pll2 = 0; | ||
173 | struct nvbios_pll pll_lim; | ||
432 | int ret; | 174 | int ret; |
433 | 175 | ||
434 | if (reg1 == 0) | 176 | ret = nvbios_pll_parse(bios, plltype, &pll_lim); |
177 | if (ret || !(reg1 = pll_lim.reg)) | ||
435 | return -ENOENT; | 178 | return -ENOENT; |
436 | 179 | ||
437 | pll1 = nvReadMC(dev, reg1); | 180 | pll1 = nv_rd32(device, reg1); |
438 | |||
439 | if (reg1 <= 0x405c) | 181 | if (reg1 <= 0x405c) |
440 | pll2 = nvReadMC(dev, reg1 + 4); | 182 | pll2 = nv_rd32(device, reg1 + 4); |
441 | else if (nv_two_reg_pll(dev)) { | 183 | else if (nv_two_reg_pll(dev)) { |
442 | uint32_t reg2 = reg1 + (reg1 == NV_RAMDAC_VPLL2 ? 0x5c : 0x70); | 184 | uint32_t reg2 = reg1 + (reg1 == NV_RAMDAC_VPLL2 ? 0x5c : 0x70); |
443 | 185 | ||
444 | pll2 = nvReadMC(dev, reg2); | 186 | pll2 = nv_rd32(device, reg2); |
445 | } | 187 | } |
446 | 188 | ||
447 | if (dev_priv->card_type == 0x40 && reg1 >= NV_PRAMDAC_VPLL_COEFF) { | 189 | if (nv_device(drm->device)->card_type == 0x40 && reg1 >= NV_PRAMDAC_VPLL_COEFF) { |
448 | uint32_t ramdac580 = NVReadRAMDAC(dev, 0, NV_PRAMDAC_580); | 190 | uint32_t ramdac580 = NVReadRAMDAC(dev, 0, NV_PRAMDAC_580); |
449 | 191 | ||
450 | /* check whether vpll has been forced into single stage mode */ | 192 | /* check whether vpll has been forced into single stage mode */ |
@@ -457,13 +199,7 @@ nouveau_hw_get_pllvals(struct drm_device *dev, enum pll_types plltype, | |||
457 | } | 199 | } |
458 | 200 | ||
459 | nouveau_hw_decode_pll(dev, reg1, pll1, pll2, pllvals); | 201 | nouveau_hw_decode_pll(dev, reg1, pll1, pll2, pllvals); |
460 | |||
461 | ret = get_pll_limits(dev, plltype, &pll_lim); | ||
462 | if (ret) | ||
463 | return ret; | ||
464 | |||
465 | pllvals->refclk = pll_lim.refclk; | 202 | pllvals->refclk = pll_lim.refclk; |
466 | |||
467 | return 0; | 203 | return 0; |
468 | } | 204 | } |
469 | 205 | ||
@@ -478,7 +214,7 @@ nouveau_hw_pllvals_to_clk(struct nouveau_pll_vals *pv) | |||
478 | } | 214 | } |
479 | 215 | ||
480 | int | 216 | int |
481 | nouveau_hw_get_clock(struct drm_device *dev, enum pll_types plltype) | 217 | nouveau_hw_get_clock(struct drm_device *dev, enum nvbios_pll_type plltype) |
482 | { | 218 | { |
483 | struct nouveau_pll_vals pllvals; | 219 | struct nouveau_pll_vals pllvals; |
484 | int ret; | 220 | int ret; |
@@ -517,26 +253,30 @@ nouveau_hw_fix_bad_vpll(struct drm_device *dev, int head) | |||
517 | * when such a condition detected. only seen on nv11 to date | 253 | * when such a condition detected. only seen on nv11 to date |
518 | */ | 254 | */ |
519 | 255 | ||
520 | struct pll_lims pll_lim; | 256 | struct nouveau_drm *drm = nouveau_drm(dev); |
257 | struct nouveau_device *device = nv_device(drm->device); | ||
258 | struct nouveau_clock *clk = nouveau_clock(device); | ||
259 | struct nouveau_bios *bios = nouveau_bios(device); | ||
260 | struct nvbios_pll pll_lim; | ||
521 | struct nouveau_pll_vals pv; | 261 | struct nouveau_pll_vals pv; |
522 | enum pll_types pll = head ? PLL_VPLL1 : PLL_VPLL0; | 262 | enum nvbios_pll_type pll = head ? PLL_VPLL1 : PLL_VPLL0; |
523 | 263 | ||
524 | if (get_pll_limits(dev, pll, &pll_lim)) | 264 | if (nvbios_pll_parse(bios, pll, &pll_lim)) |
525 | return; | 265 | return; |
526 | nouveau_hw_get_pllvals(dev, pll, &pv); | 266 | nouveau_hw_get_pllvals(dev, pll, &pv); |
527 | 267 | ||
528 | if (pv.M1 >= pll_lim.vco1.min_m && pv.M1 <= pll_lim.vco1.max_m && | 268 | if (pv.M1 >= pll_lim.vco1.min_m && pv.M1 <= pll_lim.vco1.max_m && |
529 | pv.N1 >= pll_lim.vco1.min_n && pv.N1 <= pll_lim.vco1.max_n && | 269 | pv.N1 >= pll_lim.vco1.min_n && pv.N1 <= pll_lim.vco1.max_n && |
530 | pv.log2P <= pll_lim.max_log2p) | 270 | pv.log2P <= pll_lim.max_p) |
531 | return; | 271 | return; |
532 | 272 | ||
533 | NV_WARN(dev, "VPLL %d outwith limits, attempting to fix\n", head + 1); | 273 | NV_WARN(drm, "VPLL %d outwith limits, attempting to fix\n", head + 1); |
534 | 274 | ||
535 | /* set lowest clock within static limits */ | 275 | /* set lowest clock within static limits */ |
536 | pv.M1 = pll_lim.vco1.max_m; | 276 | pv.M1 = pll_lim.vco1.max_m; |
537 | pv.N1 = pll_lim.vco1.min_n; | 277 | pv.N1 = pll_lim.vco1.min_n; |
538 | pv.log2P = pll_lim.max_usable_log2p; | 278 | pv.log2P = pll_lim.max_p_usable; |
539 | nouveau_hw_setpll(dev, pll_lim.reg, &pv); | 279 | clk->pll_prog(clk, pll_lim.reg, &pv); |
540 | } | 280 | } |
541 | 281 | ||
542 | /* | 282 | /* |
@@ -547,17 +287,16 @@ static void nouveau_vga_font_io(struct drm_device *dev, | |||
547 | void __iomem *iovram, | 287 | void __iomem *iovram, |
548 | bool save, unsigned plane) | 288 | bool save, unsigned plane) |
549 | { | 289 | { |
550 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
551 | unsigned i; | 290 | unsigned i; |
552 | 291 | ||
553 | NVWriteVgaSeq(dev, 0, NV_VIO_SR_PLANE_MASK_INDEX, 1 << plane); | 292 | NVWriteVgaSeq(dev, 0, NV_VIO_SR_PLANE_MASK_INDEX, 1 << plane); |
554 | NVWriteVgaGr(dev, 0, NV_VIO_GX_READ_MAP_INDEX, plane); | 293 | NVWriteVgaGr(dev, 0, NV_VIO_GX_READ_MAP_INDEX, plane); |
555 | for (i = 0; i < 16384; i++) { | 294 | for (i = 0; i < 16384; i++) { |
556 | if (save) { | 295 | if (save) { |
557 | dev_priv->saved_vga_font[plane][i] = | 296 | nv04_display(dev)->saved_vga_font[plane][i] = |
558 | ioread32_native(iovram + i * 4); | 297 | ioread32_native(iovram + i * 4); |
559 | } else { | 298 | } else { |
560 | iowrite32_native(dev_priv->saved_vga_font[plane][i], | 299 | iowrite32_native(nv04_display(dev)->saved_vga_font[plane][i], |
561 | iovram + i * 4); | 300 | iovram + i * 4); |
562 | } | 301 | } |
563 | } | 302 | } |
@@ -566,6 +305,7 @@ static void nouveau_vga_font_io(struct drm_device *dev, | |||
566 | void | 305 | void |
567 | nouveau_hw_save_vga_fonts(struct drm_device *dev, bool save) | 306 | nouveau_hw_save_vga_fonts(struct drm_device *dev, bool save) |
568 | { | 307 | { |
308 | struct nouveau_drm *drm = nouveau_drm(dev); | ||
569 | uint8_t misc, gr4, gr5, gr6, seq2, seq4; | 309 | uint8_t misc, gr4, gr5, gr6, seq2, seq4; |
570 | bool graphicsmode; | 310 | bool graphicsmode; |
571 | unsigned plane; | 311 | unsigned plane; |
@@ -581,12 +321,12 @@ nouveau_hw_save_vga_fonts(struct drm_device *dev, bool save) | |||
581 | if (graphicsmode) /* graphics mode => framebuffer => no need to save */ | 321 | if (graphicsmode) /* graphics mode => framebuffer => no need to save */ |
582 | return; | 322 | return; |
583 | 323 | ||
584 | NV_INFO(dev, "%sing VGA fonts\n", save ? "Sav" : "Restor"); | 324 | NV_INFO(drm, "%sing VGA fonts\n", save ? "Sav" : "Restor"); |
585 | 325 | ||
586 | /* map first 64KiB of VRAM, holds VGA fonts etc */ | 326 | /* map first 64KiB of VRAM, holds VGA fonts etc */ |
587 | iovram = ioremap(pci_resource_start(dev->pdev, 1), 65536); | 327 | iovram = ioremap(pci_resource_start(dev->pdev, 1), 65536); |
588 | if (!iovram) { | 328 | if (!iovram) { |
589 | NV_ERROR(dev, "Failed to map VRAM, " | 329 | NV_ERROR(drm, "Failed to map VRAM, " |
590 | "cannot save/restore VGA fonts.\n"); | 330 | "cannot save/restore VGA fonts.\n"); |
591 | return; | 331 | return; |
592 | } | 332 | } |
@@ -649,25 +389,25 @@ static void | |||
649 | nv_save_state_ramdac(struct drm_device *dev, int head, | 389 | nv_save_state_ramdac(struct drm_device *dev, int head, |
650 | struct nv04_mode_state *state) | 390 | struct nv04_mode_state *state) |
651 | { | 391 | { |
652 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 392 | struct nouveau_drm *drm = nouveau_drm(dev); |
653 | struct nv04_crtc_reg *regp = &state->crtc_reg[head]; | 393 | struct nv04_crtc_reg *regp = &state->crtc_reg[head]; |
654 | int i; | 394 | int i; |
655 | 395 | ||
656 | if (dev_priv->card_type >= NV_10) | 396 | if (nv_device(drm->device)->card_type >= NV_10) |
657 | regp->nv10_cursync = NVReadRAMDAC(dev, head, NV_RAMDAC_NV10_CURSYNC); | 397 | regp->nv10_cursync = NVReadRAMDAC(dev, head, NV_RAMDAC_NV10_CURSYNC); |
658 | 398 | ||
659 | nouveau_hw_get_pllvals(dev, head ? PLL_VPLL1 : PLL_VPLL0, ®p->pllvals); | 399 | nouveau_hw_get_pllvals(dev, head ? PLL_VPLL1 : PLL_VPLL0, ®p->pllvals); |
660 | state->pllsel = NVReadRAMDAC(dev, 0, NV_PRAMDAC_PLL_COEFF_SELECT); | 400 | state->pllsel = NVReadRAMDAC(dev, 0, NV_PRAMDAC_PLL_COEFF_SELECT); |
661 | if (nv_two_heads(dev)) | 401 | if (nv_two_heads(dev)) |
662 | state->sel_clk = NVReadRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK); | 402 | state->sel_clk = NVReadRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK); |
663 | if (dev_priv->chipset == 0x11) | 403 | if (nv_device(drm->device)->chipset == 0x11) |
664 | regp->dither = NVReadRAMDAC(dev, head, NV_RAMDAC_DITHER_NV11); | 404 | regp->dither = NVReadRAMDAC(dev, head, NV_RAMDAC_DITHER_NV11); |
665 | 405 | ||
666 | regp->ramdac_gen_ctrl = NVReadRAMDAC(dev, head, NV_PRAMDAC_GENERAL_CONTROL); | 406 | regp->ramdac_gen_ctrl = NVReadRAMDAC(dev, head, NV_PRAMDAC_GENERAL_CONTROL); |
667 | 407 | ||
668 | if (nv_gf4_disp_arch(dev)) | 408 | if (nv_gf4_disp_arch(dev)) |
669 | regp->ramdac_630 = NVReadRAMDAC(dev, head, NV_PRAMDAC_630); | 409 | regp->ramdac_630 = NVReadRAMDAC(dev, head, NV_PRAMDAC_630); |
670 | if (dev_priv->chipset >= 0x30) | 410 | if (nv_device(drm->device)->chipset >= 0x30) |
671 | regp->ramdac_634 = NVReadRAMDAC(dev, head, NV_PRAMDAC_634); | 411 | regp->ramdac_634 = NVReadRAMDAC(dev, head, NV_PRAMDAC_634); |
672 | 412 | ||
673 | regp->tv_setup = NVReadRAMDAC(dev, head, NV_PRAMDAC_TV_SETUP); | 413 | regp->tv_setup = NVReadRAMDAC(dev, head, NV_PRAMDAC_TV_SETUP); |
@@ -709,7 +449,7 @@ nv_save_state_ramdac(struct drm_device *dev, int head, | |||
709 | if (nv_gf4_disp_arch(dev)) | 449 | if (nv_gf4_disp_arch(dev)) |
710 | regp->ramdac_8c0 = NVReadRAMDAC(dev, head, NV_PRAMDAC_8C0); | 450 | regp->ramdac_8c0 = NVReadRAMDAC(dev, head, NV_PRAMDAC_8C0); |
711 | 451 | ||
712 | if (dev_priv->card_type == NV_40) { | 452 | if (nv_device(drm->device)->card_type == NV_40) { |
713 | regp->ramdac_a20 = NVReadRAMDAC(dev, head, NV_PRAMDAC_A20); | 453 | regp->ramdac_a20 = NVReadRAMDAC(dev, head, NV_PRAMDAC_A20); |
714 | regp->ramdac_a24 = NVReadRAMDAC(dev, head, NV_PRAMDAC_A24); | 454 | regp->ramdac_a24 = NVReadRAMDAC(dev, head, NV_PRAMDAC_A24); |
715 | regp->ramdac_a34 = NVReadRAMDAC(dev, head, NV_PRAMDAC_A34); | 455 | regp->ramdac_a34 = NVReadRAMDAC(dev, head, NV_PRAMDAC_A34); |
@@ -724,26 +464,27 @@ static void | |||
724 | nv_load_state_ramdac(struct drm_device *dev, int head, | 464 | nv_load_state_ramdac(struct drm_device *dev, int head, |
725 | struct nv04_mode_state *state) | 465 | struct nv04_mode_state *state) |
726 | { | 466 | { |
727 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 467 | struct nouveau_drm *drm = nouveau_drm(dev); |
468 | struct nouveau_clock *clk = nouveau_clock(drm->device); | ||
728 | struct nv04_crtc_reg *regp = &state->crtc_reg[head]; | 469 | struct nv04_crtc_reg *regp = &state->crtc_reg[head]; |
729 | uint32_t pllreg = head ? NV_RAMDAC_VPLL2 : NV_PRAMDAC_VPLL_COEFF; | 470 | uint32_t pllreg = head ? NV_RAMDAC_VPLL2 : NV_PRAMDAC_VPLL_COEFF; |
730 | int i; | 471 | int i; |
731 | 472 | ||
732 | if (dev_priv->card_type >= NV_10) | 473 | if (nv_device(drm->device)->card_type >= NV_10) |
733 | NVWriteRAMDAC(dev, head, NV_RAMDAC_NV10_CURSYNC, regp->nv10_cursync); | 474 | NVWriteRAMDAC(dev, head, NV_RAMDAC_NV10_CURSYNC, regp->nv10_cursync); |
734 | 475 | ||
735 | nouveau_hw_setpll(dev, pllreg, ®p->pllvals); | 476 | clk->pll_prog(clk, pllreg, ®p->pllvals); |
736 | NVWriteRAMDAC(dev, 0, NV_PRAMDAC_PLL_COEFF_SELECT, state->pllsel); | 477 | NVWriteRAMDAC(dev, 0, NV_PRAMDAC_PLL_COEFF_SELECT, state->pllsel); |
737 | if (nv_two_heads(dev)) | 478 | if (nv_two_heads(dev)) |
738 | NVWriteRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK, state->sel_clk); | 479 | NVWriteRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK, state->sel_clk); |
739 | if (dev_priv->chipset == 0x11) | 480 | if (nv_device(drm->device)->chipset == 0x11) |
740 | NVWriteRAMDAC(dev, head, NV_RAMDAC_DITHER_NV11, regp->dither); | 481 | NVWriteRAMDAC(dev, head, NV_RAMDAC_DITHER_NV11, regp->dither); |
741 | 482 | ||
742 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_GENERAL_CONTROL, regp->ramdac_gen_ctrl); | 483 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_GENERAL_CONTROL, regp->ramdac_gen_ctrl); |
743 | 484 | ||
744 | if (nv_gf4_disp_arch(dev)) | 485 | if (nv_gf4_disp_arch(dev)) |
745 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_630, regp->ramdac_630); | 486 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_630, regp->ramdac_630); |
746 | if (dev_priv->chipset >= 0x30) | 487 | if (nv_device(drm->device)->chipset >= 0x30) |
747 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_634, regp->ramdac_634); | 488 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_634, regp->ramdac_634); |
748 | 489 | ||
749 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_TV_SETUP, regp->tv_setup); | 490 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_TV_SETUP, regp->tv_setup); |
@@ -780,7 +521,7 @@ nv_load_state_ramdac(struct drm_device *dev, int head, | |||
780 | if (nv_gf4_disp_arch(dev)) | 521 | if (nv_gf4_disp_arch(dev)) |
781 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_8C0, regp->ramdac_8c0); | 522 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_8C0, regp->ramdac_8c0); |
782 | 523 | ||
783 | if (dev_priv->card_type == NV_40) { | 524 | if (nv_device(drm->device)->card_type == NV_40) { |
784 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_A20, regp->ramdac_a20); | 525 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_A20, regp->ramdac_a20); |
785 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_A24, regp->ramdac_a24); | 526 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_A24, regp->ramdac_a24); |
786 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_A34, regp->ramdac_a34); | 527 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_A34, regp->ramdac_a34); |
@@ -845,7 +586,7 @@ static void | |||
845 | nv_save_state_ext(struct drm_device *dev, int head, | 586 | nv_save_state_ext(struct drm_device *dev, int head, |
846 | struct nv04_mode_state *state) | 587 | struct nv04_mode_state *state) |
847 | { | 588 | { |
848 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 589 | struct nouveau_drm *drm = nouveau_drm(dev); |
849 | struct nv04_crtc_reg *regp = &state->crtc_reg[head]; | 590 | struct nv04_crtc_reg *regp = &state->crtc_reg[head]; |
850 | int i; | 591 | int i; |
851 | 592 | ||
@@ -861,10 +602,10 @@ nv_save_state_ext(struct drm_device *dev, int head, | |||
861 | rd_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX); | 602 | rd_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX); |
862 | rd_cio_state(dev, head, regp, NV_CIO_CRE_21); | 603 | rd_cio_state(dev, head, regp, NV_CIO_CRE_21); |
863 | 604 | ||
864 | if (dev_priv->card_type >= NV_20) | 605 | if (nv_device(drm->device)->card_type >= NV_20) |
865 | rd_cio_state(dev, head, regp, NV_CIO_CRE_47); | 606 | rd_cio_state(dev, head, regp, NV_CIO_CRE_47); |
866 | 607 | ||
867 | if (dev_priv->card_type >= NV_30) | 608 | if (nv_device(drm->device)->card_type >= NV_30) |
868 | rd_cio_state(dev, head, regp, 0x9f); | 609 | rd_cio_state(dev, head, regp, 0x9f); |
869 | 610 | ||
870 | rd_cio_state(dev, head, regp, NV_CIO_CRE_49); | 611 | rd_cio_state(dev, head, regp, NV_CIO_CRE_49); |
@@ -873,14 +614,14 @@ nv_save_state_ext(struct drm_device *dev, int head, | |||
873 | rd_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR2_INDEX); | 614 | rd_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR2_INDEX); |
874 | rd_cio_state(dev, head, regp, NV_CIO_CRE_ILACE__INDEX); | 615 | rd_cio_state(dev, head, regp, NV_CIO_CRE_ILACE__INDEX); |
875 | 616 | ||
876 | if (dev_priv->card_type >= NV_10) { | 617 | if (nv_device(drm->device)->card_type >= NV_10) { |
877 | regp->crtc_830 = NVReadCRTC(dev, head, NV_PCRTC_830); | 618 | regp->crtc_830 = NVReadCRTC(dev, head, NV_PCRTC_830); |
878 | regp->crtc_834 = NVReadCRTC(dev, head, NV_PCRTC_834); | 619 | regp->crtc_834 = NVReadCRTC(dev, head, NV_PCRTC_834); |
879 | 620 | ||
880 | if (dev_priv->card_type >= NV_30) | 621 | if (nv_device(drm->device)->card_type >= NV_30) |
881 | regp->gpio_ext = NVReadCRTC(dev, head, NV_PCRTC_GPIO_EXT); | 622 | regp->gpio_ext = NVReadCRTC(dev, head, NV_PCRTC_GPIO_EXT); |
882 | 623 | ||
883 | if (dev_priv->card_type == NV_40) | 624 | if (nv_device(drm->device)->card_type == NV_40) |
884 | regp->crtc_850 = NVReadCRTC(dev, head, NV_PCRTC_850); | 625 | regp->crtc_850 = NVReadCRTC(dev, head, NV_PCRTC_850); |
885 | 626 | ||
886 | if (nv_two_heads(dev)) | 627 | if (nv_two_heads(dev)) |
@@ -892,7 +633,7 @@ nv_save_state_ext(struct drm_device *dev, int head, | |||
892 | 633 | ||
893 | rd_cio_state(dev, head, regp, NV_CIO_CRE_SCRATCH3__INDEX); | 634 | rd_cio_state(dev, head, regp, NV_CIO_CRE_SCRATCH3__INDEX); |
894 | rd_cio_state(dev, head, regp, NV_CIO_CRE_SCRATCH4__INDEX); | 635 | rd_cio_state(dev, head, regp, NV_CIO_CRE_SCRATCH4__INDEX); |
895 | if (dev_priv->card_type >= NV_10) { | 636 | if (nv_device(drm->device)->card_type >= NV_10) { |
896 | rd_cio_state(dev, head, regp, NV_CIO_CRE_EBR_INDEX); | 637 | rd_cio_state(dev, head, regp, NV_CIO_CRE_EBR_INDEX); |
897 | rd_cio_state(dev, head, regp, NV_CIO_CRE_CSB); | 638 | rd_cio_state(dev, head, regp, NV_CIO_CRE_CSB); |
898 | rd_cio_state(dev, head, regp, NV_CIO_CRE_4B); | 639 | rd_cio_state(dev, head, regp, NV_CIO_CRE_4B); |
@@ -920,12 +661,14 @@ static void | |||
920 | nv_load_state_ext(struct drm_device *dev, int head, | 661 | nv_load_state_ext(struct drm_device *dev, int head, |
921 | struct nv04_mode_state *state) | 662 | struct nv04_mode_state *state) |
922 | { | 663 | { |
923 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 664 | struct nouveau_drm *drm = nouveau_drm(dev); |
665 | struct nouveau_device *device = nv_device(drm->device); | ||
666 | struct nouveau_timer *ptimer = nouveau_timer(device); | ||
924 | struct nv04_crtc_reg *regp = &state->crtc_reg[head]; | 667 | struct nv04_crtc_reg *regp = &state->crtc_reg[head]; |
925 | uint32_t reg900; | 668 | uint32_t reg900; |
926 | int i; | 669 | int i; |
927 | 670 | ||
928 | if (dev_priv->card_type >= NV_10) { | 671 | if (nv_device(drm->device)->card_type >= NV_10) { |
929 | if (nv_two_heads(dev)) | 672 | if (nv_two_heads(dev)) |
930 | /* setting ENGINE_CTRL (EC) *must* come before | 673 | /* setting ENGINE_CTRL (EC) *must* come before |
931 | * CIO_CRE_LCD, as writing CRE_LCD sets bits 16 & 17 in | 674 | * CIO_CRE_LCD, as writing CRE_LCD sets bits 16 & 17 in |
@@ -933,24 +676,24 @@ nv_load_state_ext(struct drm_device *dev, int head, | |||
933 | */ | 676 | */ |
934 | NVWriteCRTC(dev, head, NV_PCRTC_ENGINE_CTRL, regp->crtc_eng_ctrl); | 677 | NVWriteCRTC(dev, head, NV_PCRTC_ENGINE_CTRL, regp->crtc_eng_ctrl); |
935 | 678 | ||
936 | nvWriteVIDEO(dev, NV_PVIDEO_STOP, 1); | 679 | nv_wr32(device, NV_PVIDEO_STOP, 1); |
937 | nvWriteVIDEO(dev, NV_PVIDEO_INTR_EN, 0); | 680 | nv_wr32(device, NV_PVIDEO_INTR_EN, 0); |
938 | nvWriteVIDEO(dev, NV_PVIDEO_OFFSET_BUFF(0), 0); | 681 | nv_wr32(device, NV_PVIDEO_OFFSET_BUFF(0), 0); |
939 | nvWriteVIDEO(dev, NV_PVIDEO_OFFSET_BUFF(1), 0); | 682 | nv_wr32(device, NV_PVIDEO_OFFSET_BUFF(1), 0); |
940 | nvWriteVIDEO(dev, NV_PVIDEO_LIMIT(0), dev_priv->fb_available_size - 1); | 683 | nv_wr32(device, NV_PVIDEO_LIMIT(0), 0); //drm->fb_available_size - 1); |
941 | nvWriteVIDEO(dev, NV_PVIDEO_LIMIT(1), dev_priv->fb_available_size - 1); | 684 | nv_wr32(device, NV_PVIDEO_LIMIT(1), 0); //drm->fb_available_size - 1); |
942 | nvWriteVIDEO(dev, NV_PVIDEO_UVPLANE_LIMIT(0), dev_priv->fb_available_size - 1); | 685 | nv_wr32(device, NV_PVIDEO_UVPLANE_LIMIT(0), 0); //drm->fb_available_size - 1); |
943 | nvWriteVIDEO(dev, NV_PVIDEO_UVPLANE_LIMIT(1), dev_priv->fb_available_size - 1); | 686 | nv_wr32(device, NV_PVIDEO_UVPLANE_LIMIT(1), 0); //drm->fb_available_size - 1); |
944 | nvWriteMC(dev, NV_PBUS_POWERCTRL_2, 0); | 687 | nv_wr32(device, NV_PBUS_POWERCTRL_2, 0); |
945 | 688 | ||
946 | NVWriteCRTC(dev, head, NV_PCRTC_CURSOR_CONFIG, regp->cursor_cfg); | 689 | NVWriteCRTC(dev, head, NV_PCRTC_CURSOR_CONFIG, regp->cursor_cfg); |
947 | NVWriteCRTC(dev, head, NV_PCRTC_830, regp->crtc_830); | 690 | NVWriteCRTC(dev, head, NV_PCRTC_830, regp->crtc_830); |
948 | NVWriteCRTC(dev, head, NV_PCRTC_834, regp->crtc_834); | 691 | NVWriteCRTC(dev, head, NV_PCRTC_834, regp->crtc_834); |
949 | 692 | ||
950 | if (dev_priv->card_type >= NV_30) | 693 | if (nv_device(drm->device)->card_type >= NV_30) |
951 | NVWriteCRTC(dev, head, NV_PCRTC_GPIO_EXT, regp->gpio_ext); | 694 | NVWriteCRTC(dev, head, NV_PCRTC_GPIO_EXT, regp->gpio_ext); |
952 | 695 | ||
953 | if (dev_priv->card_type == NV_40) { | 696 | if (nv_device(drm->device)->card_type == NV_40) { |
954 | NVWriteCRTC(dev, head, NV_PCRTC_850, regp->crtc_850); | 697 | NVWriteCRTC(dev, head, NV_PCRTC_850, regp->crtc_850); |
955 | 698 | ||
956 | reg900 = NVReadRAMDAC(dev, head, NV_PRAMDAC_900); | 699 | reg900 = NVReadRAMDAC(dev, head, NV_PRAMDAC_900); |
@@ -973,23 +716,23 @@ nv_load_state_ext(struct drm_device *dev, int head, | |||
973 | wr_cio_state(dev, head, regp, NV_CIO_CRE_FF_INDEX); | 716 | wr_cio_state(dev, head, regp, NV_CIO_CRE_FF_INDEX); |
974 | wr_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX); | 717 | wr_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX); |
975 | 718 | ||
976 | if (dev_priv->card_type >= NV_20) | 719 | if (nv_device(drm->device)->card_type >= NV_20) |
977 | wr_cio_state(dev, head, regp, NV_CIO_CRE_47); | 720 | wr_cio_state(dev, head, regp, NV_CIO_CRE_47); |
978 | 721 | ||
979 | if (dev_priv->card_type >= NV_30) | 722 | if (nv_device(drm->device)->card_type >= NV_30) |
980 | wr_cio_state(dev, head, regp, 0x9f); | 723 | wr_cio_state(dev, head, regp, 0x9f); |
981 | 724 | ||
982 | wr_cio_state(dev, head, regp, NV_CIO_CRE_49); | 725 | wr_cio_state(dev, head, regp, NV_CIO_CRE_49); |
983 | wr_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX); | 726 | wr_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX); |
984 | wr_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR1_INDEX); | 727 | wr_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR1_INDEX); |
985 | wr_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR2_INDEX); | 728 | wr_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR2_INDEX); |
986 | if (dev_priv->card_type == NV_40) | 729 | if (nv_device(drm->device)->card_type == NV_40) |
987 | nv_fix_nv40_hw_cursor(dev, head); | 730 | nv_fix_nv40_hw_cursor(dev, head); |
988 | wr_cio_state(dev, head, regp, NV_CIO_CRE_ILACE__INDEX); | 731 | wr_cio_state(dev, head, regp, NV_CIO_CRE_ILACE__INDEX); |
989 | 732 | ||
990 | wr_cio_state(dev, head, regp, NV_CIO_CRE_SCRATCH3__INDEX); | 733 | wr_cio_state(dev, head, regp, NV_CIO_CRE_SCRATCH3__INDEX); |
991 | wr_cio_state(dev, head, regp, NV_CIO_CRE_SCRATCH4__INDEX); | 734 | wr_cio_state(dev, head, regp, NV_CIO_CRE_SCRATCH4__INDEX); |
992 | if (dev_priv->card_type >= NV_10) { | 735 | if (nv_device(drm->device)->card_type >= NV_10) { |
993 | wr_cio_state(dev, head, regp, NV_CIO_CRE_EBR_INDEX); | 736 | wr_cio_state(dev, head, regp, NV_CIO_CRE_EBR_INDEX); |
994 | wr_cio_state(dev, head, regp, NV_CIO_CRE_CSB); | 737 | wr_cio_state(dev, head, regp, NV_CIO_CRE_CSB); |
995 | wr_cio_state(dev, head, regp, NV_CIO_CRE_4B); | 738 | wr_cio_state(dev, head, regp, NV_CIO_CRE_4B); |
@@ -997,11 +740,11 @@ nv_load_state_ext(struct drm_device *dev, int head, | |||
997 | } | 740 | } |
998 | /* NV11 and NV20 stop at 0x52. */ | 741 | /* NV11 and NV20 stop at 0x52. */ |
999 | if (nv_gf4_disp_arch(dev)) { | 742 | if (nv_gf4_disp_arch(dev)) { |
1000 | if (dev_priv->card_type == NV_10) { | 743 | if (nv_device(drm->device)->card_type == NV_10) { |
1001 | /* Not waiting for vertical retrace before modifying | 744 | /* Not waiting for vertical retrace before modifying |
1002 | CRE_53/CRE_54 causes lockups. */ | 745 | CRE_53/CRE_54 causes lockups. */ |
1003 | nouveau_wait_eq(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x8); | 746 | nouveau_timer_wait_eq(ptimer, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x8); |
1004 | nouveau_wait_eq(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x0); | 747 | nouveau_timer_wait_eq(ptimer, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x0); |
1005 | } | 748 | } |
1006 | 749 | ||
1007 | wr_cio_state(dev, head, regp, NV_CIO_CRE_42); | 750 | wr_cio_state(dev, head, regp, NV_CIO_CRE_42); |
@@ -1024,14 +767,15 @@ static void | |||
1024 | nv_save_state_palette(struct drm_device *dev, int head, | 767 | nv_save_state_palette(struct drm_device *dev, int head, |
1025 | struct nv04_mode_state *state) | 768 | struct nv04_mode_state *state) |
1026 | { | 769 | { |
770 | struct nouveau_device *device = nouveau_dev(dev); | ||
1027 | int head_offset = head * NV_PRMDIO_SIZE, i; | 771 | int head_offset = head * NV_PRMDIO_SIZE, i; |
1028 | 772 | ||
1029 | nv_wr08(dev, NV_PRMDIO_PIXEL_MASK + head_offset, | 773 | nv_wr08(device, NV_PRMDIO_PIXEL_MASK + head_offset, |
1030 | NV_PRMDIO_PIXEL_MASK_MASK); | 774 | NV_PRMDIO_PIXEL_MASK_MASK); |
1031 | nv_wr08(dev, NV_PRMDIO_READ_MODE_ADDRESS + head_offset, 0x0); | 775 | nv_wr08(device, NV_PRMDIO_READ_MODE_ADDRESS + head_offset, 0x0); |
1032 | 776 | ||
1033 | for (i = 0; i < 768; i++) { | 777 | for (i = 0; i < 768; i++) { |
1034 | state->crtc_reg[head].DAC[i] = nv_rd08(dev, | 778 | state->crtc_reg[head].DAC[i] = nv_rd08(device, |
1035 | NV_PRMDIO_PALETTE_DATA + head_offset); | 779 | NV_PRMDIO_PALETTE_DATA + head_offset); |
1036 | } | 780 | } |
1037 | 781 | ||
@@ -1042,14 +786,15 @@ void | |||
1042 | nouveau_hw_load_state_palette(struct drm_device *dev, int head, | 786 | nouveau_hw_load_state_palette(struct drm_device *dev, int head, |
1043 | struct nv04_mode_state *state) | 787 | struct nv04_mode_state *state) |
1044 | { | 788 | { |
789 | struct nouveau_device *device = nouveau_dev(dev); | ||
1045 | int head_offset = head * NV_PRMDIO_SIZE, i; | 790 | int head_offset = head * NV_PRMDIO_SIZE, i; |
1046 | 791 | ||
1047 | nv_wr08(dev, NV_PRMDIO_PIXEL_MASK + head_offset, | 792 | nv_wr08(device, NV_PRMDIO_PIXEL_MASK + head_offset, |
1048 | NV_PRMDIO_PIXEL_MASK_MASK); | 793 | NV_PRMDIO_PIXEL_MASK_MASK); |
1049 | nv_wr08(dev, NV_PRMDIO_WRITE_MODE_ADDRESS + head_offset, 0x0); | 794 | nv_wr08(device, NV_PRMDIO_WRITE_MODE_ADDRESS + head_offset, 0x0); |
1050 | 795 | ||
1051 | for (i = 0; i < 768; i++) { | 796 | for (i = 0; i < 768; i++) { |
1052 | nv_wr08(dev, NV_PRMDIO_PALETTE_DATA + head_offset, | 797 | nv_wr08(device, NV_PRMDIO_PALETTE_DATA + head_offset, |
1053 | state->crtc_reg[head].DAC[i]); | 798 | state->crtc_reg[head].DAC[i]); |
1054 | } | 799 | } |
1055 | 800 | ||
@@ -1059,9 +804,9 @@ nouveau_hw_load_state_palette(struct drm_device *dev, int head, | |||
1059 | void nouveau_hw_save_state(struct drm_device *dev, int head, | 804 | void nouveau_hw_save_state(struct drm_device *dev, int head, |
1060 | struct nv04_mode_state *state) | 805 | struct nv04_mode_state *state) |
1061 | { | 806 | { |
1062 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 807 | struct nouveau_drm *drm = nouveau_drm(dev); |
1063 | 808 | ||
1064 | if (dev_priv->chipset == 0x11) | 809 | if (nv_device(drm->device)->chipset == 0x11) |
1065 | /* NB: no attempt is made to restore the bad pll later on */ | 810 | /* NB: no attempt is made to restore the bad pll later on */ |
1066 | nouveau_hw_fix_bad_vpll(dev, head); | 811 | nouveau_hw_fix_bad_vpll(dev, head); |
1067 | nv_save_state_ramdac(dev, head, state); | 812 | nv_save_state_ramdac(dev, head, state); |