Subversion Repositories Kolibri OS

Rev

Rev 3120 | Rev 5078 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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