CTC++ Coverage Report - Execution Profile    #811/1532

Files Summary | Functions Summary | Execution Profile | Index | No Index
First | Previous | Next | Last


File: drivers/video/aty/radeon_pm.c
Instrumentation mode: function-decision-multicondition
TER: 2 % ( 10/635)

Start/ End/    
True False - Line Source

  1 /*
  2  *   drivers/video/aty/radeon_pm.c
  3  *
  4  *   Copyright 2003,2004 Ben. Herrenschmidt <benh@kernel.crashing.org>
  5  *   Copyright 2004 Paul Mackerras <paulus@samba.org>
  6  *
  7  *   This is the power management code for ATI radeon chipsets. It contains
  8  *   some dynamic clock PM enable/disable code similar to what X.org does,
  9  *   some D2-state (APM-style) sleep/wakeup code for use on some PowerMacs,
  10  *   and the necessary bits to re-initialize from scratch a few chips found
  11  *   on PowerMacs as well. The later could be extended to more platforms
  12  *   provided the memory controller configuration code be made more generic,
  13  *   and you can get the proper mode register commands for your RAMs.
  14  *   Those things may be found in the BIOS image...
  15  */
  16 
  17 #include "radeonfb.h"
  18 
  19 #include <linux/console.h>
  20 #include <linux/agp_backend.h>
  21 
  22 #ifdef CONFIG_PPC_PMAC
  23 #include <asm/processor.h>
  24 #include <asm/prom.h>
  25 #include <asm/pmac_feature.h>
  26 #endif
  27 
  28 #include "ati_ids.h"
  29 
 
