1317c35d1SJesse Barnes /* 2317c35d1SJesse Barnes * 3317c35d1SJesse Barnes * Copyright 2008 (c) Intel Corporation 4317c35d1SJesse Barnes * Jesse Barnes <jbarnes@virtuousgeek.org> 5317c35d1SJesse Barnes * 6317c35d1SJesse Barnes * Permission is hereby granted, free of charge, to any person obtaining a 7317c35d1SJesse Barnes * copy of this software and associated documentation files (the 8317c35d1SJesse Barnes * "Software"), to deal in the Software without restriction, including 9317c35d1SJesse Barnes * without limitation the rights to use, copy, modify, merge, publish, 10317c35d1SJesse Barnes * distribute, sub license, and/or sell copies of the Software, and to 11317c35d1SJesse Barnes * permit persons to whom the Software is furnished to do so, subject to 12317c35d1SJesse Barnes * the following conditions: 13317c35d1SJesse Barnes * 14317c35d1SJesse Barnes * The above copyright notice and this permission notice (including the 15317c35d1SJesse Barnes * next paragraph) shall be included in all copies or substantial portions 16317c35d1SJesse Barnes * of the Software. 17317c35d1SJesse Barnes * 18317c35d1SJesse Barnes * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19317c35d1SJesse Barnes * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20317c35d1SJesse Barnes * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21317c35d1SJesse Barnes * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22317c35d1SJesse Barnes * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23317c35d1SJesse Barnes * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24317c35d1SJesse Barnes * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25317c35d1SJesse Barnes */ 26317c35d1SJesse Barnes 27317c35d1SJesse Barnes #include "drmP.h" 28317c35d1SJesse Barnes #include "drm.h" 29317c35d1SJesse Barnes #include "i915_drm.h" 30317c35d1SJesse Barnes #include "i915_drv.h" 31317c35d1SJesse Barnes 32317c35d1SJesse Barnes static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe) 33317c35d1SJesse Barnes { 34317c35d1SJesse Barnes struct drm_i915_private *dev_priv = dev->dev_private; 35317c35d1SJesse Barnes 36317c35d1SJesse Barnes if (pipe == PIPE_A) 37317c35d1SJesse Barnes return (I915_READ(DPLL_A) & DPLL_VCO_ENABLE); 38317c35d1SJesse Barnes else 39317c35d1SJesse Barnes return (I915_READ(DPLL_B) & DPLL_VCO_ENABLE); 40317c35d1SJesse Barnes } 41317c35d1SJesse Barnes 42317c35d1SJesse Barnes static void i915_save_palette(struct drm_device *dev, enum pipe pipe) 43317c35d1SJesse Barnes { 44317c35d1SJesse Barnes struct drm_i915_private *dev_priv = dev->dev_private; 45317c35d1SJesse Barnes unsigned long reg = (pipe == PIPE_A ? PALETTE_A : PALETTE_B); 46317c35d1SJesse Barnes u32 *array; 47317c35d1SJesse Barnes int i; 48317c35d1SJesse Barnes 49317c35d1SJesse Barnes if (!i915_pipe_enabled(dev, pipe)) 50317c35d1SJesse Barnes return; 51317c35d1SJesse Barnes 52317c35d1SJesse Barnes if (pipe == PIPE_A) 53317c35d1SJesse Barnes array = dev_priv->save_palette_a; 54317c35d1SJesse Barnes else 55317c35d1SJesse Barnes array = dev_priv->save_palette_b; 56317c35d1SJesse Barnes 57317c35d1SJesse Barnes for(i = 0; i < 256; i++) 58317c35d1SJesse Barnes array[i] = I915_READ(reg + (i << 2)); 59317c35d1SJesse Barnes } 60317c35d1SJesse Barnes 61317c35d1SJesse Barnes static void i915_restore_palette(struct drm_device *dev, enum pipe pipe) 62317c35d1SJesse Barnes { 63317c35d1SJesse Barnes struct drm_i915_private *dev_priv = dev->dev_private; 64317c35d1SJesse Barnes unsigned long reg = (pipe == PIPE_A ? PALETTE_A : PALETTE_B); 65317c35d1SJesse Barnes u32 *array; 66317c35d1SJesse Barnes int i; 67317c35d1SJesse Barnes 68317c35d1SJesse Barnes if (!i915_pipe_enabled(dev, pipe)) 69317c35d1SJesse Barnes return; 70317c35d1SJesse Barnes 71317c35d1SJesse Barnes if (pipe == PIPE_A) 72317c35d1SJesse Barnes array = dev_priv->save_palette_a; 73317c35d1SJesse Barnes else 74317c35d1SJesse Barnes array = dev_priv->save_palette_b; 75317c35d1SJesse Barnes 76317c35d1SJesse Barnes for(i = 0; i < 256; i++) 77317c35d1SJesse Barnes I915_WRITE(reg + (i << 2), array[i]); 78317c35d1SJesse Barnes } 79317c35d1SJesse Barnes 80317c35d1SJesse Barnes static u8 i915_read_indexed(struct drm_device *dev, u16 index_port, u16 data_port, u8 reg) 81317c35d1SJesse Barnes { 82317c35d1SJesse Barnes struct drm_i915_private *dev_priv = dev->dev_private; 83317c35d1SJesse Barnes 84317c35d1SJesse Barnes I915_WRITE8(index_port, reg); 85317c35d1SJesse Barnes return I915_READ8(data_port); 86317c35d1SJesse Barnes } 87317c35d1SJesse Barnes 88317c35d1SJesse Barnes static u8 i915_read_ar(struct drm_device *dev, u16 st01, u8 reg, u16 palette_enable) 89317c35d1SJesse Barnes { 90317c35d1SJesse Barnes struct drm_i915_private *dev_priv = dev->dev_private; 91317c35d1SJesse Barnes 92317c35d1SJesse Barnes I915_READ8(st01); 93317c35d1SJesse Barnes I915_WRITE8(VGA_AR_INDEX, palette_enable | reg); 94317c35d1SJesse Barnes return I915_READ8(VGA_AR_DATA_READ); 95317c35d1SJesse Barnes } 96317c35d1SJesse Barnes 97317c35d1SJesse Barnes static void i915_write_ar(struct drm_device *dev, u16 st01, u8 reg, u8 val, u16 palette_enable) 98317c35d1SJesse Barnes { 99317c35d1SJesse Barnes struct drm_i915_private *dev_priv = dev->dev_private; 100317c35d1SJesse Barnes 101317c35d1SJesse Barnes I915_READ8(st01); 102317c35d1SJesse Barnes I915_WRITE8(VGA_AR_INDEX, palette_enable | reg); 103317c35d1SJesse Barnes I915_WRITE8(VGA_AR_DATA_WRITE, val); 104317c35d1SJesse Barnes } 105317c35d1SJesse Barnes 106317c35d1SJesse Barnes static void i915_write_indexed(struct drm_device *dev, u16 index_port, u16 data_port, u8 reg, u8 val) 107317c35d1SJesse Barnes { 108317c35d1SJesse Barnes struct drm_i915_private *dev_priv = dev->dev_private; 109317c35d1SJesse Barnes 110317c35d1SJesse Barnes I915_WRITE8(index_port, reg); 111317c35d1SJesse Barnes I915_WRITE8(data_port, val); 112317c35d1SJesse Barnes } 113317c35d1SJesse Barnes 114317c35d1SJesse Barnes static void i915_save_vga(struct drm_device *dev) 115317c35d1SJesse Barnes { 116317c35d1SJesse Barnes struct drm_i915_private *dev_priv = dev->dev_private; 117317c35d1SJesse Barnes int i; 118317c35d1SJesse Barnes u16 cr_index, cr_data, st01; 119317c35d1SJesse Barnes 120317c35d1SJesse Barnes /* VGA color palette registers */ 121317c35d1SJesse Barnes dev_priv->saveDACMASK = I915_READ8(VGA_DACMASK); 122317c35d1SJesse Barnes 123317c35d1SJesse Barnes /* MSR bits */ 124317c35d1SJesse Barnes dev_priv->saveMSR = I915_READ8(VGA_MSR_READ); 125317c35d1SJesse Barnes if (dev_priv->saveMSR & VGA_MSR_CGA_MODE) { 126317c35d1SJesse Barnes cr_index = VGA_CR_INDEX_CGA; 127317c35d1SJesse Barnes cr_data = VGA_CR_DATA_CGA; 128317c35d1SJesse Barnes st01 = VGA_ST01_CGA; 129317c35d1SJesse Barnes } else { 130317c35d1SJesse Barnes cr_index = VGA_CR_INDEX_MDA; 131317c35d1SJesse Barnes cr_data = VGA_CR_DATA_MDA; 132317c35d1SJesse Barnes st01 = VGA_ST01_MDA; 133317c35d1SJesse Barnes } 134317c35d1SJesse Barnes 135317c35d1SJesse Barnes /* CRT controller regs */ 136317c35d1SJesse Barnes i915_write_indexed(dev, cr_index, cr_data, 0x11, 137317c35d1SJesse Barnes i915_read_indexed(dev, cr_index, cr_data, 0x11) & 138317c35d1SJesse Barnes (~0x80)); 139317c35d1SJesse Barnes for (i = 0; i <= 0x24; i++) 140317c35d1SJesse Barnes dev_priv->saveCR[i] = 141317c35d1SJesse Barnes i915_read_indexed(dev, cr_index, cr_data, i); 142317c35d1SJesse Barnes /* Make sure we don't turn off CR group 0 writes */ 143317c35d1SJesse Barnes dev_priv->saveCR[0x11] &= ~0x80; 144317c35d1SJesse Barnes 145317c35d1SJesse Barnes /* Attribute controller registers */ 146317c35d1SJesse Barnes I915_READ8(st01); 147317c35d1SJesse Barnes dev_priv->saveAR_INDEX = I915_READ8(VGA_AR_INDEX); 148317c35d1SJesse Barnes for (i = 0; i <= 0x14; i++) 149317c35d1SJesse Barnes dev_priv->saveAR[i] = i915_read_ar(dev, st01, i, 0); 150317c35d1SJesse Barnes I915_READ8(st01); 151317c35d1SJesse Barnes I915_WRITE8(VGA_AR_INDEX, dev_priv->saveAR_INDEX); 152317c35d1SJesse Barnes I915_READ8(st01); 153317c35d1SJesse Barnes 154317c35d1SJesse Barnes /* Graphics controller registers */ 155317c35d1SJesse Barnes for (i = 0; i < 9; i++) 156317c35d1SJesse Barnes dev_priv->saveGR[i] = 157317c35d1SJesse Barnes i915_read_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, i); 158317c35d1SJesse Barnes 159317c35d1SJesse Barnes dev_priv->saveGR[0x10] = 160317c35d1SJesse Barnes i915_read_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, 0x10); 161317c35d1SJesse Barnes dev_priv->saveGR[0x11] = 162317c35d1SJesse Barnes i915_read_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, 0x11); 163317c35d1SJesse Barnes dev_priv->saveGR[0x18] = 164317c35d1SJesse Barnes i915_read_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, 0x18); 165317c35d1SJesse Barnes 166317c35d1SJesse Barnes /* Sequencer registers */ 167317c35d1SJesse Barnes for (i = 0; i < 8; i++) 168317c35d1SJesse Barnes dev_priv->saveSR[i] = 169317c35d1SJesse Barnes i915_read_indexed(dev, VGA_SR_INDEX, VGA_SR_DATA, i); 170317c35d1SJesse Barnes } 171317c35d1SJesse Barnes 172317c35d1SJesse Barnes static void i915_restore_vga(struct drm_device *dev) 173317c35d1SJesse Barnes { 174317c35d1SJesse Barnes struct drm_i915_private *dev_priv = dev->dev_private; 175317c35d1SJesse Barnes int i; 176317c35d1SJesse Barnes u16 cr_index, cr_data, st01; 177317c35d1SJesse Barnes 178317c35d1SJesse Barnes /* MSR bits */ 179317c35d1SJesse Barnes I915_WRITE8(VGA_MSR_WRITE, dev_priv->saveMSR); 180317c35d1SJesse Barnes if (dev_priv->saveMSR & VGA_MSR_CGA_MODE) { 181317c35d1SJesse Barnes cr_index = VGA_CR_INDEX_CGA; 182317c35d1SJesse Barnes cr_data = VGA_CR_DATA_CGA; 183317c35d1SJesse Barnes st01 = VGA_ST01_CGA; 184317c35d1SJesse Barnes } else { 185317c35d1SJesse Barnes cr_index = VGA_CR_INDEX_MDA; 186317c35d1SJesse Barnes cr_data = VGA_CR_DATA_MDA; 187317c35d1SJesse Barnes st01 = VGA_ST01_MDA; 188317c35d1SJesse Barnes } 189317c35d1SJesse Barnes 190317c35d1SJesse Barnes /* Sequencer registers, don't write SR07 */ 191317c35d1SJesse Barnes for (i = 0; i < 7; i++) 192317c35d1SJesse Barnes i915_write_indexed(dev, VGA_SR_INDEX, VGA_SR_DATA, i, 193317c35d1SJesse Barnes dev_priv->saveSR[i]); 194317c35d1SJesse Barnes 195317c35d1SJesse Barnes /* CRT controller regs */ 196317c35d1SJesse Barnes /* Enable CR group 0 writes */ 197317c35d1SJesse Barnes i915_write_indexed(dev, cr_index, cr_data, 0x11, dev_priv->saveCR[0x11]); 198317c35d1SJesse Barnes for (i = 0; i <= 0x24; i++) 199317c35d1SJesse Barnes i915_write_indexed(dev, cr_index, cr_data, i, dev_priv->saveCR[i]); 200317c35d1SJesse Barnes 201317c35d1SJesse Barnes /* Graphics controller regs */ 202317c35d1SJesse Barnes for (i = 0; i < 9; i++) 203317c35d1SJesse Barnes i915_write_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, i, 204317c35d1SJesse Barnes dev_priv->saveGR[i]); 205317c35d1SJesse Barnes 206317c35d1SJesse Barnes i915_write_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, 0x10, 207317c35d1SJesse Barnes dev_priv->saveGR[0x10]); 208317c35d1SJesse Barnes i915_write_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, 0x11, 209317c35d1SJesse Barnes dev_priv->saveGR[0x11]); 210317c35d1SJesse Barnes i915_write_indexed(dev, VGA_GR_INDEX, VGA_GR_DATA, 0x18, 211317c35d1SJesse Barnes dev_priv->saveGR[0x18]); 212317c35d1SJesse Barnes 213317c35d1SJesse Barnes /* Attribute controller registers */ 214317c35d1SJesse Barnes I915_READ8(st01); /* switch back to index mode */ 215317c35d1SJesse Barnes for (i = 0; i <= 0x14; i++) 216317c35d1SJesse Barnes i915_write_ar(dev, st01, i, dev_priv->saveAR[i], 0); 217317c35d1SJesse Barnes I915_READ8(st01); /* switch back to index mode */ 218317c35d1SJesse Barnes I915_WRITE8(VGA_AR_INDEX, dev_priv->saveAR_INDEX | 0x20); 219317c35d1SJesse Barnes I915_READ8(st01); 220317c35d1SJesse Barnes 221317c35d1SJesse Barnes /* VGA color palette registers */ 222317c35d1SJesse Barnes I915_WRITE8(VGA_DACMASK, dev_priv->saveDACMASK); 223317c35d1SJesse Barnes } 224317c35d1SJesse Barnes 225fccdaba4SZhao Yakui static void i915_save_modeset_reg(struct drm_device *dev) 226317c35d1SJesse Barnes { 227317c35d1SJesse Barnes struct drm_i915_private *dev_priv = dev->dev_private; 228317c35d1SJesse Barnes 229fccdaba4SZhao Yakui if (drm_core_check_feature(dev, DRIVER_MODESET)) 230fccdaba4SZhao Yakui return; 2311341d655SBen Gamari 232317c35d1SJesse Barnes /* Pipe & plane A info */ 233317c35d1SJesse Barnes dev_priv->savePIPEACONF = I915_READ(PIPEACONF); 234317c35d1SJesse Barnes dev_priv->savePIPEASRC = I915_READ(PIPEASRC); 235317c35d1SJesse Barnes dev_priv->saveFPA0 = I915_READ(FPA0); 236317c35d1SJesse Barnes dev_priv->saveFPA1 = I915_READ(FPA1); 237317c35d1SJesse Barnes dev_priv->saveDPLL_A = I915_READ(DPLL_A); 238317c35d1SJesse Barnes if (IS_I965G(dev)) 239317c35d1SJesse Barnes dev_priv->saveDPLL_A_MD = I915_READ(DPLL_A_MD); 240317c35d1SJesse Barnes dev_priv->saveHTOTAL_A = I915_READ(HTOTAL_A); 241317c35d1SJesse Barnes dev_priv->saveHBLANK_A = I915_READ(HBLANK_A); 242317c35d1SJesse Barnes dev_priv->saveHSYNC_A = I915_READ(HSYNC_A); 243317c35d1SJesse Barnes dev_priv->saveVTOTAL_A = I915_READ(VTOTAL_A); 244317c35d1SJesse Barnes dev_priv->saveVBLANK_A = I915_READ(VBLANK_A); 245317c35d1SJesse Barnes dev_priv->saveVSYNC_A = I915_READ(VSYNC_A); 246317c35d1SJesse Barnes dev_priv->saveBCLRPAT_A = I915_READ(BCLRPAT_A); 247317c35d1SJesse Barnes 248317c35d1SJesse Barnes dev_priv->saveDSPACNTR = I915_READ(DSPACNTR); 249317c35d1SJesse Barnes dev_priv->saveDSPASTRIDE = I915_READ(DSPASTRIDE); 250317c35d1SJesse Barnes dev_priv->saveDSPASIZE = I915_READ(DSPASIZE); 251317c35d1SJesse Barnes dev_priv->saveDSPAPOS = I915_READ(DSPAPOS); 252317c35d1SJesse Barnes dev_priv->saveDSPAADDR = I915_READ(DSPAADDR); 253317c35d1SJesse Barnes if (IS_I965G(dev)) { 254317c35d1SJesse Barnes dev_priv->saveDSPASURF = I915_READ(DSPASURF); 255317c35d1SJesse Barnes dev_priv->saveDSPATILEOFF = I915_READ(DSPATILEOFF); 256317c35d1SJesse Barnes } 257317c35d1SJesse Barnes i915_save_palette(dev, PIPE_A); 258317c35d1SJesse Barnes dev_priv->savePIPEASTAT = I915_READ(PIPEASTAT); 259317c35d1SJesse Barnes 260317c35d1SJesse Barnes /* Pipe & plane B info */ 261317c35d1SJesse Barnes dev_priv->savePIPEBCONF = I915_READ(PIPEBCONF); 262317c35d1SJesse Barnes dev_priv->savePIPEBSRC = I915_READ(PIPEBSRC); 263317c35d1SJesse Barnes dev_priv->saveFPB0 = I915_READ(FPB0); 264317c35d1SJesse Barnes dev_priv->saveFPB1 = I915_READ(FPB1); 265317c35d1SJesse Barnes dev_priv->saveDPLL_B = I915_READ(DPLL_B); 266317c35d1SJesse Barnes if (IS_I965G(dev)) 267317c35d1SJesse Barnes dev_priv->saveDPLL_B_MD = I915_READ(DPLL_B_MD); 268317c35d1SJesse Barnes dev_priv->saveHTOTAL_B = I915_READ(HTOTAL_B); 269317c35d1SJesse Barnes dev_priv->saveHBLANK_B = I915_READ(HBLANK_B); 270317c35d1SJesse Barnes dev_priv->saveHSYNC_B = I915_READ(HSYNC_B); 271317c35d1SJesse Barnes dev_priv->saveVTOTAL_B = I915_READ(VTOTAL_B); 272317c35d1SJesse Barnes dev_priv->saveVBLANK_B = I915_READ(VBLANK_B); 273317c35d1SJesse Barnes dev_priv->saveVSYNC_B = I915_READ(VSYNC_B); 274317c35d1SJesse Barnes dev_priv->saveBCLRPAT_A = I915_READ(BCLRPAT_A); 275317c35d1SJesse Barnes 276317c35d1SJesse Barnes dev_priv->saveDSPBCNTR = I915_READ(DSPBCNTR); 277317c35d1SJesse Barnes dev_priv->saveDSPBSTRIDE = I915_READ(DSPBSTRIDE); 278317c35d1SJesse Barnes dev_priv->saveDSPBSIZE = I915_READ(DSPBSIZE); 279317c35d1SJesse Barnes dev_priv->saveDSPBPOS = I915_READ(DSPBPOS); 280317c35d1SJesse Barnes dev_priv->saveDSPBADDR = I915_READ(DSPBADDR); 281b9bfdfe6SJesse Barnes if (IS_I965GM(dev) || IS_GM45(dev)) { 282317c35d1SJesse Barnes dev_priv->saveDSPBSURF = I915_READ(DSPBSURF); 283317c35d1SJesse Barnes dev_priv->saveDSPBTILEOFF = I915_READ(DSPBTILEOFF); 284317c35d1SJesse Barnes } 285317c35d1SJesse Barnes i915_save_palette(dev, PIPE_B); 286317c35d1SJesse Barnes dev_priv->savePIPEBSTAT = I915_READ(PIPEBSTAT); 287fccdaba4SZhao Yakui return; 288fccdaba4SZhao Yakui } 2891341d655SBen Gamari 290fccdaba4SZhao Yakui static void i915_restore_modeset_reg(struct drm_device *dev) 291fccdaba4SZhao Yakui { 292fccdaba4SZhao Yakui struct drm_i915_private *dev_priv = dev->dev_private; 293317c35d1SJesse Barnes 294fccdaba4SZhao Yakui if (drm_core_check_feature(dev, DRIVER_MODESET)) 295fccdaba4SZhao Yakui return; 296fccdaba4SZhao Yakui 297fccdaba4SZhao Yakui /* Pipe & plane A info */ 298fccdaba4SZhao Yakui /* Prime the clock */ 299fccdaba4SZhao Yakui if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) { 300fccdaba4SZhao Yakui I915_WRITE(DPLL_A, dev_priv->saveDPLL_A & 301fccdaba4SZhao Yakui ~DPLL_VCO_ENABLE); 302fccdaba4SZhao Yakui DRM_UDELAY(150); 303fccdaba4SZhao Yakui } 304fccdaba4SZhao Yakui I915_WRITE(FPA0, dev_priv->saveFPA0); 305fccdaba4SZhao Yakui I915_WRITE(FPA1, dev_priv->saveFPA1); 306fccdaba4SZhao Yakui /* Actually enable it */ 307fccdaba4SZhao Yakui I915_WRITE(DPLL_A, dev_priv->saveDPLL_A); 308fccdaba4SZhao Yakui DRM_UDELAY(150); 309fccdaba4SZhao Yakui if (IS_I965G(dev)) 310fccdaba4SZhao Yakui I915_WRITE(DPLL_A_MD, dev_priv->saveDPLL_A_MD); 311fccdaba4SZhao Yakui DRM_UDELAY(150); 312fccdaba4SZhao Yakui 313fccdaba4SZhao Yakui /* Restore mode */ 314fccdaba4SZhao Yakui I915_WRITE(HTOTAL_A, dev_priv->saveHTOTAL_A); 315fccdaba4SZhao Yakui I915_WRITE(HBLANK_A, dev_priv->saveHBLANK_A); 316fccdaba4SZhao Yakui I915_WRITE(HSYNC_A, dev_priv->saveHSYNC_A); 317fccdaba4SZhao Yakui I915_WRITE(VTOTAL_A, dev_priv->saveVTOTAL_A); 318fccdaba4SZhao Yakui I915_WRITE(VBLANK_A, dev_priv->saveVBLANK_A); 319fccdaba4SZhao Yakui I915_WRITE(VSYNC_A, dev_priv->saveVSYNC_A); 320fccdaba4SZhao Yakui I915_WRITE(BCLRPAT_A, dev_priv->saveBCLRPAT_A); 321fccdaba4SZhao Yakui 322fccdaba4SZhao Yakui /* Restore plane info */ 323fccdaba4SZhao Yakui I915_WRITE(DSPASIZE, dev_priv->saveDSPASIZE); 324fccdaba4SZhao Yakui I915_WRITE(DSPAPOS, dev_priv->saveDSPAPOS); 325fccdaba4SZhao Yakui I915_WRITE(PIPEASRC, dev_priv->savePIPEASRC); 326fccdaba4SZhao Yakui I915_WRITE(DSPAADDR, dev_priv->saveDSPAADDR); 327fccdaba4SZhao Yakui I915_WRITE(DSPASTRIDE, dev_priv->saveDSPASTRIDE); 328fccdaba4SZhao Yakui if (IS_I965G(dev)) { 329fccdaba4SZhao Yakui I915_WRITE(DSPASURF, dev_priv->saveDSPASURF); 330fccdaba4SZhao Yakui I915_WRITE(DSPATILEOFF, dev_priv->saveDSPATILEOFF); 331fccdaba4SZhao Yakui } 332fccdaba4SZhao Yakui 333fccdaba4SZhao Yakui I915_WRITE(PIPEACONF, dev_priv->savePIPEACONF); 334fccdaba4SZhao Yakui 335fccdaba4SZhao Yakui i915_restore_palette(dev, PIPE_A); 336fccdaba4SZhao Yakui /* Enable the plane */ 337fccdaba4SZhao Yakui I915_WRITE(DSPACNTR, dev_priv->saveDSPACNTR); 338fccdaba4SZhao Yakui I915_WRITE(DSPAADDR, I915_READ(DSPAADDR)); 339fccdaba4SZhao Yakui 340fccdaba4SZhao Yakui /* Pipe & plane B info */ 341fccdaba4SZhao Yakui if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) { 342fccdaba4SZhao Yakui I915_WRITE(DPLL_B, dev_priv->saveDPLL_B & 343fccdaba4SZhao Yakui ~DPLL_VCO_ENABLE); 344fccdaba4SZhao Yakui DRM_UDELAY(150); 345fccdaba4SZhao Yakui } 346fccdaba4SZhao Yakui I915_WRITE(FPB0, dev_priv->saveFPB0); 347fccdaba4SZhao Yakui I915_WRITE(FPB1, dev_priv->saveFPB1); 348fccdaba4SZhao Yakui /* Actually enable it */ 349fccdaba4SZhao Yakui I915_WRITE(DPLL_B, dev_priv->saveDPLL_B); 350fccdaba4SZhao Yakui DRM_UDELAY(150); 351fccdaba4SZhao Yakui if (IS_I965G(dev)) 352fccdaba4SZhao Yakui I915_WRITE(DPLL_B_MD, dev_priv->saveDPLL_B_MD); 353fccdaba4SZhao Yakui DRM_UDELAY(150); 354fccdaba4SZhao Yakui 355fccdaba4SZhao Yakui /* Restore mode */ 356fccdaba4SZhao Yakui I915_WRITE(HTOTAL_B, dev_priv->saveHTOTAL_B); 357fccdaba4SZhao Yakui I915_WRITE(HBLANK_B, dev_priv->saveHBLANK_B); 358fccdaba4SZhao Yakui I915_WRITE(HSYNC_B, dev_priv->saveHSYNC_B); 359fccdaba4SZhao Yakui I915_WRITE(VTOTAL_B, dev_priv->saveVTOTAL_B); 360fccdaba4SZhao Yakui I915_WRITE(VBLANK_B, dev_priv->saveVBLANK_B); 361fccdaba4SZhao Yakui I915_WRITE(VSYNC_B, dev_priv->saveVSYNC_B); 362fccdaba4SZhao Yakui I915_WRITE(BCLRPAT_B, dev_priv->saveBCLRPAT_B); 363fccdaba4SZhao Yakui 364fccdaba4SZhao Yakui /* Restore plane info */ 365fccdaba4SZhao Yakui I915_WRITE(DSPBSIZE, dev_priv->saveDSPBSIZE); 366fccdaba4SZhao Yakui I915_WRITE(DSPBPOS, dev_priv->saveDSPBPOS); 367fccdaba4SZhao Yakui I915_WRITE(PIPEBSRC, dev_priv->savePIPEBSRC); 368fccdaba4SZhao Yakui I915_WRITE(DSPBADDR, dev_priv->saveDSPBADDR); 369fccdaba4SZhao Yakui I915_WRITE(DSPBSTRIDE, dev_priv->saveDSPBSTRIDE); 370fccdaba4SZhao Yakui if (IS_I965G(dev)) { 371fccdaba4SZhao Yakui I915_WRITE(DSPBSURF, dev_priv->saveDSPBSURF); 372fccdaba4SZhao Yakui I915_WRITE(DSPBTILEOFF, dev_priv->saveDSPBTILEOFF); 373fccdaba4SZhao Yakui } 374fccdaba4SZhao Yakui 375fccdaba4SZhao Yakui I915_WRITE(PIPEBCONF, dev_priv->savePIPEBCONF); 376fccdaba4SZhao Yakui 377fccdaba4SZhao Yakui i915_restore_palette(dev, PIPE_B); 378fccdaba4SZhao Yakui /* Enable the plane */ 379fccdaba4SZhao Yakui I915_WRITE(DSPBCNTR, dev_priv->saveDSPBCNTR); 380fccdaba4SZhao Yakui I915_WRITE(DSPBADDR, I915_READ(DSPBADDR)); 381fccdaba4SZhao Yakui 382fccdaba4SZhao Yakui return; 383fccdaba4SZhao Yakui } 3841341d655SBen Gamari 3851341d655SBen Gamari void i915_save_display(struct drm_device *dev) 386fccdaba4SZhao Yakui { 387fccdaba4SZhao Yakui struct drm_i915_private *dev_priv = dev->dev_private; 388fccdaba4SZhao Yakui 389fccdaba4SZhao Yakui /* Display arbitration control */ 390fccdaba4SZhao Yakui dev_priv->saveDSPARB = I915_READ(DSPARB); 391fccdaba4SZhao Yakui 392fccdaba4SZhao Yakui /* This is only meaningful in non-KMS mode */ 393fccdaba4SZhao Yakui /* Don't save them in KMS mode */ 394fccdaba4SZhao Yakui i915_save_modeset_reg(dev); 3951341d655SBen Gamari 3961fd1c624SEric Anholt /* Cursor state */ 3971fd1c624SEric Anholt dev_priv->saveCURACNTR = I915_READ(CURACNTR); 3981fd1c624SEric Anholt dev_priv->saveCURAPOS = I915_READ(CURAPOS); 3991fd1c624SEric Anholt dev_priv->saveCURABASE = I915_READ(CURABASE); 4001fd1c624SEric Anholt dev_priv->saveCURBCNTR = I915_READ(CURBCNTR); 4011fd1c624SEric Anholt dev_priv->saveCURBPOS = I915_READ(CURBPOS); 4021fd1c624SEric Anholt dev_priv->saveCURBBASE = I915_READ(CURBBASE); 4031fd1c624SEric Anholt if (!IS_I9XX(dev)) 4041fd1c624SEric Anholt dev_priv->saveCURSIZE = I915_READ(CURSIZE); 4051fd1c624SEric Anholt 406317c35d1SJesse Barnes /* CRT state */ 407317c35d1SJesse Barnes dev_priv->saveADPA = I915_READ(ADPA); 408317c35d1SJesse Barnes 409317c35d1SJesse Barnes /* LVDS state */ 410317c35d1SJesse Barnes dev_priv->savePP_CONTROL = I915_READ(PP_CONTROL); 411317c35d1SJesse Barnes dev_priv->savePFIT_PGM_RATIOS = I915_READ(PFIT_PGM_RATIOS); 412317c35d1SJesse Barnes dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL); 413*0eb96d6eSJesse Barnes dev_priv->saveBLC_HIST_CTL = I915_READ(BLC_HIST_CTL); 414317c35d1SJesse Barnes if (IS_I965G(dev)) 415317c35d1SJesse Barnes dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_CTL2); 416317c35d1SJesse Barnes if (IS_MOBILE(dev) && !IS_I830(dev)) 417317c35d1SJesse Barnes dev_priv->saveLVDS = I915_READ(LVDS); 418317c35d1SJesse Barnes if (!IS_I830(dev) && !IS_845G(dev)) 419317c35d1SJesse Barnes dev_priv->savePFIT_CONTROL = I915_READ(PFIT_CONTROL); 420317c35d1SJesse Barnes dev_priv->savePP_ON_DELAYS = I915_READ(PP_ON_DELAYS); 421317c35d1SJesse Barnes dev_priv->savePP_OFF_DELAYS = I915_READ(PP_OFF_DELAYS); 422317c35d1SJesse Barnes dev_priv->savePP_DIVISOR = I915_READ(PP_DIVISOR); 423317c35d1SJesse Barnes 424a4fc5ed6SKeith Packard /* Display Port state */ 425a4fc5ed6SKeith Packard if (SUPPORTS_INTEGRATED_DP(dev)) { 426a4fc5ed6SKeith Packard dev_priv->saveDP_B = I915_READ(DP_B); 427a4fc5ed6SKeith Packard dev_priv->saveDP_C = I915_READ(DP_C); 428a4fc5ed6SKeith Packard dev_priv->saveDP_D = I915_READ(DP_D); 429a4fc5ed6SKeith Packard dev_priv->savePIPEA_GMCH_DATA_M = I915_READ(PIPEA_GMCH_DATA_M); 430a4fc5ed6SKeith Packard dev_priv->savePIPEB_GMCH_DATA_M = I915_READ(PIPEB_GMCH_DATA_M); 431a4fc5ed6SKeith Packard dev_priv->savePIPEA_GMCH_DATA_N = I915_READ(PIPEA_GMCH_DATA_N); 432a4fc5ed6SKeith Packard dev_priv->savePIPEB_GMCH_DATA_N = I915_READ(PIPEB_GMCH_DATA_N); 433a4fc5ed6SKeith Packard dev_priv->savePIPEA_DP_LINK_M = I915_READ(PIPEA_DP_LINK_M); 434a4fc5ed6SKeith Packard dev_priv->savePIPEB_DP_LINK_M = I915_READ(PIPEB_DP_LINK_M); 435a4fc5ed6SKeith Packard dev_priv->savePIPEA_DP_LINK_N = I915_READ(PIPEA_DP_LINK_N); 436a4fc5ed6SKeith Packard dev_priv->savePIPEB_DP_LINK_N = I915_READ(PIPEB_DP_LINK_N); 437a4fc5ed6SKeith Packard } 438317c35d1SJesse Barnes /* FIXME: save TV & SDVO state */ 439317c35d1SJesse Barnes 440317c35d1SJesse Barnes /* FBC state */ 44106027f91SJesse Barnes if (IS_GM45(dev)) { 44206027f91SJesse Barnes dev_priv->saveDPFC_CB_BASE = I915_READ(DPFC_CB_BASE); 44306027f91SJesse Barnes } else { 444317c35d1SJesse Barnes dev_priv->saveFBC_CFB_BASE = I915_READ(FBC_CFB_BASE); 445317c35d1SJesse Barnes dev_priv->saveFBC_LL_BASE = I915_READ(FBC_LL_BASE); 446317c35d1SJesse Barnes dev_priv->saveFBC_CONTROL2 = I915_READ(FBC_CONTROL2); 447317c35d1SJesse Barnes dev_priv->saveFBC_CONTROL = I915_READ(FBC_CONTROL); 44806027f91SJesse Barnes } 449317c35d1SJesse Barnes 450317c35d1SJesse Barnes /* VGA state */ 451317c35d1SJesse Barnes dev_priv->saveVGA0 = I915_READ(VGA0); 452317c35d1SJesse Barnes dev_priv->saveVGA1 = I915_READ(VGA1); 453317c35d1SJesse Barnes dev_priv->saveVGA_PD = I915_READ(VGA_PD); 454317c35d1SJesse Barnes dev_priv->saveVGACNTRL = I915_READ(VGACNTRL); 455317c35d1SJesse Barnes 456317c35d1SJesse Barnes i915_save_vga(dev); 457317c35d1SJesse Barnes } 458317c35d1SJesse Barnes 4591341d655SBen Gamari void i915_restore_display(struct drm_device *dev) 460317c35d1SJesse Barnes { 461317c35d1SJesse Barnes struct drm_i915_private *dev_priv = dev->dev_private; 462461cba2dSPeng Li 463881ee988SKeith Packard /* Display arbitration */ 464317c35d1SJesse Barnes I915_WRITE(DSPARB, dev_priv->saveDSPARB); 465317c35d1SJesse Barnes 466a4fc5ed6SKeith Packard /* Display port ratios (must be done before clock is set) */ 467a4fc5ed6SKeith Packard if (SUPPORTS_INTEGRATED_DP(dev)) { 468a4fc5ed6SKeith Packard I915_WRITE(PIPEA_GMCH_DATA_M, dev_priv->savePIPEA_GMCH_DATA_M); 469a4fc5ed6SKeith Packard I915_WRITE(PIPEB_GMCH_DATA_M, dev_priv->savePIPEB_GMCH_DATA_M); 470a4fc5ed6SKeith Packard I915_WRITE(PIPEA_GMCH_DATA_N, dev_priv->savePIPEA_GMCH_DATA_N); 471a4fc5ed6SKeith Packard I915_WRITE(PIPEB_GMCH_DATA_N, dev_priv->savePIPEB_GMCH_DATA_N); 472a4fc5ed6SKeith Packard I915_WRITE(PIPEA_DP_LINK_M, dev_priv->savePIPEA_DP_LINK_M); 473a4fc5ed6SKeith Packard I915_WRITE(PIPEB_DP_LINK_M, dev_priv->savePIPEB_DP_LINK_M); 474a4fc5ed6SKeith Packard I915_WRITE(PIPEA_DP_LINK_N, dev_priv->savePIPEA_DP_LINK_N); 475a4fc5ed6SKeith Packard I915_WRITE(PIPEB_DP_LINK_N, dev_priv->savePIPEB_DP_LINK_N); 476a4fc5ed6SKeith Packard } 4771341d655SBen Gamari 478fccdaba4SZhao Yakui /* This is only meaningful in non-KMS mode */ 479fccdaba4SZhao Yakui /* Don't restore them in KMS mode */ 480fccdaba4SZhao Yakui i915_restore_modeset_reg(dev); 4811341d655SBen Gamari 4821fd1c624SEric Anholt /* Cursor state */ 4831fd1c624SEric Anholt I915_WRITE(CURAPOS, dev_priv->saveCURAPOS); 4841fd1c624SEric Anholt I915_WRITE(CURACNTR, dev_priv->saveCURACNTR); 4851fd1c624SEric Anholt I915_WRITE(CURABASE, dev_priv->saveCURABASE); 4861fd1c624SEric Anholt I915_WRITE(CURBPOS, dev_priv->saveCURBPOS); 4871fd1c624SEric Anholt I915_WRITE(CURBCNTR, dev_priv->saveCURBCNTR); 4881fd1c624SEric Anholt I915_WRITE(CURBBASE, dev_priv->saveCURBBASE); 4891fd1c624SEric Anholt if (!IS_I9XX(dev)) 4901fd1c624SEric Anholt I915_WRITE(CURSIZE, dev_priv->saveCURSIZE); 4911fd1c624SEric Anholt 492317c35d1SJesse Barnes /* CRT state */ 493317c35d1SJesse Barnes I915_WRITE(ADPA, dev_priv->saveADPA); 494317c35d1SJesse Barnes 495317c35d1SJesse Barnes /* LVDS state */ 496317c35d1SJesse Barnes if (IS_I965G(dev)) 497317c35d1SJesse Barnes I915_WRITE(BLC_PWM_CTL2, dev_priv->saveBLC_PWM_CTL2); 498317c35d1SJesse Barnes if (IS_MOBILE(dev) && !IS_I830(dev)) 499317c35d1SJesse Barnes I915_WRITE(LVDS, dev_priv->saveLVDS); 500317c35d1SJesse Barnes if (!IS_I830(dev) && !IS_845G(dev)) 501317c35d1SJesse Barnes I915_WRITE(PFIT_CONTROL, dev_priv->savePFIT_CONTROL); 502317c35d1SJesse Barnes 503317c35d1SJesse Barnes I915_WRITE(PFIT_PGM_RATIOS, dev_priv->savePFIT_PGM_RATIOS); 504317c35d1SJesse Barnes I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL); 505*0eb96d6eSJesse Barnes I915_WRITE(BLC_HIST_CTL, dev_priv->saveBLC_HIST_CTL); 506317c35d1SJesse Barnes I915_WRITE(PP_ON_DELAYS, dev_priv->savePP_ON_DELAYS); 507317c35d1SJesse Barnes I915_WRITE(PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); 508317c35d1SJesse Barnes I915_WRITE(PP_DIVISOR, dev_priv->savePP_DIVISOR); 509317c35d1SJesse Barnes I915_WRITE(PP_CONTROL, dev_priv->savePP_CONTROL); 510317c35d1SJesse Barnes 511a4fc5ed6SKeith Packard /* Display Port state */ 512a4fc5ed6SKeith Packard if (SUPPORTS_INTEGRATED_DP(dev)) { 513a4fc5ed6SKeith Packard I915_WRITE(DP_B, dev_priv->saveDP_B); 514a4fc5ed6SKeith Packard I915_WRITE(DP_C, dev_priv->saveDP_C); 515a4fc5ed6SKeith Packard I915_WRITE(DP_D, dev_priv->saveDP_D); 516a4fc5ed6SKeith Packard } 517317c35d1SJesse Barnes /* FIXME: restore TV & SDVO state */ 518317c35d1SJesse Barnes 519317c35d1SJesse Barnes /* FBC info */ 52006027f91SJesse Barnes if (IS_GM45(dev)) { 52106027f91SJesse Barnes g4x_disable_fbc(dev); 52206027f91SJesse Barnes I915_WRITE(DPFC_CB_BASE, dev_priv->saveDPFC_CB_BASE); 52306027f91SJesse Barnes } else { 52406027f91SJesse Barnes i8xx_disable_fbc(dev); 525317c35d1SJesse Barnes I915_WRITE(FBC_CFB_BASE, dev_priv->saveFBC_CFB_BASE); 526317c35d1SJesse Barnes I915_WRITE(FBC_LL_BASE, dev_priv->saveFBC_LL_BASE); 527317c35d1SJesse Barnes I915_WRITE(FBC_CONTROL2, dev_priv->saveFBC_CONTROL2); 528317c35d1SJesse Barnes I915_WRITE(FBC_CONTROL, dev_priv->saveFBC_CONTROL); 52906027f91SJesse Barnes } 530317c35d1SJesse Barnes 531317c35d1SJesse Barnes /* VGA state */ 532317c35d1SJesse Barnes I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL); 533317c35d1SJesse Barnes I915_WRITE(VGA0, dev_priv->saveVGA0); 534317c35d1SJesse Barnes I915_WRITE(VGA1, dev_priv->saveVGA1); 535317c35d1SJesse Barnes I915_WRITE(VGA_PD, dev_priv->saveVGA_PD); 536317c35d1SJesse Barnes DRM_UDELAY(150); 537317c35d1SJesse Barnes 5381341d655SBen Gamari i915_restore_vga(dev); 5391341d655SBen Gamari } 5401341d655SBen Gamari 5411341d655SBen Gamari int i915_save_state(struct drm_device *dev) 5421341d655SBen Gamari { 5431341d655SBen Gamari struct drm_i915_private *dev_priv = dev->dev_private; 5441341d655SBen Gamari int i; 5451341d655SBen Gamari 5461341d655SBen Gamari pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB); 5471341d655SBen Gamari 5481341d655SBen Gamari /* Render Standby */ 5491341d655SBen Gamari if (IS_I965G(dev) && IS_MOBILE(dev)) 5501341d655SBen Gamari dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY); 5511341d655SBen Gamari 5521341d655SBen Gamari /* Hardware status page */ 5531341d655SBen Gamari dev_priv->saveHWS = I915_READ(HWS_PGA); 5541341d655SBen Gamari 5551341d655SBen Gamari i915_save_display(dev); 5561341d655SBen Gamari 5571341d655SBen Gamari /* Interrupt state */ 5581341d655SBen Gamari dev_priv->saveIER = I915_READ(IER); 5591341d655SBen Gamari dev_priv->saveIMR = I915_READ(IMR); 5601341d655SBen Gamari 5611341d655SBen Gamari /* Clock gating state */ 5621341d655SBen Gamari dev_priv->saveD_STATE = I915_READ(D_STATE); 5631341d655SBen Gamari dev_priv->saveDSPCLK_GATE_D = I915_READ(DSPCLK_GATE_D); /* Not sure about this */ 5641341d655SBen Gamari 5651341d655SBen Gamari /* Cache mode state */ 5661341d655SBen Gamari dev_priv->saveCACHE_MODE_0 = I915_READ(CACHE_MODE_0); 5671341d655SBen Gamari 5681341d655SBen Gamari /* Memory Arbitration state */ 5691341d655SBen Gamari dev_priv->saveMI_ARB_STATE = I915_READ(MI_ARB_STATE); 5701341d655SBen Gamari 5711341d655SBen Gamari /* Scratch space */ 5721341d655SBen Gamari for (i = 0; i < 16; i++) { 5731341d655SBen Gamari dev_priv->saveSWF0[i] = I915_READ(SWF00 + (i << 2)); 5741341d655SBen Gamari dev_priv->saveSWF1[i] = I915_READ(SWF10 + (i << 2)); 5751341d655SBen Gamari } 5761341d655SBen Gamari for (i = 0; i < 3; i++) 5771341d655SBen Gamari dev_priv->saveSWF2[i] = I915_READ(SWF30 + (i << 2)); 5781341d655SBen Gamari 5791341d655SBen Gamari /* Fences */ 5801341d655SBen Gamari if (IS_I965G(dev)) { 5811341d655SBen Gamari for (i = 0; i < 16; i++) 5821341d655SBen Gamari dev_priv->saveFENCE[i] = I915_READ64(FENCE_REG_965_0 + (i * 8)); 5831341d655SBen Gamari } else { 5841341d655SBen Gamari for (i = 0; i < 8; i++) 5851341d655SBen Gamari dev_priv->saveFENCE[i] = I915_READ(FENCE_REG_830_0 + (i * 4)); 5861341d655SBen Gamari 5871341d655SBen Gamari if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) 5881341d655SBen Gamari for (i = 0; i < 8; i++) 5891341d655SBen Gamari dev_priv->saveFENCE[i+8] = I915_READ(FENCE_REG_945_8 + (i * 4)); 5901341d655SBen Gamari } 5911341d655SBen Gamari 5921341d655SBen Gamari return 0; 5931341d655SBen Gamari } 5941341d655SBen Gamari 5951341d655SBen Gamari int i915_restore_state(struct drm_device *dev) 5961341d655SBen Gamari { 5971341d655SBen Gamari struct drm_i915_private *dev_priv = dev->dev_private; 5981341d655SBen Gamari int i; 5991341d655SBen Gamari 6001341d655SBen Gamari pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB); 6011341d655SBen Gamari 6021341d655SBen Gamari /* Render Standby */ 6031341d655SBen Gamari if (IS_I965G(dev) && IS_MOBILE(dev)) 6041341d655SBen Gamari I915_WRITE(MCHBAR_RENDER_STANDBY, dev_priv->saveRENDERSTANDBY); 6051341d655SBen Gamari 6061341d655SBen Gamari /* Hardware status page */ 6071341d655SBen Gamari I915_WRITE(HWS_PGA, dev_priv->saveHWS); 6081341d655SBen Gamari 6091341d655SBen Gamari /* Fences */ 6101341d655SBen Gamari if (IS_I965G(dev)) { 6111341d655SBen Gamari for (i = 0; i < 16; i++) 6121341d655SBen Gamari I915_WRITE64(FENCE_REG_965_0 + (i * 8), dev_priv->saveFENCE[i]); 6131341d655SBen Gamari } else { 6141341d655SBen Gamari for (i = 0; i < 8; i++) 6151341d655SBen Gamari I915_WRITE(FENCE_REG_830_0 + (i * 4), dev_priv->saveFENCE[i]); 6161341d655SBen Gamari if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) 6171341d655SBen Gamari for (i = 0; i < 8; i++) 6181341d655SBen Gamari I915_WRITE(FENCE_REG_945_8 + (i * 4), dev_priv->saveFENCE[i+8]); 6191341d655SBen Gamari } 6201341d655SBen Gamari 6211341d655SBen Gamari i915_restore_display(dev); 6221341d655SBen Gamari 6231341d655SBen Gamari /* Interrupt state */ 6241341d655SBen Gamari I915_WRITE (IER, dev_priv->saveIER); 6251341d655SBen Gamari I915_WRITE (IMR, dev_priv->saveIMR); 6261341d655SBen Gamari 627317c35d1SJesse Barnes /* Clock gating state */ 628317c35d1SJesse Barnes I915_WRITE (D_STATE, dev_priv->saveD_STATE); 629652c393aSJesse Barnes I915_WRITE (DSPCLK_GATE_D, dev_priv->saveDSPCLK_GATE_D); 630317c35d1SJesse Barnes 631317c35d1SJesse Barnes /* Cache mode state */ 632317c35d1SJesse Barnes I915_WRITE (CACHE_MODE_0, dev_priv->saveCACHE_MODE_0 | 0xffff0000); 633317c35d1SJesse Barnes 634317c35d1SJesse Barnes /* Memory arbitration state */ 635317c35d1SJesse Barnes I915_WRITE (MI_ARB_STATE, dev_priv->saveMI_ARB_STATE | 0xffff0000); 636317c35d1SJesse Barnes 637317c35d1SJesse Barnes for (i = 0; i < 16; i++) { 638317c35d1SJesse Barnes I915_WRITE(SWF00 + (i << 2), dev_priv->saveSWF0[i]); 639819e0064SRoel Kluin I915_WRITE(SWF10 + (i << 2), dev_priv->saveSWF1[i]); 640317c35d1SJesse Barnes } 641317c35d1SJesse Barnes for (i = 0; i < 3; i++) 642317c35d1SJesse Barnes I915_WRITE(SWF30 + (i << 2), dev_priv->saveSWF2[i]); 643317c35d1SJesse Barnes 644317c35d1SJesse Barnes return 0; 645317c35d1SJesse Barnes } 646317c35d1SJesse Barnes 647