Home | History | Annotate | Line # | Download | only in src
      1 /*
      2  * Copyright 2009 Advanced Micro Devices, Inc.
      3  *
      4  * All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining
      7  * a copy of this software and associated documentation files (the
      8  * "Software"), to deal in the Software without restriction, including
      9  * without limitation on the rights to use, copy, modify, merge,
     10  * publish, distribute, sublicense, and/or sell copies of the Software,
     11  * and to permit persons to whom the Software is furnished to do so,
     12  * subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice (including the
     15  * next paragraph) shall be included in all copies or substantial
     16  * portions of the Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     19  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     21  * NON-INFRINGEMENT.  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR
     22  * AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
     23  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     24  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     25  * DEALINGS IN THE SOFTWARE.
     26  *
     27  * Author: Alex Deucher <alexander.deucher (at) amd.com>
     28  *
     29  */
     30 
     31 #ifdef HAVE_CONFIG_H
     32 #include "config.h"
     33 #endif
     34 
     35 				/* Driver data structures */
     36 #include "radeon.h"
     37 #include "radeon_reg.h"
     38 #include "radeon_macros.h"
     39 #include "radeon_atombios.h"
     40 
     41 #include "ati_pciids_gen.h"
     42 
     43 /* 10 khz */
     44 static uint32_t calc_eng_mem_clock(ScrnInfoPtr pScrn,
     45 				   uint32_t req_clock,
     46 				   int ref_div,
     47 				   int *fb_div,
     48 				   int *post_div)
     49 {
     50     RADEONInfoPtr info = RADEONPTR(pScrn);
     51     RADEONPLLPtr pll = &info->pll;
     52 
     53     if (req_clock < 15000) {
     54 	*post_div = 8;
     55 	req_clock *= 8;
     56     } else if (req_clock < 30000) {
     57 	*post_div = 4;
     58 	req_clock *= 4;
     59     } else if (req_clock < 60000) {
     60 	*post_div = 2;
     61 	req_clock *= 2;
     62     } else
     63 	*post_div = 1;
     64 
     65     req_clock *= ref_div;
     66     req_clock += pll->reference_freq;
     67     req_clock /= (2 * pll->reference_freq);
     68 
     69     *fb_div = req_clock & 0xff;
     70 
     71     req_clock = (req_clock & 0xffff) << 1;
     72     req_clock *= pll->reference_freq;
     73     req_clock /= ref_div;
     74     req_clock /= *post_div;
     75 
     76     return req_clock;
     77 
     78 }
     79 
     80 static void
     81 RADEONSetEngineClock(ScrnInfoPtr pScrn, uint32_t eng_clock)
     82 {
     83     uint32_t tmp;
     84     int ref_div, fb_div, post_div;
     85 
     86     RADEONWaitForIdleMMIO(pScrn);
     87 
     88     tmp = INPLL(pScrn, RADEON_M_SPLL_REF_FB_DIV);
     89     ref_div = tmp & RADEON_M_SPLL_REF_DIV_MASK;
     90 
     91     eng_clock = calc_eng_mem_clock(pScrn, eng_clock, ref_div, &fb_div, &post_div);
     92 
     93     tmp = INPLL(pScrn, RADEON_CLK_PIN_CNTL);
     94     tmp &= ~RADEON_DONT_USE_XTALIN;
     95     OUTPLL(pScrn, RADEON_CLK_PIN_CNTL, tmp);
     96 
     97     tmp = INPLL(pScrn, RADEON_SCLK_CNTL);
     98     tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
     99     OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp);
    100 
    101     usleep(10);
    102 
    103     tmp = INPLL(pScrn, RADEON_SPLL_CNTL);
    104     tmp |= RADEON_SPLL_SLEEP;
    105     OUTPLL(pScrn, RADEON_SPLL_CNTL, tmp);
    106 
    107     usleep(2);
    108 
    109     tmp = INPLL(pScrn, RADEON_SPLL_CNTL);
    110     tmp |= RADEON_SPLL_RESET;
    111     OUTPLL(pScrn, RADEON_SPLL_CNTL, tmp);
    112 
    113     usleep(200);
    114 
    115     tmp = INPLL(pScrn, RADEON_M_SPLL_REF_FB_DIV);
    116     tmp &= ~(RADEON_SPLL_FB_DIV_MASK << RADEON_SPLL_FB_DIV_SHIFT);
    117     tmp |= (fb_div & RADEON_SPLL_FB_DIV_MASK) << RADEON_SPLL_FB_DIV_SHIFT;
    118     OUTPLL(pScrn, RADEON_M_SPLL_REF_FB_DIV, tmp);
    119 
    120     /* XXX: verify on different asics */
    121     tmp = INPLL(pScrn, RADEON_SPLL_CNTL);
    122     tmp &= ~RADEON_SPLL_PVG_MASK;
    123     if ((eng_clock * post_div) >= 90000)
    124 	tmp |= (0x7 << RADEON_SPLL_PVG_SHIFT);
    125     else
    126 	tmp |= (0x4 << RADEON_SPLL_PVG_SHIFT);
    127     OUTPLL(pScrn, RADEON_SPLL_CNTL, tmp);
    128 
    129     tmp = INPLL(pScrn, RADEON_SPLL_CNTL);
    130     tmp &= ~RADEON_SPLL_SLEEP;
    131     OUTPLL(pScrn, RADEON_SPLL_CNTL, tmp);
    132 
    133     usleep(2);
    134 
    135     tmp = INPLL(pScrn, RADEON_SPLL_CNTL);
    136     tmp &= ~RADEON_SPLL_RESET;
    137     OUTPLL(pScrn, RADEON_SPLL_CNTL, tmp);
    138 
    139     usleep(200);
    140 
    141     tmp = INPLL(pScrn, RADEON_SCLK_CNTL);
    142     tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
    143     switch (post_div) {
    144     case 1:
    145     default:
    146 	tmp |= 1;
    147 	break;
    148     case 2:
    149 	tmp |= 2;
    150 	break;
    151     case 4:
    152 	tmp |= 3;
    153 	break;
    154     case 8:
    155 	tmp |= 4;
    156 	break;
    157     }
    158     OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp);
    159 
    160     usleep(20);
    161 
    162     tmp = INPLL(pScrn, RADEON_CLK_PIN_CNTL);
    163     tmp |= RADEON_DONT_USE_XTALIN;
    164     OUTPLL(pScrn, RADEON_CLK_PIN_CNTL, tmp);
    165 
    166     usleep(10);
    167 
    168 }
    169 
    170 static void LegacySetClockGating(ScrnInfoPtr pScrn, Bool enable)
    171 {
    172     RADEONInfoPtr  info       = RADEONPTR(pScrn);
    173     RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
    174     unsigned char *RADEONMMIO = info->MMIO;
    175     uint32_t tmp;
    176 
    177     if (enable) {
    178 	if (!pRADEONEnt->HasCRTC2) {
    179 	    tmp = INPLL(pScrn, RADEON_SCLK_CNTL);
    180 	    if ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) >
    181 		RADEON_CFG_ATI_REV_A13) {
    182 		tmp &= ~(RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_RB);
    183 	    }
    184 	    tmp &= ~(RADEON_SCLK_FORCE_HDP  | RADEON_SCLK_FORCE_DISP1 |
    185 		     RADEON_SCLK_FORCE_TOP  | RADEON_SCLK_FORCE_SE   |
    186 		     RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_RE   |
    187 		     RADEON_SCLK_FORCE_PB   | RADEON_SCLK_FORCE_TAM  |
    188 		     RADEON_SCLK_FORCE_TDM);
    189 	    OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp);
    190 	} else if (IS_R300_VARIANT) {
    191 	    if ((info->ChipFamily == CHIP_FAMILY_RS400) ||
    192 		(info->ChipFamily == CHIP_FAMILY_RS480)) {
    193 		tmp = INPLL(pScrn, RADEON_SCLK_CNTL);
    194 		tmp &= ~(RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP      |
    195 			 RADEON_SCLK_FORCE_HDP   | RADEON_SCLK_FORCE_DISP1   |
    196 			 RADEON_SCLK_FORCE_TOP   | RADEON_SCLK_FORCE_E2      |
    197 			 R300_SCLK_FORCE_VAP     | RADEON_SCLK_FORCE_IDCT    |
    198 			 RADEON_SCLK_FORCE_VIP   | R300_SCLK_FORCE_SR        |
    199 			 R300_SCLK_FORCE_PX      | R300_SCLK_FORCE_TX        |
    200 			 R300_SCLK_FORCE_US      | RADEON_SCLK_FORCE_TV_SCLK |
    201 			 R300_SCLK_FORCE_SU      | RADEON_SCLK_FORCE_OV0);
    202 		tmp |=  RADEON_DYN_STOP_LAT_MASK;
    203 		tmp |= RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_VIP;
    204 		OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp);
    205 
    206 		tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL);
    207 		tmp &= ~RADEON_SCLK_MORE_FORCEON;
    208 		tmp |=  RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
    209 		OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp);
    210 
    211 		tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL);
    212 		tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
    213 			RADEON_PIXCLK_DAC_ALWAYS_ONb);
    214 		OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp);
    215 
    216 		tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL);
    217 		tmp |= (RADEON_PIX2CLK_ALWAYS_ONb         |
    218 			RADEON_PIX2CLK_DAC_ALWAYS_ONb     |
    219 			RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
    220 			R300_DVOCLK_ALWAYS_ONb            |
    221 			RADEON_PIXCLK_BLEND_ALWAYS_ONb    |
    222 			RADEON_PIXCLK_GV_ALWAYS_ONb       |
    223 			R300_PIXCLK_DVO_ALWAYS_ONb        |
    224 			RADEON_PIXCLK_LVDS_ALWAYS_ONb     |
    225 			RADEON_PIXCLK_TMDS_ALWAYS_ONb     |
    226 			R300_PIXCLK_TRANS_ALWAYS_ONb      |
    227 			R300_PIXCLK_TVO_ALWAYS_ONb        |
    228 			R300_P2G2CLK_ALWAYS_ONb           |
    229 			R300_P2G2CLK_DAC_ALWAYS_ONb);
    230 		OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp);
    231 	    } else if (info->ChipFamily >= CHIP_FAMILY_RV350) {
    232 		tmp = INPLL(pScrn, R300_SCLK_CNTL2);
    233 		tmp &= ~(R300_SCLK_FORCE_TCL |
    234 			 R300_SCLK_FORCE_GA  |
    235 			 R300_SCLK_FORCE_CBA);
    236 		tmp |=  (R300_SCLK_TCL_MAX_DYN_STOP_LAT |
    237 			 R300_SCLK_GA_MAX_DYN_STOP_LAT  |
    238 			 R300_SCLK_CBA_MAX_DYN_STOP_LAT);
    239 		OUTPLL(pScrn, R300_SCLK_CNTL2, tmp);
    240 
    241 		tmp = INPLL(pScrn, RADEON_SCLK_CNTL);
    242 		tmp &= ~(RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP      |
    243 			 RADEON_SCLK_FORCE_HDP   | RADEON_SCLK_FORCE_DISP1   |
    244 			 RADEON_SCLK_FORCE_TOP   | RADEON_SCLK_FORCE_E2      |
    245 			 R300_SCLK_FORCE_VAP     | RADEON_SCLK_FORCE_IDCT    |
    246 			 RADEON_SCLK_FORCE_VIP   | R300_SCLK_FORCE_SR        |
    247 			 R300_SCLK_FORCE_PX      | R300_SCLK_FORCE_TX        |
    248 			 R300_SCLK_FORCE_US      | RADEON_SCLK_FORCE_TV_SCLK |
    249 			 R300_SCLK_FORCE_SU      | RADEON_SCLK_FORCE_OV0);
    250 		tmp |=  RADEON_DYN_STOP_LAT_MASK;
    251 		OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp);
    252 
    253 		tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL);
    254 		tmp &= ~RADEON_SCLK_MORE_FORCEON;
    255 		tmp |=  RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
    256 		OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp);
    257 
    258 		tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL);
    259 		tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
    260 			RADEON_PIXCLK_DAC_ALWAYS_ONb);
    261 		OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp);
    262 
    263 		tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL);
    264 		tmp |= (RADEON_PIX2CLK_ALWAYS_ONb         |
    265 			RADEON_PIX2CLK_DAC_ALWAYS_ONb     |
    266 			RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
    267 			R300_DVOCLK_ALWAYS_ONb            |
    268 			RADEON_PIXCLK_BLEND_ALWAYS_ONb    |
    269 			RADEON_PIXCLK_GV_ALWAYS_ONb       |
    270 			R300_PIXCLK_DVO_ALWAYS_ONb        |
    271 			RADEON_PIXCLK_LVDS_ALWAYS_ONb     |
    272 			RADEON_PIXCLK_TMDS_ALWAYS_ONb     |
    273 			R300_PIXCLK_TRANS_ALWAYS_ONb      |
    274 			R300_PIXCLK_TVO_ALWAYS_ONb        |
    275 			R300_P2G2CLK_ALWAYS_ONb           |
    276 			R300_P2G2CLK_DAC_ALWAYS_ONb);
    277 		OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp);
    278 
    279 		tmp = INPLL(pScrn, RADEON_MCLK_MISC);
    280 		tmp |= (RADEON_MC_MCLK_DYN_ENABLE |
    281 			RADEON_IO_MCLK_DYN_ENABLE);
    282 		OUTPLL(pScrn, RADEON_MCLK_MISC, tmp);
    283 
    284 		tmp = INPLL(pScrn, RADEON_MCLK_CNTL);
    285 		tmp |= (RADEON_FORCEON_MCLKA |
    286 			RADEON_FORCEON_MCLKB);
    287 
    288 		tmp &= ~(RADEON_FORCEON_YCLKA  |
    289 			 RADEON_FORCEON_YCLKB  |
    290 			 RADEON_FORCEON_MC);
    291 
    292 		/* Some releases of vbios have set DISABLE_MC_MCLKA
    293 		   and DISABLE_MC_MCLKB bits in the vbios table.  Setting these
    294 		   bits will cause H/W hang when reading video memory with dynamic clocking
    295 		   enabled. */
    296 		if ((tmp & R300_DISABLE_MC_MCLKA) &&
    297 		    (tmp & R300_DISABLE_MC_MCLKB)) {
    298 		    /* If both bits are set, then check the active channels */
    299 		    tmp = INPLL(pScrn, RADEON_MCLK_CNTL);
    300 		    if (info->RamWidth == 64) {
    301 			if (INREG(RADEON_MEM_CNTL) & R300_MEM_USE_CD_CH_ONLY)
    302 			    tmp &= ~R300_DISABLE_MC_MCLKB;
    303 			else
    304 			    tmp &= ~R300_DISABLE_MC_MCLKA;
    305 		    } else {
    306 			tmp &= ~(R300_DISABLE_MC_MCLKA |
    307 				 R300_DISABLE_MC_MCLKB);
    308 		    }
    309 		}
    310 
    311 		OUTPLL(pScrn, RADEON_MCLK_CNTL, tmp);
    312 	    } else {
    313 		tmp = INPLL(pScrn, RADEON_SCLK_CNTL);
    314 		tmp &= ~(R300_SCLK_FORCE_VAP);
    315 		tmp |= RADEON_SCLK_FORCE_CP;
    316 		OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp);
    317 		usleep(15000);
    318 
    319 		tmp = INPLL(pScrn, R300_SCLK_CNTL2);
    320 		tmp &= ~(R300_SCLK_FORCE_TCL |
    321 			 R300_SCLK_FORCE_GA  |
    322 			 R300_SCLK_FORCE_CBA);
    323 		OUTPLL(pScrn, R300_SCLK_CNTL2, tmp);
    324 	    }
    325 	} else {
    326 	    tmp = INPLL(pScrn, RADEON_CLK_PWRMGT_CNTL);
    327 
    328 	    tmp &= ~(RADEON_ACTIVE_HILO_LAT_MASK     |
    329 		     RADEON_DISP_DYN_STOP_LAT_MASK   |
    330 		     RADEON_DYN_STOP_MODE_MASK);
    331 
    332 	    tmp |= (RADEON_ENGIN_DYNCLK_MODE |
    333 		    (0x01 << RADEON_ACTIVE_HILO_LAT_SHIFT));
    334 	    OUTPLL(pScrn, RADEON_CLK_PWRMGT_CNTL, tmp);
    335 	    usleep(15000);
    336 
    337 	    tmp = INPLL(pScrn, RADEON_CLK_PIN_CNTL);
    338 	    tmp |= RADEON_SCLK_DYN_START_CNTL;
    339 	    OUTPLL(pScrn, RADEON_CLK_PIN_CNTL, tmp);
    340 	    usleep(15000);
    341 
    342 	    /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200
    343 	       to lockup randomly, leave them as set by BIOS.
    344 	    */
    345 	    tmp = INPLL(pScrn, RADEON_SCLK_CNTL);
    346 	    /*tmp &= RADEON_SCLK_SRC_SEL_MASK;*/
    347 	    tmp &= ~RADEON_SCLK_FORCEON_MASK;
    348 
    349 	    /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300*/
    350 	    if (((info->ChipFamily == CHIP_FAMILY_RV250) &&
    351 		 ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) <
    352 		  RADEON_CFG_ATI_REV_A13)) ||
    353 		((info->ChipFamily == CHIP_FAMILY_RV100) &&
    354 		 ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) <=
    355 		  RADEON_CFG_ATI_REV_A13))) {
    356 		tmp |= RADEON_SCLK_FORCE_CP;
    357 		tmp |= RADEON_SCLK_FORCE_VIP;
    358 	    }
    359 
    360 	    OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp);
    361 
    362 	    if ((info->ChipFamily == CHIP_FAMILY_RV200) ||
    363 		(info->ChipFamily == CHIP_FAMILY_RV250) ||
    364 		(info->ChipFamily == CHIP_FAMILY_RV280)) {
    365 		tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL);
    366 		tmp &= ~RADEON_SCLK_MORE_FORCEON;
    367 
    368 		/* RV200::A11 A12 RV250::A11 A12 */
    369 		if (((info->ChipFamily == CHIP_FAMILY_RV200) ||
    370 		     (info->ChipFamily == CHIP_FAMILY_RV250)) &&
    371 		    ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) <
    372 		     RADEON_CFG_ATI_REV_A13)) {
    373 		    tmp |= RADEON_SCLK_MORE_FORCEON;
    374 		}
    375 		OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp);
    376 		usleep(15000);
    377 	    }
    378 
    379 	    /* RV200::A11 A12, RV250::A11 A12 */
    380 	    if (((info->ChipFamily == CHIP_FAMILY_RV200) ||
    381 		 (info->ChipFamily == CHIP_FAMILY_RV250)) &&
    382 		((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) <
    383 		 RADEON_CFG_ATI_REV_A13)) {
    384 		tmp = INPLL(pScrn, RADEON_PLL_PWRMGT_CNTL);
    385 		tmp |= RADEON_TCL_BYPASS_DISABLE;
    386 		OUTPLL(pScrn, RADEON_PLL_PWRMGT_CNTL, tmp);
    387 	    }
    388 	    usleep(15000);
    389 
    390 	    /*enable dynamic mode for display clocks (PIXCLK and PIX2CLK)*/
    391 	    tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL);
    392 	    tmp |=  (RADEON_PIX2CLK_ALWAYS_ONb         |
    393 		     RADEON_PIX2CLK_DAC_ALWAYS_ONb     |
    394 		     RADEON_PIXCLK_BLEND_ALWAYS_ONb    |
    395 		     RADEON_PIXCLK_GV_ALWAYS_ONb       |
    396 		     RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
    397 		     RADEON_PIXCLK_LVDS_ALWAYS_ONb     |
    398 		     RADEON_PIXCLK_TMDS_ALWAYS_ONb);
    399 
    400 	    OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp);
    401 	    usleep(15000);
    402 
    403 	    tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL);
    404 	    tmp |= (RADEON_PIXCLK_ALWAYS_ONb  |
    405 		    RADEON_PIXCLK_DAC_ALWAYS_ONb);
    406 
    407 	    OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp);
    408 	    usleep(15000);
    409 	}
    410     } else {
    411 	/* Turn everything OFF (ForceON to everything)*/
    412 	if ( !pRADEONEnt->HasCRTC2 ) {
    413 	    tmp = INPLL(pScrn, RADEON_SCLK_CNTL);
    414 	    tmp |= (RADEON_SCLK_FORCE_CP   | RADEON_SCLK_FORCE_HDP |
    415 		    RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_TOP |
    416 		    RADEON_SCLK_FORCE_E2   | RADEON_SCLK_FORCE_SE  |
    417 		    RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_VIP |
    418 		    RADEON_SCLK_FORCE_RE   | RADEON_SCLK_FORCE_PB  |
    419 		    RADEON_SCLK_FORCE_TAM  | RADEON_SCLK_FORCE_TDM |
    420 		    RADEON_SCLK_FORCE_RB);
    421 	    OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp);
    422 	} else if ((info->ChipFamily == CHIP_FAMILY_RS400) ||
    423 		   (info->ChipFamily == CHIP_FAMILY_RS480)) {
    424 	    tmp = INPLL(pScrn, RADEON_SCLK_CNTL);
    425 	    tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP      |
    426 		    RADEON_SCLK_FORCE_HDP   | RADEON_SCLK_FORCE_DISP1   |
    427 		    RADEON_SCLK_FORCE_TOP   | RADEON_SCLK_FORCE_E2      |
    428 		    R300_SCLK_FORCE_VAP     | RADEON_SCLK_FORCE_IDCT    |
    429 		    RADEON_SCLK_FORCE_VIP   | R300_SCLK_FORCE_SR        |
    430 		    R300_SCLK_FORCE_PX      | R300_SCLK_FORCE_TX        |
    431 		    R300_SCLK_FORCE_US      | RADEON_SCLK_FORCE_TV_SCLK |
    432 		    R300_SCLK_FORCE_SU      | RADEON_SCLK_FORCE_OV0);
    433 	    OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp);
    434 
    435 	    tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL);
    436 	    tmp |= RADEON_SCLK_MORE_FORCEON;
    437 	    OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp);
    438 
    439 	    tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL);
    440 	    tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb  |
    441 		     RADEON_PIXCLK_DAC_ALWAYS_ONb |
    442 		     R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
    443 	    OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp);
    444 
    445 	    tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL);
    446 	    tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb         |
    447 		     RADEON_PIX2CLK_DAC_ALWAYS_ONb     |
    448 		     RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
    449 		     R300_DVOCLK_ALWAYS_ONb            |
    450 		     RADEON_PIXCLK_BLEND_ALWAYS_ONb    |
    451 		     RADEON_PIXCLK_GV_ALWAYS_ONb       |
    452 		     R300_PIXCLK_DVO_ALWAYS_ONb        |
    453 		     RADEON_PIXCLK_LVDS_ALWAYS_ONb     |
    454 		     RADEON_PIXCLK_TMDS_ALWAYS_ONb     |
    455 		     R300_PIXCLK_TRANS_ALWAYS_ONb      |
    456 		     R300_PIXCLK_TVO_ALWAYS_ONb        |
    457 		     R300_P2G2CLK_ALWAYS_ONb           |
    458 		     R300_P2G2CLK_DAC_ALWAYS_ONb       |
    459 		     R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
    460 	    OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp);
    461 	} else if (info->ChipFamily >= CHIP_FAMILY_RV350) {
    462 	    /* for RV350/M10, no delays are required. */
    463 	    tmp = INPLL(pScrn, R300_SCLK_CNTL2);
    464 	    tmp |= (R300_SCLK_FORCE_TCL |
    465 		    R300_SCLK_FORCE_GA  |
    466 		    R300_SCLK_FORCE_CBA);
    467 	    OUTPLL(pScrn, R300_SCLK_CNTL2, tmp);
    468 
    469 	    tmp = INPLL(pScrn, RADEON_SCLK_CNTL);
    470 	    tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP      |
    471 		    RADEON_SCLK_FORCE_HDP   | RADEON_SCLK_FORCE_DISP1   |
    472 		    RADEON_SCLK_FORCE_TOP   | RADEON_SCLK_FORCE_E2      |
    473 		    R300_SCLK_FORCE_VAP     | RADEON_SCLK_FORCE_IDCT    |
    474 		    RADEON_SCLK_FORCE_VIP   | R300_SCLK_FORCE_SR        |
    475 		    R300_SCLK_FORCE_PX      | R300_SCLK_FORCE_TX        |
    476 		    R300_SCLK_FORCE_US      | RADEON_SCLK_FORCE_TV_SCLK |
    477 		    R300_SCLK_FORCE_SU      | RADEON_SCLK_FORCE_OV0);
    478 	    OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp);
    479 
    480 	    tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL);
    481 	    tmp |= RADEON_SCLK_MORE_FORCEON;
    482 	    OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp);
    483 
    484 	    tmp = INPLL(pScrn, RADEON_MCLK_CNTL);
    485 	    tmp |= (RADEON_FORCEON_MCLKA |
    486 		    RADEON_FORCEON_MCLKB |
    487 		    RADEON_FORCEON_YCLKA |
    488 		    RADEON_FORCEON_YCLKB |
    489 		    RADEON_FORCEON_MC);
    490 	    OUTPLL(pScrn, RADEON_MCLK_CNTL, tmp);
    491 
    492 	    tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL);
    493 	    tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb  |
    494 		     RADEON_PIXCLK_DAC_ALWAYS_ONb |
    495 		     R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
    496 	    OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp);
    497 
    498 	    tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL);
    499 	    tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb         |
    500 		     RADEON_PIX2CLK_DAC_ALWAYS_ONb     |
    501 		     RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
    502 		     R300_DVOCLK_ALWAYS_ONb            |
    503 		     RADEON_PIXCLK_BLEND_ALWAYS_ONb    |
    504 		     RADEON_PIXCLK_GV_ALWAYS_ONb       |
    505 		     R300_PIXCLK_DVO_ALWAYS_ONb        |
    506 		     RADEON_PIXCLK_LVDS_ALWAYS_ONb     |
    507 		     RADEON_PIXCLK_TMDS_ALWAYS_ONb     |
    508 		     R300_PIXCLK_TRANS_ALWAYS_ONb      |
    509 		     R300_PIXCLK_TVO_ALWAYS_ONb        |
    510 		     R300_P2G2CLK_ALWAYS_ONb           |
    511 		     R300_P2G2CLK_DAC_ALWAYS_ONb       |
    512 		     R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
    513 	    OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp);
    514 	}  else {
    515 	    tmp = INPLL(pScrn, RADEON_SCLK_CNTL);
    516 	    tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_E2);
    517 	    tmp |= RADEON_SCLK_FORCE_SE;
    518 
    519 	    if ( !pRADEONEnt->HasCRTC2 ) {
    520 		tmp |= ( RADEON_SCLK_FORCE_RB    |
    521 			 RADEON_SCLK_FORCE_TDM   |
    522 			 RADEON_SCLK_FORCE_TAM   |
    523 			 RADEON_SCLK_FORCE_PB    |
    524 			 RADEON_SCLK_FORCE_RE    |
    525 			 RADEON_SCLK_FORCE_VIP   |
    526 			 RADEON_SCLK_FORCE_IDCT  |
    527 			 RADEON_SCLK_FORCE_TOP   |
    528 			 RADEON_SCLK_FORCE_DISP1 |
    529 			 RADEON_SCLK_FORCE_DISP2 |
    530 			 RADEON_SCLK_FORCE_HDP    );
    531 	    } else if ((info->ChipFamily == CHIP_FAMILY_R300) ||
    532 		       (info->ChipFamily == CHIP_FAMILY_R350)) {
    533 		tmp |= ( RADEON_SCLK_FORCE_HDP   |
    534 			 RADEON_SCLK_FORCE_DISP1 |
    535 			 RADEON_SCLK_FORCE_DISP2 |
    536 			 RADEON_SCLK_FORCE_TOP   |
    537 			 RADEON_SCLK_FORCE_IDCT  |
    538 			 RADEON_SCLK_FORCE_VIP);
    539 	    }
    540 	    OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp);
    541 
    542 	    usleep(16000);
    543 
    544 	    if ((info->ChipFamily == CHIP_FAMILY_R300) ||
    545 		(info->ChipFamily == CHIP_FAMILY_R350)) {
    546 		tmp = INPLL(pScrn, R300_SCLK_CNTL2);
    547 		tmp |= ( R300_SCLK_FORCE_TCL |
    548 			 R300_SCLK_FORCE_GA  |
    549 			 R300_SCLK_FORCE_CBA);
    550 		OUTPLL(pScrn, R300_SCLK_CNTL2, tmp);
    551 		usleep(16000);
    552 	    }
    553 
    554 	    if (info->IsIGP) {
    555 		tmp = INPLL(pScrn, RADEON_MCLK_CNTL);
    556 		tmp &= ~(RADEON_FORCEON_MCLKA |
    557 			 RADEON_FORCEON_YCLKA);
    558 		OUTPLL(pScrn, RADEON_MCLK_CNTL, tmp);
    559 		usleep(16000);
    560 	    }
    561 
    562 	    if ((info->ChipFamily == CHIP_FAMILY_RV200) ||
    563 		(info->ChipFamily == CHIP_FAMILY_RV250) ||
    564 		(info->ChipFamily == CHIP_FAMILY_RV280)) {
    565 		tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL);
    566 		tmp |= RADEON_SCLK_MORE_FORCEON;
    567 		OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp);
    568 		usleep(16000);
    569 	    }
    570 
    571 	    tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL);
    572 	    tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb         |
    573 		     RADEON_PIX2CLK_DAC_ALWAYS_ONb     |
    574 		     RADEON_PIXCLK_BLEND_ALWAYS_ONb    |
    575 		     RADEON_PIXCLK_GV_ALWAYS_ONb       |
    576 		     RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
    577 		     RADEON_PIXCLK_LVDS_ALWAYS_ONb     |
    578 		     RADEON_PIXCLK_TMDS_ALWAYS_ONb);
    579 
    580 	    OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp);
    581 	    usleep(16000);
    582 
    583 	    tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL);
    584 	    tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb  |
    585 		     RADEON_PIXCLK_DAC_ALWAYS_ONb);
    586 	    OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp);
    587 	}
    588     }
    589 }
    590 
    591 static void RADEONPMQuirks(ScrnInfoPtr pScrn)
    592 {
    593     RADEONInfoPtr  info       = RADEONPTR(pScrn);
    594     uint32_t tmp;
    595 
    596     RADEONWaitForIdleMMIO(pScrn);
    597 
    598     if (info->ChipFamily < CHIP_FAMILY_RV515) {
    599 	tmp = INPLL(pScrn, RADEON_SCLK_CNTL);
    600 	if (IS_R300_VARIANT || IS_RV100_VARIANT)
    601 	    tmp |= RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_VIP;
    602 	if ((info->ChipFamily == CHIP_FAMILY_RV250) || (info->ChipFamily == CHIP_FAMILY_RV280))
    603 	    tmp |= RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_DISP2;
    604 	if ((info->ChipFamily == CHIP_FAMILY_RV350) || (info->ChipFamily == CHIP_FAMILY_RV380))
    605 	    tmp |= R300_SCLK_FORCE_VAP;
    606 	if (info->ChipFamily == CHIP_FAMILY_R420)
    607 	    tmp |= R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX;
    608 	OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp);
    609     } else if (info->ChipFamily < CHIP_FAMILY_R600) {
    610 	tmp = INPLL(pScrn, AVIVO_CP_DYN_CNTL);
    611 	tmp |= AVIVO_CP_FORCEON;
    612 	OUTPLL(pScrn, AVIVO_CP_DYN_CNTL, tmp);
    613 
    614 	tmp = INPLL(pScrn, AVIVO_E2_DYN_CNTL);
    615 	tmp |= AVIVO_E2_FORCEON;
    616 	OUTPLL(pScrn, AVIVO_E2_DYN_CNTL, tmp);
    617 
    618 	tmp = INPLL(pScrn, AVIVO_IDCT_DYN_CNTL);
    619 	tmp |= AVIVO_IDCT_FORCEON;
    620 	OUTPLL(pScrn, AVIVO_IDCT_DYN_CNTL, tmp);
    621     }
    622 }
    623 
    624 static void
    625 RADEONSetPCIELanes(ScrnInfoPtr pScrn, int lanes)
    626 {
    627     RADEONInfoPtr  info       = RADEONPTR(pScrn);
    628     unsigned char *RADEONMMIO = info->MMIO;
    629     uint32_t link_width_cntl, mask, target_reg;
    630 
    631     if (info->IsIGP)
    632 	return;
    633 
    634     /* don't change lanes on multi-gpu cards for now */
    635     if ((info->Chipset == PCI_CHIP_RV770_9441) ||
    636 	(info->Chipset == PCI_CHIP_RV770_9443) ||
    637 	(info->Chipset == PCI_CHIP_RV770_944B) ||
    638 	(info->Chipset == PCI_CHIP_RV670_9506) ||
    639 	(info->Chipset == PCI_CHIP_RV670_9509) ||
    640 	(info->Chipset == PCI_CHIP_RV670_950F))
    641 	return;
    642 
    643     RADEONWaitForIdleMMIO(pScrn);
    644 
    645     switch (lanes) {
    646     case 0:
    647 	mask = RADEON_PCIE_LC_LINK_WIDTH_X0;
    648 	break;
    649     case 1:
    650 	mask = RADEON_PCIE_LC_LINK_WIDTH_X1;
    651 	break;
    652     case 2:
    653 	mask = RADEON_PCIE_LC_LINK_WIDTH_X2;
    654 	break;
    655     case 4:
    656 	mask = RADEON_PCIE_LC_LINK_WIDTH_X4;
    657 	break;
    658     case 8:
    659 	mask = RADEON_PCIE_LC_LINK_WIDTH_X8;
    660 	break;
    661     case 12:
    662 	mask = RADEON_PCIE_LC_LINK_WIDTH_X12;
    663 	break;
    664     case 16:
    665     default:
    666 	mask = RADEON_PCIE_LC_LINK_WIDTH_X16;
    667 	break;
    668     }
    669 
    670     if (info->ChipFamily >= CHIP_FAMILY_R600) {
    671 	link_width_cntl = INPCIE_P(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL);
    672 
    673 	if ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) ==
    674 	    (mask << RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT))
    675 	    return;
    676 
    677 	link_width_cntl &= ~(RADEON_PCIE_LC_LINK_WIDTH_MASK |
    678 			     RADEON_PCIE_LC_RECONFIG_NOW |
    679 			     R600_PCIE_LC_RECONFIG_ARC_MISSING_ESCAPE |
    680 			     R600_PCIE_LC_SHORT_RECONFIG_EN |
    681 			     R600_PCIE_LC_RENEGOTIATE_EN);
    682 	link_width_cntl |= mask;
    683 
    684 #if 0
    685 	/* some northbridges can renegotiate the link rather than requiring
    686 	 * a complete re-config.
    687 	 * e.g., AMD 780/790 northbridges (pci ids: 0x5956, 0x5957, 0x5958, etc.)
    688 	 */
    689 	if (northbridge can renegotiate)
    690 	    link_width_cntl |= R600_PCIE_LC_RENEGOTIATE_EN;
    691 	else
    692 #endif
    693 	    link_width_cntl |= R600_PCIE_LC_RECONFIG_ARC_MISSING_ESCAPE;
    694 
    695 	OUTPCIE_P(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
    696 	OUTPCIE_P(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl | RADEON_PCIE_LC_RECONFIG_NOW);
    697 
    698 	if (info->ChipFamily >= CHIP_FAMILY_RV770)
    699 	    target_reg = R700_TARGET_AND_CURRENT_PROFILE_INDEX;
    700 	else
    701 	    target_reg = R600_TARGET_AND_CURRENT_PROFILE_INDEX;
    702 
    703 	/* wait for lane set to complete */
    704 	link_width_cntl = INREG(target_reg);
    705 	while (link_width_cntl == 0xffffffff)
    706 	    link_width_cntl = INREG(target_reg);
    707 
    708     } else {
    709 	link_width_cntl = INPCIE(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL);
    710 
    711 	if ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) ==
    712 	    (mask << RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT))
    713 	    return;
    714 
    715 	link_width_cntl &= ~(RADEON_PCIE_LC_LINK_WIDTH_MASK |
    716 			     RADEON_PCIE_LC_RECONFIG_NOW |
    717 			     RADEON_PCIE_LC_RECONFIG_LATER |
    718 			     RADEON_PCIE_LC_SHORT_RECONFIG_EN);
    719 	link_width_cntl |= mask;
    720 	OUTPCIE(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
    721 	OUTPCIE(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl | RADEON_PCIE_LC_RECONFIG_NOW);
    722 
    723 	/* wait for lane set to complete */
    724 	link_width_cntl = INPCIE(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL);
    725 	while (link_width_cntl == 0xffffffff)
    726 	    link_width_cntl = INPCIE(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL);
    727 
    728     }
    729 
    730 }
    731 
    732 static void
    733 RADEONSetClockGating(ScrnInfoPtr pScrn, Bool enable)
    734 {
    735     RADEONInfoPtr  info       = RADEONPTR(pScrn);
    736 
    737     RADEONWaitForIdleMMIO(pScrn);
    738 
    739     if (info->ChipFamily >= CHIP_FAMILY_R600)
    740 	atombios_static_pwrmgt_setup(pScrn, enable);
    741     else {
    742 	if (info->IsAtomBios) {
    743 	    atombios_static_pwrmgt_setup(pScrn, enable);
    744 	    atombios_clk_gating_setup(pScrn, enable);
    745 	} else if (info->IsMobility)
    746 	    LegacySetClockGating(pScrn, enable);
    747     }
    748 
    749     xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Dynamic Clock Gating %sabled\n",
    750 	       enable ? "En" : "Dis");
    751 }
    752 
    753 static void RADEONSetStaticPowerMode(ScrnInfoPtr pScrn, RADEONPMType type)
    754 {
    755     RADEONInfoPtr  info       = RADEONPTR(pScrn);
    756     int i;
    757 
    758     for (i = 0; i < info->pm.num_modes; i++) {
    759 	if (info->pm.mode[i].type == type)
    760 	    break;
    761     }
    762 
    763     if (i == info->pm.num_modes)
    764 	return;
    765 
    766     if (i == info->pm.current_mode)
    767 	return;
    768 
    769     RADEONWaitForIdleMMIO(pScrn);
    770 
    771     if (info->IsAtomBios)
    772 	atombios_set_engine_clock(pScrn, info->pm.mode[i].sclk);
    773     else
    774 	RADEONSetEngineClock(pScrn, info->pm.mode[i].sclk);
    775 
    776     if (info->cardType == CARD_PCIE)
    777 	RADEONSetPCIELanes(pScrn, info->pm.mode[i].pcie_lanes);
    778 
    779     info->pm.current_mode = i;
    780 
    781     xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Power Mode Switch\n");
    782 }
    783 
    784 
    785 void RADEONPMInit(ScrnInfoPtr pScrn)
    786 {
    787     RADEONInfoPtr  info       = RADEONPTR(pScrn);
    788 
    789     if (xf86ReturnOptValBool(info->Options, OPTION_CLOCK_GATING, FALSE)) {
    790 	info->pm.clock_gating_enabled = TRUE;
    791 	RADEONSetClockGating(pScrn, info->pm.clock_gating_enabled);
    792     } else
    793 	info->pm.clock_gating_enabled = FALSE;
    794 
    795     info->pm.mode[0].type = POWER_DEFAULT;
    796     info->pm.mode[0].sclk = (uint32_t)info->sclk * 100; /* 10 khz */
    797     info->pm.mode[0].mclk = (uint32_t)info->mclk * 100; /* 10 khz */
    798     info->pm.mode[0].pcie_lanes = 16; /* XXX: read back current lane config */
    799     info->pm.current_mode = 0;
    800     info->pm.num_modes = 1;
    801 
    802     if (xf86ReturnOptValBool(info->Options, OPTION_DYNAMIC_PM, FALSE)) {
    803 	info->pm.dynamic_mode_enabled = TRUE;
    804 	info->pm.mode[1].type = POWER_LOW;
    805 	info->pm.mode[1].sclk = info->pm.mode[0].sclk / 4;
    806 	info->pm.mode[1].mclk = info->pm.mode[0].mclk / 4;
    807 	info->pm.mode[1].pcie_lanes = 1;
    808 
    809 	info->pm.mode[2].type = POWER_HIGH;
    810 	info->pm.mode[2].sclk = info->pm.mode[0].sclk;
    811 	info->pm.mode[2].mclk = info->pm.mode[0].mclk;
    812 	info->pm.mode[2].pcie_lanes = 16;
    813 
    814 	info->pm.num_modes += 2;
    815 
    816 	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Dynamic Power Management Enabled\n");
    817     } else {
    818 	info->pm.dynamic_mode_enabled = FALSE;
    819 	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Dynamic Power Management Disabled\n");
    820     }
    821 
    822     if (xf86ReturnOptValBool(info->Options, OPTION_FORCE_LOW_POWER, FALSE)) {
    823 	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Force Low Power Mode Enabled\n");
    824 	info->pm.force_low_power_enabled = TRUE;
    825 	if (info->pm.dynamic_mode_enabled) {
    826 	    info->pm.mode[2].type = POWER_HIGH;
    827 	    info->pm.mode[2].sclk = info->pm.mode[0].sclk / 2;
    828 	    info->pm.mode[2].mclk = info->pm.mode[0].mclk / 2;
    829 	    info->pm.mode[2].pcie_lanes = 4;
    830 	} else {
    831 	    info->pm.mode[1].type = POWER_HIGH;
    832 	    info->pm.mode[1].sclk = info->pm.mode[0].sclk / 2;
    833 	    info->pm.mode[1].mclk = info->pm.mode[0].mclk / 2;
    834 	    info->pm.mode[1].pcie_lanes = 4;
    835 	    info->pm.num_modes += 1;
    836 	}
    837 	RADEONSetStaticPowerMode(pScrn, POWER_HIGH);
    838     } else
    839 	info->pm.force_low_power_enabled = FALSE;
    840 
    841     RADEONPMQuirks(pScrn);
    842 }
    843 
    844 void RADEONPMEnterVT(ScrnInfoPtr pScrn)
    845 {
    846     RADEONInfoPtr  info       = RADEONPTR(pScrn);
    847 
    848     if (info->pm.clock_gating_enabled)
    849 	RADEONSetClockGating(pScrn, info->pm.clock_gating_enabled);
    850     RADEONPMQuirks(pScrn);
    851     if (info->pm.force_low_power_enabled || info->pm.dynamic_mode_enabled)
    852 	RADEONSetStaticPowerMode(pScrn, POWER_HIGH);
    853 }
    854 
    855 void RADEONPMLeaveVT(ScrnInfoPtr pScrn)
    856 {
    857     RADEONInfoPtr  info       = RADEONPTR(pScrn);
    858 
    859     if (info->pm.clock_gating_enabled)
    860 	RADEONSetClockGating(pScrn, FALSE);
    861     if (info->pm.force_low_power_enabled || info->pm.dynamic_mode_enabled)
    862 	RADEONSetStaticPowerMode(pScrn, POWER_DEFAULT);
    863 }
    864 
    865 void RADEONPMFini(ScrnInfoPtr pScrn)
    866 {
    867     RADEONInfoPtr info = RADEONPTR(pScrn);
    868 
    869     if (info->pm.clock_gating_enabled)
    870 	RADEONSetClockGating(pScrn, FALSE);
    871     if (info->pm.force_low_power_enabled || info->pm.dynamic_mode_enabled)
    872 	RADEONSetStaticPowerMode(pScrn, POWER_DEFAULT);
    873 }
    874 
    875 void RADEONPMBlockHandler(ScrnInfoPtr pScrn)
    876 {
    877     RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn);
    878 
    879     if ((!pRADEONEnt->Controller[0]->enabled) &&
    880 	(!pRADEONEnt->Controller[1]->enabled))
    881 	RADEONSetStaticPowerMode(pScrn, POWER_LOW);
    882     else
    883 	RADEONSetStaticPowerMode(pScrn, POWER_HIGH);
    884 
    885 }
    886 
    887