- 30 static void radeon_pm_disable_dynamic_mode(struct radeonfb_info *rinfo)
  31 {
  32    u32 tmp;
  33 
  34    /* RV100 */
- 35    if ((rinfo->family == CHIP_FAMILY_RV100) && (!rinfo->is_mobility)) {
 - 35   (T) && (T)
 - 35   (T) && (F)
 - 35   (F) && (_)
- 36       if (rinfo->has_CRTC2) {
  37          tmp = INPLL(pllSCLK_CNTL);
  38          tmp &= ~SCLK_CNTL__DYN_STOP_LAT_MASK;
  39          tmp |= SCLK_CNTL__CP_MAX_DYN_STOP_LAT | SCLK_CNTL__FORCEON_MASK;
  40          OUTPLL(pllSCLK_CNTL, tmp);
  41       }
  42       tmp = INPLL(pllMCLK_CNTL);
  43       tmp |= (MCLK_CNTL__FORCE_MCLKA |
  44               MCLK_CNTL__FORCE_MCLKB |
  45               MCLK_CNTL__FORCE_YCLKA |
  46               MCLK_CNTL__FORCE_YCLKB |
  47          MCLK_CNTL__FORCE_AIC |
  48          MCLK_CNTL__FORCE_MC);
  49                 OUTPLL(pllMCLK_CNTL, tmp);
 - 50       return;
  51    }
  52    /* R100 */
- 53    if (!rinfo->has_CRTC2) {
  54                 tmp = INPLL(pllSCLK_CNTL);
  55                 tmp |= (SCLK_CNTL__FORCE_CP   | SCLK_CNTL__FORCE_HDP   |
  56          SCLK_CNTL__FORCE_DISP1   | SCLK_CNTL__FORCE_TOP   |
  57                         SCLK_CNTL__FORCE_E2   | SCLK_CNTL__FORCE_SE    |
  58          SCLK_CNTL__FORCE_IDCT   | SCLK_CNTL__FORCE_VIP   |
  59          SCLK_CNTL__FORCE_RE   | SCLK_CNTL__FORCE_PB    |
  60          SCLK_CNTL__FORCE_TAM   | SCLK_CNTL__FORCE_TDM   |
  61                         SCLK_CNTL__FORCE_RB);
  62                 OUTPLL(pllSCLK_CNTL, tmp);
 - 63       return;
  64    }
  65    /* RV350 (M10/M11) */
- 66    if (rinfo->family == CHIP_FAMILY_RV350) {
  67                 /* for RV350/M10/M11, no delays are required. */
  68                 tmp = INPLL(pllSCLK_CNTL2);
  69                 tmp |= (SCLK_CNTL2__R300_FORCE_TCL |
  70                         SCLK_CNTL2__R300_FORCE_GA  |
  71          SCLK_CNTL2__R300_FORCE_CBA);
  72                 OUTPLL(pllSCLK_CNTL2, tmp);
  73 
  74                 tmp = INPLL(pllSCLK_CNTL);
  75                 tmp |= (SCLK_CNTL__FORCE_DISP2      | SCLK_CNTL__FORCE_CP      |
  76                         SCLK_CNTL__FORCE_HDP      | SCLK_CNTL__FORCE_DISP1   |
  77                         SCLK_CNTL__FORCE_TOP      | SCLK_CNTL__FORCE_E2      |
  78                         SCLK_CNTL__R300_FORCE_VAP   | SCLK_CNTL__FORCE_IDCT       |
  79          SCLK_CNTL__FORCE_VIP      | SCLK_CNTL__R300_FORCE_SR   |
  80          SCLK_CNTL__R300_FORCE_PX   | SCLK_CNTL__R300_FORCE_TX   |
  81          SCLK_CNTL__R300_FORCE_US   | SCLK_CNTL__FORCE_TV_SCLK   |
  82                         SCLK_CNTL__R300_FORCE_SU   | SCLK_CNTL__FORCE_OV0);
  83                 OUTPLL(pllSCLK_CNTL, tmp);
  84 
  85                 tmp = INPLL(pllSCLK_MORE_CNTL);
  86       tmp |= (SCLK_MORE_CNTL__FORCE_DISPREGS   | SCLK_MORE_CNTL__FORCE_MC_GUI   |
  87          SCLK_MORE_CNTL__FORCE_MC_HOST);
  88                 OUTPLL(pllSCLK_MORE_CNTL, tmp);
  89 
  90       tmp = INPLL(pllMCLK_CNTL);
  91       tmp |= (MCLK_CNTL__FORCE_MCLKA |
  92               MCLK_CNTL__FORCE_MCLKB |
  93               MCLK_CNTL__FORCE_YCLKA |
  94               MCLK_CNTL__FORCE_YCLKB |
  95          MCLK_CNTL__FORCE_MC);
  96                 OUTPLL(pllMCLK_CNTL, tmp);
  97 
  98                 tmp = INPLL(pllVCLK_ECP_CNTL);
  99                 tmp &= ~(VCLK_ECP_CNTL__PIXCLK_ALWAYS_ONb  |
  100                          VCLK_ECP_CNTL__PIXCLK_DAC_ALWAYS_ONb |
  101           VCLK_ECP_CNTL__R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
  102                 OUTPLL(pllVCLK_ECP_CNTL, tmp);
  103 
  104                 tmp = INPLL(pllPIXCLKS_CNTL);
  105                 tmp &= ~(PIXCLKS_CNTL__PIX2CLK_ALWAYS_ONb      |
  106           PIXCLKS_CNTL__PIX2CLK_DAC_ALWAYS_ONb      |
  107           PIXCLKS_CNTL__DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb   |
  108           PIXCLKS_CNTL__R300_DVOCLK_ALWAYS_ONb      |
  109           PIXCLKS_CNTL__PIXCLK_BLEND_ALWAYS_ONb      |
  110           PIXCLKS_CNTL__PIXCLK_GV_ALWAYS_ONb      |
  111           PIXCLKS_CNTL__R300_PIXCLK_DVO_ALWAYS_ONb   |
  112           PIXCLKS_CNTL__PIXCLK_LVDS_ALWAYS_ONb      |
  113           PIXCLKS_CNTL__PIXCLK_TMDS_ALWAYS_ONb      |
  114           PIXCLKS_CNTL__R300_PIXCLK_TRANS_ALWAYS_ONb   |
  115           PIXCLKS_CNTL__R300_PIXCLK_TVO_ALWAYS_ONb   |
  116           PIXCLKS_CNTL__R300_P2G2CLK_ALWAYS_ONb      |
  117           PIXCLKS_CNTL__R300_P2G2CLK_ALWAYS_ONb      |
  118           PIXCLKS_CNTL__R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
  119                 OUTPLL(pllPIXCLKS_CNTL, tmp);
  120 
 - 121       return;
  122    }
  123    
  124    /* Default */
  125 
  126    /* Force Core Clocks */
  127    tmp = INPLL(pllSCLK_CNTL);
  128    tmp |= (SCLK_CNTL__FORCE_CP | SCLK_CNTL__FORCE_E2);
  129 
  130    /* XFree doesn't do that case, but we had this code from Apple and it
  131     * seem necessary for proper suspend/resume operations
  132     */
- 133    if (rinfo->is_mobility) {
  134       tmp |=    SCLK_CNTL__FORCE_HDP|
  135          SCLK_CNTL__FORCE_DISP1|
  136          SCLK_CNTL__FORCE_DISP2|
  137          SCLK_CNTL__FORCE_TOP|
  138          SCLK_CNTL__FORCE_SE|
  139          SCLK_CNTL__FORCE_IDCT|
  140          SCLK_CNTL__FORCE_VIP|
  141          SCLK_CNTL__FORCE_PB|
  142          SCLK_CNTL__FORCE_RE|
  143          SCLK_CNTL__FORCE_TAM|
  144          SCLK_CNTL__FORCE_TDM|
  145          SCLK_CNTL__FORCE_RB|
  146          SCLK_CNTL__FORCE_TV_SCLK|
  147          SCLK_CNTL__FORCE_SUBPIC|
  148          SCLK_CNTL__FORCE_OV0;
  149    }
  150    else if (rinfo->family == CHIP_FAMILY_R300 ||
- 151          rinfo->family == CHIP_FAMILY_R350) {
 - 151   T || _
 - 151   F || T
 - 151   F || F
  152       tmp |=  SCLK_CNTL__FORCE_HDP   |
  153          SCLK_CNTL__FORCE_DISP1 |
  154          SCLK_CNTL__FORCE_DISP2 |
  155          SCLK_CNTL__FORCE_TOP   |
  156          SCLK_CNTL__FORCE_IDCT  |
  157          SCLK_CNTL__FORCE_VIP;
  158    }
  159        OUTPLL(pllSCLK_CNTL, tmp);
  160    radeon_msleep(16);
  161 
- 162    if (rinfo->family == CHIP_FAMILY_R300 || rinfo->family == CHIP_FAMILY_R350) {
 - 162   T || _
 - 162   F || T
 - 162   F || F
  163       tmp = INPLL(pllSCLK_CNTL2);
  164       tmp |=  SCLK_CNTL2__R300_FORCE_TCL |
  165          SCLK_CNTL2__R300_FORCE_GA  |
  166          SCLK_CNTL2__R300_FORCE_CBA;
  167       OUTPLL(pllSCLK_CNTL2, tmp);
  168       radeon_msleep(16);
  169    }
  170 
  171    tmp = INPLL(pllCLK_PIN_CNTL);
  172    tmp &= ~CLK_PIN_CNTL__SCLK_DYN_START_CNTL;
  173    OUTPLL(pllCLK_PIN_CNTL, tmp);
  174    radeon_msleep(15);
  175 
- 176    if (rinfo->is_IGP) {
  177       /* Weird  ... X is _un_ forcing clocks here, I think it's
  178        * doing backward. Imitate it for now...
  179        */
  180       tmp = INPLL(pllMCLK_CNTL);
  181       tmp &= ~(MCLK_CNTL__FORCE_MCLKA |
  182           MCLK_CNTL__FORCE_YCLKA);
  183       OUTPLL(pllMCLK_CNTL, tmp);
  184       radeon_msleep(16);
  185    }
  186    /* Hrm... same shit, X doesn't do that but I have to */
- 187    else if (rinfo->is_mobility) {
  188       tmp = INPLL(pllMCLK_CNTL);
  189       tmp |= (MCLK_CNTL__FORCE_MCLKA |
  190          MCLK_CNTL__FORCE_MCLKB |
  191          MCLK_CNTL__FORCE_YCLKA |
  192          MCLK_CNTL__FORCE_YCLKB);
  193       OUTPLL(pllMCLK_CNTL, tmp);
  194       radeon_msleep(16);
  195 
  196       tmp = INPLL(pllMCLK_MISC);
  197       tmp &=    ~(MCLK_MISC__MC_MCLK_MAX_DYN_STOP_LAT|
  198            MCLK_MISC__IO_MCLK_MAX_DYN_STOP_LAT|
  199            MCLK_MISC__MC_MCLK_DYN_ENABLE|
  200            MCLK_MISC__IO_MCLK_DYN_ENABLE);
  201       OUTPLL(pllMCLK_MISC, tmp);
  202       radeon_msleep(15);
  203    }
  204 
- 205    if (rinfo->is_mobility) {
  206       tmp = INPLL(pllSCLK_MORE_CNTL);
  207       tmp |=    SCLK_MORE_CNTL__FORCE_DISPREGS|
  208          SCLK_MORE_CNTL__FORCE_MC_GUI|
  209          SCLK_MORE_CNTL__FORCE_MC_HOST;
  210       OUTPLL(pllSCLK_MORE_CNTL, tmp);
  211       radeon_msleep(16);
  212    }
  213 
  214    tmp = INPLL(pllPIXCLKS_CNTL);
  215    tmp &= ~(PIXCLKS_CNTL__PIXCLK_GV_ALWAYS_ONb |
  216        PIXCLKS_CNTL__PIXCLK_BLEND_ALWAYS_ONb|
  217        PIXCLKS_CNTL__PIXCLK_DIG_TMDS_ALWAYS_ONb |
  218        PIXCLKS_CNTL__PIXCLK_LVDS_ALWAYS_ONb|
  219        PIXCLKS_CNTL__PIXCLK_TMDS_ALWAYS_ONb|
  220        PIXCLKS_CNTL__PIX2CLK_ALWAYS_ONb|
  221        PIXCLKS_CNTL__PIX2CLK_DAC_ALWAYS_ONb);
  222     OUTPLL(pllPIXCLKS_CNTL, tmp);
  223    radeon_msleep(16);
  224 
  225    tmp = INPLL( pllVCLK_ECP_CNTL);
  226    tmp &= ~(VCLK_ECP_CNTL__PIXCLK_ALWAYS_ONb |
  227        VCLK_ECP_CNTL__PIXCLK_DAC_ALWAYS_ONb);
  228    OUTPLL( pllVCLK_ECP_CNTL, tmp);
  229    radeon_msleep(16);
  230 }
  231 
 
  232 static void radeon_pm_enable_dynamic_mode(struct radeonfb_info *rinfo)
  233 {
  234    u32 tmp;
  235 
  236    /* R100 */
- 237    if (!rinfo->has_CRTC2) {
  238                 tmp = INPLL(pllSCLK_CNTL);
  239 
- 240       if ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) > CFG_ATI_REV_A13)
  241                     tmp &= ~(SCLK_CNTL__FORCE_CP   | SCLK_CNTL__FORCE_RB);
  242                 tmp &= ~(SCLK_CNTL__FORCE_HDP      | SCLK_CNTL__FORCE_DISP1 |
  243           SCLK_CNTL__FORCE_TOP      | SCLK_CNTL__FORCE_SE   |
  244           SCLK_CNTL__FORCE_IDCT      | SCLK_CNTL__FORCE_RE   |
  245           SCLK_CNTL__FORCE_PB      | SCLK_CNTL__FORCE_TAM  |
  246           SCLK_CNTL__FORCE_TDM);
  247                 OUTPLL(pllSCLK_CNTL, tmp);
 - 248       return;
  249    }
  250 
  251    /* M10/M11 */
- 252    if (rinfo->family == CHIP_FAMILY_RV350) {
  253       tmp = INPLL(pllSCLK_CNTL2);
  254       tmp &= ~(SCLK_CNTL2__R300_FORCE_TCL |
  255           SCLK_CNTL2__R300_FORCE_GA  |
  256           SCLK_CNTL2__R300_FORCE_CBA);
  257       tmp |=  (SCLK_CNTL2__R300_TCL_MAX_DYN_STOP_LAT |
  258           SCLK_CNTL2__R300_GA_MAX_DYN_STOP_LAT  |
  259           SCLK_CNTL2__R300_CBA_MAX_DYN_STOP_LAT);
  260       OUTPLL(pllSCLK_CNTL2, tmp);
  261 
  262       tmp = INPLL(pllSCLK_CNTL);
  263       tmp &= ~(SCLK_CNTL__FORCE_DISP2 | SCLK_CNTL__FORCE_CP      |
  264           SCLK_CNTL__FORCE_HDP   | SCLK_CNTL__FORCE_DISP1   |
  265           SCLK_CNTL__FORCE_TOP   | SCLK_CNTL__FORCE_E2      |
  266           SCLK_CNTL__R300_FORCE_VAP | SCLK_CNTL__FORCE_IDCT |
  267           SCLK_CNTL__FORCE_VIP   | SCLK_CNTL__R300_FORCE_SR |
  268           SCLK_CNTL__R300_FORCE_PX | SCLK_CNTL__R300_FORCE_TX |
  269           SCLK_CNTL__R300_FORCE_US | SCLK_CNTL__FORCE_TV_SCLK |
  270           SCLK_CNTL__R300_FORCE_SU | SCLK_CNTL__FORCE_OV0);
  271       tmp |= SCLK_CNTL__DYN_STOP_LAT_MASK;
  272       OUTPLL(pllSCLK_CNTL, tmp);
  273 
  274       tmp = INPLL(pllSCLK_MORE_CNTL);
  275       tmp &= ~SCLK_MORE_CNTL__FORCEON;
  276       tmp |=  SCLK_MORE_CNTL__DISPREGS_MAX_DYN_STOP_LAT |
  277          SCLK_MORE_CNTL__MC_GUI_MAX_DYN_STOP_LAT |
  278          SCLK_MORE_CNTL__MC_HOST_MAX_DYN_STOP_LAT;
  279       OUTPLL(pllSCLK_MORE_CNTL, tmp);
  280 
  281       tmp = INPLL(pllVCLK_ECP_CNTL);
  282       tmp |= (VCLK_ECP_CNTL__PIXCLK_ALWAYS_ONb |
  283          VCLK_ECP_CNTL__PIXCLK_DAC_ALWAYS_ONb);
  284       OUTPLL(pllVCLK_ECP_CNTL, tmp);
  285 
  286       tmp = INPLL(pllPIXCLKS_CNTL);
  287       tmp |= (PIXCLKS_CNTL__PIX2CLK_ALWAYS_ONb         |
  288          PIXCLKS_CNTL__PIX2CLK_DAC_ALWAYS_ONb     |
  289          PIXCLKS_CNTL__DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
  290          PIXCLKS_CNTL__R300_DVOCLK_ALWAYS_ONb            |
  291          PIXCLKS_CNTL__PIXCLK_BLEND_ALWAYS_ONb    |
  292          PIXCLKS_CNTL__PIXCLK_GV_ALWAYS_ONb       |
  293          PIXCLKS_CNTL__R300_PIXCLK_DVO_ALWAYS_ONb        |
  294          PIXCLKS_CNTL__PIXCLK_LVDS_ALWAYS_ONb     |
  295          PIXCLKS_CNTL__PIXCLK_TMDS_ALWAYS_ONb     |
  296          PIXCLKS_CNTL__R300_PIXCLK_TRANS_ALWAYS_ONb      |
  297          PIXCLKS_CNTL__R300_PIXCLK_TVO_ALWAYS_ONb        |
  298          PIXCLKS_CNTL__R300_P2G2CLK_ALWAYS_ONb           |
  299          PIXCLKS_CNTL__R300_P2G2CLK_ALWAYS_ONb);
  300       OUTPLL(pllPIXCLKS_CNTL, tmp);
  301 
  302       tmp = INPLL(pllMCLK_MISC);
  303       tmp |= (MCLK_MISC__MC_MCLK_DYN_ENABLE |
  304          MCLK_MISC__IO_MCLK_DYN_ENABLE);
  305       OUTPLL(pllMCLK_MISC, tmp);
  306 
  307       tmp = INPLL(pllMCLK_CNTL);
  308       tmp |= (MCLK_CNTL__FORCE_MCLKA | MCLK_CNTL__FORCE_MCLKB);
  309       tmp &= ~(MCLK_CNTL__FORCE_YCLKA  |
  310           MCLK_CNTL__FORCE_YCLKB  |
  311           MCLK_CNTL__FORCE_MC);
  312 
  313       /* Some releases of vbios have set DISABLE_MC_MCLKA
  314        * and DISABLE_MC_MCLKB bits in the vbios table.  Setting these
  315        * bits will cause H/W hang when reading video memory with dynamic
  316        * clocking enabled.
  317        */
  318       if ((tmp & MCLK_CNTL__R300_DISABLE_MC_MCLKA) &&
- 319           (tmp & MCLK_CNTL__R300_DISABLE_MC_MCLKB)) {
 - 319     (T) && (T)
 - 319     (T) && (F)
   319     (F) && (_)
  320          /* If both bits are set, then check the active channels */
  321          tmp = INPLL(pllMCLK_CNTL);
- 322          if (rinfo->vram_width == 64) {
- 323              if (INREG(MEM_CNTL) & R300_MEM_USE_CD_CH_ONLY)
  324             tmp &= ~MCLK_CNTL__R300_DISABLE_MC_MCLKB;
    325              else
  326             tmp &= ~MCLK_CNTL__R300_DISABLE_MC_MCLKA;
    327          } else {
  328              tmp &= ~(MCLK_CNTL__R300_DISABLE_MC_MCLKA |
  329                  MCLK_CNTL__R300_DISABLE_MC_MCLKB);
  330          }
  331       }
  332       OUTPLL(pllMCLK_CNTL, tmp);
   333       return;
  334    }
  335 
  336    /* R300 */
- 337    if (rinfo->family == CHIP_FAMILY_R300 || rinfo->family == CHIP_FAMILY_R350) {
 - 337   T || _
 - 337   F || T
 - 337   F || F
  338       tmp = INPLL(pllSCLK_CNTL);
  339       tmp &= ~(SCLK_CNTL__R300_FORCE_VAP);
  340       tmp |= SCLK_CNTL__FORCE_CP;
  341       OUTPLL(pllSCLK_CNTL, tmp);
  342       radeon_msleep(15);
  343 
  344       tmp = INPLL(pllSCLK_CNTL2);
  345       tmp &= ~(SCLK_CNTL2__R300_FORCE_TCL |
  346           SCLK_CNTL2__R300_FORCE_GA  |
  347           SCLK_CNTL2__R300_FORCE_CBA);
  348       OUTPLL(pllSCLK_CNTL2, tmp);
  349    }
  350 
  351    /* Others */
  352 
  353    tmp = INPLL( pllCLK_PWRMGT_CNTL);
  354    tmp &= ~(CLK_PWRMGT_CNTL__ACTIVE_HILO_LAT_MASK|
  355        CLK_PWRMGT_CNTL__DISP_DYN_STOP_LAT_MASK|
  356        CLK_PWRMGT_CNTL__DYN_STOP_MODE_MASK);
  357    tmp |= CLK_PWRMGT_CNTL__ENGINE_DYNCLK_MODE_MASK |
  358           (0x01 << CLK_PWRMGT_CNTL__ACTIVE_HILO_LAT__SHIFT);
  359    OUTPLL( pllCLK_PWRMGT_CNTL, tmp);
  360    radeon_msleep(15);
  361 
  362    tmp = INPLL(pllCLK_PIN_CNTL);
  363    tmp |= CLK_PIN_CNTL__SCLK_DYN_START_CNTL;
  364    OUTPLL(pllCLK_PIN_CNTL, tmp);
  365    radeon_msleep(15);
  366 
  367    /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200
  368     * to lockup randomly, leave them as set by BIOS.
  369     */
  370    tmp = INPLL(pllSCLK_CNTL);
  371    tmp &= ~SCLK_CNTL__FORCEON_MASK;
  372 
  373    /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300*/
  374    if ((rinfo->family == CHIP_FAMILY_RV250 &&
  375         ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) ||
  376        ((rinfo->family == CHIP_FAMILY_RV100) &&
- 377         ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) <= CFG_ATI_REV_A13))) {
 - 377   (T && (T)) || ((_) && (_))
 - 377   (T && (F)) || ((T) && (T))
 - 377   (F && (_)) || ((T) && (T))
 - 377   (T && (F)) || ((T) && (F))
 - 377   (T && (F)) || ((F) && (_))
 - 377   (F && (_)) || ((T) && (F))
 - 377   (F && (_)) || ((F) && (_))
  378       tmp |= SCLK_CNTL__FORCE_CP;
  379       tmp |= SCLK_CNTL__FORCE_VIP;
  380    }
  381    OUTPLL(pllSCLK_CNTL, tmp);
  382    radeon_msleep(15);
  383 
  384    if ((rinfo->family == CHIP_FAMILY_RV200) ||
  385        (rinfo->family == CHIP_FAMILY_RV250) ||
- 386        (rinfo->family == CHIP_FAMILY_RV280)) {
 - 386   (T) || (_) || (_)
 - 386   (F) || (T) || (_)
 - 386   (F) || (F) || (T)
 - 386   (F) || (F) || (F)
  387       tmp = INPLL(pllSCLK_MORE_CNTL);
  388       tmp &= ~SCLK_MORE_CNTL__FORCEON;
  389 
  390       /* RV200::A11 A12 RV250::A11 A12 */
  391       if (((rinfo->family == CHIP_FAMILY_RV200) ||
  392            (rinfo->family == CHIP_FAMILY_RV250)) &&
- 393           ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13))
 - 393     ((T) || (_)) && (T)
 - 393     ((F) || (T)) && (T)
 - 393     ((T) || (_)) && (F)
 - 393     ((F) || (T)) && (F)
 - 393     ((F) || (F)) && (_)
  394          tmp |= SCLK_MORE_CNTL__FORCEON;
  395 
  396       OUTPLL(pllSCLK_MORE_CNTL, tmp);
  397       radeon_msleep(15);
  398    }
  399    
  400 
  401    /* RV200::A11 A12, RV250::A11 A12 */
  402    if (((rinfo->family == CHIP_FAMILY_RV200) ||
  403         (rinfo->family == CHIP_FAMILY_RV250)) &&
- 404        ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) {
 - 404   ((T) || (_)) && (T)
 - 404   ((F) || (T)) && (T)
 - 404   ((T) || (_)) && (F)
 - 404   ((F) || (T)) && (F)
 - 404   ((F) || (F)) && (_)
  405       tmp = INPLL(pllPLL_PWRMGT_CNTL);
  406       tmp |= PLL_PWRMGT_CNTL__TCL_BYPASS_DISABLE;
  407       OUTPLL(pllPLL_PWRMGT_CNTL, tmp);
  408       radeon_msleep(15);
  409    }
  410 
  411    tmp = INPLL(pllPIXCLKS_CNTL);
  412    tmp |=  PIXCLKS_CNTL__PIX2CLK_ALWAYS_ONb |
  413       PIXCLKS_CNTL__PIX2CLK_DAC_ALWAYS_ONb|
  414       PIXCLKS_CNTL__PIXCLK_BLEND_ALWAYS_ONb|
  415       PIXCLKS_CNTL__PIXCLK_GV_ALWAYS_ONb|
  416       PIXCLKS_CNTL__PIXCLK_DIG_TMDS_ALWAYS_ONb|
  417       PIXCLKS_CNTL__PIXCLK_LVDS_ALWAYS_ONb|
  418       PIXCLKS_CNTL__PIXCLK_TMDS_ALWAYS_ONb;
  419    OUTPLL(pllPIXCLKS_CNTL, tmp);
  420    radeon_msleep(15);
  421       
  422    tmp = INPLL(pllVCLK_ECP_CNTL);
  423    tmp |=  VCLK_ECP_CNTL__PIXCLK_ALWAYS_ONb |
  424       VCLK_ECP_CNTL__PIXCLK_DAC_ALWAYS_ONb;
  425    OUTPLL(pllVCLK_ECP_CNTL, tmp);
  426 
  427    /* X doesn't do that ... hrm, we do on mobility && Macs */
  428 #ifdef CONFIG_PPC_OF
  429    if (rinfo->is_mobility) {
  430       tmp  = INPLL(pllMCLK_CNTL);
  431       tmp &= ~(MCLK_CNTL__FORCE_MCLKA |
  432           MCLK_CNTL__FORCE_MCLKB |
  433           MCLK_CNTL__FORCE_YCLKA |
  434           MCLK_CNTL__FORCE_YCLKB);
  435       OUTPLL(pllMCLK_CNTL, tmp);
  436       radeon_msleep(15);
  437 
  438       tmp = INPLL(pllMCLK_MISC);
  439       tmp |=    MCLK_MISC__MC_MCLK_MAX_DYN_STOP_LAT|
  440          MCLK_MISC__IO_MCLK_MAX_DYN_STOP_LAT|
  441          MCLK_MISC__MC_MCLK_DYN_ENABLE|
  442          MCLK_MISC__IO_MCLK_DYN_ENABLE;
  443       OUTPLL(pllMCLK_MISC, tmp);
  444       radeon_msleep(15);
  445    }
  446 #endif /* CONFIG_PPC_OF */
  447 }
  448 
  449 #ifdef CONFIG_PM
  450 
 
