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