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