LCOV - code coverage report
Current view: top level - dev/pci/drm/radeon - radeon_legacy_crtc.c (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 502 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 19 0.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.13