- 451 static void OUTMC( struct radeonfb_info *rinfo, u8 indx, u32 value)
  452 {
  453    OUTREG( MC_IND_INDEX, indx | MC_IND_INDEX__MC_IND_WR_EN);   
  454    OUTREG( MC_IND_DATA, value);      
  455 }
  456 
 
- 457 static u32 INMC(struct radeonfb_info *rinfo, u8 indx)
  458 {
  459    OUTREG( MC_IND_INDEX, indx);               
 - 460    return INREG( MC_IND_DATA);
  461 }
  462 
 
- 463 static void radeon_pm_save_regs(struct radeonfb_info *rinfo, int saving_for_d3)
  464 {
  465    rinfo->save_regs[0] = INPLL(PLL_PWRMGT_CNTL);
  466    rinfo->save_regs[1] = INPLL(CLK_PWRMGT_CNTL);
  467    rinfo->save_regs[2] = INPLL(MCLK_CNTL);
  468    rinfo->save_regs[3] = INPLL(SCLK_CNTL);
  469    rinfo->save_regs[4] = INPLL(CLK_PIN_CNTL);
  470    rinfo->save_regs[5] = INPLL(VCLK_ECP_CNTL);
  471    rinfo->save_regs[6] = INPLL(PIXCLKS_CNTL);
  472    rinfo->save_regs[7] = INPLL(MCLK_MISC);
  473    rinfo->save_regs[8] = INPLL(P2PLL_CNTL);
  474    
  475    rinfo->save_regs[9] = INREG(DISP_MISC_CNTL);
  476    rinfo->save_regs[10] = INREG(DISP_PWR_MAN);
  477    rinfo->save_regs[11] = INREG(LVDS_GEN_CNTL);
  478    rinfo->save_regs[13] = INREG(TV_DAC_CNTL);
  479    rinfo->save_regs[14] = INREG(BUS_CNTL1);
  480    rinfo->save_regs[15] = INREG(CRTC_OFFSET_CNTL);
  481    rinfo->save_regs[16] = INREG(AGP_CNTL);
  482    rinfo->save_regs[17] = (INREG(CRTC_GEN_CNTL) & 0xfdffffff) | 0x04000000;
  483    rinfo->save_regs[18] = (INREG(CRTC2_GEN_CNTL) & 0xfdffffff) | 0x04000000;
  484    rinfo->save_regs[19] = INREG(GPIOPAD_A);
  485    rinfo->save_regs[20] = INREG(GPIOPAD_EN);
  486    rinfo->save_regs[21] = INREG(GPIOPAD_MASK);
  487    rinfo->save_regs[22] = INREG(ZV_LCDPAD_A);
  488    rinfo->save_regs[23] = INREG(ZV_LCDPAD_EN);
  489    rinfo->save_regs[24] = INREG(ZV_LCDPAD_MASK);
  490    rinfo->save_regs[25] = INREG(GPIO_VGA_DDC);
  491