linux/drivers/gpu/drm/radeon/radeon_clocks.c
<<
>>
Prefs
   1/*
   2 * Copyright 2008 Advanced Micro Devices, Inc.
   3 * Copyright 2008 Red Hat Inc.
   4 * Copyright 2009 Jerome Glisse.
   5 *
   6 * Permission is hereby granted, free of charge, to any person obtaining a
   7 * copy of this software and associated documentation files (the "Software"),
   8 * to deal in the Software without restriction, including without limitation
   9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10 * and/or sell copies of the Software, and to permit persons to whom the
  11 * Software is furnished to do so, subject to the following conditions:
  12 *
  13 * The above copyright notice and this permission notice shall be included in
  14 * all copies or substantial portions of the Software.
  15 *
  16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  22 * OTHER DEALINGS IN THE SOFTWARE.
  23 *
  24 * Authors: Dave Airlie
  25 *          Alex Deucher
  26 *          Jerome Glisse
  27 */
  28#include <drm/drmP.h>
  29#include <drm/radeon_drm.h>
  30#include "radeon_reg.h"
  31#include "radeon.h"
  32#include "radeon_asic.h"
  33#include "atom.h"
  34
  35/* 10 khz */
  36uint32_t radeon_legacy_get_engine_clock(struct radeon_device *rdev)
  37{
  38        struct radeon_pll *spll = &rdev->clock.spll;
  39        uint32_t fb_div, ref_div, post_div, sclk;
  40
  41        fb_div = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
  42        fb_div = (fb_div >> RADEON_SPLL_FB_DIV_SHIFT) & RADEON_SPLL_FB_DIV_MASK;
  43        fb_div <<= 1;
  44        fb_div *= spll->reference_freq;
  45
  46        ref_div =
  47            RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) & RADEON_M_SPLL_REF_DIV_MASK;
  48
  49        if (ref_div == 0)
  50                return 0;
  51
  52        sclk = fb_div / ref_div;
  53
  54        post_div = RREG32_PLL(RADEON_SCLK_CNTL) & RADEON_SCLK_SRC_SEL_MASK;
  55        if (post_div == 2)
  56                sclk >>= 1;
  57        else if (post_div == 3)
  58                sclk >>= 2;
  59        else if (post_div == 4)
  60                sclk >>= 3;
  61
  62        return sclk;
  63}
  64
  65/* 10 khz */
  66uint32_t radeon_legacy_get_memory_clock(struct radeon_device *rdev)
  67{
  68        struct radeon_pll *mpll = &rdev->clock.mpll;
  69        uint32_t fb_div, ref_div, post_div, mclk;
  70
  71        fb_div = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
  72        fb_div = (fb_div >> RADEON_MPLL_FB_DIV_SHIFT) & RADEON_MPLL_FB_DIV_MASK;
  73        fb_div <<= 1;
  74        fb_div *= mpll->reference_freq;
  75
  76        ref_div =
  77            RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) & RADEON_M_SPLL_REF_DIV_MASK;
  78
  79        if (ref_div == 0)
  80                return 0;
  81
  82        mclk = fb_div / ref_div;
  83
  84        post_div = RREG32_PLL(RADEON_MCLK_CNTL) & 0x7;
  85        if (post_div == 2)
  86                mclk >>= 1;
  87        else if (post_div == 3)
  88                mclk >>= 2;
  89        else if (post_div == 4)
  90                mclk >>= 3;
  91
  92        return mclk;
  93}
  94
  95#ifdef CONFIG_OF
  96/*
  97 * Read XTAL (ref clock), SCLK and MCLK from Open Firmware device
  98 * tree. Hopefully, ATI OF driver is kind enough to fill these
  99 */
 100static bool radeon_read_clocks_OF(struct drm_device *dev)
 101{
 102        struct radeon_device *rdev = dev->dev_private;
 103        struct device_node *dp = rdev->pdev->dev.of_node;
 104        const u32 *val;
 105        struct radeon_pll *p1pll = &rdev->clock.p1pll;
 106        struct radeon_pll *p2pll = &rdev->clock.p2pll;
 107        struct radeon_pll *spll = &rdev->clock.spll;
 108        struct radeon_pll *mpll = &rdev->clock.mpll;
 109
 110        if (dp == NULL)
 111                return false;
 112        val = of_get_property(dp, "ATY,RefCLK", NULL);
 113        if (!val || !*val) {
 114                pr_warn("radeonfb: No ATY,RefCLK property !\n");
 115                return false;
 116        }
 117        p1pll->reference_freq = p2pll->reference_freq = (*val) / 10;
 118        p1pll->reference_div = RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff;
 119        if (p1pll->reference_div < 2)
 120                p1pll->reference_div = 12;
 121        p2pll->reference_div = p1pll->reference_div;
 122
 123        /* These aren't in the device-tree */
 124        if (rdev->family >= CHIP_R420) {
 125                p1pll->pll_in_min = 100;
 126                p1pll->pll_in_max = 1350;
 127                p1pll->pll_out_min = 20000;
 128                p1pll->pll_out_max = 50000;
 129                p2pll->pll_in_min = 100;
 130                p2pll->pll_in_max = 1350;
 131                p2pll->pll_out_min = 20000;
 132                p2pll->pll_out_max = 50000;
 133        } else {
 134                p1pll->pll_in_min = 40;
 135                p1pll->pll_in_max = 500;
 136                p1pll->pll_out_min = 12500;
 137                p1pll->pll_out_max = 35000;
 138                p2pll->pll_in_min = 40;
 139                p2pll->pll_in_max = 500;
 140                p2pll->pll_out_min = 12500;
 141                p2pll->pll_out_max = 35000;
 142        }
 143        /* not sure what the max should be in all cases */
 144        rdev->clock.max_pixel_clock = 35000;
 145
 146        spll->reference_freq = mpll->reference_freq = p1pll->reference_freq;
 147        spll->reference_div = mpll->reference_div =
 148                RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
 149                            RADEON_M_SPLL_REF_DIV_MASK;
 150
 151        val = of_get_property(dp, "ATY,SCLK", NULL);
 152        if (val && *val)
 153                rdev->clock.default_sclk = (*val) / 10;
 154        else
 155                rdev->clock.default_sclk =
 156                        radeon_legacy_get_engine_clock(rdev);
 157
 158        val = of_get_property(dp, "ATY,MCLK", NULL);
 159        if (val && *val)
 160                rdev->clock.default_mclk = (*val) / 10;
 161        else
 162                rdev->clock.default_mclk =
 163                        radeon_legacy_get_memory_clock(rdev);
 164
 165        DRM_INFO("Using device-tree clock info\n");
 166
 167        return true;
 168}
 169#else
 170static bool radeon_read_clocks_OF(struct drm_device *dev)
 171{
 172        return false;
 173}
 174#endif /* CONFIG_OF */
 175
 176void radeon_get_clock_info(struct drm_device *dev)
 177{
 178        struct radeon_device *rdev = dev->dev_private;
 179        struct radeon_pll *p1pll = &rdev->clock.p1pll;
 180        struct radeon_pll *p2pll = &rdev->clock.p2pll;
 181        struct radeon_pll *dcpll = &rdev->clock.dcpll;
 182        struct radeon_pll *spll = &rdev->clock.spll;
 183        struct radeon_pll *mpll = &rdev->clock.mpll;
 184        int ret;
 185
 186        if (rdev->is_atom_bios)
 187                ret = radeon_atom_get_clock_info(dev);
 188        else
 189                ret = radeon_combios_get_clock_info(dev);
 190        if (!ret)
 191                ret = radeon_read_clocks_OF(dev);
 192
 193        if (ret) {
 194                if (p1pll->reference_div < 2) {
 195                        if (!ASIC_IS_AVIVO(rdev)) {
 196                                u32 tmp = RREG32_PLL(RADEON_PPLL_REF_DIV);
 197                                if (ASIC_IS_R300(rdev))
 198                                        p1pll->reference_div =
 199                                                (tmp & R300_PPLL_REF_DIV_ACC_MASK) >> R300_PPLL_REF_DIV_ACC_SHIFT;
 200                                else
 201                                        p1pll->reference_div = tmp & RADEON_PPLL_REF_DIV_MASK;
 202                                if (p1pll->reference_div < 2)
 203                                        p1pll->reference_div = 12;
 204                        } else
 205                                p1pll->reference_div = 12;
 206                }
 207                if (p2pll->reference_div < 2)
 208                        p2pll->reference_div = 12;
 209                if (rdev->family < CHIP_RS600) {
 210                        if (spll->reference_div < 2)
 211                                spll->reference_div =
 212                                        RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
 213                                        RADEON_M_SPLL_REF_DIV_MASK;
 214                }
 215                if (mpll->reference_div < 2)
 216                        mpll->reference_div = spll->reference_div;
 217        } else {
 218                if (ASIC_IS_AVIVO(rdev)) {
 219                        /* TODO FALLBACK */
 220                } else {
 221                        DRM_INFO("Using generic clock info\n");
 222
 223                        /* may need to be per card */
 224                        rdev->clock.max_pixel_clock = 35000;
 225
 226                        if (rdev->flags & RADEON_IS_IGP) {
 227                                p1pll->reference_freq = 1432;
 228                                p2pll->reference_freq = 1432;
 229                                spll->reference_freq = 1432;
 230                                mpll->reference_freq = 1432;
 231                        } else {
 232                                p1pll->reference_freq = 2700;
 233                                p2pll->reference_freq = 2700;
 234                                spll->reference_freq = 2700;
 235                                mpll->reference_freq = 2700;
 236                        }
 237                        p1pll->reference_div =
 238                            RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff;
 239                        if (p1pll->reference_div < 2)
 240                                p1pll->reference_div = 12;
 241                        p2pll->reference_div = p1pll->reference_div;
 242
 243                        if (rdev->family >= CHIP_R420) {
 244                                p1pll->pll_in_min = 100;
 245                                p1pll->pll_in_max = 1350;
 246                                p1pll->pll_out_min = 20000;
 247                                p1pll->pll_out_max = 50000;
 248                                p2pll->pll_in_min = 100;
 249                                p2pll->pll_in_max = 1350;
 250                                p2pll->pll_out_min = 20000;
 251                                p2pll->pll_out_max = 50000;
 252                        } else {
 253                                p1pll->pll_in_min = 40;
 254                                p1pll->pll_in_max = 500;
 255                                p1pll->pll_out_min = 12500;
 256                                p1pll->pll_out_max = 35000;
 257                                p2pll->pll_in_min = 40;
 258                                p2pll->pll_in_max = 500;
 259                                p2pll->pll_out_min = 12500;
 260                                p2pll->pll_out_max = 35000;
 261                        }
 262
 263                        spll->reference_div =
 264                            RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
 265                            RADEON_M_SPLL_REF_DIV_MASK;
 266                        mpll->reference_div = spll->reference_div;
 267                        rdev->clock.default_sclk =
 268                            radeon_legacy_get_engine_clock(rdev);
 269                        rdev->clock.default_mclk =
 270                            radeon_legacy_get_memory_clock(rdev);
 271                }
 272        }
 273
 274        /* pixel clocks */
 275        if (ASIC_IS_AVIVO(rdev)) {
 276                p1pll->min_post_div = 2;
 277                p1pll->max_post_div = 0x7f;
 278                p1pll->min_frac_feedback_div = 0;
 279                p1pll->max_frac_feedback_div = 9;
 280                p2pll->min_post_div = 2;
 281                p2pll->max_post_div = 0x7f;
 282                p2pll->min_frac_feedback_div = 0;
 283                p2pll->max_frac_feedback_div = 9;
 284        } else {
 285                p1pll->min_post_div = 1;
 286                p1pll->max_post_div = 16;
 287                p1pll->min_frac_feedback_div = 0;
 288                p1pll->max_frac_feedback_div = 0;
 289                p2pll->min_post_div = 1;
 290                p2pll->max_post_div = 12;
 291                p2pll->min_frac_feedback_div = 0;
 292                p2pll->max_frac_feedback_div = 0;
 293        }
 294
 295        /* dcpll is DCE4 only */
 296        dcpll->min_post_div = 2;
 297        dcpll->max_post_div = 0x7f;
 298        dcpll->min_frac_feedback_div = 0;
 299        dcpll->max_frac_feedback_div = 9;
 300        dcpll->min_ref_div = 2;
 301        dcpll->max_ref_div = 0x3ff;
 302        dcpll->min_feedback_div = 4;
 303        dcpll->max_feedback_div = 0xfff;
 304        dcpll->best_vco = 0;
 305
 306        p1pll->min_ref_div = 2;
 307        p1pll->max_ref_div = 0x3ff;
 308        p1pll->min_feedback_div = 4;
 309        p1pll->max_feedback_div = 0x7ff;
 310        p1pll->best_vco = 0;
 311
 312        p2pll->min_ref_div = 2;
 313        p2pll->max_ref_div = 0x3ff;
 314        p2pll->min_feedback_div = 4;
 315        p2pll->max_feedback_div = 0x7ff;
 316        p2pll->best_vco = 0;
 317
 318        /* system clock */
 319        spll->min_post_div = 1;
 320        spll->max_post_div = 1;
 321        spll->min_ref_div = 2;
 322        spll->max_ref_div = 0xff;
 323        spll->min_feedback_div = 4;
 324        spll->max_feedback_div = 0xff;
 325        spll->best_vco = 0;
 326
 327        /* memory clock */
 328        mpll->min_post_div = 1;
 329        mpll->max_post_div = 1;
 330        mpll->min_ref_div = 2;
 331        mpll->max_ref_div = 0xff;
 332        mpll->min_feedback_div = 4;
 333        mpll->max_feedback_div = 0xff;
 334        mpll->best_vco = 0;
 335
 336        if (!rdev->clock.default_sclk)
 337                rdev->clock.default_sclk = radeon_get_engine_clock(rdev);
 338        if ((!rdev->clock.default_mclk) && rdev->asic->pm.get_memory_clock)
 339                rdev->clock.default_mclk = radeon_get_memory_clock(rdev);
 340
 341        rdev->pm.current_sclk = rdev->clock.default_sclk;
 342        rdev->pm.current_mclk = rdev->clock.default_mclk;
 343
 344}
 345
 346/* 10 khz */
 347static uint32_t calc_eng_mem_clock(struct radeon_device *rdev,
 348                                   uint32_t req_clock,
 349                                   int *fb_div, int *post_div)
 350{
 351        struct radeon_pll *spll = &rdev->clock.spll;
 352        int ref_div = spll->reference_div;
 353
 354        if (!ref_div)
 355                ref_div =
 356                    RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
 357                    RADEON_M_SPLL_REF_DIV_MASK;
 358
 359        if (req_clock < 15000) {
 360                *post_div = 8;
 361                req_clock *= 8;
 362        } else if (req_clock < 30000) {
 363                *post_div = 4;
 364                req_clock *= 4;
 365        } else if (req_clock < 60000) {
 366                *post_div = 2;
 367                req_clock *= 2;
 368        } else
 369                *post_div = 1;
 370
 371        req_clock *= ref_div;
 372        req_clock += spll->reference_freq;
 373        req_clock /= (2 * spll->reference_freq);
 374
 375        *fb_div = req_clock & 0xff;
 376
 377        req_clock = (req_clock & 0xffff) << 1;
 378        req_clock *= spll->reference_freq;
 379        req_clock /= ref_div;
 380        req_clock /= *post_div;
 381
 382        return req_clock;
 383}
 384
 385/* 10 khz */
 386void radeon_legacy_set_engine_clock(struct radeon_device *rdev,
 387                                    uint32_t eng_clock)
 388{
 389        uint32_t tmp;
 390        int fb_div, post_div;
 391
 392        /* XXX: wait for idle */
 393
 394        eng_clock = calc_eng_mem_clock(rdev, eng_clock, &fb_div, &post_div);
 395
 396        tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
 397        tmp &= ~RADEON_DONT_USE_XTALIN;
 398        WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
 399
 400        tmp = RREG32_PLL(RADEON_SCLK_CNTL);
 401        tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
 402        WREG32_PLL(RADEON_SCLK_CNTL, tmp);
 403
 404        udelay(10);
 405
 406        tmp = RREG32_PLL(RADEON_SPLL_CNTL);
 407        tmp |= RADEON_SPLL_SLEEP;
 408        WREG32_PLL(RADEON_SPLL_CNTL, tmp);
 409
 410        udelay(2);
 411
 412        tmp = RREG32_PLL(RADEON_SPLL_CNTL);
 413        tmp |= RADEON_SPLL_RESET;
 414        WREG32_PLL(RADEON_SPLL_CNTL, tmp);
 415
 416        udelay(200);
 417
 418        tmp = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
 419        tmp &= ~(RADEON_SPLL_FB_DIV_MASK << RADEON_SPLL_FB_DIV_SHIFT);
 420        tmp |= (fb_div & RADEON_SPLL_FB_DIV_MASK) << RADEON_SPLL_FB_DIV_SHIFT;
 421        WREG32_PLL(RADEON_M_SPLL_REF_FB_DIV, tmp);
 422
 423        /* XXX: verify on different asics */
 424        tmp = RREG32_PLL(RADEON_SPLL_CNTL);
 425        tmp &= ~RADEON_SPLL_PVG_MASK;
 426        if ((eng_clock * post_div) >= 90000)
 427                tmp |= (0x7 << RADEON_SPLL_PVG_SHIFT);
 428        else
 429                tmp |= (0x4 << RADEON_SPLL_PVG_SHIFT);
 430        WREG32_PLL(RADEON_SPLL_CNTL, tmp);
 431
 432        tmp = RREG32_PLL(RADEON_SPLL_CNTL);
 433        tmp &= ~RADEON_SPLL_SLEEP;
 434        WREG32_PLL(RADEON_SPLL_CNTL, tmp);
 435
 436        udelay(2);
 437
 438        tmp = RREG32_PLL(RADEON_SPLL_CNTL);
 439        tmp &= ~RADEON_SPLL_RESET;
 440        WREG32_PLL(RADEON_SPLL_CNTL, tmp);
 441
 442        udelay(200);
 443
 444        tmp = RREG32_PLL(RADEON_SCLK_CNTL);
 445        tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
 446        switch (post_div) {
 447        case 1:
 448        default:
 449                tmp |= 1;
 450                break;
 451        case 2:
 452                tmp |= 2;
 453                break;
 454        case 4:
 455                tmp |= 3;
 456                break;
 457        case 8:
 458                tmp |= 4;
 459                break;
 460        }
 461        WREG32_PLL(RADEON_SCLK_CNTL, tmp);
 462
 463        udelay(20);
 464
 465        tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
 466        tmp |= RADEON_DONT_USE_XTALIN;
 467        WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
 468
 469        udelay(10);
 470}
 471
 472void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable)
 473{
 474        uint32_t tmp;
 475
 476        if (enable) {
 477                if (rdev->flags & RADEON_SINGLE_CRTC) {
 478                        tmp = RREG32_PLL(RADEON_SCLK_CNTL);
 479                        if ((RREG32(RADEON_CONFIG_CNTL) &
 480                             RADEON_CFG_ATI_REV_ID_MASK) >
 481                            RADEON_CFG_ATI_REV_A13) {
 482                                tmp &=
 483                                    ~(RADEON_SCLK_FORCE_CP |
 484                                      RADEON_SCLK_FORCE_RB);
 485                        }
 486                        tmp &=
 487                            ~(RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 |
 488                              RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_SE |
 489                              RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_RE |
 490                              RADEON_SCLK_FORCE_PB | RADEON_SCLK_FORCE_TAM |
 491                              RADEON_SCLK_FORCE_TDM);
 492                        WREG32_PLL(RADEON_SCLK_CNTL, tmp);
 493                } else if (ASIC_IS_R300(rdev)) {
 494                        if ((rdev->family == CHIP_RS400) ||
 495                            (rdev->family == CHIP_RS480)) {
 496                                tmp = RREG32_PLL(RADEON_SCLK_CNTL);
 497                                tmp &=
 498                                    ~(RADEON_SCLK_FORCE_DISP2 |
 499                                      RADEON_SCLK_FORCE_CP |
 500                                      RADEON_SCLK_FORCE_HDP |
 501                                      RADEON_SCLK_FORCE_DISP1 |
 502                                      RADEON_SCLK_FORCE_TOP |
 503                                      RADEON_SCLK_FORCE_E2 | R300_SCLK_FORCE_VAP
 504                                      | RADEON_SCLK_FORCE_IDCT |
 505                                      RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR
 506                                      | R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX
 507                                      | R300_SCLK_FORCE_US |
 508                                      RADEON_SCLK_FORCE_TV_SCLK |
 509                                      R300_SCLK_FORCE_SU |
 510                                      RADEON_SCLK_FORCE_OV0);
 511                                tmp |= RADEON_DYN_STOP_LAT_MASK;
 512                                tmp |=
 513                                    RADEON_SCLK_FORCE_TOP |
 514                                    RADEON_SCLK_FORCE_VIP;
 515                                WREG32_PLL(RADEON_SCLK_CNTL, tmp);
 516
 517                                tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
 518                                tmp &= ~RADEON_SCLK_MORE_FORCEON;
 519                                tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
 520                                WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
 521
 522                                tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
 523                                tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
 524                                        RADEON_PIXCLK_DAC_ALWAYS_ONb);
 525                                WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
 526
 527                                tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
 528                                tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
 529                                        RADEON_PIX2CLK_DAC_ALWAYS_ONb |
 530                                        RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
 531                                        R300_DVOCLK_ALWAYS_ONb |
 532                                        RADEON_PIXCLK_BLEND_ALWAYS_ONb |
 533                                        RADEON_PIXCLK_GV_ALWAYS_ONb |
 534                                        R300_PIXCLK_DVO_ALWAYS_ONb |
 535                                        RADEON_PIXCLK_LVDS_ALWAYS_ONb |
 536                                        RADEON_PIXCLK_TMDS_ALWAYS_ONb |
 537                                        R300_PIXCLK_TRANS_ALWAYS_ONb |
 538                                        R300_PIXCLK_TVO_ALWAYS_ONb |
 539                                        R300_P2G2CLK_ALWAYS_ONb |
 540                                        R300_P2G2CLK_DAC_ALWAYS_ONb);
 541                                WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
 542                        } else if (rdev->family >= CHIP_RV350) {
 543                                tmp = RREG32_PLL(R300_SCLK_CNTL2);
 544                                tmp &= ~(R300_SCLK_FORCE_TCL |
 545                                         R300_SCLK_FORCE_GA |
 546                                         R300_SCLK_FORCE_CBA);
 547                                tmp |= (R300_SCLK_TCL_MAX_DYN_STOP_LAT |
 548                                        R300_SCLK_GA_MAX_DYN_STOP_LAT |
 549                                        R300_SCLK_CBA_MAX_DYN_STOP_LAT);
 550                                WREG32_PLL(R300_SCLK_CNTL2, tmp);
 551
 552                                tmp = RREG32_PLL(RADEON_SCLK_CNTL);
 553                                tmp &=
 554                                    ~(RADEON_SCLK_FORCE_DISP2 |
 555                                      RADEON_SCLK_FORCE_CP |
 556                                      RADEON_SCLK_FORCE_HDP |
 557                                      RADEON_SCLK_FORCE_DISP1 |
 558                                      RADEON_SCLK_FORCE_TOP |
 559                                      RADEON_SCLK_FORCE_E2 | R300_SCLK_FORCE_VAP
 560                                      | RADEON_SCLK_FORCE_IDCT |
 561                                      RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR
 562                                      | R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX
 563                                      | R300_SCLK_FORCE_US |
 564                                      RADEON_SCLK_FORCE_TV_SCLK |
 565                                      R300_SCLK_FORCE_SU |
 566                                      RADEON_SCLK_FORCE_OV0);
 567                                tmp |= RADEON_DYN_STOP_LAT_MASK;
 568                                WREG32_PLL(RADEON_SCLK_CNTL, tmp);
 569
 570                                tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
 571                                tmp &= ~RADEON_SCLK_MORE_FORCEON;
 572                                tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
 573                                WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
 574
 575                                tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
 576                                tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
 577                                        RADEON_PIXCLK_DAC_ALWAYS_ONb);
 578                                WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
 579
 580                                tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
 581                                tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
 582                                        RADEON_PIX2CLK_DAC_ALWAYS_ONb |
 583                                        RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
 584                                        R300_DVOCLK_ALWAYS_ONb |
 585                                        RADEON_PIXCLK_BLEND_ALWAYS_ONb |
 586                                        RADEON_PIXCLK_GV_ALWAYS_ONb |
 587                                        R300_PIXCLK_DVO_ALWAYS_ONb |
 588                                        RADEON_PIXCLK_LVDS_ALWAYS_ONb |
 589                                        RADEON_PIXCLK_TMDS_ALWAYS_ONb |
 590                                        R300_PIXCLK_TRANS_ALWAYS_ONb |
 591                                        R300_PIXCLK_TVO_ALWAYS_ONb |
 592                                        R300_P2G2CLK_ALWAYS_ONb |
 593                                        R300_P2G2CLK_DAC_ALWAYS_ONb);
 594                                WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
 595
 596                                tmp = RREG32_PLL(RADEON_MCLK_MISC);
 597                                tmp |= (RADEON_MC_MCLK_DYN_ENABLE |
 598                                        RADEON_IO_MCLK_DYN_ENABLE);
 599                                WREG32_PLL(RADEON_MCLK_MISC, tmp);
 600
 601                                tmp = RREG32_PLL(RADEON_MCLK_CNTL);
 602                                tmp |= (RADEON_FORCEON_MCLKA |
 603                                        RADEON_FORCEON_MCLKB);
 604
 605                                tmp &= ~(RADEON_FORCEON_YCLKA |
 606                                         RADEON_FORCEON_YCLKB |
 607                                         RADEON_FORCEON_MC);
 608
 609                                /* Some releases of vbios have set DISABLE_MC_MCLKA
 610                                   and DISABLE_MC_MCLKB bits in the vbios table.  Setting these
 611                                   bits will cause H/W hang when reading video memory with dynamic clocking
 612                                   enabled. */
 613                                if ((tmp & R300_DISABLE_MC_MCLKA) &&
 614                                    (tmp & R300_DISABLE_MC_MCLKB)) {
 615                                        /* If both bits are set, then check the active channels */
 616                                        tmp = RREG32_PLL(RADEON_MCLK_CNTL);
 617                                        if (rdev->mc.vram_width == 64) {
 618                                                if (RREG32(RADEON_MEM_CNTL) &
 619                                                    R300_MEM_USE_CD_CH_ONLY)
 620                                                        tmp &=
 621                                                            ~R300_DISABLE_MC_MCLKB;
 622                                                else
 623                                                        tmp &=
 624                                                            ~R300_DISABLE_MC_MCLKA;
 625                                        } else {
 626                                                tmp &= ~(R300_DISABLE_MC_MCLKA |
 627                                                         R300_DISABLE_MC_MCLKB);
 628                                        }
 629                                }
 630
 631                                WREG32_PLL(RADEON_MCLK_CNTL, tmp);
 632                        } else {
 633                                tmp = RREG32_PLL(RADEON_SCLK_CNTL);
 634                                tmp &= ~(R300_SCLK_FORCE_VAP);
 635                                tmp |= RADEON_SCLK_FORCE_CP;
 636                                WREG32_PLL(RADEON_SCLK_CNTL, tmp);
 637                                mdelay(15);
 638
 639                                tmp = RREG32_PLL(R300_SCLK_CNTL2);
 640                                tmp &= ~(R300_SCLK_FORCE_TCL |
 641                                         R300_SCLK_FORCE_GA |
 642                                         R300_SCLK_FORCE_CBA);
 643                                WREG32_PLL(R300_SCLK_CNTL2, tmp);
 644                        }
 645                } else {
 646                        tmp = RREG32_PLL(RADEON_CLK_PWRMGT_CNTL);
 647
 648                        tmp &= ~(RADEON_ACTIVE_HILO_LAT_MASK |
 649                                 RADEON_DISP_DYN_STOP_LAT_MASK |
 650                                 RADEON_DYN_STOP_MODE_MASK);
 651
 652                        tmp |= (RADEON_ENGIN_DYNCLK_MODE |
 653                                (0x01 << RADEON_ACTIVE_HILO_LAT_SHIFT));
 654                        WREG32_PLL(RADEON_CLK_PWRMGT_CNTL, tmp);
 655                        mdelay(15);
 656
 657                        tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
 658                        tmp |= RADEON_SCLK_DYN_START_CNTL;
 659                        WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
 660                        mdelay(15);
 661
 662                        /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200
 663                           to lockup randomly, leave them as set by BIOS.
 664                         */
 665                        tmp = RREG32_PLL(RADEON_SCLK_CNTL);
 666                        /*tmp &= RADEON_SCLK_SRC_SEL_MASK; */
 667                        tmp &= ~RADEON_SCLK_FORCEON_MASK;
 668
 669                        /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300 */
 670                        if (((rdev->family == CHIP_RV250) &&
 671                             ((RREG32(RADEON_CONFIG_CNTL) &
 672                               RADEON_CFG_ATI_REV_ID_MASK) <
 673                              RADEON_CFG_ATI_REV_A13))
 674                            || ((rdev->family == CHIP_RV100)
 675                                &&
 676                                ((RREG32(RADEON_CONFIG_CNTL) &
 677                                  RADEON_CFG_ATI_REV_ID_MASK) <=
 678                                 RADEON_CFG_ATI_REV_A13))) {
 679                                tmp |= RADEON_SCLK_FORCE_CP;
 680                                tmp |= RADEON_SCLK_FORCE_VIP;
 681                        }
 682
 683                        WREG32_PLL(RADEON_SCLK_CNTL, tmp);
 684
 685                        if ((rdev->family == CHIP_RV200) ||
 686                            (rdev->family == CHIP_RV250) ||
 687                            (rdev->family == CHIP_RV280)) {
 688                                tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
 689                                tmp &= ~RADEON_SCLK_MORE_FORCEON;
 690
 691                                /* RV200::A11 A12 RV250::A11 A12 */
 692                                if (((rdev->family == CHIP_RV200) ||
 693                                     (rdev->family == CHIP_RV250)) &&
 694                                    ((RREG32(RADEON_CONFIG_CNTL) &
 695                                      RADEON_CFG_ATI_REV_ID_MASK) <
 696                                     RADEON_CFG_ATI_REV_A13)) {
 697                                        tmp |= RADEON_SCLK_MORE_FORCEON;
 698                                }
 699                                WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
 700                                mdelay(15);
 701                        }
 702
 703                        /* RV200::A11 A12, RV250::A11 A12 */
 704                        if (((rdev->family == CHIP_RV200) ||
 705                             (rdev->family == CHIP_RV250)) &&
 706                            ((RREG32(RADEON_CONFIG_CNTL) &
 707                              RADEON_CFG_ATI_REV_ID_MASK) <
 708                             RADEON_CFG_ATI_REV_A13)) {
 709                                tmp = RREG32_PLL(RADEON_PLL_PWRMGT_CNTL);
 710                                tmp |= RADEON_TCL_BYPASS_DISABLE;
 711                                WREG32_PLL(RADEON_PLL_PWRMGT_CNTL, tmp);
 712                        }
 713                        mdelay(15);
 714
 715                        /*enable dynamic mode for display clocks (PIXCLK and PIX2CLK) */
 716                        tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
 717                        tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
 718                                RADEON_PIX2CLK_DAC_ALWAYS_ONb |
 719                                RADEON_PIXCLK_BLEND_ALWAYS_ONb |
 720                                RADEON_PIXCLK_GV_ALWAYS_ONb |
 721                                RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
 722                                RADEON_PIXCLK_LVDS_ALWAYS_ONb |
 723                                RADEON_PIXCLK_TMDS_ALWAYS_ONb);
 724
 725                        WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
 726                        mdelay(15);
 727
 728                        tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
 729                        tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
 730                                RADEON_PIXCLK_DAC_ALWAYS_ONb);
 731
 732                        WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
 733                        mdelay(15);
 734                }
 735        } else {
 736                /* Turn everything OFF (ForceON to everything) */
 737                if (rdev->flags & RADEON_SINGLE_CRTC) {
 738                        tmp = RREG32_PLL(RADEON_SCLK_CNTL);
 739                        tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_HDP |
 740                                RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_TOP
 741                                | RADEON_SCLK_FORCE_E2 | RADEON_SCLK_FORCE_SE |
 742                                RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_VIP |
 743                                RADEON_SCLK_FORCE_RE | RADEON_SCLK_FORCE_PB |
 744                                RADEON_SCLK_FORCE_TAM | RADEON_SCLK_FORCE_TDM |
 745                                RADEON_SCLK_FORCE_RB);
 746                        WREG32_PLL(RADEON_SCLK_CNTL, tmp);
 747                } else if ((rdev->family == CHIP_RS400) ||
 748                           (rdev->family == CHIP_RS480)) {
 749                        tmp = RREG32_PLL(RADEON_SCLK_CNTL);
 750                        tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP |
 751                                RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1
 752                                | RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 |
 753                                R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT |
 754                                RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR |
 755                                R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX |
 756                                R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK |
 757                                R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0);
 758                        WREG32_PLL(RADEON_SCLK_CNTL, tmp);
 759
 760                        tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
 761                        tmp |= RADEON_SCLK_MORE_FORCEON;
 762                        WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
 763
 764                        tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
 765                        tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
 766                                 RADEON_PIXCLK_DAC_ALWAYS_ONb |
 767                                 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
 768                        WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
 769
 770                        tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
 771                        tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
 772                                 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
 773                                 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
 774                                 R300_DVOCLK_ALWAYS_ONb |
 775                                 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
 776                                 RADEON_PIXCLK_GV_ALWAYS_ONb |
 777                                 R300_PIXCLK_DVO_ALWAYS_ONb |
 778                                 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
 779                                 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
 780                                 R300_PIXCLK_TRANS_ALWAYS_ONb |
 781                                 R300_PIXCLK_TVO_ALWAYS_ONb |
 782                                 R300_P2G2CLK_ALWAYS_ONb |
 783                                 R300_P2G2CLK_DAC_ALWAYS_ONb |
 784                                 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
 785                        WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
 786                } else if (rdev->family >= CHIP_RV350) {
 787                        /* for RV350/M10, no delays are required. */
 788                        tmp = RREG32_PLL(R300_SCLK_CNTL2);
 789                        tmp |= (R300_SCLK_FORCE_TCL |
 790                                R300_SCLK_FORCE_GA | R300_SCLK_FORCE_CBA);
 791                        WREG32_PLL(R300_SCLK_CNTL2, tmp);
 792
 793                        tmp = RREG32_PLL(RADEON_SCLK_CNTL);
 794                        tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP |
 795                                RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1
 796                                | RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 |
 797                                R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT |
 798                                RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR |
 799                                R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX |
 800                                R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK |
 801                                R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0);
 802                        WREG32_PLL(RADEON_SCLK_CNTL, tmp);
 803
 804                        tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
 805                        tmp |= RADEON_SCLK_MORE_FORCEON;
 806                        WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
 807
 808                        tmp = RREG32_PLL(RADEON_MCLK_CNTL);
 809                        tmp |= (RADEON_FORCEON_MCLKA |
 810                                RADEON_FORCEON_MCLKB |
 811                                RADEON_FORCEON_YCLKA |
 812                                RADEON_FORCEON_YCLKB | RADEON_FORCEON_MC);
 813                        WREG32_PLL(RADEON_MCLK_CNTL, tmp);
 814
 815                        tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
 816                        tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
 817                                 RADEON_PIXCLK_DAC_ALWAYS_ONb |
 818                                 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
 819                        WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
 820
 821                        tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
 822                        tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
 823                                 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
 824                                 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
 825                                 R300_DVOCLK_ALWAYS_ONb |
 826                                 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
 827                                 RADEON_PIXCLK_GV_ALWAYS_ONb |
 828                                 R300_PIXCLK_DVO_ALWAYS_ONb |
 829                                 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
 830                                 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
 831                                 R300_PIXCLK_TRANS_ALWAYS_ONb |
 832                                 R300_PIXCLK_TVO_ALWAYS_ONb |
 833                                 R300_P2G2CLK_ALWAYS_ONb |
 834                                 R300_P2G2CLK_DAC_ALWAYS_ONb |
 835                                 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
 836                        WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
 837                } else {
 838                        tmp = RREG32_PLL(RADEON_SCLK_CNTL);
 839                        tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_E2);
 840                        tmp |= RADEON_SCLK_FORCE_SE;
 841
 842                        if (rdev->flags & RADEON_SINGLE_CRTC) {
 843                                tmp |= (RADEON_SCLK_FORCE_RB |
 844                                        RADEON_SCLK_FORCE_TDM |
 845                                        RADEON_SCLK_FORCE_TAM |
 846                                        RADEON_SCLK_FORCE_PB |
 847                                        RADEON_SCLK_FORCE_RE |
 848                                        RADEON_SCLK_FORCE_VIP |
 849                                        RADEON_SCLK_FORCE_IDCT |
 850                                        RADEON_SCLK_FORCE_TOP |
 851                                        RADEON_SCLK_FORCE_DISP1 |
 852                                        RADEON_SCLK_FORCE_DISP2 |
 853                                        RADEON_SCLK_FORCE_HDP);
 854                        } else if ((rdev->family == CHIP_R300) ||
 855                                   (rdev->family == CHIP_R350)) {
 856                                tmp |= (RADEON_SCLK_FORCE_HDP |
 857                                        RADEON_SCLK_FORCE_DISP1 |
 858                                        RADEON_SCLK_FORCE_DISP2 |
 859                                        RADEON_SCLK_FORCE_TOP |
 860                                        RADEON_SCLK_FORCE_IDCT |
 861                                        RADEON_SCLK_FORCE_VIP);
 862                        }
 863                        WREG32_PLL(RADEON_SCLK_CNTL, tmp);
 864
 865                        mdelay(16);
 866
 867                        if ((rdev->family == CHIP_R300) ||
 868                            (rdev->family == CHIP_R350)) {
 869                                tmp = RREG32_PLL(R300_SCLK_CNTL2);
 870                                tmp |= (R300_SCLK_FORCE_TCL |
 871                                        R300_SCLK_FORCE_GA |
 872                                        R300_SCLK_FORCE_CBA);
 873                                WREG32_PLL(R300_SCLK_CNTL2, tmp);
 874                                mdelay(16);
 875                        }
 876
 877                        if (rdev->flags & RADEON_IS_IGP) {
 878                                tmp = RREG32_PLL(RADEON_MCLK_CNTL);
 879                                tmp &= ~(RADEON_FORCEON_MCLKA |
 880                                         RADEON_FORCEON_YCLKA);
 881                                WREG32_PLL(RADEON_MCLK_CNTL, tmp);
 882                                mdelay(16);
 883                        }
 884
 885                        if ((rdev->family == CHIP_RV200) ||
 886                            (rdev->family == CHIP_RV250) ||
 887                            (rdev->family == CHIP_RV280)) {
 888                                tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
 889                                tmp |= RADEON_SCLK_MORE_FORCEON;
 890                                WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
 891                                mdelay(16);
 892                        }
 893
 894                        tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
 895                        tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
 896                                 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
 897                                 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
 898                                 RADEON_PIXCLK_GV_ALWAYS_ONb |
 899                                 RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
 900                                 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
 901                                 RADEON_PIXCLK_TMDS_ALWAYS_ONb);
 902
 903                        WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
 904                        mdelay(16);
 905
 906                        tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
 907                        tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
 908                                 RADEON_PIXCLK_DAC_ALWAYS_ONb);
 909                        WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
 910                }
 911        }
 912}
 913
 914