2 * Copyright 2006 Dave Airlie
3 * Copyright 2007 Maarten Maathuis
4 * Copyright 2007-2009 Stuart Bennett
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
21 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 #include "nouveau_drv.h"
26 #include "nouveau_hw.h"
28 #define CHIPSET_NFORCE 0x01a0
29 #define CHIPSET_NFORCE2 0x01f0
32 * misc hw access wrappers/control functions
36 NVWriteVgaSeq(struct drm_device
*dev
, int head
, uint8_t index
, uint8_t value
)
38 NVWritePRMVIO(dev
, head
, NV_PRMVIO_SRX
, index
);
39 NVWritePRMVIO(dev
, head
, NV_PRMVIO_SR
, value
);
43 NVReadVgaSeq(struct drm_device
*dev
, int head
, uint8_t index
)
45 NVWritePRMVIO(dev
, head
, NV_PRMVIO_SRX
, index
);
46 return NVReadPRMVIO(dev
, head
, NV_PRMVIO_SR
);
50 NVWriteVgaGr(struct drm_device
*dev
, int head
, uint8_t index
, uint8_t value
)
52 NVWritePRMVIO(dev
, head
, NV_PRMVIO_GRX
, index
);
53 NVWritePRMVIO(dev
, head
, NV_PRMVIO_GX
, value
);
57 NVReadVgaGr(struct drm_device
*dev
, int head
, uint8_t index
)
59 NVWritePRMVIO(dev
, head
, NV_PRMVIO_GRX
, index
);
60 return NVReadPRMVIO(dev
, head
, NV_PRMVIO_GX
);
63 /* CR44 takes values 0 (head A), 3 (head B) and 4 (heads tied)
64 * it affects only the 8 bit vga io regs, which we access using mmio at
65 * 0xc{0,2}3c*, 0x60{1,3}3*, and 0x68{1,3}3d*
66 * in general, the set value of cr44 does not matter: reg access works as
67 * expected and values can be set for the appropriate head by using a 0x2000
70 * a) pre nv40, the head B range of PRMVIO regs at 0xc23c* was not exposed and
71 * cr44 must be set to 0 or 3 for accessing values on the correct head
72 * through the common 0xc03c* addresses
73 * b) in tied mode (4) head B is programmed to the values set on head A, and
74 * access using the head B addresses can have strange results, ergo we leave
75 * tied mode in init once we know to what cr44 should be restored on exit
77 * the owner parameter is slightly abused:
78 * 0 and 1 are treated as head values and so the set value is (owner * 3)
79 * other values are treated as literal values to set
82 NVSetOwner(struct drm_device
*dev
, int owner
)
84 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
89 if (dev_priv
->chipset
== 0x11) {
90 /* This might seem stupid, but the blob does it and
91 * omitting it often locks the system up.
93 NVReadVgaCrtc(dev
, 0, NV_CIO_SR_LOCK_INDEX
);
94 NVReadVgaCrtc(dev
, 1, NV_CIO_SR_LOCK_INDEX
);
97 /* CR44 is always changed on CRTC0 */
98 NVWriteVgaCrtc(dev
, 0, NV_CIO_CRE_44
, owner
);
100 if (dev_priv
->chipset
== 0x11) { /* set me harder */
101 NVWriteVgaCrtc(dev
, 0, NV_CIO_CRE_2E
, owner
);
102 NVWriteVgaCrtc(dev
, 0, NV_CIO_CRE_2E
, owner
);
107 NVBlankScreen(struct drm_device
*dev
, int head
, bool blank
)
111 if (nv_two_heads(dev
))
112 NVSetOwner(dev
, head
);
114 seq1
= NVReadVgaSeq(dev
, head
, NV_VIO_SR_CLOCK_INDEX
);
116 NVVgaSeqReset(dev
, head
, true);
118 NVWriteVgaSeq(dev
, head
, NV_VIO_SR_CLOCK_INDEX
, seq1
| 0x20);
120 NVWriteVgaSeq(dev
, head
, NV_VIO_SR_CLOCK_INDEX
, seq1
& ~0x20);
121 NVVgaSeqReset(dev
, head
, false);
129 powerctrl_1_shift(int chip_version
, int reg
)
133 if (chip_version
< 0x17 || chip_version
== 0x1a || chip_version
== 0x20)
137 case NV_RAMDAC_VPLL2
:
139 case NV_PRAMDAC_VPLL_COEFF
:
141 case NV_PRAMDAC_MPLL_COEFF
:
143 case NV_PRAMDAC_NVPLL_COEFF
:
148 * the shift for vpll regs is only used for nv3x chips with a single
151 if (shift
> 4 && (chip_version
< 0x32 || chip_version
== 0x35 ||
152 chip_version
== 0x36 || chip_version
>= 0x40))
159 setPLL_single(struct drm_device
*dev
, uint32_t reg
, struct nouveau_pll_vals
*pv
)
161 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
162 int chip_version
= dev_priv
->vbios
.chip_version
;
163 uint32_t oldpll
= NVReadRAMDAC(dev
, 0, reg
);
164 int oldN
= (oldpll
>> 8) & 0xff, oldM
= oldpll
& 0xff;
165 uint32_t pll
= (oldpll
& 0xfff80000) | pv
->log2P
<< 16 | pv
->NM1
;
166 uint32_t saved_powerctrl_1
= 0;
167 int shift_powerctrl_1
= powerctrl_1_shift(chip_version
, reg
);
170 return; /* already set */
172 if (shift_powerctrl_1
>= 0) {
173 saved_powerctrl_1
= nvReadMC(dev
, NV_PBUS_POWERCTRL_1
);
174 nvWriteMC(dev
, NV_PBUS_POWERCTRL_1
,
175 (saved_powerctrl_1
& ~(0xf << shift_powerctrl_1
)) |
176 1 << shift_powerctrl_1
);
179 if (oldM
&& pv
->M1
&& (oldN
/ oldM
< pv
->N1
/ pv
->M1
))
180 /* upclock -- write new post divider first */
181 NVWriteRAMDAC(dev
, 0, reg
, pv
->log2P
<< 16 | (oldpll
& 0xffff));
183 /* downclock -- write new NM first */
184 NVWriteRAMDAC(dev
, 0, reg
, (oldpll
& 0xffff0000) | pv
->NM1
);
186 if (chip_version
< 0x17 && chip_version
!= 0x11)
187 /* wait a bit on older chips */
189 NVReadRAMDAC(dev
, 0, reg
);
191 /* then write the other half as well */
192 NVWriteRAMDAC(dev
, 0, reg
, pll
);
194 if (shift_powerctrl_1
>= 0)
195 nvWriteMC(dev
, NV_PBUS_POWERCTRL_1
, saved_powerctrl_1
);
199 new_ramdac580(uint32_t reg1
, bool ss
, uint32_t ramdac580
)
201 bool head_a
= (reg1
== NV_PRAMDAC_VPLL_COEFF
);
203 if (ss
) /* single stage pll mode */
204 ramdac580
|= head_a
? NV_RAMDAC_580_VPLL1_ACTIVE
:
205 NV_RAMDAC_580_VPLL2_ACTIVE
;
207 ramdac580
&= head_a
? ~NV_RAMDAC_580_VPLL1_ACTIVE
:
208 ~NV_RAMDAC_580_VPLL2_ACTIVE
;
214 setPLL_double_highregs(struct drm_device
*dev
, uint32_t reg1
,
215 struct nouveau_pll_vals
*pv
)
217 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
218 int chip_version
= dev_priv
->vbios
.chip_version
;
219 bool nv3035
= chip_version
== 0x30 || chip_version
== 0x35;
220 uint32_t reg2
= reg1
+ ((reg1
== NV_RAMDAC_VPLL2
) ? 0x5c : 0x70);
221 uint32_t oldpll1
= NVReadRAMDAC(dev
, 0, reg1
);
222 uint32_t oldpll2
= !nv3035
? NVReadRAMDAC(dev
, 0, reg2
) : 0;
223 uint32_t pll1
= (oldpll1
& 0xfff80000) | pv
->log2P
<< 16 | pv
->NM1
;
224 uint32_t pll2
= (oldpll2
& 0x7fff0000) | 1 << 31 | pv
->NM2
;
225 uint32_t oldramdac580
= 0, ramdac580
= 0;
226 bool single_stage
= !pv
->NM2
|| pv
->N2
== pv
->M2
; /* nv41+ only */
227 uint32_t saved_powerctrl_1
= 0, savedc040
= 0;
228 int shift_powerctrl_1
= powerctrl_1_shift(chip_version
, reg1
);
230 /* model specific additions to generic pll1 and pll2 set up above */
232 pll1
= (pll1
& 0xfcc7ffff) | (pv
->N2
& 0x18) << 21 |
233 (pv
->N2
& 0x7) << 19 | 8 << 4 | (pv
->M2
& 7) << 4;
236 if (chip_version
> 0x40 && reg1
>= NV_PRAMDAC_VPLL_COEFF
) { /* !nv40 */
237 oldramdac580
= NVReadRAMDAC(dev
, 0, NV_PRAMDAC_580
);
238 ramdac580
= new_ramdac580(reg1
, single_stage
, oldramdac580
);
239 if (oldramdac580
!= ramdac580
)
240 oldpll1
= ~0; /* force mismatch */
242 /* magic value used by nvidia in single stage mode */
245 if (chip_version
> 0x70)
246 /* magic bits set by the blob (but not the bios) on g71-73 */
247 pll1
= (pll1
& 0x7fffffff) | (single_stage
? 0x4 : 0xc) << 28;
249 if (oldpll1
== pll1
&& oldpll2
== pll2
)
250 return; /* already set */
252 if (shift_powerctrl_1
>= 0) {
253 saved_powerctrl_1
= nvReadMC(dev
, NV_PBUS_POWERCTRL_1
);
254 nvWriteMC(dev
, NV_PBUS_POWERCTRL_1
,
255 (saved_powerctrl_1
& ~(0xf << shift_powerctrl_1
)) |
256 1 << shift_powerctrl_1
);
259 if (chip_version
>= 0x40) {
263 case NV_PRAMDAC_MPLL_COEFF
:
265 case NV_PRAMDAC_NVPLL_COEFF
:
267 case NV_RAMDAC_VPLL2
:
269 case NV_PRAMDAC_VPLL_COEFF
:
273 savedc040
= nvReadMC(dev
, 0xc040);
274 if (shift_c040
!= 14)
275 nvWriteMC(dev
, 0xc040, savedc040
& ~(3 << shift_c040
));
278 if (oldramdac580
!= ramdac580
)
279 NVWriteRAMDAC(dev
, 0, NV_PRAMDAC_580
, ramdac580
);
282 NVWriteRAMDAC(dev
, 0, reg2
, pll2
);
283 NVWriteRAMDAC(dev
, 0, reg1
, pll1
);
285 if (shift_powerctrl_1
>= 0)
286 nvWriteMC(dev
, NV_PBUS_POWERCTRL_1
, saved_powerctrl_1
);
287 if (chip_version
>= 0x40)
288 nvWriteMC(dev
, 0xc040, savedc040
);
292 setPLL_double_lowregs(struct drm_device
*dev
, uint32_t NMNMreg
,
293 struct nouveau_pll_vals
*pv
)
295 /* When setting PLLs, there is a merry game of disabling and enabling
296 * various bits of hardware during the process. This function is a
297 * synthesis of six nv4x traces, nearly each card doing a subtly
298 * different thing. With luck all the necessary bits for each card are
299 * combined herein. Without luck it deviates from each card's formula
300 * so as to not work on any :)
303 uint32_t Preg
= NMNMreg
- 4;
304 bool mpll
= Preg
== 0x4020;
305 uint32_t oldPval
= nvReadMC(dev
, Preg
);
306 uint32_t NMNM
= pv
->NM2
<< 16 | pv
->NM1
;
307 uint32_t Pval
= (oldPval
& (mpll
? ~(0x77 << 16) : ~(7 << 16))) |
308 0xc << 28 | pv
->log2P
<< 16;
309 uint32_t saved4600
= 0;
310 /* some cards have different maskc040s */
311 uint32_t maskc040
= ~(3 << 14), savedc040
;
312 bool single_stage
= !pv
->NM2
|| pv
->N2
== pv
->M2
;
314 if (nvReadMC(dev
, NMNMreg
) == NMNM
&& (oldPval
& 0xc0070000) == Pval
)
320 maskc040
= ~(0xc << 24);
323 struct pll_lims pll_lim
;
326 if (get_pll_limits(dev
, Preg
, &pll_lim
))
329 Pval2
= pv
->log2P
+ pll_lim
.log2p_bias
;
330 if (Pval2
> pll_lim
.max_log2p
)
331 Pval2
= pll_lim
.max_log2p
;
332 Pval
|= 1 << 28 | Pval2
<< 20;
334 saved4600
= nvReadMC(dev
, 0x4600);
335 nvWriteMC(dev
, 0x4600, saved4600
| 8 << 28);
338 Pval
|= mpll
? 1 << 12 : 1 << 8;
340 nvWriteMC(dev
, Preg
, oldPval
| 1 << 28);
341 nvWriteMC(dev
, Preg
, Pval
& ~(4 << 28));
344 nvWriteMC(dev
, 0x4020, Pval
& ~(0xc << 28));
345 nvWriteMC(dev
, 0x4038, Pval
& ~(0xc << 28));
348 savedc040
= nvReadMC(dev
, 0xc040);
349 nvWriteMC(dev
, 0xc040, savedc040
& maskc040
);
351 nvWriteMC(dev
, NMNMreg
, NMNM
);
352 if (NMNMreg
== 0x4024)
353 nvWriteMC(dev
, 0x403c, NMNM
);
355 nvWriteMC(dev
, Preg
, Pval
);
358 nvWriteMC(dev
, 0x4020, Pval
);
359 nvWriteMC(dev
, 0x4038, Pval
);
360 nvWriteMC(dev
, 0x4600, saved4600
);
363 nvWriteMC(dev
, 0xc040, savedc040
);
366 nvWriteMC(dev
, 0x4020, Pval
& ~(1 << 28));
367 nvWriteMC(dev
, 0x4038, Pval
& ~(1 << 28));
372 nouveau_hw_setpll(struct drm_device
*dev
, uint32_t reg1
,
373 struct nouveau_pll_vals
*pv
)
375 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
376 int cv
= dev_priv
->vbios
.chip_version
;
378 if (cv
== 0x30 || cv
== 0x31 || cv
== 0x35 || cv
== 0x36 ||
381 setPLL_double_highregs(dev
, reg1
, pv
);
383 setPLL_double_lowregs(dev
, reg1
, pv
);
385 setPLL_single(dev
, reg1
, pv
);
393 nouveau_hw_decode_pll(struct drm_device
*dev
, uint32_t reg1
, uint32_t pll1
,
394 uint32_t pll2
, struct nouveau_pll_vals
*pllvals
)
396 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
398 /* to force parsing as single stage (i.e. nv40 vplls) pass pll2 as 0 */
400 /* log2P is & 0x7 as never more than 7, and nv30/35 only uses 3 bits */
401 pllvals
->log2P
= (pll1
>> 16) & 0x7;
402 pllvals
->N2
= pllvals
->M2
= 1;
404 if (reg1
<= 0x405c) {
405 pllvals
->NM1
= pll2
& 0xffff;
406 /* single stage NVPLL and VPLLs use 1 << 8, MPLL uses 1 << 12 */
407 if (!(pll1
& 0x1100))
408 pllvals
->NM2
= pll2
>> 16;
410 pllvals
->NM1
= pll1
& 0xffff;
411 if (nv_two_reg_pll(dev
) && pll2
& NV31_RAMDAC_ENABLE_VCO2
)
412 pllvals
->NM2
= pll2
& 0xffff;
413 else if (dev_priv
->chipset
== 0x30 || dev_priv
->chipset
== 0x35) {
414 pllvals
->M1
&= 0xf; /* only 4 bits */
415 if (pll1
& NV30_RAMDAC_ENABLE_VCO2
) {
416 pllvals
->M2
= (pll1
>> 4) & 0x7;
417 pllvals
->N2
= ((pll1
>> 21) & 0x18) |
418 ((pll1
>> 19) & 0x7);
425 nouveau_hw_get_pllvals(struct drm_device
*dev
, enum pll_types plltype
,
426 struct nouveau_pll_vals
*pllvals
)
428 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
429 uint32_t reg1
= get_pll_register(dev
, plltype
), pll1
, pll2
= 0;
430 struct pll_lims pll_lim
;
436 pll1
= nvReadMC(dev
, reg1
);
439 pll2
= nvReadMC(dev
, reg1
+ 4);
440 else if (nv_two_reg_pll(dev
)) {
441 uint32_t reg2
= reg1
+ (reg1
== NV_RAMDAC_VPLL2
? 0x5c : 0x70);
443 pll2
= nvReadMC(dev
, reg2
);
446 if (dev_priv
->card_type
== 0x40 && reg1
>= NV_PRAMDAC_VPLL_COEFF
) {
447 uint32_t ramdac580
= NVReadRAMDAC(dev
, 0, NV_PRAMDAC_580
);
449 /* check whether vpll has been forced into single stage mode */
450 if (reg1
== NV_PRAMDAC_VPLL_COEFF
) {
451 if (ramdac580
& NV_RAMDAC_580_VPLL1_ACTIVE
)
454 if (ramdac580
& NV_RAMDAC_580_VPLL2_ACTIVE
)
458 nouveau_hw_decode_pll(dev
, reg1
, pll1
, pll2
, pllvals
);
460 ret
= get_pll_limits(dev
, plltype
, &pll_lim
);
464 pllvals
->refclk
= pll_lim
.refclk
;
470 nouveau_hw_pllvals_to_clk(struct nouveau_pll_vals
*pv
)
472 /* Avoid divide by zero if called at an inappropriate time */
473 if (!pv
->M1
|| !pv
->M2
)
476 return pv
->N1
* pv
->N2
* pv
->refclk
/ (pv
->M1
* pv
->M2
) >> pv
->log2P
;
480 nouveau_hw_get_clock(struct drm_device
*dev
, enum pll_types plltype
)
482 struct nouveau_pll_vals pllvals
;
485 #ifdef __linux__ // TODO?
486 if (plltype
== PLL_MEMORY
&&
487 (dev
->pci_device
& 0x0ff0) == CHIPSET_NFORCE
) {
490 pci_read_config_dword(pci_get_bus_and_slot(0, 3), 0x6c, &mpllP
);
494 return 400000 / mpllP
;
496 if (plltype
== PLL_MEMORY
&&
497 (dev
->pci_device
& 0xff0) == CHIPSET_NFORCE2
) {
500 pci_read_config_dword(pci_get_bus_and_slot(0, 5), 0x4c, &clock
);
505 ret
= nouveau_hw_get_pllvals(dev
, plltype
, &pllvals
);
509 return nouveau_hw_pllvals_to_clk(&pllvals
);
513 nouveau_hw_fix_bad_vpll(struct drm_device
*dev
, int head
)
515 /* the vpll on an unused head can come up with a random value, way
516 * beyond the pll limits. for some reason this causes the chip to
517 * lock up when reading the dac palette regs, so set a valid pll here
518 * when such a condition detected. only seen on nv11 to date
521 struct pll_lims pll_lim
;
522 struct nouveau_pll_vals pv
;
523 enum pll_types pll
= head
? PLL_VPLL1
: PLL_VPLL0
;
525 if (get_pll_limits(dev
, pll
, &pll_lim
))
527 nouveau_hw_get_pllvals(dev
, pll
, &pv
);
529 if (pv
.M1
>= pll_lim
.vco1
.min_m
&& pv
.M1
<= pll_lim
.vco1
.max_m
&&
530 pv
.N1
>= pll_lim
.vco1
.min_n
&& pv
.N1
<= pll_lim
.vco1
.max_n
&&
531 pv
.log2P
<= pll_lim
.max_log2p
)
534 NV_WARN(dev
, "VPLL %d outwith limits, attempting to fix\n", head
+ 1);
536 /* set lowest clock within static limits */
537 pv
.M1
= pll_lim
.vco1
.max_m
;
538 pv
.N1
= pll_lim
.vco1
.min_n
;
539 pv
.log2P
= pll_lim
.max_usable_log2p
;
540 nouveau_hw_setpll(dev
, pll_lim
.reg
, &pv
);
544 * vga font save/restore
547 static void nouveau_vga_font_io(struct drm_device
*dev
,
548 struct drm_local_map
*iovram
,
549 bool save
, unsigned plane
)
551 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
554 NVWriteVgaSeq(dev
, 0, NV_VIO_SR_PLANE_MASK_INDEX
, 1 << plane
);
555 NVWriteVgaGr(dev
, 0, NV_VIO_GX_READ_MAP_INDEX
, plane
);
556 for (i
= 0; i
< 16384; i
++) {
558 dev_priv
->saved_vga_font
[plane
][i
] = DRM_READ32(iovram
, i
* 4);
560 DRM_WRITE32(iovram
, i
* 4, dev_priv
->saved_vga_font
[plane
][i
]);
566 nouveau_hw_save_vga_fonts(struct drm_device
*dev
, bool save
)
568 uint8_t misc
, gr4
, gr5
, gr6
, seq2
, seq4
;
571 struct drm_local_map
*iovram
= NULL
;
573 if (nv_two_heads(dev
))
576 NVSetEnablePalette(dev
, 0, true);
577 graphicsmode
= NVReadVgaAttr(dev
, 0, NV_CIO_AR_MODE_INDEX
) & 1;
578 NVSetEnablePalette(dev
, 0, false);
580 if (graphicsmode
) /* graphics mode => framebuffer => no need to save */
583 NV_INFO(dev
, "%sing VGA fonts\n", save
? "Sav" : "Restor");
585 /* map first 64KiB of VRAM, holds VGA fonts etc */
586 drm_addmap(dev
, drm_get_resource_start(dev
, 1), 65536, _DRM_FRAME_BUFFER
, _DRM_KERNEL
| _DRM_DRIVER
, &iovram
);
588 NV_ERROR(dev
, "Failed to map VRAM, "
589 "cannot save/restore VGA fonts.\n");
593 if (nv_two_heads(dev
))
594 NVBlankScreen(dev
, 1, true);
595 NVBlankScreen(dev
, 0, true);
597 /* save control regs */
598 misc
= NVReadPRMVIO(dev
, 0, NV_PRMVIO_MISC__READ
);
599 seq2
= NVReadVgaSeq(dev
, 0, NV_VIO_SR_PLANE_MASK_INDEX
);
600 seq4
= NVReadVgaSeq(dev
, 0, NV_VIO_SR_MEM_MODE_INDEX
);
601 gr4
= NVReadVgaGr(dev
, 0, NV_VIO_GX_READ_MAP_INDEX
);
602 gr5
= NVReadVgaGr(dev
, 0, NV_VIO_GX_MODE_INDEX
);
603 gr6
= NVReadVgaGr(dev
, 0, NV_VIO_GX_MISC_INDEX
);
605 NVWritePRMVIO(dev
, 0, NV_PRMVIO_MISC__WRITE
, 0x67);
606 NVWriteVgaSeq(dev
, 0, NV_VIO_SR_MEM_MODE_INDEX
, 0x6);
607 NVWriteVgaGr(dev
, 0, NV_VIO_GX_MODE_INDEX
, 0x0);
608 NVWriteVgaGr(dev
, 0, NV_VIO_GX_MISC_INDEX
, 0x5);
610 /* store font in planes 0..3 */
611 for (plane
= 0; plane
< 4; plane
++)
612 nouveau_vga_font_io(dev
, iovram
, save
, plane
);
614 /* restore control regs */
615 NVWritePRMVIO(dev
, 0, NV_PRMVIO_MISC__WRITE
, misc
);
616 NVWriteVgaGr(dev
, 0, NV_VIO_GX_READ_MAP_INDEX
, gr4
);
617 NVWriteVgaGr(dev
, 0, NV_VIO_GX_MODE_INDEX
, gr5
);
618 NVWriteVgaGr(dev
, 0, NV_VIO_GX_MISC_INDEX
, gr6
);
619 NVWriteVgaSeq(dev
, 0, NV_VIO_SR_PLANE_MASK_INDEX
, seq2
);
620 NVWriteVgaSeq(dev
, 0, NV_VIO_SR_MEM_MODE_INDEX
, seq4
);
622 if (nv_two_heads(dev
))
623 NVBlankScreen(dev
, 1, false);
624 NVBlankScreen(dev
, 0, false);
626 drm_rmmap(dev
, iovram
);
630 * mode state save/load
634 rd_cio_state(struct drm_device
*dev
, int head
,
635 struct nv04_crtc_reg
*crtcstate
, int index
)
637 crtcstate
->CRTC
[index
] = NVReadVgaCrtc(dev
, head
, index
);
641 wr_cio_state(struct drm_device
*dev
, int head
,
642 struct nv04_crtc_reg
*crtcstate
, int index
)
644 NVWriteVgaCrtc(dev
, head
, index
, crtcstate
->CRTC
[index
]);
648 nv_save_state_ramdac(struct drm_device
*dev
, int head
,
649 struct nv04_mode_state
*state
)
651 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
652 struct nv04_crtc_reg
*regp
= &state
->crtc_reg
[head
];
655 if (dev_priv
->card_type
>= NV_10
)
656 regp
->nv10_cursync
= NVReadRAMDAC(dev
, head
, NV_RAMDAC_NV10_CURSYNC
);
658 nouveau_hw_get_pllvals(dev
, head
? PLL_VPLL1
: PLL_VPLL0
, ®p
->pllvals
);
659 state
->pllsel
= NVReadRAMDAC(dev
, 0, NV_PRAMDAC_PLL_COEFF_SELECT
);
660 if (nv_two_heads(dev
))
661 state
->sel_clk
= NVReadRAMDAC(dev
, 0, NV_PRAMDAC_SEL_CLK
);
662 if (dev_priv
->chipset
== 0x11)
663 regp
->dither
= NVReadRAMDAC(dev
, head
, NV_RAMDAC_DITHER_NV11
);
665 regp
->ramdac_gen_ctrl
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_GENERAL_CONTROL
);
667 if (nv_gf4_disp_arch(dev
))
668 regp
->ramdac_630
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_630
);
669 if (dev_priv
->chipset
>= 0x30)
670 regp
->ramdac_634
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_634
);
672 regp
->tv_setup
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_TV_SETUP
);
673 regp
->tv_vtotal
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_TV_VTOTAL
);
674 regp
->tv_vskew
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_TV_VSKEW
);
675 regp
->tv_vsync_delay
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_TV_VSYNC_DELAY
);
676 regp
->tv_htotal
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_TV_HTOTAL
);
677 regp
->tv_hskew
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_TV_HSKEW
);
678 regp
->tv_hsync_delay
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_TV_HSYNC_DELAY
);
679 regp
->tv_hsync_delay2
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_TV_HSYNC_DELAY2
);
681 for (i
= 0; i
< 7; i
++) {
682 uint32_t ramdac_reg
= NV_PRAMDAC_FP_VDISPLAY_END
+ (i
* 4);
683 regp
->fp_vert_regs
[i
] = NVReadRAMDAC(dev
, head
, ramdac_reg
);
684 regp
->fp_horiz_regs
[i
] = NVReadRAMDAC(dev
, head
, ramdac_reg
+ 0x20);
687 if (nv_gf4_disp_arch(dev
)) {
688 regp
->dither
= NVReadRAMDAC(dev
, head
, NV_RAMDAC_FP_DITHER
);
689 for (i
= 0; i
< 3; i
++) {
690 regp
->dither_regs
[i
] = NVReadRAMDAC(dev
, head
, NV_PRAMDAC_850
+ i
* 4);
691 regp
->dither_regs
[i
+ 3] = NVReadRAMDAC(dev
, head
, NV_PRAMDAC_85C
+ i
* 4);
695 regp
->fp_control
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_FP_TG_CONTROL
);
696 regp
->fp_debug_0
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_FP_DEBUG_0
);
697 if (!nv_gf4_disp_arch(dev
) && head
== 0) {
698 /* early chips don't allow access to PRAMDAC_TMDS_* without
699 * the head A FPCLK on (nv11 even locks up) */
700 NVWriteRAMDAC(dev
, 0, NV_PRAMDAC_FP_DEBUG_0
, regp
->fp_debug_0
&
701 ~NV_PRAMDAC_FP_DEBUG_0_PWRDOWN_FPCLK
);
703 regp
->fp_debug_1
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_FP_DEBUG_1
);
704 regp
->fp_debug_2
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_FP_DEBUG_2
);
706 regp
->fp_margin_color
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_FP_MARGIN_COLOR
);
708 if (nv_gf4_disp_arch(dev
))
709 regp
->ramdac_8c0
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_8C0
);
711 if (dev_priv
->card_type
== NV_40
) {
712 regp
->ramdac_a20
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_A20
);
713 regp
->ramdac_a24
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_A24
);
714 regp
->ramdac_a34
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_A34
);
716 for (i
= 0; i
< 38; i
++)
717 regp
->ctv_regs
[i
] = NVReadRAMDAC(dev
, head
,
718 NV_PRAMDAC_CTV
+ 4*i
);
723 nv_load_state_ramdac(struct drm_device
*dev
, int head
,
724 struct nv04_mode_state
*state
)
726 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
727 struct nv04_crtc_reg
*regp
= &state
->crtc_reg
[head
];
728 uint32_t pllreg
= head
? NV_RAMDAC_VPLL2
: NV_PRAMDAC_VPLL_COEFF
;
731 if (dev_priv
->card_type
>= NV_10
)
732 NVWriteRAMDAC(dev
, head
, NV_RAMDAC_NV10_CURSYNC
, regp
->nv10_cursync
);
734 nouveau_hw_setpll(dev
, pllreg
, ®p
->pllvals
);
735 NVWriteRAMDAC(dev
, 0, NV_PRAMDAC_PLL_COEFF_SELECT
, state
->pllsel
);
736 if (nv_two_heads(dev
))
737 NVWriteRAMDAC(dev
, 0, NV_PRAMDAC_SEL_CLK
, state
->sel_clk
);
738 if (dev_priv
->chipset
== 0x11)
739 NVWriteRAMDAC(dev
, head
, NV_RAMDAC_DITHER_NV11
, regp
->dither
);
741 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_GENERAL_CONTROL
, regp
->ramdac_gen_ctrl
);
743 if (nv_gf4_disp_arch(dev
))
744 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_630
, regp
->ramdac_630
);
745 if (dev_priv
->chipset
>= 0x30)
746 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_634
, regp
->ramdac_634
);
748 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_TV_SETUP
, regp
->tv_setup
);
749 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_TV_VTOTAL
, regp
->tv_vtotal
);
750 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_TV_VSKEW
, regp
->tv_vskew
);
751 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_TV_VSYNC_DELAY
, regp
->tv_vsync_delay
);
752 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_TV_HTOTAL
, regp
->tv_htotal
);
753 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_TV_HSKEW
, regp
->tv_hskew
);
754 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_TV_HSYNC_DELAY
, regp
->tv_hsync_delay
);
755 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_TV_HSYNC_DELAY2
, regp
->tv_hsync_delay2
);
757 for (i
= 0; i
< 7; i
++) {
758 uint32_t ramdac_reg
= NV_PRAMDAC_FP_VDISPLAY_END
+ (i
* 4);
760 NVWriteRAMDAC(dev
, head
, ramdac_reg
, regp
->fp_vert_regs
[i
]);
761 NVWriteRAMDAC(dev
, head
, ramdac_reg
+ 0x20, regp
->fp_horiz_regs
[i
]);
764 if (nv_gf4_disp_arch(dev
)) {
765 NVWriteRAMDAC(dev
, head
, NV_RAMDAC_FP_DITHER
, regp
->dither
);
766 for (i
= 0; i
< 3; i
++) {
767 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_850
+ i
* 4, regp
->dither_regs
[i
]);
768 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_85C
+ i
* 4, regp
->dither_regs
[i
+ 3]);
772 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_FP_TG_CONTROL
, regp
->fp_control
);
773 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_FP_DEBUG_0
, regp
->fp_debug_0
);
774 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_FP_DEBUG_1
, regp
->fp_debug_1
);
775 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_FP_DEBUG_2
, regp
->fp_debug_2
);
777 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_FP_MARGIN_COLOR
, regp
->fp_margin_color
);
779 if (nv_gf4_disp_arch(dev
))
780 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_8C0
, regp
->ramdac_8c0
);
782 if (dev_priv
->card_type
== NV_40
) {
783 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_A20
, regp
->ramdac_a20
);
784 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_A24
, regp
->ramdac_a24
);
785 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_A34
, regp
->ramdac_a34
);
787 for (i
= 0; i
< 38; i
++)
788 NVWriteRAMDAC(dev
, head
,
789 NV_PRAMDAC_CTV
+ 4*i
, regp
->ctv_regs
[i
]);
794 nv_save_state_vga(struct drm_device
*dev
, int head
,
795 struct nv04_mode_state
*state
)
797 struct nv04_crtc_reg
*regp
= &state
->crtc_reg
[head
];
800 regp
->MiscOutReg
= NVReadPRMVIO(dev
, head
, NV_PRMVIO_MISC__READ
);
802 for (i
= 0; i
< 25; i
++)
803 rd_cio_state(dev
, head
, regp
, i
);
805 NVSetEnablePalette(dev
, head
, true);
806 for (i
= 0; i
< 21; i
++)
807 regp
->Attribute
[i
] = NVReadVgaAttr(dev
, head
, i
);
808 NVSetEnablePalette(dev
, head
, false);
810 for (i
= 0; i
< 9; i
++)
811 regp
->Graphics
[i
] = NVReadVgaGr(dev
, head
, i
);
813 for (i
= 0; i
< 5; i
++)
814 regp
->Sequencer
[i
] = NVReadVgaSeq(dev
, head
, i
);
818 nv_load_state_vga(struct drm_device
*dev
, int head
,
819 struct nv04_mode_state
*state
)
821 struct nv04_crtc_reg
*regp
= &state
->crtc_reg
[head
];
824 NVWritePRMVIO(dev
, head
, NV_PRMVIO_MISC__WRITE
, regp
->MiscOutReg
);
826 for (i
= 0; i
< 5; i
++)
827 NVWriteVgaSeq(dev
, head
, i
, regp
->Sequencer
[i
]);
829 nv_lock_vga_crtc_base(dev
, head
, false);
830 for (i
= 0; i
< 25; i
++)
831 wr_cio_state(dev
, head
, regp
, i
);
832 nv_lock_vga_crtc_base(dev
, head
, true);
834 for (i
= 0; i
< 9; i
++)
835 NVWriteVgaGr(dev
, head
, i
, regp
->Graphics
[i
]);
837 NVSetEnablePalette(dev
, head
, true);
838 for (i
= 0; i
< 21; i
++)
839 NVWriteVgaAttr(dev
, head
, i
, regp
->Attribute
[i
]);
840 NVSetEnablePalette(dev
, head
, false);
844 nv_save_state_ext(struct drm_device
*dev
, int head
,
845 struct nv04_mode_state
*state
)
847 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
848 struct nv04_crtc_reg
*regp
= &state
->crtc_reg
[head
];
851 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_LCD__INDEX
);
852 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_RPC0_INDEX
);
853 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_RPC1_INDEX
);
854 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_LSR_INDEX
);
855 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_PIXEL_INDEX
);
856 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_HEB__INDEX
);
857 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_ENH_INDEX
);
859 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_FF_INDEX
);
860 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_FFLWM__INDEX
);
861 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_21
);
863 if (dev_priv
->card_type
>= NV_20
)
864 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_47
);
866 if (dev_priv
->card_type
>= NV_30
)
867 rd_cio_state(dev
, head
, regp
, 0x9f);
869 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_49
);
870 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_HCUR_ADDR0_INDEX
);
871 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_HCUR_ADDR1_INDEX
);
872 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_HCUR_ADDR2_INDEX
);
873 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_ILACE__INDEX
);
875 if (dev_priv
->card_type
>= NV_10
) {
876 regp
->crtc_830
= NVReadCRTC(dev
, head
, NV_PCRTC_830
);
877 regp
->crtc_834
= NVReadCRTC(dev
, head
, NV_PCRTC_834
);
879 if (dev_priv
->card_type
>= NV_30
)
880 regp
->gpio_ext
= NVReadCRTC(dev
, head
, NV_PCRTC_GPIO_EXT
);
882 if (dev_priv
->card_type
== NV_40
)
883 regp
->crtc_850
= NVReadCRTC(dev
, head
, NV_PCRTC_850
);
885 if (nv_two_heads(dev
))
886 regp
->crtc_eng_ctrl
= NVReadCRTC(dev
, head
, NV_PCRTC_ENGINE_CTRL
);
887 regp
->cursor_cfg
= NVReadCRTC(dev
, head
, NV_PCRTC_CURSOR_CONFIG
);
890 regp
->crtc_cfg
= NVReadCRTC(dev
, head
, NV_PCRTC_CONFIG
);
892 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_SCRATCH3__INDEX
);
893 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_SCRATCH4__INDEX
);
894 if (dev_priv
->card_type
>= NV_10
) {
895 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_EBR_INDEX
);
896 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_CSB
);
897 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_4B
);
898 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_TVOUT_LATENCY
);
900 /* NV11 and NV20 don't have this, they stop at 0x52. */
901 if (nv_gf4_disp_arch(dev
)) {
902 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_53
);
903 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_54
);
905 for (i
= 0; i
< 0x10; i
++)
906 regp
->CR58
[i
] = NVReadVgaCrtc5758(dev
, head
, i
);
907 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_59
);
908 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_5B
);
910 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_85
);
911 rd_cio_state(dev
, head
, regp
, NV_CIO_CRE_86
);
914 regp
->fb_start
= NVReadCRTC(dev
, head
, NV_PCRTC_START
);
918 nv_load_state_ext(struct drm_device
*dev
, int head
,
919 struct nv04_mode_state
*state
)
921 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
922 struct nv04_crtc_reg
*regp
= &state
->crtc_reg
[head
];
926 if (dev_priv
->card_type
>= NV_10
) {
927 if (nv_two_heads(dev
))
928 /* setting ENGINE_CTRL (EC) *must* come before
929 * CIO_CRE_LCD, as writing CRE_LCD sets bits 16 & 17 in
930 * EC that should not be overwritten by writing stale EC
932 NVWriteCRTC(dev
, head
, NV_PCRTC_ENGINE_CTRL
, regp
->crtc_eng_ctrl
);
934 nvWriteVIDEO(dev
, NV_PVIDEO_STOP
, 1);
935 nvWriteVIDEO(dev
, NV_PVIDEO_INTR_EN
, 0);
936 nvWriteVIDEO(dev
, NV_PVIDEO_OFFSET_BUFF(0), 0);
937 nvWriteVIDEO(dev
, NV_PVIDEO_OFFSET_BUFF(1), 0);
939 nvWriteVIDEO(dev
, NV_PVIDEO_LIMIT(0), dev_priv
->fb_available_size
- 1);
940 nvWriteVIDEO(dev
, NV_PVIDEO_LIMIT(1), dev_priv
->fb_available_size
- 1);
941 nvWriteVIDEO(dev
, NV_PVIDEO_UVPLANE_LIMIT(0), dev_priv
->fb_available_size
- 1);
942 nvWriteVIDEO(dev
, NV_PVIDEO_UVPLANE_LIMIT(1), dev_priv
->fb_available_size
- 1);
944 nvWriteMC(dev
, NV_PBUS_POWERCTRL_2
, 0);
946 NVWriteCRTC(dev
, head
, NV_PCRTC_CURSOR_CONFIG
, regp
->cursor_cfg
);
947 NVWriteCRTC(dev
, head
, NV_PCRTC_830
, regp
->crtc_830
);
948 NVWriteCRTC(dev
, head
, NV_PCRTC_834
, regp
->crtc_834
);
950 if (dev_priv
->card_type
>= NV_30
)
951 NVWriteCRTC(dev
, head
, NV_PCRTC_GPIO_EXT
, regp
->gpio_ext
);
953 if (dev_priv
->card_type
== NV_40
) {
954 NVWriteCRTC(dev
, head
, NV_PCRTC_850
, regp
->crtc_850
);
956 reg900
= NVReadRAMDAC(dev
, head
, NV_PRAMDAC_900
);
957 if (regp
->crtc_cfg
== NV_PCRTC_CONFIG_START_ADDRESS_HSYNC
)
958 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_900
, reg900
| 0x10000);
960 NVWriteRAMDAC(dev
, head
, NV_PRAMDAC_900
, reg900
& ~0x10000);
964 NVWriteCRTC(dev
, head
, NV_PCRTC_CONFIG
, regp
->crtc_cfg
);
966 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_RPC0_INDEX
);
967 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_RPC1_INDEX
);
968 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_LSR_INDEX
);
969 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_PIXEL_INDEX
);
970 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_LCD__INDEX
);
971 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_HEB__INDEX
);
972 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_ENH_INDEX
);
973 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_FF_INDEX
);
974 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_FFLWM__INDEX
);
976 if (dev_priv
->card_type
>= NV_20
)
977 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_47
);
979 if (dev_priv
->card_type
>= NV_30
)
980 wr_cio_state(dev
, head
, regp
, 0x9f);
982 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_49
);
983 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
);
985 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_HCUR_ADDR2_INDEX
);
986 if (dev_priv
->card_type
== NV_40
)
987 nv_fix_nv40_hw_cursor(dev
, head
);
988 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_ILACE__INDEX
);
990 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_SCRATCH3__INDEX
);
991 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_SCRATCH4__INDEX
);
992 if (dev_priv
->card_type
>= NV_10
) {
993 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_EBR_INDEX
);
994 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_CSB
);
995 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_4B
);
996 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_TVOUT_LATENCY
);
998 /* NV11 and NV20 stop at 0x52. */
999 if (nv_gf4_disp_arch(dev
)) {
1000 if (dev_priv
->card_type
== NV_10
) {
1001 /* Not waiting for vertical retrace before modifying
1002 CRE_53/CRE_54 causes lockups. */
1003 nouveau_wait_until(dev
, 650000000, NV_PRMCIO_INP0__COLOR
, 0x8, 0x8);
1004 nouveau_wait_until(dev
, 650000000, NV_PRMCIO_INP0__COLOR
, 0x8, 0x0);
1007 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_53
);
1008 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_54
);
1010 for (i
= 0; i
< 0x10; i
++)
1011 NVWriteVgaCrtc5758(dev
, head
, i
, regp
->CR58
[i
]);
1012 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_59
);
1013 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_5B
);
1015 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_85
);
1016 wr_cio_state(dev
, head
, regp
, NV_CIO_CRE_86
);
1019 NVWriteCRTC(dev
, head
, NV_PCRTC_START
, regp
->fb_start
);
1021 /* Setting 1 on this value gives you interrupts for every vblank period. */
1022 NVWriteCRTC(dev
, head
, NV_PCRTC_INTR_EN_0
, 0);
1023 NVWriteCRTC(dev
, head
, NV_PCRTC_INTR_0
, NV_PCRTC_INTR_0_VBLANK
);
1027 nv_save_state_palette(struct drm_device
*dev
, int head
,
1028 struct nv04_mode_state
*state
)
1030 int head_offset
= head
* NV_PRMDIO_SIZE
, i
;
1032 nv_wr08(dev
, NV_PRMDIO_PIXEL_MASK
+ head_offset
,
1033 NV_PRMDIO_PIXEL_MASK_MASK
);
1034 nv_wr08(dev
, NV_PRMDIO_READ_MODE_ADDRESS
+ head_offset
, 0x0);
1036 for (i
= 0; i
< 768; i
++) {
1037 state
->crtc_reg
[head
].DAC
[i
] = nv_rd08(dev
,
1038 NV_PRMDIO_PALETTE_DATA
+ head_offset
);
1041 NVSetEnablePalette(dev
, head
, false);
1045 nouveau_hw_load_state_palette(struct drm_device
*dev
, int head
,
1046 struct nv04_mode_state
*state
)
1048 int head_offset
= head
* NV_PRMDIO_SIZE
, i
;
1050 nv_wr08(dev
, NV_PRMDIO_PIXEL_MASK
+ head_offset
,
1051 NV_PRMDIO_PIXEL_MASK_MASK
);
1052 nv_wr08(dev
, NV_PRMDIO_WRITE_MODE_ADDRESS
+ head_offset
, 0x0);
1054 for (i
= 0; i
< 768; i
++) {
1055 nv_wr08(dev
, NV_PRMDIO_PALETTE_DATA
+ head_offset
,
1056 state
->crtc_reg
[head
].DAC
[i
]);
1059 NVSetEnablePalette(dev
, head
, false);
1062 void nouveau_hw_save_state(struct drm_device
*dev
, int head
,
1063 struct nv04_mode_state
*state
)
1065 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
1067 if (dev_priv
->chipset
== 0x11)
1068 /* NB: no attempt is made to restore the bad pll later on */
1069 nouveau_hw_fix_bad_vpll(dev
, head
);
1070 nv_save_state_ramdac(dev
, head
, state
);
1071 nv_save_state_vga(dev
, head
, state
);
1072 nv_save_state_palette(dev
, head
, state
);
1073 nv_save_state_ext(dev
, head
, state
);
1076 void nouveau_hw_load_state(struct drm_device
*dev
, int head
,
1077 struct nv04_mode_state
*state
)
1079 NVVgaProtect(dev
, head
, true);
1080 nv_load_state_ramdac(dev
, head
, state
);
1081 nv_load_state_ext(dev
, head
, state
);
1082 nouveau_hw_load_state_palette(dev
, head
, state
);
1083 nv_load_state_vga(dev
, head
, state
);
1084 NVVgaProtect(dev
, head
, false);