Path: blob/master/drivers/gpu/drm/nouveau/nouveau_hw.c
15112 views
/*1* Copyright 2006 Dave Airlie2* Copyright 2007 Maarten Maathuis3* Copyright 2007-2009 Stuart Bennett4*5* Permission is hereby granted, free of charge, to any person obtaining a6* copy of this software and associated documentation files (the "Software"),7* to deal in the Software without restriction, including without limitation8* the rights to use, copy, modify, merge, publish, distribute, sublicense,9* and/or sell copies of the Software, and to permit persons to whom the10* Software is furnished to do so, subject to the following conditions:11*12* The above copyright notice and this permission notice shall be included in13* all copies or substantial portions of the Software.14*15* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR16* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,17* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL18* THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,19* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF20* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE21* SOFTWARE.22*/2324#include "drmP.h"25#include "nouveau_drv.h"26#include "nouveau_hw.h"2728#define CHIPSET_NFORCE 0x01a029#define CHIPSET_NFORCE2 0x01f03031/*32* misc hw access wrappers/control functions33*/3435void36NVWriteVgaSeq(struct drm_device *dev, int head, uint8_t index, uint8_t value)37{38NVWritePRMVIO(dev, head, NV_PRMVIO_SRX, index);39NVWritePRMVIO(dev, head, NV_PRMVIO_SR, value);40}4142uint8_t43NVReadVgaSeq(struct drm_device *dev, int head, uint8_t index)44{45NVWritePRMVIO(dev, head, NV_PRMVIO_SRX, index);46return NVReadPRMVIO(dev, head, NV_PRMVIO_SR);47}4849void50NVWriteVgaGr(struct drm_device *dev, int head, uint8_t index, uint8_t value)51{52NVWritePRMVIO(dev, head, NV_PRMVIO_GRX, index);53NVWritePRMVIO(dev, head, NV_PRMVIO_GX, value);54}5556uint8_t57NVReadVgaGr(struct drm_device *dev, int head, uint8_t index)58{59NVWritePRMVIO(dev, head, NV_PRMVIO_GRX, index);60return NVReadPRMVIO(dev, head, NV_PRMVIO_GX);61}6263/* 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 at65* 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 as67* expected and values can be set for the appropriate head by using a 0x200068* offset as required69* however:70* a) pre nv40, the head B range of PRMVIO regs at 0xc23c* was not exposed and71* cr44 must be set to 0 or 3 for accessing values on the correct head72* through the common 0xc03c* addresses73* b) in tied mode (4) head B is programmed to the values set on head A, and74* access using the head B addresses can have strange results, ergo we leave75* tied mode in init once we know to what cr44 should be restored on exit76*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 set80*/81void82NVSetOwner(struct drm_device *dev, int owner)83{84struct drm_nouveau_private *dev_priv = dev->dev_private;8586if (owner == 1)87owner *= 3;8889if (dev_priv->chipset == 0x11) {90/* This might seem stupid, but the blob does it and91* omitting it often locks the system up.92*/93NVReadVgaCrtc(dev, 0, NV_CIO_SR_LOCK_INDEX);94NVReadVgaCrtc(dev, 1, NV_CIO_SR_LOCK_INDEX);95}9697/* CR44 is always changed on CRTC0 */98NVWriteVgaCrtc(dev, 0, NV_CIO_CRE_44, owner);99100if (dev_priv->chipset == 0x11) { /* set me harder */101NVWriteVgaCrtc(dev, 0, NV_CIO_CRE_2E, owner);102NVWriteVgaCrtc(dev, 0, NV_CIO_CRE_2E, owner);103}104}105106void107NVBlankScreen(struct drm_device *dev, int head, bool blank)108{109unsigned char seq1;110111if (nv_two_heads(dev))112NVSetOwner(dev, head);113114seq1 = NVReadVgaSeq(dev, head, NV_VIO_SR_CLOCK_INDEX);115116NVVgaSeqReset(dev, head, true);117if (blank)118NVWriteVgaSeq(dev, head, NV_VIO_SR_CLOCK_INDEX, seq1 | 0x20);119else120NVWriteVgaSeq(dev, head, NV_VIO_SR_CLOCK_INDEX, seq1 & ~0x20);121NVVgaSeqReset(dev, head, false);122}123124/*125* PLL setting126*/127128static int129powerctrl_1_shift(int chip_version, int reg)130{131int shift = -4;132133if (chip_version < 0x17 || chip_version == 0x1a || chip_version == 0x20)134return shift;135136switch (reg) {137case NV_RAMDAC_VPLL2:138shift += 4;139case NV_PRAMDAC_VPLL_COEFF:140shift += 4;141case NV_PRAMDAC_MPLL_COEFF:142shift += 4;143case NV_PRAMDAC_NVPLL_COEFF:144shift += 4;145}146147/*148* the shift for vpll regs is only used for nv3x chips with a single149* stage pll150*/151if (shift > 4 && (chip_version < 0x32 || chip_version == 0x35 ||152chip_version == 0x36 || chip_version >= 0x40))153shift = -4;154155return shift;156}157158static void159setPLL_single(struct drm_device *dev, uint32_t reg, struct nouveau_pll_vals *pv)160{161struct drm_nouveau_private *dev_priv = dev->dev_private;162int chip_version = dev_priv->vbios.chip_version;163uint32_t oldpll = NVReadRAMDAC(dev, 0, reg);164int oldN = (oldpll >> 8) & 0xff, oldM = oldpll & 0xff;165uint32_t pll = (oldpll & 0xfff80000) | pv->log2P << 16 | pv->NM1;166uint32_t saved_powerctrl_1 = 0;167int shift_powerctrl_1 = powerctrl_1_shift(chip_version, reg);168169if (oldpll == pll)170return; /* already set */171172if (shift_powerctrl_1 >= 0) {173saved_powerctrl_1 = nvReadMC(dev, NV_PBUS_POWERCTRL_1);174nvWriteMC(dev, NV_PBUS_POWERCTRL_1,175(saved_powerctrl_1 & ~(0xf << shift_powerctrl_1)) |1761 << shift_powerctrl_1);177}178179if (oldM && pv->M1 && (oldN / oldM < pv->N1 / pv->M1))180/* upclock -- write new post divider first */181NVWriteRAMDAC(dev, 0, reg, pv->log2P << 16 | (oldpll & 0xffff));182else183/* downclock -- write new NM first */184NVWriteRAMDAC(dev, 0, reg, (oldpll & 0xffff0000) | pv->NM1);185186if (chip_version < 0x17 && chip_version != 0x11)187/* wait a bit on older chips */188msleep(64);189NVReadRAMDAC(dev, 0, reg);190191/* then write the other half as well */192NVWriteRAMDAC(dev, 0, reg, pll);193194if (shift_powerctrl_1 >= 0)195nvWriteMC(dev, NV_PBUS_POWERCTRL_1, saved_powerctrl_1);196}197198static uint32_t199new_ramdac580(uint32_t reg1, bool ss, uint32_t ramdac580)200{201bool head_a = (reg1 == NV_PRAMDAC_VPLL_COEFF);202203if (ss) /* single stage pll mode */204ramdac580 |= head_a ? NV_RAMDAC_580_VPLL1_ACTIVE :205NV_RAMDAC_580_VPLL2_ACTIVE;206else207ramdac580 &= head_a ? ~NV_RAMDAC_580_VPLL1_ACTIVE :208~NV_RAMDAC_580_VPLL2_ACTIVE;209210return ramdac580;211}212213static void214setPLL_double_highregs(struct drm_device *dev, uint32_t reg1,215struct nouveau_pll_vals *pv)216{217struct drm_nouveau_private *dev_priv = dev->dev_private;218int chip_version = dev_priv->vbios.chip_version;219bool nv3035 = chip_version == 0x30 || chip_version == 0x35;220uint32_t reg2 = reg1 + ((reg1 == NV_RAMDAC_VPLL2) ? 0x5c : 0x70);221uint32_t oldpll1 = NVReadRAMDAC(dev, 0, reg1);222uint32_t oldpll2 = !nv3035 ? NVReadRAMDAC(dev, 0, reg2) : 0;223uint32_t pll1 = (oldpll1 & 0xfff80000) | pv->log2P << 16 | pv->NM1;224uint32_t pll2 = (oldpll2 & 0x7fff0000) | 1 << 31 | pv->NM2;225uint32_t oldramdac580 = 0, ramdac580 = 0;226bool single_stage = !pv->NM2 || pv->N2 == pv->M2; /* nv41+ only */227uint32_t saved_powerctrl_1 = 0, savedc040 = 0;228int shift_powerctrl_1 = powerctrl_1_shift(chip_version, reg1);229230/* model specific additions to generic pll1 and pll2 set up above */231if (nv3035) {232pll1 = (pll1 & 0xfcc7ffff) | (pv->N2 & 0x18) << 21 |233(pv->N2 & 0x7) << 19 | 8 << 4 | (pv->M2 & 7) << 4;234pll2 = 0;235}236if (chip_version > 0x40 && reg1 >= NV_PRAMDAC_VPLL_COEFF) { /* !nv40 */237oldramdac580 = NVReadRAMDAC(dev, 0, NV_PRAMDAC_580);238ramdac580 = new_ramdac580(reg1, single_stage, oldramdac580);239if (oldramdac580 != ramdac580)240oldpll1 = ~0; /* force mismatch */241if (single_stage)242/* magic value used by nvidia in single stage mode */243pll2 |= 0x011f;244}245if (chip_version > 0x70)246/* magic bits set by the blob (but not the bios) on g71-73 */247pll1 = (pll1 & 0x7fffffff) | (single_stage ? 0x4 : 0xc) << 28;248249if (oldpll1 == pll1 && oldpll2 == pll2)250return; /* already set */251252if (shift_powerctrl_1 >= 0) {253saved_powerctrl_1 = nvReadMC(dev, NV_PBUS_POWERCTRL_1);254nvWriteMC(dev, NV_PBUS_POWERCTRL_1,255(saved_powerctrl_1 & ~(0xf << shift_powerctrl_1)) |2561 << shift_powerctrl_1);257}258259if (chip_version >= 0x40) {260int shift_c040 = 14;261262switch (reg1) {263case NV_PRAMDAC_MPLL_COEFF:264shift_c040 += 2;265case NV_PRAMDAC_NVPLL_COEFF:266shift_c040 += 2;267case NV_RAMDAC_VPLL2:268shift_c040 += 2;269case NV_PRAMDAC_VPLL_COEFF:270shift_c040 += 2;271}272273savedc040 = nvReadMC(dev, 0xc040);274if (shift_c040 != 14)275nvWriteMC(dev, 0xc040, savedc040 & ~(3 << shift_c040));276}277278if (oldramdac580 != ramdac580)279NVWriteRAMDAC(dev, 0, NV_PRAMDAC_580, ramdac580);280281if (!nv3035)282NVWriteRAMDAC(dev, 0, reg2, pll2);283NVWriteRAMDAC(dev, 0, reg1, pll1);284285if (shift_powerctrl_1 >= 0)286nvWriteMC(dev, NV_PBUS_POWERCTRL_1, saved_powerctrl_1);287if (chip_version >= 0x40)288nvWriteMC(dev, 0xc040, savedc040);289}290291static void292setPLL_double_lowregs(struct drm_device *dev, uint32_t NMNMreg,293struct nouveau_pll_vals *pv)294{295/* When setting PLLs, there is a merry game of disabling and enabling296* various bits of hardware during the process. This function is a297* synthesis of six nv4x traces, nearly each card doing a subtly298* different thing. With luck all the necessary bits for each card are299* combined herein. Without luck it deviates from each card's formula300* so as to not work on any :)301*/302303uint32_t Preg = NMNMreg - 4;304bool mpll = Preg == 0x4020;305uint32_t oldPval = nvReadMC(dev, Preg);306uint32_t NMNM = pv->NM2 << 16 | pv->NM1;307uint32_t Pval = (oldPval & (mpll ? ~(0x77 << 16) : ~(7 << 16))) |3080xc << 28 | pv->log2P << 16;309uint32_t saved4600 = 0;310/* some cards have different maskc040s */311uint32_t maskc040 = ~(3 << 14), savedc040;312bool single_stage = !pv->NM2 || pv->N2 == pv->M2;313314if (nvReadMC(dev, NMNMreg) == NMNM && (oldPval & 0xc0070000) == Pval)315return;316317if (Preg == 0x4000)318maskc040 = ~0x333;319if (Preg == 0x4058)320maskc040 = ~(0xc << 24);321322if (mpll) {323struct pll_lims pll_lim;324uint8_t Pval2;325326if (get_pll_limits(dev, Preg, &pll_lim))327return;328329Pval2 = pv->log2P + pll_lim.log2p_bias;330if (Pval2 > pll_lim.max_log2p)331Pval2 = pll_lim.max_log2p;332Pval |= 1 << 28 | Pval2 << 20;333334saved4600 = nvReadMC(dev, 0x4600);335nvWriteMC(dev, 0x4600, saved4600 | 8 << 28);336}337if (single_stage)338Pval |= mpll ? 1 << 12 : 1 << 8;339340nvWriteMC(dev, Preg, oldPval | 1 << 28);341nvWriteMC(dev, Preg, Pval & ~(4 << 28));342if (mpll) {343Pval |= 8 << 20;344nvWriteMC(dev, 0x4020, Pval & ~(0xc << 28));345nvWriteMC(dev, 0x4038, Pval & ~(0xc << 28));346}347348savedc040 = nvReadMC(dev, 0xc040);349nvWriteMC(dev, 0xc040, savedc040 & maskc040);350351nvWriteMC(dev, NMNMreg, NMNM);352if (NMNMreg == 0x4024)353nvWriteMC(dev, 0x403c, NMNM);354355nvWriteMC(dev, Preg, Pval);356if (mpll) {357Pval &= ~(8 << 20);358nvWriteMC(dev, 0x4020, Pval);359nvWriteMC(dev, 0x4038, Pval);360nvWriteMC(dev, 0x4600, saved4600);361}362363nvWriteMC(dev, 0xc040, savedc040);364365if (mpll) {366nvWriteMC(dev, 0x4020, Pval & ~(1 << 28));367nvWriteMC(dev, 0x4038, Pval & ~(1 << 28));368}369}370371void372nouveau_hw_setpll(struct drm_device *dev, uint32_t reg1,373struct nouveau_pll_vals *pv)374{375struct drm_nouveau_private *dev_priv = dev->dev_private;376int cv = dev_priv->vbios.chip_version;377378if (cv == 0x30 || cv == 0x31 || cv == 0x35 || cv == 0x36 ||379cv >= 0x40) {380if (reg1 > 0x405c)381setPLL_double_highregs(dev, reg1, pv);382else383setPLL_double_lowregs(dev, reg1, pv);384} else385setPLL_single(dev, reg1, pv);386}387388/*389* PLL getting390*/391392static void393nouveau_hw_decode_pll(struct drm_device *dev, uint32_t reg1, uint32_t pll1,394uint32_t pll2, struct nouveau_pll_vals *pllvals)395{396struct drm_nouveau_private *dev_priv = dev->dev_private;397398/* to force parsing as single stage (i.e. nv40 vplls) pass pll2 as 0 */399400/* log2P is & 0x7 as never more than 7, and nv30/35 only uses 3 bits */401pllvals->log2P = (pll1 >> 16) & 0x7;402pllvals->N2 = pllvals->M2 = 1;403404if (reg1 <= 0x405c) {405pllvals->NM1 = pll2 & 0xffff;406/* single stage NVPLL and VPLLs use 1 << 8, MPLL uses 1 << 12 */407if (!(pll1 & 0x1100))408pllvals->NM2 = pll2 >> 16;409} else {410pllvals->NM1 = pll1 & 0xffff;411if (nv_two_reg_pll(dev) && pll2 & NV31_RAMDAC_ENABLE_VCO2)412pllvals->NM2 = pll2 & 0xffff;413else if (dev_priv->chipset == 0x30 || dev_priv->chipset == 0x35) {414pllvals->M1 &= 0xf; /* only 4 bits */415if (pll1 & NV30_RAMDAC_ENABLE_VCO2) {416pllvals->M2 = (pll1 >> 4) & 0x7;417pllvals->N2 = ((pll1 >> 21) & 0x18) |418((pll1 >> 19) & 0x7);419}420}421}422}423424int425nouveau_hw_get_pllvals(struct drm_device *dev, enum pll_types plltype,426struct nouveau_pll_vals *pllvals)427{428struct drm_nouveau_private *dev_priv = dev->dev_private;429uint32_t reg1 = get_pll_register(dev, plltype), pll1, pll2 = 0;430struct pll_lims pll_lim;431int ret;432433if (reg1 == 0)434return -ENOENT;435436pll1 = nvReadMC(dev, reg1);437438if (reg1 <= 0x405c)439pll2 = nvReadMC(dev, reg1 + 4);440else if (nv_two_reg_pll(dev)) {441uint32_t reg2 = reg1 + (reg1 == NV_RAMDAC_VPLL2 ? 0x5c : 0x70);442443pll2 = nvReadMC(dev, reg2);444}445446if (dev_priv->card_type == 0x40 && reg1 >= NV_PRAMDAC_VPLL_COEFF) {447uint32_t ramdac580 = NVReadRAMDAC(dev, 0, NV_PRAMDAC_580);448449/* check whether vpll has been forced into single stage mode */450if (reg1 == NV_PRAMDAC_VPLL_COEFF) {451if (ramdac580 & NV_RAMDAC_580_VPLL1_ACTIVE)452pll2 = 0;453} else454if (ramdac580 & NV_RAMDAC_580_VPLL2_ACTIVE)455pll2 = 0;456}457458nouveau_hw_decode_pll(dev, reg1, pll1, pll2, pllvals);459460ret = get_pll_limits(dev, plltype, &pll_lim);461if (ret)462return ret;463464pllvals->refclk = pll_lim.refclk;465466return 0;467}468469int470nouveau_hw_pllvals_to_clk(struct nouveau_pll_vals *pv)471{472/* Avoid divide by zero if called at an inappropriate time */473if (!pv->M1 || !pv->M2)474return 0;475476return pv->N1 * pv->N2 * pv->refclk / (pv->M1 * pv->M2) >> pv->log2P;477}478479int480nouveau_hw_get_clock(struct drm_device *dev, enum pll_types plltype)481{482struct nouveau_pll_vals pllvals;483int ret;484485if (plltype == PLL_MEMORY &&486(dev->pci_device & 0x0ff0) == CHIPSET_NFORCE) {487uint32_t mpllP;488489pci_read_config_dword(pci_get_bus_and_slot(0, 3), 0x6c, &mpllP);490if (!mpllP)491mpllP = 4;492493return 400000 / mpllP;494} else495if (plltype == PLL_MEMORY &&496(dev->pci_device & 0xff0) == CHIPSET_NFORCE2) {497uint32_t clock;498499pci_read_config_dword(pci_get_bus_and_slot(0, 5), 0x4c, &clock);500return clock;501}502503ret = nouveau_hw_get_pllvals(dev, plltype, &pllvals);504if (ret)505return ret;506507return nouveau_hw_pllvals_to_clk(&pllvals);508}509510static void511nouveau_hw_fix_bad_vpll(struct drm_device *dev, int head)512{513/* the vpll on an unused head can come up with a random value, way514* beyond the pll limits. for some reason this causes the chip to515* lock up when reading the dac palette regs, so set a valid pll here516* when such a condition detected. only seen on nv11 to date517*/518519struct pll_lims pll_lim;520struct nouveau_pll_vals pv;521enum pll_types pll = head ? PLL_VPLL1 : PLL_VPLL0;522523if (get_pll_limits(dev, pll, &pll_lim))524return;525nouveau_hw_get_pllvals(dev, pll, &pv);526527if (pv.M1 >= pll_lim.vco1.min_m && pv.M1 <= pll_lim.vco1.max_m &&528pv.N1 >= pll_lim.vco1.min_n && pv.N1 <= pll_lim.vco1.max_n &&529pv.log2P <= pll_lim.max_log2p)530return;531532NV_WARN(dev, "VPLL %d outwith limits, attempting to fix\n", head + 1);533534/* set lowest clock within static limits */535pv.M1 = pll_lim.vco1.max_m;536pv.N1 = pll_lim.vco1.min_n;537pv.log2P = pll_lim.max_usable_log2p;538nouveau_hw_setpll(dev, pll_lim.reg, &pv);539}540541/*542* vga font save/restore543*/544545static void nouveau_vga_font_io(struct drm_device *dev,546void __iomem *iovram,547bool save, unsigned plane)548{549struct drm_nouveau_private *dev_priv = dev->dev_private;550unsigned i;551552NVWriteVgaSeq(dev, 0, NV_VIO_SR_PLANE_MASK_INDEX, 1 << plane);553NVWriteVgaGr(dev, 0, NV_VIO_GX_READ_MAP_INDEX, plane);554for (i = 0; i < 16384; i++) {555if (save) {556dev_priv->saved_vga_font[plane][i] =557ioread32_native(iovram + i * 4);558} else {559iowrite32_native(dev_priv->saved_vga_font[plane][i],560iovram + i * 4);561}562}563}564565void566nouveau_hw_save_vga_fonts(struct drm_device *dev, bool save)567{568uint8_t misc, gr4, gr5, gr6, seq2, seq4;569bool graphicsmode;570unsigned plane;571void __iomem *iovram;572573if (nv_two_heads(dev))574NVSetOwner(dev, 0);575576NVSetEnablePalette(dev, 0, true);577graphicsmode = NVReadVgaAttr(dev, 0, NV_CIO_AR_MODE_INDEX) & 1;578NVSetEnablePalette(dev, 0, false);579580if (graphicsmode) /* graphics mode => framebuffer => no need to save */581return;582583NV_INFO(dev, "%sing VGA fonts\n", save ? "Sav" : "Restor");584585/* map first 64KiB of VRAM, holds VGA fonts etc */586iovram = ioremap(pci_resource_start(dev->pdev, 1), 65536);587if (!iovram) {588NV_ERROR(dev, "Failed to map VRAM, "589"cannot save/restore VGA fonts.\n");590return;591}592593if (nv_two_heads(dev))594NVBlankScreen(dev, 1, true);595NVBlankScreen(dev, 0, true);596597/* save control regs */598misc = NVReadPRMVIO(dev, 0, NV_PRMVIO_MISC__READ);599seq2 = NVReadVgaSeq(dev, 0, NV_VIO_SR_PLANE_MASK_INDEX);600seq4 = NVReadVgaSeq(dev, 0, NV_VIO_SR_MEM_MODE_INDEX);601gr4 = NVReadVgaGr(dev, 0, NV_VIO_GX_READ_MAP_INDEX);602gr5 = NVReadVgaGr(dev, 0, NV_VIO_GX_MODE_INDEX);603gr6 = NVReadVgaGr(dev, 0, NV_VIO_GX_MISC_INDEX);604605NVWritePRMVIO(dev, 0, NV_PRMVIO_MISC__WRITE, 0x67);606NVWriteVgaSeq(dev, 0, NV_VIO_SR_MEM_MODE_INDEX, 0x6);607NVWriteVgaGr(dev, 0, NV_VIO_GX_MODE_INDEX, 0x0);608NVWriteVgaGr(dev, 0, NV_VIO_GX_MISC_INDEX, 0x5);609610/* store font in planes 0..3 */611for (plane = 0; plane < 4; plane++)612nouveau_vga_font_io(dev, iovram, save, plane);613614/* restore control regs */615NVWritePRMVIO(dev, 0, NV_PRMVIO_MISC__WRITE, misc);616NVWriteVgaGr(dev, 0, NV_VIO_GX_READ_MAP_INDEX, gr4);617NVWriteVgaGr(dev, 0, NV_VIO_GX_MODE_INDEX, gr5);618NVWriteVgaGr(dev, 0, NV_VIO_GX_MISC_INDEX, gr6);619NVWriteVgaSeq(dev, 0, NV_VIO_SR_PLANE_MASK_INDEX, seq2);620NVWriteVgaSeq(dev, 0, NV_VIO_SR_MEM_MODE_INDEX, seq4);621622if (nv_two_heads(dev))623NVBlankScreen(dev, 1, false);624NVBlankScreen(dev, 0, false);625626iounmap(iovram);627}628629/*630* mode state save/load631*/632633static void634rd_cio_state(struct drm_device *dev, int head,635struct nv04_crtc_reg *crtcstate, int index)636{637crtcstate->CRTC[index] = NVReadVgaCrtc(dev, head, index);638}639640static void641wr_cio_state(struct drm_device *dev, int head,642struct nv04_crtc_reg *crtcstate, int index)643{644NVWriteVgaCrtc(dev, head, index, crtcstate->CRTC[index]);645}646647static void648nv_save_state_ramdac(struct drm_device *dev, int head,649struct nv04_mode_state *state)650{651struct drm_nouveau_private *dev_priv = dev->dev_private;652struct nv04_crtc_reg *regp = &state->crtc_reg[head];653int i;654655if (dev_priv->card_type >= NV_10)656regp->nv10_cursync = NVReadRAMDAC(dev, head, NV_RAMDAC_NV10_CURSYNC);657658nouveau_hw_get_pllvals(dev, head ? PLL_VPLL1 : PLL_VPLL0, ®p->pllvals);659state->pllsel = NVReadRAMDAC(dev, 0, NV_PRAMDAC_PLL_COEFF_SELECT);660if (nv_two_heads(dev))661state->sel_clk = NVReadRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK);662if (dev_priv->chipset == 0x11)663regp->dither = NVReadRAMDAC(dev, head, NV_RAMDAC_DITHER_NV11);664665regp->ramdac_gen_ctrl = NVReadRAMDAC(dev, head, NV_PRAMDAC_GENERAL_CONTROL);666667if (nv_gf4_disp_arch(dev))668regp->ramdac_630 = NVReadRAMDAC(dev, head, NV_PRAMDAC_630);669if (dev_priv->chipset >= 0x30)670regp->ramdac_634 = NVReadRAMDAC(dev, head, NV_PRAMDAC_634);671672regp->tv_setup = NVReadRAMDAC(dev, head, NV_PRAMDAC_TV_SETUP);673regp->tv_vtotal = NVReadRAMDAC(dev, head, NV_PRAMDAC_TV_VTOTAL);674regp->tv_vskew = NVReadRAMDAC(dev, head, NV_PRAMDAC_TV_VSKEW);675regp->tv_vsync_delay = NVReadRAMDAC(dev, head, NV_PRAMDAC_TV_VSYNC_DELAY);676regp->tv_htotal = NVReadRAMDAC(dev, head, NV_PRAMDAC_TV_HTOTAL);677regp->tv_hskew = NVReadRAMDAC(dev, head, NV_PRAMDAC_TV_HSKEW);678regp->tv_hsync_delay = NVReadRAMDAC(dev, head, NV_PRAMDAC_TV_HSYNC_DELAY);679regp->tv_hsync_delay2 = NVReadRAMDAC(dev, head, NV_PRAMDAC_TV_HSYNC_DELAY2);680681for (i = 0; i < 7; i++) {682uint32_t ramdac_reg = NV_PRAMDAC_FP_VDISPLAY_END + (i * 4);683regp->fp_vert_regs[i] = NVReadRAMDAC(dev, head, ramdac_reg);684regp->fp_horiz_regs[i] = NVReadRAMDAC(dev, head, ramdac_reg + 0x20);685}686687if (nv_gf4_disp_arch(dev)) {688regp->dither = NVReadRAMDAC(dev, head, NV_RAMDAC_FP_DITHER);689for (i = 0; i < 3; i++) {690regp->dither_regs[i] = NVReadRAMDAC(dev, head, NV_PRAMDAC_850 + i * 4);691regp->dither_regs[i + 3] = NVReadRAMDAC(dev, head, NV_PRAMDAC_85C + i * 4);692}693}694695regp->fp_control = NVReadRAMDAC(dev, head, NV_PRAMDAC_FP_TG_CONTROL);696regp->fp_debug_0 = NVReadRAMDAC(dev, head, NV_PRAMDAC_FP_DEBUG_0);697if (!nv_gf4_disp_arch(dev) && head == 0) {698/* early chips don't allow access to PRAMDAC_TMDS_* without699* the head A FPCLK on (nv11 even locks up) */700NVWriteRAMDAC(dev, 0, NV_PRAMDAC_FP_DEBUG_0, regp->fp_debug_0 &701~NV_PRAMDAC_FP_DEBUG_0_PWRDOWN_FPCLK);702}703regp->fp_debug_1 = NVReadRAMDAC(dev, head, NV_PRAMDAC_FP_DEBUG_1);704regp->fp_debug_2 = NVReadRAMDAC(dev, head, NV_PRAMDAC_FP_DEBUG_2);705706regp->fp_margin_color = NVReadRAMDAC(dev, head, NV_PRAMDAC_FP_MARGIN_COLOR);707708if (nv_gf4_disp_arch(dev))709regp->ramdac_8c0 = NVReadRAMDAC(dev, head, NV_PRAMDAC_8C0);710711if (dev_priv->card_type == NV_40) {712regp->ramdac_a20 = NVReadRAMDAC(dev, head, NV_PRAMDAC_A20);713regp->ramdac_a24 = NVReadRAMDAC(dev, head, NV_PRAMDAC_A24);714regp->ramdac_a34 = NVReadRAMDAC(dev, head, NV_PRAMDAC_A34);715716for (i = 0; i < 38; i++)717regp->ctv_regs[i] = NVReadRAMDAC(dev, head,718NV_PRAMDAC_CTV + 4*i);719}720}721722static void723nv_load_state_ramdac(struct drm_device *dev, int head,724struct nv04_mode_state *state)725{726struct drm_nouveau_private *dev_priv = dev->dev_private;727struct nv04_crtc_reg *regp = &state->crtc_reg[head];728uint32_t pllreg = head ? NV_RAMDAC_VPLL2 : NV_PRAMDAC_VPLL_COEFF;729int i;730731if (dev_priv->card_type >= NV_10)732NVWriteRAMDAC(dev, head, NV_RAMDAC_NV10_CURSYNC, regp->nv10_cursync);733734nouveau_hw_setpll(dev, pllreg, ®p->pllvals);735NVWriteRAMDAC(dev, 0, NV_PRAMDAC_PLL_COEFF_SELECT, state->pllsel);736if (nv_two_heads(dev))737NVWriteRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK, state->sel_clk);738if (dev_priv->chipset == 0x11)739NVWriteRAMDAC(dev, head, NV_RAMDAC_DITHER_NV11, regp->dither);740741NVWriteRAMDAC(dev, head, NV_PRAMDAC_GENERAL_CONTROL, regp->ramdac_gen_ctrl);742743if (nv_gf4_disp_arch(dev))744NVWriteRAMDAC(dev, head, NV_PRAMDAC_630, regp->ramdac_630);745if (dev_priv->chipset >= 0x30)746NVWriteRAMDAC(dev, head, NV_PRAMDAC_634, regp->ramdac_634);747748NVWriteRAMDAC(dev, head, NV_PRAMDAC_TV_SETUP, regp->tv_setup);749NVWriteRAMDAC(dev, head, NV_PRAMDAC_TV_VTOTAL, regp->tv_vtotal);750NVWriteRAMDAC(dev, head, NV_PRAMDAC_TV_VSKEW, regp->tv_vskew);751NVWriteRAMDAC(dev, head, NV_PRAMDAC_TV_VSYNC_DELAY, regp->tv_vsync_delay);752NVWriteRAMDAC(dev, head, NV_PRAMDAC_TV_HTOTAL, regp->tv_htotal);753NVWriteRAMDAC(dev, head, NV_PRAMDAC_TV_HSKEW, regp->tv_hskew);754NVWriteRAMDAC(dev, head, NV_PRAMDAC_TV_HSYNC_DELAY, regp->tv_hsync_delay);755NVWriteRAMDAC(dev, head, NV_PRAMDAC_TV_HSYNC_DELAY2, regp->tv_hsync_delay2);756757for (i = 0; i < 7; i++) {758uint32_t ramdac_reg = NV_PRAMDAC_FP_VDISPLAY_END + (i * 4);759760NVWriteRAMDAC(dev, head, ramdac_reg, regp->fp_vert_regs[i]);761NVWriteRAMDAC(dev, head, ramdac_reg + 0x20, regp->fp_horiz_regs[i]);762}763764if (nv_gf4_disp_arch(dev)) {765NVWriteRAMDAC(dev, head, NV_RAMDAC_FP_DITHER, regp->dither);766for (i = 0; i < 3; i++) {767NVWriteRAMDAC(dev, head, NV_PRAMDAC_850 + i * 4, regp->dither_regs[i]);768NVWriteRAMDAC(dev, head, NV_PRAMDAC_85C + i * 4, regp->dither_regs[i + 3]);769}770}771772NVWriteRAMDAC(dev, head, NV_PRAMDAC_FP_TG_CONTROL, regp->fp_control);773NVWriteRAMDAC(dev, head, NV_PRAMDAC_FP_DEBUG_0, regp->fp_debug_0);774NVWriteRAMDAC(dev, head, NV_PRAMDAC_FP_DEBUG_1, regp->fp_debug_1);775NVWriteRAMDAC(dev, head, NV_PRAMDAC_FP_DEBUG_2, regp->fp_debug_2);776777NVWriteRAMDAC(dev, head, NV_PRAMDAC_FP_MARGIN_COLOR, regp->fp_margin_color);778779if (nv_gf4_disp_arch(dev))780NVWriteRAMDAC(dev, head, NV_PRAMDAC_8C0, regp->ramdac_8c0);781782if (dev_priv->card_type == NV_40) {783NVWriteRAMDAC(dev, head, NV_PRAMDAC_A20, regp->ramdac_a20);784NVWriteRAMDAC(dev, head, NV_PRAMDAC_A24, regp->ramdac_a24);785NVWriteRAMDAC(dev, head, NV_PRAMDAC_A34, regp->ramdac_a34);786787for (i = 0; i < 38; i++)788NVWriteRAMDAC(dev, head,789NV_PRAMDAC_CTV + 4*i, regp->ctv_regs[i]);790}791}792793static void794nv_save_state_vga(struct drm_device *dev, int head,795struct nv04_mode_state *state)796{797struct nv04_crtc_reg *regp = &state->crtc_reg[head];798int i;799800regp->MiscOutReg = NVReadPRMVIO(dev, head, NV_PRMVIO_MISC__READ);801802for (i = 0; i < 25; i++)803rd_cio_state(dev, head, regp, i);804805NVSetEnablePalette(dev, head, true);806for (i = 0; i < 21; i++)807regp->Attribute[i] = NVReadVgaAttr(dev, head, i);808NVSetEnablePalette(dev, head, false);809810for (i = 0; i < 9; i++)811regp->Graphics[i] = NVReadVgaGr(dev, head, i);812813for (i = 0; i < 5; i++)814regp->Sequencer[i] = NVReadVgaSeq(dev, head, i);815}816817static void818nv_load_state_vga(struct drm_device *dev, int head,819struct nv04_mode_state *state)820{821struct nv04_crtc_reg *regp = &state->crtc_reg[head];822int i;823824NVWritePRMVIO(dev, head, NV_PRMVIO_MISC__WRITE, regp->MiscOutReg);825826for (i = 0; i < 5; i++)827NVWriteVgaSeq(dev, head, i, regp->Sequencer[i]);828829nv_lock_vga_crtc_base(dev, head, false);830for (i = 0; i < 25; i++)831wr_cio_state(dev, head, regp, i);832nv_lock_vga_crtc_base(dev, head, true);833834for (i = 0; i < 9; i++)835NVWriteVgaGr(dev, head, i, regp->Graphics[i]);836837NVSetEnablePalette(dev, head, true);838for (i = 0; i < 21; i++)839NVWriteVgaAttr(dev, head, i, regp->Attribute[i]);840NVSetEnablePalette(dev, head, false);841}842843static void844nv_save_state_ext(struct drm_device *dev, int head,845struct nv04_mode_state *state)846{847struct drm_nouveau_private *dev_priv = dev->dev_private;848struct nv04_crtc_reg *regp = &state->crtc_reg[head];849int i;850851rd_cio_state(dev, head, regp, NV_CIO_CRE_LCD__INDEX);852rd_cio_state(dev, head, regp, NV_CIO_CRE_RPC0_INDEX);853rd_cio_state(dev, head, regp, NV_CIO_CRE_RPC1_INDEX);854rd_cio_state(dev, head, regp, NV_CIO_CRE_LSR_INDEX);855rd_cio_state(dev, head, regp, NV_CIO_CRE_PIXEL_INDEX);856rd_cio_state(dev, head, regp, NV_CIO_CRE_HEB__INDEX);857rd_cio_state(dev, head, regp, NV_CIO_CRE_ENH_INDEX);858859rd_cio_state(dev, head, regp, NV_CIO_CRE_FF_INDEX);860rd_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX);861rd_cio_state(dev, head, regp, NV_CIO_CRE_21);862863if (dev_priv->card_type >= NV_20)864rd_cio_state(dev, head, regp, NV_CIO_CRE_47);865866if (dev_priv->card_type >= NV_30)867rd_cio_state(dev, head, regp, 0x9f);868869rd_cio_state(dev, head, regp, NV_CIO_CRE_49);870rd_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX);871rd_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR1_INDEX);872rd_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR2_INDEX);873rd_cio_state(dev, head, regp, NV_CIO_CRE_ILACE__INDEX);874875if (dev_priv->card_type >= NV_10) {876regp->crtc_830 = NVReadCRTC(dev, head, NV_PCRTC_830);877regp->crtc_834 = NVReadCRTC(dev, head, NV_PCRTC_834);878879if (dev_priv->card_type >= NV_30)880regp->gpio_ext = NVReadCRTC(dev, head, NV_PCRTC_GPIO_EXT);881882if (dev_priv->card_type == NV_40)883regp->crtc_850 = NVReadCRTC(dev, head, NV_PCRTC_850);884885if (nv_two_heads(dev))886regp->crtc_eng_ctrl = NVReadCRTC(dev, head, NV_PCRTC_ENGINE_CTRL);887regp->cursor_cfg = NVReadCRTC(dev, head, NV_PCRTC_CURSOR_CONFIG);888}889890regp->crtc_cfg = NVReadCRTC(dev, head, NV_PCRTC_CONFIG);891892rd_cio_state(dev, head, regp, NV_CIO_CRE_SCRATCH3__INDEX);893rd_cio_state(dev, head, regp, NV_CIO_CRE_SCRATCH4__INDEX);894if (dev_priv->card_type >= NV_10) {895rd_cio_state(dev, head, regp, NV_CIO_CRE_EBR_INDEX);896rd_cio_state(dev, head, regp, NV_CIO_CRE_CSB);897rd_cio_state(dev, head, regp, NV_CIO_CRE_4B);898rd_cio_state(dev, head, regp, NV_CIO_CRE_TVOUT_LATENCY);899}900/* NV11 and NV20 don't have this, they stop at 0x52. */901if (nv_gf4_disp_arch(dev)) {902rd_cio_state(dev, head, regp, NV_CIO_CRE_42);903rd_cio_state(dev, head, regp, NV_CIO_CRE_53);904rd_cio_state(dev, head, regp, NV_CIO_CRE_54);905906for (i = 0; i < 0x10; i++)907regp->CR58[i] = NVReadVgaCrtc5758(dev, head, i);908rd_cio_state(dev, head, regp, NV_CIO_CRE_59);909rd_cio_state(dev, head, regp, NV_CIO_CRE_5B);910911rd_cio_state(dev, head, regp, NV_CIO_CRE_85);912rd_cio_state(dev, head, regp, NV_CIO_CRE_86);913}914915regp->fb_start = NVReadCRTC(dev, head, NV_PCRTC_START);916}917918static void919nv_load_state_ext(struct drm_device *dev, int head,920struct nv04_mode_state *state)921{922struct drm_nouveau_private *dev_priv = dev->dev_private;923struct nv04_crtc_reg *regp = &state->crtc_reg[head];924uint32_t reg900;925int i;926927if (dev_priv->card_type >= NV_10) {928if (nv_two_heads(dev))929/* setting ENGINE_CTRL (EC) *must* come before930* CIO_CRE_LCD, as writing CRE_LCD sets bits 16 & 17 in931* EC that should not be overwritten by writing stale EC932*/933NVWriteCRTC(dev, head, NV_PCRTC_ENGINE_CTRL, regp->crtc_eng_ctrl);934935nvWriteVIDEO(dev, NV_PVIDEO_STOP, 1);936nvWriteVIDEO(dev, NV_PVIDEO_INTR_EN, 0);937nvWriteVIDEO(dev, NV_PVIDEO_OFFSET_BUFF(0), 0);938nvWriteVIDEO(dev, NV_PVIDEO_OFFSET_BUFF(1), 0);939nvWriteVIDEO(dev, NV_PVIDEO_LIMIT(0), dev_priv->fb_available_size - 1);940nvWriteVIDEO(dev, NV_PVIDEO_LIMIT(1), dev_priv->fb_available_size - 1);941nvWriteVIDEO(dev, NV_PVIDEO_UVPLANE_LIMIT(0), dev_priv->fb_available_size - 1);942nvWriteVIDEO(dev, NV_PVIDEO_UVPLANE_LIMIT(1), dev_priv->fb_available_size - 1);943nvWriteMC(dev, NV_PBUS_POWERCTRL_2, 0);944945NVWriteCRTC(dev, head, NV_PCRTC_CURSOR_CONFIG, regp->cursor_cfg);946NVWriteCRTC(dev, head, NV_PCRTC_830, regp->crtc_830);947NVWriteCRTC(dev, head, NV_PCRTC_834, regp->crtc_834);948949if (dev_priv->card_type >= NV_30)950NVWriteCRTC(dev, head, NV_PCRTC_GPIO_EXT, regp->gpio_ext);951952if (dev_priv->card_type == NV_40) {953NVWriteCRTC(dev, head, NV_PCRTC_850, regp->crtc_850);954955reg900 = NVReadRAMDAC(dev, head, NV_PRAMDAC_900);956if (regp->crtc_cfg == NV10_PCRTC_CONFIG_START_ADDRESS_HSYNC)957NVWriteRAMDAC(dev, head, NV_PRAMDAC_900, reg900 | 0x10000);958else959NVWriteRAMDAC(dev, head, NV_PRAMDAC_900, reg900 & ~0x10000);960}961}962963NVWriteCRTC(dev, head, NV_PCRTC_CONFIG, regp->crtc_cfg);964965wr_cio_state(dev, head, regp, NV_CIO_CRE_RPC0_INDEX);966wr_cio_state(dev, head, regp, NV_CIO_CRE_RPC1_INDEX);967wr_cio_state(dev, head, regp, NV_CIO_CRE_LSR_INDEX);968wr_cio_state(dev, head, regp, NV_CIO_CRE_PIXEL_INDEX);969wr_cio_state(dev, head, regp, NV_CIO_CRE_LCD__INDEX);970wr_cio_state(dev, head, regp, NV_CIO_CRE_HEB__INDEX);971wr_cio_state(dev, head, regp, NV_CIO_CRE_ENH_INDEX);972wr_cio_state(dev, head, regp, NV_CIO_CRE_FF_INDEX);973wr_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX);974975if (dev_priv->card_type >= NV_20)976wr_cio_state(dev, head, regp, NV_CIO_CRE_47);977978if (dev_priv->card_type >= NV_30)979wr_cio_state(dev, head, regp, 0x9f);980981wr_cio_state(dev, head, regp, NV_CIO_CRE_49);982wr_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX);983wr_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR1_INDEX);984wr_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR2_INDEX);985if (dev_priv->card_type == NV_40)986nv_fix_nv40_hw_cursor(dev, head);987wr_cio_state(dev, head, regp, NV_CIO_CRE_ILACE__INDEX);988989wr_cio_state(dev, head, regp, NV_CIO_CRE_SCRATCH3__INDEX);990wr_cio_state(dev, head, regp, NV_CIO_CRE_SCRATCH4__INDEX);991if (dev_priv->card_type >= NV_10) {992wr_cio_state(dev, head, regp, NV_CIO_CRE_EBR_INDEX);993wr_cio_state(dev, head, regp, NV_CIO_CRE_CSB);994wr_cio_state(dev, head, regp, NV_CIO_CRE_4B);995wr_cio_state(dev, head, regp, NV_CIO_CRE_TVOUT_LATENCY);996}997/* NV11 and NV20 stop at 0x52. */998if (nv_gf4_disp_arch(dev)) {999if (dev_priv->card_type == NV_10) {1000/* Not waiting for vertical retrace before modifying1001CRE_53/CRE_54 causes lockups. */1002nouveau_wait_eq(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x8);1003nouveau_wait_eq(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x0);1004}10051006wr_cio_state(dev, head, regp, NV_CIO_CRE_42);1007wr_cio_state(dev, head, regp, NV_CIO_CRE_53);1008wr_cio_state(dev, head, regp, NV_CIO_CRE_54);10091010for (i = 0; i < 0x10; i++)1011NVWriteVgaCrtc5758(dev, head, i, regp->CR58[i]);1012wr_cio_state(dev, head, regp, NV_CIO_CRE_59);1013wr_cio_state(dev, head, regp, NV_CIO_CRE_5B);10141015wr_cio_state(dev, head, regp, NV_CIO_CRE_85);1016wr_cio_state(dev, head, regp, NV_CIO_CRE_86);1017}10181019NVWriteCRTC(dev, head, NV_PCRTC_START, regp->fb_start);10201021/* Enable vblank interrupts. */1022NVWriteCRTC(dev, head, NV_PCRTC_INTR_EN_0,1023(dev->vblank_enabled[head] ? 1 : 0));1024NVWriteCRTC(dev, head, NV_PCRTC_INTR_0, NV_PCRTC_INTR_0_VBLANK);1025}10261027static void1028nv_save_state_palette(struct drm_device *dev, int head,1029struct nv04_mode_state *state)1030{1031int head_offset = head * NV_PRMDIO_SIZE, i;10321033nv_wr08(dev, NV_PRMDIO_PIXEL_MASK + head_offset,1034NV_PRMDIO_PIXEL_MASK_MASK);1035nv_wr08(dev, NV_PRMDIO_READ_MODE_ADDRESS + head_offset, 0x0);10361037for (i = 0; i < 768; i++) {1038state->crtc_reg[head].DAC[i] = nv_rd08(dev,1039NV_PRMDIO_PALETTE_DATA + head_offset);1040}10411042NVSetEnablePalette(dev, head, false);1043}10441045void1046nouveau_hw_load_state_palette(struct drm_device *dev, int head,1047struct nv04_mode_state *state)1048{1049int head_offset = head * NV_PRMDIO_SIZE, i;10501051nv_wr08(dev, NV_PRMDIO_PIXEL_MASK + head_offset,1052NV_PRMDIO_PIXEL_MASK_MASK);1053nv_wr08(dev, NV_PRMDIO_WRITE_MODE_ADDRESS + head_offset, 0x0);10541055for (i = 0; i < 768; i++) {1056nv_wr08(dev, NV_PRMDIO_PALETTE_DATA + head_offset,1057state->crtc_reg[head].DAC[i]);1058}10591060NVSetEnablePalette(dev, head, false);1061}10621063void nouveau_hw_save_state(struct drm_device *dev, int head,1064struct nv04_mode_state *state)1065{1066struct drm_nouveau_private *dev_priv = dev->dev_private;10671068if (dev_priv->chipset == 0x11)1069/* NB: no attempt is made to restore the bad pll later on */1070nouveau_hw_fix_bad_vpll(dev, head);1071nv_save_state_ramdac(dev, head, state);1072nv_save_state_vga(dev, head, state);1073nv_save_state_palette(dev, head, state);1074nv_save_state_ext(dev, head, state);1075}10761077void nouveau_hw_load_state(struct drm_device *dev, int head,1078struct nv04_mode_state *state)1079{1080NVVgaProtect(dev, head, true);1081nv_load_state_ramdac(dev, head, state);1082nv_load_state_ext(dev, head, state);1083nouveau_hw_load_state_palette(dev, head, state);1084nv_load_state_vga(dev, head, state);1085NVVgaProtect(dev, head, false);1086}108710881089