linux/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
<<
>>
Prefs
   1/*
   2 * Copyright 2007-8 Advanced Micro Devices, Inc.
   3 * Copyright 2008 Red Hat Inc.
   4 *
   5 * Permission is hereby granted, free of charge, to any person obtaining a
   6 * copy of this software and associated documentation files (the "Software"),
   7 * to deal in the Software without restriction, including without limitation
   8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   9 * and/or sell copies of the Software, and to permit persons to whom the
  10 * Software is furnished to do so, subject to the following conditions:
  11 *
  12 * The above copyright notice and this permission notice shall be included in
  13 * all copies or substantial portions of the Software.
  14 *
  15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  21 * OTHER DEALINGS IN THE SOFTWARE.
  22 *
  23 * Authors: Dave Airlie
  24 *          Alex Deucher
  25 */
  26#include <drm/drmP.h>
  27#include <drm/drm_crtc_helper.h>
  28#include <drm/drm_fb_helper.h>
  29#include <drm/radeon_drm.h>
  30#include <drm/drm_fixed.h>
  31#include "radeon.h"
  32#include "atom.h"
  33
  34static void radeon_overscan_setup(struct drm_crtc *crtc,
  35                                  struct drm_display_mode *mode)
  36{
  37        struct drm_device *dev = crtc->dev;
  38        struct radeon_device *rdev = dev->dev_private;
  39        struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
  40
  41        WREG32(RADEON_OVR_CLR + radeon_crtc->crtc_offset, 0);
  42        WREG32(RADEON_OVR_WID_LEFT_RIGHT + radeon_crtc->crtc_offset, 0);
  43        WREG32(RADEON_OVR_WID_TOP_BOTTOM + radeon_crtc->crtc_offset, 0);
  44}
  45
  46static void radeon_legacy_rmx_mode_set(struct drm_crtc *crtc,
  47                                       struct drm_display_mode *mode)
  48{
  49        struct drm_device *dev = crtc->dev;
  50        struct radeon_device *rdev = dev->dev_private;
  51        struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
  52        int xres = mode->hdisplay;
  53        int yres = mode->vdisplay;
  54        bool hscale = true, vscale = true;
  55        int hsync_wid;
  56        int vsync_wid;
  57        int hsync_start;
  58        int blank_width;
  59        u32 scale, inc, crtc_more_cntl;
  60        u32 fp_horz_stretch, fp_vert_stretch, fp_horz_vert_active;
  61        u32 fp_h_sync_strt_wid, fp_crtc_h_total_disp;
  62        u32 fp_v_sync_strt_wid, fp_crtc_v_total_disp;
  63        struct drm_display_mode *native_mode = &radeon_crtc->native_mode;
  64
  65        fp_vert_stretch = RREG32(RADEON_FP_VERT_STRETCH) &
  66                (RADEON_VERT_STRETCH_RESERVED |
  67                 RADEON_VERT_AUTO_RATIO_INC);
  68        fp_horz_stretch = RREG32(RADEON_FP_HORZ_STRETCH) &
  69                (RADEON_HORZ_FP_LOOP_STRETCH |
  70                 RADEON_HORZ_AUTO_RATIO_INC);
  71
  72        crtc_more_cntl = 0;
  73        if ((rdev->family == CHIP_RS100) ||
  74            (rdev->family == CHIP_RS200)) {
  75                /* This is to workaround the asic bug for RMX, some versions
  76                   of BIOS dosen't have this register initialized correctly. */
  77                crtc_more_cntl |= RADEON_CRTC_H_CUTOFF_ACTIVE_EN;
  78        }
  79
  80
  81        fp_crtc_h_total_disp = ((((mode->crtc_htotal / 8) - 1) & 0x3ff)
  82                                | ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
  83
  84        hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
  85        if (!hsync_wid)
  86                hsync_wid = 1;
  87        hsync_start = mode->crtc_hsync_start - 8;
  88
  89        fp_h_sync_strt_wid = ((hsync_start & 0x1fff)
  90                              | ((hsync_wid & 0x3f) << 16)
  91                              | ((mode->flags & DRM_MODE_FLAG_NHSYNC)
  92                                 ? RADEON_CRTC_H_SYNC_POL
  93                                 : 0));
  94
  95        fp_crtc_v_total_disp = (((mode->crtc_vtotal - 1) & 0xffff)
  96                                | ((mode->crtc_vdisplay - 1) << 16));
  97
  98        vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
  99        if (!vsync_wid)
 100                vsync_wid = 1;
 101
 102        fp_v_sync_strt_wid = (((mode->crtc_vsync_start - 1) & 0xfff)
 103                              | ((vsync_wid & 0x1f) << 16)
 104                              | ((mode->flags & DRM_MODE_FLAG_NVSYNC)
 105                                 ? RADEON_CRTC_V_SYNC_POL
 106                                 : 0));
 107
 108        fp_horz_vert_active = 0;
 109
 110        if (native_mode->hdisplay == 0 ||
 111            native_mode->vdisplay == 0) {
 112                hscale = false;
 113                vscale = false;
 114        } else {
 115                if (xres > native_mode->hdisplay)
 116                        xres = native_mode->hdisplay;
 117                if (yres > native_mode->vdisplay)
 118                        yres = native_mode->vdisplay;
 119
 120                if (xres == native_mode->hdisplay)
 121                        hscale = false;
 122                if (yres == native_mode->vdisplay)
 123                        vscale = false;
 124        }
 125
 126        switch (radeon_crtc->rmx_type) {
 127        case RMX_FULL:
 128        case RMX_ASPECT:
 129                if (!hscale)
 130                        fp_horz_stretch |= ((xres/8-1) << 16);
 131                else {
 132                        inc = (fp_horz_stretch & RADEON_HORZ_AUTO_RATIO_INC) ? 1 : 0;
 133                        scale = ((xres + inc) * RADEON_HORZ_STRETCH_RATIO_MAX)
 134                                / native_mode->hdisplay + 1;
 135                        fp_horz_stretch |= (((scale) & RADEON_HORZ_STRETCH_RATIO_MASK) |
 136                                        RADEON_HORZ_STRETCH_BLEND |
 137                                        RADEON_HORZ_STRETCH_ENABLE |
 138                                        ((native_mode->hdisplay/8-1) << 16));
 139                }
 140
 141                if (!vscale)
 142                        fp_vert_stretch |= ((yres-1) << 12);
 143                else {
 144                        inc = (fp_vert_stretch & RADEON_VERT_AUTO_RATIO_INC) ? 1 : 0;
 145                        scale = ((yres + inc) * RADEON_VERT_STRETCH_RATIO_MAX)
 146                                / native_mode->vdisplay + 1;
 147                        fp_vert_stretch |= (((scale) & RADEON_VERT_STRETCH_RATIO_MASK) |
 148                                        RADEON_VERT_STRETCH_ENABLE |
 149                                        RADEON_VERT_STRETCH_BLEND |
 150                                        ((native_mode->vdisplay-1) << 12));
 151                }
 152                break;
 153        case RMX_CENTER:
 154                fp_horz_stretch |= ((xres/8-1) << 16);
 155                fp_vert_stretch |= ((yres-1) << 12);
 156
 157                crtc_more_cntl |= (RADEON_CRTC_AUTO_HORZ_CENTER_EN |
 158                                RADEON_CRTC_AUTO_VERT_CENTER_EN);
 159
 160                blank_width = (mode->crtc_hblank_end - mode->crtc_hblank_start) / 8;
 161                if (blank_width > 110)
 162                        blank_width = 110;
 163
 164                fp_crtc_h_total_disp = (((blank_width) & 0x3ff)
 165                                | ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
 166
 167                hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
 168                if (!hsync_wid)
 169                        hsync_wid = 1;
 170
 171                fp_h_sync_strt_wid = ((((mode->crtc_hsync_start - mode->crtc_hblank_start) / 8) & 0x1fff)
 172                                | ((hsync_wid & 0x3f) << 16)
 173                                | ((mode->flags & DRM_MODE_FLAG_NHSYNC)
 174                                        ? RADEON_CRTC_H_SYNC_POL
 175                                        : 0));
 176
 177                fp_crtc_v_total_disp = (((mode->crtc_vblank_end - mode->crtc_vblank_start) & 0xffff)
 178                                | ((mode->crtc_vdisplay - 1) << 16));
 179
 180                vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
 181                if (!vsync_wid)
 182                        vsync_wid = 1;
 183
 184                fp_v_sync_strt_wid = ((((mode->crtc_vsync_start - mode->crtc_vblank_start) & 0xfff)
 185                                        | ((vsync_wid & 0x1f) << 16)
 186                                        | ((mode->flags & DRM_MODE_FLAG_NVSYNC)
 187                                                ? RADEON_CRTC_V_SYNC_POL
 188                                                : 0)));
 189
 190                fp_horz_vert_active = (((native_mode->vdisplay) & 0xfff) |
 191                                (((native_mode->hdisplay / 8) & 0x1ff) << 16));
 192                break;
 193        case RMX_OFF:
 194        default:
 195                fp_horz_stretch |= ((xres/8-1) << 16);
 196                fp_vert_stretch |= ((yres-1) << 12);
 197                break;
 198        }
 199
 200        WREG32(RADEON_FP_HORZ_STRETCH,      fp_horz_stretch);
 201        WREG32(RADEON_FP_VERT_STRETCH,      fp_vert_stretch);
 202        WREG32(RADEON_CRTC_MORE_CNTL,       crtc_more_cntl);
 203        WREG32(RADEON_FP_HORZ_VERT_ACTIVE,  fp_horz_vert_active);
 204        WREG32(RADEON_FP_H_SYNC_STRT_WID,   fp_h_sync_strt_wid);
 205        WREG32(RADEON_FP_V_SYNC_STRT_WID,   fp_v_sync_strt_wid);
 206        WREG32(RADEON_FP_CRTC_H_TOTAL_DISP, fp_crtc_h_total_disp);
 207        WREG32(RADEON_FP_CRTC_V_TOTAL_DISP, fp_crtc_v_total_disp);
 208}
 209
 210static void radeon_pll_wait_for_read_update_complete(struct drm_device *dev)
 211{
 212        struct radeon_device *rdev = dev->dev_private;
 213        int i = 0;
 214
 215        /* FIXME: Certain revisions of R300 can't recover here.  Not sure of
 216           the cause yet, but this workaround will mask the problem for now.
 217           Other chips usually will pass at the very first test, so the
 218           workaround shouldn't have any effect on them. */
 219        for (i = 0;
 220             (i < 10000 &&
 221              RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_ATOMIC_UPDATE_R);
 222             i++);
 223}
 224
 225static void radeon_pll_write_update(struct drm_device *dev)
 226{
 227        struct radeon_device *rdev = dev->dev_private;
 228
 229        while (RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_ATOMIC_UPDATE_R);
 230
 231        WREG32_PLL_P(RADEON_PPLL_REF_DIV,
 232                           RADEON_PPLL_ATOMIC_UPDATE_W,
 233                           ~(RADEON_PPLL_ATOMIC_UPDATE_W));
 234}
 235
 236static void radeon_pll2_wait_for_read_update_complete(struct drm_device *dev)
 237{
 238        struct radeon_device *rdev = dev->dev_private;
 239        int i = 0;
 240
 241
 242        /* FIXME: Certain revisions of R300 can't recover here.  Not sure of
 243           the cause yet, but this workaround will mask the problem for now.
 244           Other chips usually will pass at the very first test, so the
 245           workaround shouldn't have any effect on them. */
 246        for (i = 0;
 247             (i < 10000 &&
 248              RREG32_PLL(RADEON_P2PLL_REF_DIV) & RADEON_P2PLL_ATOMIC_UPDATE_R);
 249             i++);
 250}
 251
 252static void radeon_pll2_write_update(struct drm_device *dev)
 253{
 254        struct radeon_device *rdev = dev->dev_private;
 255
 256        while (RREG32_PLL(RADEON_P2PLL_REF_DIV) & RADEON_P2PLL_ATOMIC_UPDATE_R);
 257
 258        WREG32_PLL_P(RADEON_P2PLL_REF_DIV,
 259                           RADEON_P2PLL_ATOMIC_UPDATE_W,
 260                           ~(RADEON_P2PLL_ATOMIC_UPDATE_W));
 261}
 262
 263static uint8_t radeon_compute_pll_gain(uint16_t ref_freq, uint16_t ref_div,
 264                                       uint16_t fb_div)
 265{
 266        unsigned int vcoFreq;
 267
 268        if (!ref_div)
 269                return 1;
 270
 271        vcoFreq = ((unsigned)ref_freq * fb_div) / ref_div;
 272
 273        /*
 274         * This is horribly crude: the VCO frequency range is divided into
 275         * 3 parts, each part having a fixed PLL gain value.
 276         */
 277        if (vcoFreq >= 30000)
 278                /*
 279                 * [300..max] MHz : 7
 280                 */
 281                return 7;
 282        else if (vcoFreq >= 18000)
 283                /*
 284                 * [180..300) MHz : 4
 285                 */
 286                return 4;
 287        else
 288                /*
 289                 * [0..180) MHz : 1
 290                 */
 291                return 1;
 292}
 293
 294static void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
 295{
 296        struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
 297        struct drm_device *dev = crtc->dev;
 298        struct radeon_device *rdev = dev->dev_private;
 299        uint32_t crtc_ext_cntl = 0;
 300        uint32_t mask;
 301
 302        if (radeon_crtc->crtc_id)
 303                mask = (RADEON_CRTC2_DISP_DIS |
 304                        RADEON_CRTC2_VSYNC_DIS |
 305                        RADEON_CRTC2_HSYNC_DIS |
 306                        RADEON_CRTC2_DISP_REQ_EN_B);
 307        else
 308                mask = (RADEON_CRTC_DISPLAY_DIS |
 309                        RADEON_CRTC_VSYNC_DIS |
 310                        RADEON_CRTC_HSYNC_DIS);
 311
 312        /*
 313         * On all dual CRTC GPUs this bit controls the CRTC of the primary DAC.
 314         * Therefore it is set in the DAC DMPS function.
 315         * This is different for GPU's with a single CRTC but a primary and a
 316         * TV DAC: here it controls the single CRTC no matter where it is
 317         * routed. Therefore we set it here.
 318         */
 319        if (rdev->flags & RADEON_SINGLE_CRTC)
 320                crtc_ext_cntl = RADEON_CRTC_CRT_ON;
 321        
 322        switch (mode) {
 323        case DRM_MODE_DPMS_ON:
 324                radeon_crtc->enabled = true;
 325                /* adjust pm to dpms changes BEFORE enabling crtcs */
 326                radeon_pm_compute_clocks(rdev);
 327                if (radeon_crtc->crtc_id)
 328                        WREG32_P(RADEON_CRTC2_GEN_CNTL, RADEON_CRTC2_EN, ~(RADEON_CRTC2_EN | mask));
 329                else {
 330                        WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_EN, ~(RADEON_CRTC_EN |
 331                                                                         RADEON_CRTC_DISP_REQ_EN_B));
 332                        WREG32_P(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl, ~(mask | crtc_ext_cntl));
 333                }
 334                if (dev->num_crtcs > radeon_crtc->crtc_id)
 335                        drm_crtc_vblank_on(crtc);
 336                radeon_crtc_load_lut(crtc);
 337                break;
 338        case DRM_MODE_DPMS_STANDBY:
 339        case DRM_MODE_DPMS_SUSPEND:
 340        case DRM_MODE_DPMS_OFF:
 341                if (dev->num_crtcs > radeon_crtc->crtc_id)
 342                        drm_crtc_vblank_off(crtc);
 343                if (radeon_crtc->crtc_id)
 344                        WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask));
 345                else {
 346                        WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_DISP_REQ_EN_B, ~(RADEON_CRTC_EN |
 347                                                                                    RADEON_CRTC_DISP_REQ_EN_B));
 348                        WREG32_P(RADEON_CRTC_EXT_CNTL, mask, ~(mask | crtc_ext_cntl));
 349                }
 350                radeon_crtc->enabled = false;
 351                /* adjust pm to dpms changes AFTER disabling crtcs */
 352                radeon_pm_compute_clocks(rdev);
 353                break;
 354        }
 355}
 356
 357int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
 358                         struct drm_framebuffer *old_fb)
 359{
 360        return radeon_crtc_do_set_base(crtc, old_fb, x, y, 0);
 361}
 362
 363int radeon_crtc_set_base_atomic(struct drm_crtc *crtc,
 364                                struct drm_framebuffer *fb,
 365                                int x, int y, enum mode_set_atomic state)
 366{
 367        return radeon_crtc_do_set_base(crtc, fb, x, y, 1);
 368}
 369
 370int radeon_crtc_do_set_base(struct drm_crtc *crtc,
 371                         struct drm_framebuffer *fb,
 372                         int x, int y, int atomic)
 373{
 374        struct drm_device *dev = crtc->dev;
 375        struct radeon_device *rdev = dev->dev_private;
 376        struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
 377        struct drm_framebuffer *target_fb;
 378        struct drm_gem_object *obj;
 379        struct radeon_bo *rbo;
 380        uint64_t base;
 381        uint32_t crtc_offset, crtc_offset_cntl, crtc_tile_x0_y0 = 0;
 382        uint32_t crtc_pitch, pitch_pixels;
 383        uint32_t tiling_flags;
 384        int format;
 385        uint32_t gen_cntl_reg, gen_cntl_val;
 386        int r;
 387
 388        DRM_DEBUG_KMS("\n");
 389        /* no fb bound */
 390        if (!atomic && !crtc->primary->fb) {
 391                DRM_DEBUG_KMS("No FB bound\n");
 392                return 0;
 393        }
 394
 395        if (atomic)
 396                target_fb = fb;
 397        else
 398                target_fb = crtc->primary->fb;
 399
 400        switch (target_fb->format->cpp[0] * 8) {
 401        case 8:
 402                format = 2;
 403                break;
 404        case 15:      /*  555 */
 405                format = 3;
 406                break;
 407        case 16:      /*  565 */
 408                format = 4;
 409                break;
 410        case 24:      /*  RGB */
 411                format = 5;
 412                break;
 413        case 32:      /* xRGB */
 414                format = 6;
 415                break;
 416        default:
 417                return false;
 418        }
 419
 420        /* Pin framebuffer & get tilling informations */
 421        obj = target_fb->obj[0];
 422        rbo = gem_to_radeon_bo(obj);
 423retry:
 424        r = radeon_bo_reserve(rbo, false);
 425        if (unlikely(r != 0))
 426                return r;
 427        /* Only 27 bit offset for legacy CRTC */
 428        r = radeon_bo_pin_restricted(rbo, RADEON_GEM_DOMAIN_VRAM, 1 << 27,
 429                                     &base);
 430        if (unlikely(r != 0)) {
 431                radeon_bo_unreserve(rbo);
 432
 433                /* On old GPU like RN50 with little vram pining can fails because
 434                 * current fb is taking all space needed. So instead of unpining
 435                 * the old buffer after pining the new one, first unpin old one
 436                 * and then retry pining new one.
 437                 *
 438                 * As only master can set mode only master can pin and it is
 439                 * unlikely the master client will race with itself especialy
 440                 * on those old gpu with single crtc.
 441                 *
 442                 * We don't shutdown the display controller because new buffer
 443                 * will end up in same spot.
 444                 */
 445                if (!atomic && fb && fb != crtc->primary->fb) {
 446                        struct radeon_bo *old_rbo;
 447                        unsigned long nsize, osize;
 448
 449                        old_rbo = gem_to_radeon_bo(fb->obj[0]);
 450                        osize = radeon_bo_size(old_rbo);
 451                        nsize = radeon_bo_size(rbo);
 452                        if (nsize <= osize && !radeon_bo_reserve(old_rbo, false)) {
 453                                radeon_bo_unpin(old_rbo);
 454                                radeon_bo_unreserve(old_rbo);
 455                                fb = NULL;
 456                                goto retry;
 457                        }
 458                }
 459                return -EINVAL;
 460        }
 461        radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL);
 462        radeon_bo_unreserve(rbo);
 463        if (tiling_flags & RADEON_TILING_MICRO)
 464                DRM_ERROR("trying to scanout microtiled buffer\n");
 465
 466        /* if scanout was in GTT this really wouldn't work */
 467        /* crtc offset is from display base addr not FB location */
 468        radeon_crtc->legacy_display_base_addr = rdev->mc.vram_start;
 469
 470        base -= radeon_crtc->legacy_display_base_addr;
 471
 472        crtc_offset_cntl = 0;
 473
 474        pitch_pixels = target_fb->pitches[0] / target_fb->format->cpp[0];
 475        crtc_pitch = DIV_ROUND_UP(pitch_pixels * target_fb->format->cpp[0] * 8,
 476                                  target_fb->format->cpp[0] * 8 * 8);
 477        crtc_pitch |= crtc_pitch << 16;
 478
 479        crtc_offset_cntl |= RADEON_CRTC_GUI_TRIG_OFFSET_LEFT_EN;
 480        if (tiling_flags & RADEON_TILING_MACRO) {
 481                if (ASIC_IS_R300(rdev))
 482                        crtc_offset_cntl |= (R300_CRTC_X_Y_MODE_EN |
 483                                             R300_CRTC_MICRO_TILE_BUFFER_DIS |
 484                                             R300_CRTC_MACRO_TILE_EN);
 485                else
 486                        crtc_offset_cntl |= RADEON_CRTC_TILE_EN;
 487        } else {
 488                if (ASIC_IS_R300(rdev))
 489                        crtc_offset_cntl &= ~(R300_CRTC_X_Y_MODE_EN |
 490                                              R300_CRTC_MICRO_TILE_BUFFER_DIS |
 491                                              R300_CRTC_MACRO_TILE_EN);
 492                else
 493                        crtc_offset_cntl &= ~RADEON_CRTC_TILE_EN;
 494        }
 495
 496        if (tiling_flags & RADEON_TILING_MACRO) {
 497                if (ASIC_IS_R300(rdev)) {
 498                        crtc_tile_x0_y0 = x | (y << 16);
 499                        base &= ~0x7ff;
 500                } else {
 501                        int byteshift = target_fb->format->cpp[0] * 8 >> 4;
 502                        int tile_addr = (((y >> 3) * pitch_pixels +  x) >> (8 - byteshift)) << 11;
 503                        base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8);
 504                        crtc_offset_cntl |= (y % 16);
 505                }
 506        } else {
 507                int offset = y * pitch_pixels + x;
 508                switch (target_fb->format->cpp[0] * 8) {
 509                case 8:
 510                        offset *= 1;
 511                        break;
 512                case 15:
 513                case 16:
 514                        offset *= 2;
 515                        break;
 516                case 24:
 517                        offset *= 3;
 518                        break;
 519                case 32:
 520                        offset *= 4;
 521                        break;
 522                default:
 523                        return false;
 524                }
 525                base += offset;
 526        }
 527
 528        base &= ~7;
 529
 530        if (radeon_crtc->crtc_id == 1)
 531                gen_cntl_reg = RADEON_CRTC2_GEN_CNTL;
 532        else
 533                gen_cntl_reg = RADEON_CRTC_GEN_CNTL;
 534
 535        gen_cntl_val = RREG32(gen_cntl_reg);
 536        gen_cntl_val &= ~(0xf << 8);
 537        gen_cntl_val |= (format << 8);
 538        gen_cntl_val &= ~RADEON_CRTC_VSTAT_MODE_MASK;
 539        WREG32(gen_cntl_reg, gen_cntl_val);
 540
 541        crtc_offset = (u32)base;
 542
 543        WREG32(RADEON_DISPLAY_BASE_ADDR + radeon_crtc->crtc_offset, radeon_crtc->legacy_display_base_addr);
 544
 545        if (ASIC_IS_R300(rdev)) {
 546                if (radeon_crtc->crtc_id)
 547                        WREG32(R300_CRTC2_TILE_X0_Y0, crtc_tile_x0_y0);
 548                else
 549                        WREG32(R300_CRTC_TILE_X0_Y0, crtc_tile_x0_y0);
 550        }
 551        WREG32(RADEON_CRTC_OFFSET_CNTL + radeon_crtc->crtc_offset, crtc_offset_cntl);
 552        WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, crtc_offset);
 553        WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);
 554
 555        if (!atomic && fb && fb != crtc->primary->fb) {
 556                rbo = gem_to_radeon_bo(fb->obj[0]);
 557                r = radeon_bo_reserve(rbo, false);
 558                if (unlikely(r != 0))
 559                        return r;
 560                radeon_bo_unpin(rbo);
 561                radeon_bo_unreserve(rbo);
 562        }
 563
 564        /* Bytes per pixel may have changed */
 565        radeon_bandwidth_update(rdev);
 566
 567        return 0;
 568}
 569
 570static bool radeon_set_crtc_timing(struct drm_crtc *crtc, struct drm_display_mode *mode)
 571{
 572        struct drm_device *dev = crtc->dev;
 573        struct radeon_device *rdev = dev->dev_private;
 574        struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
 575        const struct drm_framebuffer *fb = crtc->primary->fb;
 576        struct drm_encoder *encoder;
 577        int format;
 578        int hsync_start;
 579        int hsync_wid;
 580        int vsync_wid;
 581        uint32_t crtc_h_total_disp;
 582        uint32_t crtc_h_sync_strt_wid;
 583        uint32_t crtc_v_total_disp;
 584        uint32_t crtc_v_sync_strt_wid;
 585        bool is_tv = false;
 586
 587        DRM_DEBUG_KMS("\n");
 588        list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
 589                if (encoder->crtc == crtc) {
 590                        struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
 591                        if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
 592                                is_tv = true;
 593                                DRM_INFO("crtc %d is connected to a TV\n", radeon_crtc->crtc_id);
 594                                break;
 595                        }
 596                }
 597        }
 598
 599        switch (fb->format->cpp[0] * 8) {
 600        case 8:
 601                format = 2;
 602                break;
 603        case 15:      /*  555 */
 604                format = 3;
 605                break;
 606        case 16:      /*  565 */
 607                format = 4;
 608                break;
 609        case 24:      /*  RGB */
 610                format = 5;
 611                break;
 612        case 32:      /* xRGB */
 613                format = 6;
 614                break;
 615        default:
 616                return false;
 617        }
 618
 619        crtc_h_total_disp = ((((mode->crtc_htotal / 8) - 1) & 0x3ff)
 620                             | ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
 621
 622        hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
 623        if (!hsync_wid)
 624                hsync_wid = 1;
 625        hsync_start = mode->crtc_hsync_start - 8;
 626
 627        crtc_h_sync_strt_wid = ((hsync_start & 0x1fff)
 628                                | ((hsync_wid & 0x3f) << 16)
 629                                | ((mode->flags & DRM_MODE_FLAG_NHSYNC)
 630                                   ? RADEON_CRTC_H_SYNC_POL
 631                                   : 0));
 632
 633        /* This works for double scan mode. */
 634        crtc_v_total_disp = (((mode->crtc_vtotal - 1) & 0xffff)
 635                             | ((mode->crtc_vdisplay - 1) << 16));
 636
 637        vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
 638        if (!vsync_wid)
 639                vsync_wid = 1;
 640
 641        crtc_v_sync_strt_wid = (((mode->crtc_vsync_start - 1) & 0xfff)
 642                                | ((vsync_wid & 0x1f) << 16)
 643                                | ((mode->flags & DRM_MODE_FLAG_NVSYNC)
 644                                   ? RADEON_CRTC_V_SYNC_POL
 645                                   : 0));
 646
 647        if (radeon_crtc->crtc_id) {
 648                uint32_t crtc2_gen_cntl;
 649                uint32_t disp2_merge_cntl;
 650
 651                /* if TV DAC is enabled for another crtc and keep it enabled */
 652                crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL) & 0x00718080;
 653                crtc2_gen_cntl |= ((format << 8)
 654                                   | RADEON_CRTC2_VSYNC_DIS
 655                                   | RADEON_CRTC2_HSYNC_DIS
 656                                   | RADEON_CRTC2_DISP_DIS
 657                                   | RADEON_CRTC2_DISP_REQ_EN_B
 658                                   | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
 659                                      ? RADEON_CRTC2_DBL_SCAN_EN
 660                                      : 0)
 661                                   | ((mode->flags & DRM_MODE_FLAG_CSYNC)
 662                                      ? RADEON_CRTC2_CSYNC_EN
 663                                      : 0)
 664                                   | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
 665                                      ? RADEON_CRTC2_INTERLACE_EN
 666                                      : 0));
 667
 668                /* rs4xx chips seem to like to have the crtc enabled when the timing is set */
 669                if ((rdev->family == CHIP_RS400) || (rdev->family == CHIP_RS480))
 670                        crtc2_gen_cntl |= RADEON_CRTC2_EN;
 671
 672                disp2_merge_cntl = RREG32(RADEON_DISP2_MERGE_CNTL);
 673                disp2_merge_cntl &= ~RADEON_DISP2_RGB_OFFSET_EN;
 674
 675                WREG32(RADEON_DISP2_MERGE_CNTL, disp2_merge_cntl);
 676                WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
 677
 678                WREG32(RADEON_FP_H2_SYNC_STRT_WID, crtc_h_sync_strt_wid);
 679                WREG32(RADEON_FP_V2_SYNC_STRT_WID, crtc_v_sync_strt_wid);
 680        } else {
 681                uint32_t crtc_gen_cntl;
 682                uint32_t crtc_ext_cntl;
 683                uint32_t disp_merge_cntl;
 684
 685                crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL) & 0x00718000;
 686                crtc_gen_cntl |= (RADEON_CRTC_EXT_DISP_EN
 687                                 | (format << 8)
 688                                 | RADEON_CRTC_DISP_REQ_EN_B
 689                                 | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
 690                                    ? RADEON_CRTC_DBL_SCAN_EN
 691                                    : 0)
 692                                 | ((mode->flags & DRM_MODE_FLAG_CSYNC)
 693                                    ? RADEON_CRTC_CSYNC_EN
 694                                    : 0)
 695                                 | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
 696                                    ? RADEON_CRTC_INTERLACE_EN
 697                                    : 0));
 698
 699                /* rs4xx chips seem to like to have the crtc enabled when the timing is set */
 700                if ((rdev->family == CHIP_RS400) || (rdev->family == CHIP_RS480))
 701                        crtc_gen_cntl |= RADEON_CRTC_EN;
 702
 703                crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
 704                crtc_ext_cntl |= (RADEON_XCRT_CNT_EN |
 705                                  RADEON_CRTC_VSYNC_DIS |
 706                                  RADEON_CRTC_HSYNC_DIS |
 707                                  RADEON_CRTC_DISPLAY_DIS);
 708
 709                disp_merge_cntl = RREG32(RADEON_DISP_MERGE_CNTL);
 710                disp_merge_cntl &= ~RADEON_DISP_RGB_OFFSET_EN;
 711
 712                WREG32(RADEON_DISP_MERGE_CNTL, disp_merge_cntl);
 713                WREG32(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl);
 714                WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
 715        }
 716
 717        if (is_tv)
 718                radeon_legacy_tv_adjust_crtc_reg(encoder, &crtc_h_total_disp,
 719                                                 &crtc_h_sync_strt_wid, &crtc_v_total_disp,
 720                                                 &crtc_v_sync_strt_wid);
 721
 722        WREG32(RADEON_CRTC_H_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_h_total_disp);
 723        WREG32(RADEON_CRTC_H_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_h_sync_strt_wid);
 724        WREG32(RADEON_CRTC_V_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_v_total_disp);
 725        WREG32(RADEON_CRTC_V_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_v_sync_strt_wid);
 726
 727        return true;
 728}
 729
 730static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
 731{
 732        struct drm_device *dev = crtc->dev;
 733        struct radeon_device *rdev = dev->dev_private;
 734        struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
 735        struct drm_encoder *encoder;
 736        uint32_t feedback_div = 0;
 737        uint32_t frac_fb_div = 0;
 738        uint32_t reference_div = 0;
 739        uint32_t post_divider = 0;
 740        uint32_t freq = 0;
 741        uint8_t pll_gain;
 742        bool use_bios_divs = false;
 743        /* PLL registers */
 744        uint32_t pll_ref_div = 0;
 745        uint32_t pll_fb_post_div = 0;
 746        uint32_t htotal_cntl = 0;
 747        bool is_tv = false;
 748        struct radeon_pll *pll;
 749
 750        struct {
 751                int divider;
 752                int bitvalue;
 753        } *post_div, post_divs[]   = {
 754                /* From RAGE 128 VR/RAGE 128 GL Register
 755                 * Reference Manual (Technical Reference
 756                 * Manual P/N RRG-G04100-C Rev. 0.04), page
 757                 * 3-17 (PLL_DIV_[3:0]).
 758                 */
 759                {  1, 0 },              /* VCLK_SRC                 */
 760                {  2, 1 },              /* VCLK_SRC/2               */
 761                {  4, 2 },              /* VCLK_SRC/4               */
 762                {  8, 3 },              /* VCLK_SRC/8               */
 763                {  3, 4 },              /* VCLK_SRC/3               */
 764                { 16, 5 },              /* VCLK_SRC/16              */
 765                {  6, 6 },              /* VCLK_SRC/6               */
 766                { 12, 7 },              /* VCLK_SRC/12              */
 767                {  0, 0 }
 768        };
 769
 770        if (radeon_crtc->crtc_id)
 771                pll = &rdev->clock.p2pll;
 772        else
 773                pll = &rdev->clock.p1pll;
 774
 775        pll->flags = RADEON_PLL_LEGACY;
 776
 777        if (mode->clock > 200000) /* range limits??? */
 778                pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
 779        else
 780                pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
 781
 782        list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
 783                if (encoder->crtc == crtc) {
 784                        struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
 785
 786                        if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
 787                                is_tv = true;
 788                                break;
 789                        }
 790
 791                        if (encoder->encoder_type != DRM_MODE_ENCODER_DAC)
 792                                pll->flags |= RADEON_PLL_NO_ODD_POST_DIV;
 793                        if (encoder->encoder_type == DRM_MODE_ENCODER_LVDS) {
 794                                if (!rdev->is_atom_bios) {
 795                                        struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
 796                                        struct radeon_encoder_lvds *lvds = (struct radeon_encoder_lvds *)radeon_encoder->enc_priv;
 797                                        if (lvds) {
 798                                                if (lvds->use_bios_dividers) {
 799                                                        pll_ref_div = lvds->panel_ref_divider;
 800                                                        pll_fb_post_div   = (lvds->panel_fb_divider |
 801                                                                             (lvds->panel_post_divider << 16));
 802                                                        htotal_cntl  = 0;
 803                                                        use_bios_divs = true;
 804                                                }
 805                                        }
 806                                }
 807                                pll->flags |= RADEON_PLL_USE_REF_DIV;
 808                        }
 809                }
 810        }
 811
 812        DRM_DEBUG_KMS("\n");
 813
 814        if (!use_bios_divs) {
 815                radeon_compute_pll_legacy(pll, mode->clock,
 816                                          &freq, &feedback_div, &frac_fb_div,
 817                                          &reference_div, &post_divider);
 818
 819                for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
 820                        if (post_div->divider == post_divider)
 821                                break;
 822                }
 823
 824                if (!post_div->divider)
 825                        post_div = &post_divs[0];
 826
 827                DRM_DEBUG_KMS("dc=%u, fd=%d, rd=%d, pd=%d\n",
 828                          (unsigned)freq,
 829                          feedback_div,
 830                          reference_div,
 831                          post_divider);
 832
 833                pll_ref_div   = reference_div;
 834#if defined(__powerpc__) && (0) /* TODO */
 835                /* apparently programming this otherwise causes a hang??? */
 836                if (info->MacModel == RADEON_MAC_IBOOK)
 837                        pll_fb_post_div = 0x000600ad;
 838                else
 839#endif
 840                        pll_fb_post_div     = (feedback_div | (post_div->bitvalue << 16));
 841
 842                htotal_cntl    = mode->htotal & 0x7;
 843
 844        }
 845
 846        pll_gain = radeon_compute_pll_gain(pll->reference_freq,
 847                                           pll_ref_div & 0x3ff,
 848                                           pll_fb_post_div & 0x7ff);
 849
 850        if (radeon_crtc->crtc_id) {
 851                uint32_t pixclks_cntl = ((RREG32_PLL(RADEON_PIXCLKS_CNTL) &
 852                                          ~(RADEON_PIX2CLK_SRC_SEL_MASK)) |
 853                                         RADEON_PIX2CLK_SRC_SEL_P2PLLCLK);
 854
 855                if (is_tv) {
 856                        radeon_legacy_tv_adjust_pll2(encoder, &htotal_cntl,
 857                                                     &pll_ref_div, &pll_fb_post_div,
 858                                                     &pixclks_cntl);
 859                }
 860
 861                WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
 862                             RADEON_PIX2CLK_SRC_SEL_CPUCLK,
 863                             ~(RADEON_PIX2CLK_SRC_SEL_MASK));
 864
 865                WREG32_PLL_P(RADEON_P2PLL_CNTL,
 866                             RADEON_P2PLL_RESET
 867                             | RADEON_P2PLL_ATOMIC_UPDATE_EN
 868                             | ((uint32_t)pll_gain << RADEON_P2PLL_PVG_SHIFT),
 869                             ~(RADEON_P2PLL_RESET
 870                               | RADEON_P2PLL_ATOMIC_UPDATE_EN
 871                               | RADEON_P2PLL_PVG_MASK));
 872
 873                WREG32_PLL_P(RADEON_P2PLL_REF_DIV,
 874                             pll_ref_div,
 875                             ~RADEON_P2PLL_REF_DIV_MASK);
 876
 877                WREG32_PLL_P(RADEON_P2PLL_DIV_0,
 878                             pll_fb_post_div,
 879                             ~RADEON_P2PLL_FB0_DIV_MASK);
 880
 881                WREG32_PLL_P(RADEON_P2PLL_DIV_0,
 882                             pll_fb_post_div,
 883                             ~RADEON_P2PLL_POST0_DIV_MASK);
 884
 885                radeon_pll2_write_update(dev);
 886                radeon_pll2_wait_for_read_update_complete(dev);
 887
 888                WREG32_PLL(RADEON_HTOTAL2_CNTL, htotal_cntl);
 889
 890                WREG32_PLL_P(RADEON_P2PLL_CNTL,
 891                             0,
 892                             ~(RADEON_P2PLL_RESET
 893                               | RADEON_P2PLL_SLEEP
 894                               | RADEON_P2PLL_ATOMIC_UPDATE_EN));
 895
 896                DRM_DEBUG_KMS("Wrote2: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
 897                          (unsigned)pll_ref_div,
 898                          (unsigned)pll_fb_post_div,
 899                          (unsigned)htotal_cntl,
 900                          RREG32_PLL(RADEON_P2PLL_CNTL));
 901                DRM_DEBUG_KMS("Wrote2: rd=%u, fd=%u, pd=%u\n",
 902                          (unsigned)pll_ref_div & RADEON_P2PLL_REF_DIV_MASK,
 903                          (unsigned)pll_fb_post_div & RADEON_P2PLL_FB0_DIV_MASK,
 904                          (unsigned)((pll_fb_post_div &
 905                                      RADEON_P2PLL_POST0_DIV_MASK) >> 16));
 906
 907                mdelay(50); /* Let the clock to lock */
 908
 909                WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
 910                             RADEON_PIX2CLK_SRC_SEL_P2PLLCLK,
 911                             ~(RADEON_PIX2CLK_SRC_SEL_MASK));
 912
 913                WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
 914        } else {
 915                uint32_t pixclks_cntl;
 916
 917
 918                if (is_tv) {
 919                        pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL);
 920                        radeon_legacy_tv_adjust_pll1(encoder, &htotal_cntl, &pll_ref_div,
 921                                                     &pll_fb_post_div, &pixclks_cntl);
 922                }
 923
 924                if (rdev->flags & RADEON_IS_MOBILITY) {
 925                        /* A temporal workaround for the occasional blanking on certain laptop panels.
 926                           This appears to related to the PLL divider registers (fail to lock?).
 927                           It occurs even when all dividers are the same with their old settings.
 928                           In this case we really don't need to fiddle with PLL registers.
 929                           By doing this we can avoid the blanking problem with some panels.
 930                        */
 931                        if ((pll_ref_div == (RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_REF_DIV_MASK)) &&
 932                            (pll_fb_post_div == (RREG32_PLL(RADEON_PPLL_DIV_3) &
 933                                                 (RADEON_PPLL_POST3_DIV_MASK | RADEON_PPLL_FB3_DIV_MASK)))) {
 934                                WREG32_P(RADEON_CLOCK_CNTL_INDEX,
 935                                         RADEON_PLL_DIV_SEL,
 936                                         ~(RADEON_PLL_DIV_SEL));
 937                                r100_pll_errata_after_index(rdev);
 938                                return;
 939                        }
 940                }
 941
 942                WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
 943                             RADEON_VCLK_SRC_SEL_CPUCLK,
 944                             ~(RADEON_VCLK_SRC_SEL_MASK));
 945                WREG32_PLL_P(RADEON_PPLL_CNTL,
 946                             RADEON_PPLL_RESET
 947                             | RADEON_PPLL_ATOMIC_UPDATE_EN
 948                             | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
 949                             | ((uint32_t)pll_gain << RADEON_PPLL_PVG_SHIFT),
 950                             ~(RADEON_PPLL_RESET
 951                               | RADEON_PPLL_ATOMIC_UPDATE_EN
 952                               | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
 953                               | RADEON_PPLL_PVG_MASK));
 954
 955                WREG32_P(RADEON_CLOCK_CNTL_INDEX,
 956                         RADEON_PLL_DIV_SEL,
 957                         ~(RADEON_PLL_DIV_SEL));
 958                r100_pll_errata_after_index(rdev);
 959
 960                if (ASIC_IS_R300(rdev) ||
 961                    (rdev->family == CHIP_RS300) ||
 962                    (rdev->family == CHIP_RS400) ||
 963                    (rdev->family == CHIP_RS480)) {
 964                        if (pll_ref_div & R300_PPLL_REF_DIV_ACC_MASK) {
 965                                /* When restoring console mode, use saved PPLL_REF_DIV
 966                                 * setting.
 967                                 */
 968                                WREG32_PLL_P(RADEON_PPLL_REF_DIV,
 969                                             pll_ref_div,
 970                                             0);
 971                        } else {
 972                                /* R300 uses ref_div_acc field as real ref divider */
 973                                WREG32_PLL_P(RADEON_PPLL_REF_DIV,
 974                                             (pll_ref_div << R300_PPLL_REF_DIV_ACC_SHIFT),
 975                                             ~R300_PPLL_REF_DIV_ACC_MASK);
 976                        }
 977                } else
 978                        WREG32_PLL_P(RADEON_PPLL_REF_DIV,
 979                                     pll_ref_div,
 980                                     ~RADEON_PPLL_REF_DIV_MASK);
 981
 982                WREG32_PLL_P(RADEON_PPLL_DIV_3,
 983                             pll_fb_post_div,
 984                             ~RADEON_PPLL_FB3_DIV_MASK);
 985
 986                WREG32_PLL_P(RADEON_PPLL_DIV_3,
 987                             pll_fb_post_div,
 988                             ~RADEON_PPLL_POST3_DIV_MASK);
 989
 990                radeon_pll_write_update(dev);
 991                radeon_pll_wait_for_read_update_complete(dev);
 992
 993                WREG32_PLL(RADEON_HTOTAL_CNTL, htotal_cntl);
 994
 995                WREG32_PLL_P(RADEON_PPLL_CNTL,
 996                             0,
 997                             ~(RADEON_PPLL_RESET
 998                               | RADEON_PPLL_SLEEP
 999                               | RADEON_PPLL_ATOMIC_UPDATE_EN
1000                               | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN));
1001
1002                DRM_DEBUG_KMS("Wrote: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
1003                          pll_ref_div,
1004                          pll_fb_post_div,
1005                          (unsigned)htotal_cntl,
1006                          RREG32_PLL(RADEON_PPLL_CNTL));
1007                DRM_DEBUG_KMS("Wrote: rd=%d, fd=%d, pd=%d\n",
1008                          pll_ref_div & RADEON_PPLL_REF_DIV_MASK,
1009                          pll_fb_post_div & RADEON_PPLL_FB3_DIV_MASK,
1010                          (pll_fb_post_div & RADEON_PPLL_POST3_DIV_MASK) >> 16);
1011
1012                mdelay(50); /* Let the clock to lock */
1013
1014                WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
1015                             RADEON_VCLK_SRC_SEL_PPLLCLK,
1016                             ~(RADEON_VCLK_SRC_SEL_MASK));
1017
1018                if (is_tv)
1019                        WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
1020        }
1021}
1022
1023static bool radeon_crtc_mode_fixup(struct drm_crtc *crtc,
1024                                   const struct drm_display_mode *mode,
1025                                   struct drm_display_mode *adjusted_mode)
1026{
1027        if (!radeon_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode))
1028                return false;
1029        return true;
1030}
1031
1032static int radeon_crtc_mode_set(struct drm_crtc *crtc,
1033                                 struct drm_display_mode *mode,
1034                                 struct drm_display_mode *adjusted_mode,
1035                                 int x, int y, struct drm_framebuffer *old_fb)
1036{
1037        struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1038
1039        /* TODO TV */
1040        radeon_crtc_set_base(crtc, x, y, old_fb);
1041        radeon_set_crtc_timing(crtc, adjusted_mode);
1042        radeon_set_pll(crtc, adjusted_mode);
1043        radeon_overscan_setup(crtc, adjusted_mode);
1044        if (radeon_crtc->crtc_id == 0) {
1045                radeon_legacy_rmx_mode_set(crtc, adjusted_mode);
1046        } else {
1047                if (radeon_crtc->rmx_type != RMX_OFF) {
1048                        /* FIXME: only first crtc has rmx what should we
1049                         * do ?
1050                         */
1051                        DRM_ERROR("Mode need scaling but only first crtc can do that.\n");
1052                }
1053        }
1054        radeon_cursor_reset(crtc);
1055        return 0;
1056}
1057
1058static void radeon_crtc_prepare(struct drm_crtc *crtc)
1059{
1060        struct drm_device *dev = crtc->dev;
1061        struct drm_crtc *crtci;
1062
1063        /*
1064        * The hardware wedges sometimes if you reconfigure one CRTC
1065        * whilst another is running (see fdo bug #24611).
1066        */
1067        list_for_each_entry(crtci, &dev->mode_config.crtc_list, head)
1068                radeon_crtc_dpms(crtci, DRM_MODE_DPMS_OFF);
1069}
1070
1071static void radeon_crtc_commit(struct drm_crtc *crtc)
1072{
1073        struct drm_device *dev = crtc->dev;
1074        struct drm_crtc *crtci;
1075
1076        /*
1077        * Reenable the CRTCs that should be running.
1078        */
1079        list_for_each_entry(crtci, &dev->mode_config.crtc_list, head) {
1080                if (crtci->enabled)
1081                        radeon_crtc_dpms(crtci, DRM_MODE_DPMS_ON);
1082        }
1083}
1084
1085static void radeon_crtc_disable(struct drm_crtc *crtc)
1086{
1087        radeon_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
1088        if (crtc->primary->fb) {
1089                int r;
1090                struct radeon_bo *rbo;
1091
1092                rbo = gem_to_radeon_bo(crtc->primary->fb->obj[0]);
1093                r = radeon_bo_reserve(rbo, false);
1094                if (unlikely(r))
1095                        DRM_ERROR("failed to reserve rbo before unpin\n");
1096                else {
1097                        radeon_bo_unpin(rbo);
1098                        radeon_bo_unreserve(rbo);
1099                }
1100        }
1101}
1102
1103static const struct drm_crtc_helper_funcs legacy_helper_funcs = {
1104        .dpms = radeon_crtc_dpms,
1105        .mode_fixup = radeon_crtc_mode_fixup,
1106        .mode_set = radeon_crtc_mode_set,
1107        .mode_set_base = radeon_crtc_set_base,
1108        .mode_set_base_atomic = radeon_crtc_set_base_atomic,
1109        .prepare = radeon_crtc_prepare,
1110        .commit = radeon_crtc_commit,
1111        .disable = radeon_crtc_disable
1112};
1113
1114
1115void radeon_legacy_init_crtc(struct drm_device *dev,
1116                               struct radeon_crtc *radeon_crtc)
1117{
1118        if (radeon_crtc->crtc_id == 1)
1119                radeon_crtc->crtc_offset = RADEON_CRTC2_H_TOTAL_DISP - RADEON_CRTC_H_TOTAL_DISP;
1120        drm_crtc_helper_add(&radeon_crtc->base, &legacy_helper_funcs);
1121}
1122