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