drm/radeon: Remove unnecessary include statements for drm_crtc_helper.h
[platform/kernel/linux-rpi.git] / drivers / gpu / drm / radeon / radeon_legacy_tv.c
1 // SPDX-License-Identifier: MIT
2
3 #include <drm/drm_device.h>
4
5 #include "radeon.h"
6
7 /*
8  * Integrated TV out support based on the GATOS code by
9  * Federico Ulivi <fulivi@lycos.com>
10  */
11
12
13 /*
14  * Limits of h/v positions (hPos & vPos)
15  */
16 #define MAX_H_POSITION 5 /* Range: [-5..5], negative is on the left, 0 is default, positive is on the right */
17 #define MAX_V_POSITION 5 /* Range: [-5..5], negative is up, 0 is default, positive is down */
18
19 /*
20  * Unit for hPos (in TV clock periods)
21  */
22 #define H_POS_UNIT 10
23
24 /*
25  * Indexes in h. code timing table for horizontal line position adjustment
26  */
27 #define H_TABLE_POS1 6
28 #define H_TABLE_POS2 8
29
30 /*
31  * Limits of hor. size (hSize)
32  */
33 #define MAX_H_SIZE 5 /* Range: [-5..5], negative is smaller, positive is larger */
34
35 /* tv standard constants */
36 #define NTSC_TV_CLOCK_T 233
37 #define NTSC_TV_VFTOTAL 1
38 #define NTSC_TV_LINES_PER_FRAME 525
39 #define NTSC_TV_ZERO_H_SIZE 479166
40 #define NTSC_TV_H_SIZE_UNIT 9478
41
42 #define PAL_TV_CLOCK_T 188
43 #define PAL_TV_VFTOTAL 3
44 #define PAL_TV_LINES_PER_FRAME 625
45 #define PAL_TV_ZERO_H_SIZE 473200
46 #define PAL_TV_H_SIZE_UNIT 9360
47
48 /* tv pll setting for 27 mhz ref clk */
49 #define NTSC_TV_PLL_M_27 22
50 #define NTSC_TV_PLL_N_27 175
51 #define NTSC_TV_PLL_P_27 5
52
53 #define PAL_TV_PLL_M_27 113
54 #define PAL_TV_PLL_N_27 668
55 #define PAL_TV_PLL_P_27 3
56
57 /* tv pll setting for 14 mhz ref clk */
58 #define NTSC_TV_PLL_M_14 33
59 #define NTSC_TV_PLL_N_14 693
60 #define NTSC_TV_PLL_P_14 7
61
62 #define PAL_TV_PLL_M_14 19
63 #define PAL_TV_PLL_N_14 353
64 #define PAL_TV_PLL_P_14 5
65
66 #define VERT_LEAD_IN_LINES 2
67 #define FRAC_BITS 0xe
68 #define FRAC_MASK 0x3fff
69
70 struct radeon_tv_mode_constants {
71         uint16_t hor_resolution;
72         uint16_t ver_resolution;
73         enum radeon_tv_std standard;
74         uint16_t hor_total;
75         uint16_t ver_total;
76         uint16_t hor_start;
77         uint16_t hor_syncstart;
78         uint16_t ver_syncstart;
79         unsigned def_restart;
80         uint16_t crtcPLL_N;
81         uint8_t  crtcPLL_M;
82         uint8_t  crtcPLL_post_div;
83         unsigned pix_to_tv;
84 };
85
86 static const uint16_t hor_timing_NTSC[MAX_H_CODE_TIMING_LEN] = {
87         0x0007,
88         0x003f,
89         0x0263,
90         0x0a24,
91         0x2a6b,
92         0x0a36,
93         0x126d, /* H_TABLE_POS1 */
94         0x1bfe,
95         0x1a8f, /* H_TABLE_POS2 */
96         0x1ec7,
97         0x3863,
98         0x1bfe,
99         0x1bfe,
100         0x1a2a,
101         0x1e95,
102         0x0e31,
103         0x201b,
104         0
105 };
106
107 static const uint16_t vert_timing_NTSC[MAX_V_CODE_TIMING_LEN] = {
108         0x2001,
109         0x200d,
110         0x1006,
111         0x0c06,
112         0x1006,
113         0x1818,
114         0x21e3,
115         0x1006,
116         0x0c06,
117         0x1006,
118         0x1817,
119         0x21d4,
120         0x0002,
121         0
122 };
123
124 static const uint16_t hor_timing_PAL[MAX_H_CODE_TIMING_LEN] = {
125         0x0007,
126         0x0058,
127         0x027c,
128         0x0a31,
129         0x2a77,
130         0x0a95,
131         0x124f, /* H_TABLE_POS1 */
132         0x1bfe,
133         0x1b22, /* H_TABLE_POS2 */
134         0x1ef9,
135         0x387c,
136         0x1bfe,
137         0x1bfe,
138         0x1b31,
139         0x1eb5,
140         0x0e43,
141         0x201b,
142         0
143 };
144
145 static const uint16_t vert_timing_PAL[MAX_V_CODE_TIMING_LEN] = {
146         0x2001,
147         0x200c,
148         0x1005,
149         0x0c05,
150         0x1005,
151         0x1401,
152         0x1821,
153         0x2240,
154         0x1005,
155         0x0c05,
156         0x1005,
157         0x1401,
158         0x1822,
159         0x2230,
160         0x0002,
161         0
162 };
163
164 /**********************************************************************
165  *
166  * availableModes
167  *
168  * Table of all allowed modes for tv output
169  *
170  **********************************************************************/
171 static const struct radeon_tv_mode_constants available_tv_modes[] = {
172         {   /* NTSC timing for 27 Mhz ref clk */
173                 800,                /* horResolution */
174                 600,                /* verResolution */
175                 TV_STD_NTSC,        /* standard */
176                 990,                /* horTotal */
177                 740,                /* verTotal */
178                 813,                /* horStart */
179                 824,                /* horSyncStart */
180                 632,                /* verSyncStart */
181                 625592,             /* defRestart */
182                 592,                /* crtcPLL_N */
183                 91,                 /* crtcPLL_M */
184                 4,                  /* crtcPLL_postDiv */
185                 1022,               /* pixToTV */
186         },
187         {   /* PAL timing for 27 Mhz ref clk */
188                 800,               /* horResolution */
189                 600,               /* verResolution */
190                 TV_STD_PAL,        /* standard */
191                 1144,              /* horTotal */
192                 706,               /* verTotal */
193                 812,               /* horStart */
194                 824,               /* horSyncStart */
195                 669,               /* verSyncStart */
196                 696700,            /* defRestart */
197                 1382,              /* crtcPLL_N */
198                 231,               /* crtcPLL_M */
199                 4,                 /* crtcPLL_postDiv */
200                 759,               /* pixToTV */
201         },
202         {   /* NTSC timing for 14 Mhz ref clk */
203                 800,                /* horResolution */
204                 600,                /* verResolution */
205                 TV_STD_NTSC,        /* standard */
206                 1018,               /* horTotal */
207                 727,                /* verTotal */
208                 813,                /* horStart */
209                 840,                /* horSyncStart */
210                 633,                /* verSyncStart */
211                 630627,             /* defRestart */
212                 347,                /* crtcPLL_N */
213                 14,                 /* crtcPLL_M */
214                 8,                  /* crtcPLL_postDiv */
215                 1022,               /* pixToTV */
216         },
217         { /* PAL timing for 14 Mhz ref clk */
218                 800,                /* horResolution */
219                 600,                /* verResolution */
220                 TV_STD_PAL,         /* standard */
221                 1131,               /* horTotal */
222                 742,                /* verTotal */
223                 813,                /* horStart */
224                 840,                /* horSyncStart */
225                 633,                /* verSyncStart */
226                 708369,             /* defRestart */
227                 211,                /* crtcPLL_N */
228                 9,                  /* crtcPLL_M */
229                 8,                  /* crtcPLL_postDiv */
230                 759,                /* pixToTV */
231         },
232 };
233
234 #define N_AVAILABLE_MODES ARRAY_SIZE(available_tv_modes)
235
236 static const struct radeon_tv_mode_constants *radeon_legacy_tv_get_std_mode(struct radeon_encoder *radeon_encoder,
237                                                                             uint16_t *pll_ref_freq)
238 {
239         struct drm_device *dev = radeon_encoder->base.dev;
240         struct radeon_device *rdev = dev->dev_private;
241         struct radeon_crtc *radeon_crtc;
242         struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
243         const struct radeon_tv_mode_constants *const_ptr;
244         struct radeon_pll *pll;
245
246         radeon_crtc = to_radeon_crtc(radeon_encoder->base.crtc);
247         if (radeon_crtc->crtc_id == 1)
248                 pll = &rdev->clock.p2pll;
249         else
250                 pll = &rdev->clock.p1pll;
251
252         if (pll_ref_freq)
253                 *pll_ref_freq = pll->reference_freq;
254
255         if (tv_dac->tv_std == TV_STD_NTSC ||
256             tv_dac->tv_std == TV_STD_NTSC_J ||
257             tv_dac->tv_std == TV_STD_PAL_M) {
258                 if (pll->reference_freq == 2700)
259                         const_ptr = &available_tv_modes[0];
260                 else
261                         const_ptr = &available_tv_modes[2];
262         } else {
263                 if (pll->reference_freq == 2700)
264                         const_ptr = &available_tv_modes[1];
265                 else
266                         const_ptr = &available_tv_modes[3];
267         }
268         return const_ptr;
269 }
270
271 static long YCOEF_value[5] = { 2, 2, 0, 4, 0 };
272 static long YCOEF_EN_value[5] = { 1, 1, 0, 1, 0 };
273 static long SLOPE_value[5] = { 1, 2, 2, 4, 8 };
274 static long SLOPE_limit[5] = { 6, 5, 4, 3, 2 };
275
276 static void radeon_wait_pll_lock(struct drm_encoder *encoder, unsigned n_tests,
277                                  unsigned n_wait_loops, unsigned cnt_threshold)
278 {
279         struct drm_device *dev = encoder->dev;
280         struct radeon_device *rdev = dev->dev_private;
281         uint32_t save_pll_test;
282         unsigned int i, j;
283
284         WREG32(RADEON_TEST_DEBUG_MUX, (RREG32(RADEON_TEST_DEBUG_MUX) & 0xffff60ff) | 0x100);
285         save_pll_test = RREG32_PLL(RADEON_PLL_TEST_CNTL);
286         WREG32_PLL(RADEON_PLL_TEST_CNTL, save_pll_test & ~RADEON_PLL_MASK_READ_B);
287
288         WREG8(RADEON_CLOCK_CNTL_INDEX, RADEON_PLL_TEST_CNTL);
289         for (i = 0; i < n_tests; i++) {
290                 WREG8(RADEON_CLOCK_CNTL_DATA + 3, 0);
291                 for (j = 0; j < n_wait_loops; j++)
292                         if (RREG8(RADEON_CLOCK_CNTL_DATA + 3) >= cnt_threshold)
293                                 break;
294         }
295         WREG32_PLL(RADEON_PLL_TEST_CNTL, save_pll_test);
296         WREG32(RADEON_TEST_DEBUG_MUX, RREG32(RADEON_TEST_DEBUG_MUX) & 0xffffe0ff);
297 }
298
299
300 static void radeon_legacy_tv_write_fifo(struct radeon_encoder *radeon_encoder,
301                                         uint16_t addr, uint32_t value)
302 {
303         struct drm_device *dev = radeon_encoder->base.dev;
304         struct radeon_device *rdev = dev->dev_private;
305         uint32_t tmp;
306         int i = 0;
307
308         WREG32(RADEON_TV_HOST_WRITE_DATA, value);
309
310         WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr);
311         WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr | RADEON_HOST_FIFO_WT);
312
313         do {
314                 tmp = RREG32(RADEON_TV_HOST_RD_WT_CNTL);
315                 if ((tmp & RADEON_HOST_FIFO_WT_ACK) == 0)
316                         break;
317                 i++;
318         } while (i < 10000);
319         WREG32(RADEON_TV_HOST_RD_WT_CNTL, 0);
320 }
321
322 #if 0 /* included for completeness */
323 static uint32_t radeon_legacy_tv_read_fifo(struct radeon_encoder *radeon_encoder, uint16_t addr)
324 {
325         struct drm_device *dev = radeon_encoder->base.dev;
326         struct radeon_device *rdev = dev->dev_private;
327         uint32_t tmp;
328         int i = 0;
329
330         WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr);
331         WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr | RADEON_HOST_FIFO_RD);
332
333         do {
334                 tmp = RREG32(RADEON_TV_HOST_RD_WT_CNTL);
335                 if ((tmp & RADEON_HOST_FIFO_RD_ACK) == 0)
336                         break;
337                 i++;
338         } while (i < 10000);
339         WREG32(RADEON_TV_HOST_RD_WT_CNTL, 0);
340         return RREG32(RADEON_TV_HOST_READ_DATA);
341 }
342 #endif
343
344 static uint16_t radeon_get_htiming_tables_addr(uint32_t tv_uv_adr)
345 {
346         uint16_t h_table;
347
348         switch ((tv_uv_adr & RADEON_HCODE_TABLE_SEL_MASK) >> RADEON_HCODE_TABLE_SEL_SHIFT) {
349         case 0:
350                 h_table = RADEON_TV_MAX_FIFO_ADDR_INTERNAL;
351                 break;
352         case 1:
353                 h_table = ((tv_uv_adr & RADEON_TABLE1_BOT_ADR_MASK) >> RADEON_TABLE1_BOT_ADR_SHIFT) * 2;
354                 break;
355         case 2:
356                 h_table = ((tv_uv_adr & RADEON_TABLE3_TOP_ADR_MASK) >> RADEON_TABLE3_TOP_ADR_SHIFT) * 2;
357                 break;
358         default:
359                 h_table = 0;
360                 break;
361         }
362         return h_table;
363 }
364
365 static uint16_t radeon_get_vtiming_tables_addr(uint32_t tv_uv_adr)
366 {
367         uint16_t v_table;
368
369         switch ((tv_uv_adr & RADEON_VCODE_TABLE_SEL_MASK) >> RADEON_VCODE_TABLE_SEL_SHIFT) {
370         case 0:
371                 v_table = ((tv_uv_adr & RADEON_MAX_UV_ADR_MASK) >> RADEON_MAX_UV_ADR_SHIFT) * 2 + 1;
372                 break;
373         case 1:
374                 v_table = ((tv_uv_adr & RADEON_TABLE1_BOT_ADR_MASK) >> RADEON_TABLE1_BOT_ADR_SHIFT) * 2 + 1;
375                 break;
376         case 2:
377                 v_table = ((tv_uv_adr & RADEON_TABLE3_TOP_ADR_MASK) >> RADEON_TABLE3_TOP_ADR_SHIFT) * 2 + 1;
378                 break;
379         default:
380                 v_table = 0;
381                 break;
382         }
383         return v_table;
384 }
385
386 static void radeon_restore_tv_timing_tables(struct radeon_encoder *radeon_encoder)
387 {
388         struct drm_device *dev = radeon_encoder->base.dev;
389         struct radeon_device *rdev = dev->dev_private;
390         struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
391         uint16_t h_table, v_table;
392         uint32_t tmp;
393         int i;
394
395         WREG32(RADEON_TV_UV_ADR, tv_dac->tv.tv_uv_adr);
396         h_table = radeon_get_htiming_tables_addr(tv_dac->tv.tv_uv_adr);
397         v_table = radeon_get_vtiming_tables_addr(tv_dac->tv.tv_uv_adr);
398
399         for (i = 0; i < MAX_H_CODE_TIMING_LEN; i += 2, h_table--) {
400                 tmp = ((uint32_t)tv_dac->tv.h_code_timing[i] << 14) | ((uint32_t)tv_dac->tv.h_code_timing[i+1]);
401                 radeon_legacy_tv_write_fifo(radeon_encoder, h_table, tmp);
402                 if (tv_dac->tv.h_code_timing[i] == 0 || tv_dac->tv.h_code_timing[i + 1] == 0)
403                         break;
404         }
405         for (i = 0; i < MAX_V_CODE_TIMING_LEN; i += 2, v_table++) {
406                 tmp = ((uint32_t)tv_dac->tv.v_code_timing[i+1] << 14) | ((uint32_t)tv_dac->tv.v_code_timing[i]);
407                 radeon_legacy_tv_write_fifo(radeon_encoder, v_table, tmp);
408                 if (tv_dac->tv.v_code_timing[i] == 0 || tv_dac->tv.v_code_timing[i + 1] == 0)
409                         break;
410         }
411 }
412
413 static void radeon_legacy_write_tv_restarts(struct radeon_encoder *radeon_encoder)
414 {
415         struct drm_device *dev = radeon_encoder->base.dev;
416         struct radeon_device *rdev = dev->dev_private;
417         struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
418         WREG32(RADEON_TV_FRESTART, tv_dac->tv.frestart);
419         WREG32(RADEON_TV_HRESTART, tv_dac->tv.hrestart);
420         WREG32(RADEON_TV_VRESTART, tv_dac->tv.vrestart);
421 }
422
423 static bool radeon_legacy_tv_init_restarts(struct drm_encoder *encoder)
424 {
425         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
426         struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
427         int restart;
428         unsigned int h_total, v_total, f_total;
429         int v_offset, h_offset;
430         u16 p1, p2, h_inc;
431         bool h_changed;
432         const struct radeon_tv_mode_constants *const_ptr;
433
434         const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
435         if (!const_ptr)
436                 return false;
437
438         h_total = const_ptr->hor_total;
439         v_total = const_ptr->ver_total;
440
441         if (tv_dac->tv_std == TV_STD_NTSC ||
442             tv_dac->tv_std == TV_STD_NTSC_J ||
443             tv_dac->tv_std == TV_STD_PAL_M ||
444             tv_dac->tv_std == TV_STD_PAL_60)
445                 f_total = NTSC_TV_VFTOTAL + 1;
446         else
447                 f_total = PAL_TV_VFTOTAL + 1;
448
449         /* adjust positions 1&2 in hor. cod timing table */
450         h_offset = tv_dac->h_pos * H_POS_UNIT;
451
452         if (tv_dac->tv_std == TV_STD_NTSC ||
453             tv_dac->tv_std == TV_STD_NTSC_J ||
454             tv_dac->tv_std == TV_STD_PAL_M) {
455                 h_offset -= 50;
456                 p1 = hor_timing_NTSC[H_TABLE_POS1];
457                 p2 = hor_timing_NTSC[H_TABLE_POS2];
458         } else {
459                 p1 = hor_timing_PAL[H_TABLE_POS1];
460                 p2 = hor_timing_PAL[H_TABLE_POS2];
461         }
462
463         p1 = (u16)((int)p1 + h_offset);
464         p2 = (u16)((int)p2 - h_offset);
465
466         h_changed = (p1 != tv_dac->tv.h_code_timing[H_TABLE_POS1] ||
467                      p2 != tv_dac->tv.h_code_timing[H_TABLE_POS2]);
468
469         tv_dac->tv.h_code_timing[H_TABLE_POS1] = p1;
470         tv_dac->tv.h_code_timing[H_TABLE_POS2] = p2;
471
472         /* Convert hOffset from n. of TV clock periods to n. of CRTC clock periods (CRTC pixels) */
473         h_offset = (h_offset * (int)(const_ptr->pix_to_tv)) / 1000;
474
475         /* adjust restart */
476         restart = const_ptr->def_restart;
477
478         /*
479          * convert v_pos TV lines to n. of CRTC pixels
480          */
481         if (tv_dac->tv_std == TV_STD_NTSC ||
482             tv_dac->tv_std == TV_STD_NTSC_J ||
483             tv_dac->tv_std == TV_STD_PAL_M ||
484             tv_dac->tv_std == TV_STD_PAL_60)
485                 v_offset = ((int)(v_total * h_total) * 2 * tv_dac->v_pos) / (int)(NTSC_TV_LINES_PER_FRAME);
486         else
487                 v_offset = ((int)(v_total * h_total) * 2 * tv_dac->v_pos) / (int)(PAL_TV_LINES_PER_FRAME);
488
489         restart -= v_offset + h_offset;
490
491         DRM_DEBUG_KMS("compute_restarts: def = %u h = %d v = %d, p1 = %04x, p2 = %04x, restart = %d\n",
492                   const_ptr->def_restart, tv_dac->h_pos, tv_dac->v_pos, p1, p2, restart);
493
494         tv_dac->tv.hrestart = restart % h_total;
495         restart /= h_total;
496         tv_dac->tv.vrestart = restart % v_total;
497         restart /= v_total;
498         tv_dac->tv.frestart = restart % f_total;
499
500         DRM_DEBUG_KMS("compute_restart: F/H/V=%u,%u,%u\n",
501                   (unsigned)tv_dac->tv.frestart,
502                   (unsigned)tv_dac->tv.vrestart,
503                   (unsigned)tv_dac->tv.hrestart);
504
505         /* compute h_inc from hsize */
506         if (tv_dac->tv_std == TV_STD_NTSC ||
507             tv_dac->tv_std == TV_STD_NTSC_J ||
508             tv_dac->tv_std == TV_STD_PAL_M)
509                 h_inc = (u16)((int)(const_ptr->hor_resolution * 4096 * NTSC_TV_CLOCK_T) /
510                               (tv_dac->h_size * (int)(NTSC_TV_H_SIZE_UNIT) + (int)(NTSC_TV_ZERO_H_SIZE)));
511         else
512                 h_inc = (u16)((int)(const_ptr->hor_resolution * 4096 * PAL_TV_CLOCK_T) /
513                               (tv_dac->h_size * (int)(PAL_TV_H_SIZE_UNIT) + (int)(PAL_TV_ZERO_H_SIZE)));
514
515         tv_dac->tv.timing_cntl = (tv_dac->tv.timing_cntl & ~RADEON_H_INC_MASK) |
516                 ((u32)h_inc << RADEON_H_INC_SHIFT);
517
518         DRM_DEBUG_KMS("compute_restart: h_size = %d h_inc = %d\n", tv_dac->h_size, h_inc);
519
520         return h_changed;
521 }
522
523 void radeon_legacy_tv_mode_set(struct drm_encoder *encoder,
524                                struct drm_display_mode *mode,
525                                struct drm_display_mode *adjusted_mode)
526 {
527         struct drm_device *dev = encoder->dev;
528         struct radeon_device *rdev = dev->dev_private;
529         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
530         struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
531         const struct radeon_tv_mode_constants *const_ptr;
532         struct radeon_crtc *radeon_crtc;
533         int i;
534         uint16_t pll_ref_freq;
535         uint32_t vert_space, flicker_removal, tmp;
536         uint32_t tv_master_cntl, tv_rgb_cntl, tv_dac_cntl;
537         uint32_t tv_modulator_cntl1, tv_modulator_cntl2;
538         uint32_t tv_vscaler_cntl1, tv_vscaler_cntl2;
539         uint32_t tv_pll_cntl, tv_ftotal;
540         uint32_t tv_y_fall_cntl, tv_y_rise_cntl, tv_y_saw_tooth_cntl;
541         uint32_t m, n, p;
542         const uint16_t *hor_timing;
543         const uint16_t *vert_timing;
544
545         const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, &pll_ref_freq);
546         if (!const_ptr)
547                 return;
548
549         radeon_crtc = to_radeon_crtc(encoder->crtc);
550
551         tv_master_cntl = (RADEON_VIN_ASYNC_RST |
552                           RADEON_CRT_FIFO_CE_EN |
553                           RADEON_TV_FIFO_CE_EN |
554                           RADEON_TV_ON);
555
556         if (!ASIC_IS_R300(rdev))
557                 tv_master_cntl |= RADEON_TVCLK_ALWAYS_ONb;
558
559         if (tv_dac->tv_std == TV_STD_NTSC ||
560             tv_dac->tv_std == TV_STD_NTSC_J)
561                 tv_master_cntl |= RADEON_RESTART_PHASE_FIX;
562
563         tv_modulator_cntl1 = (RADEON_SLEW_RATE_LIMIT |
564                               RADEON_SYNC_TIP_LEVEL |
565                               RADEON_YFLT_EN |
566                               RADEON_UVFLT_EN |
567                               (6 << RADEON_CY_FILT_BLEND_SHIFT));
568
569         if (tv_dac->tv_std == TV_STD_NTSC ||
570             tv_dac->tv_std == TV_STD_NTSC_J) {
571                 tv_modulator_cntl1 |= (0x46 << RADEON_SET_UP_LEVEL_SHIFT) |
572                         (0x3b << RADEON_BLANK_LEVEL_SHIFT);
573                 tv_modulator_cntl2 = (-111 & RADEON_TV_U_BURST_LEVEL_MASK) |
574                         ((0 & RADEON_TV_V_BURST_LEVEL_MASK) << RADEON_TV_V_BURST_LEVEL_SHIFT);
575         } else if (tv_dac->tv_std == TV_STD_SCART_PAL) {
576                 tv_modulator_cntl1 |= RADEON_ALT_PHASE_EN;
577                 tv_modulator_cntl2 = (0 & RADEON_TV_U_BURST_LEVEL_MASK) |
578                         ((0 & RADEON_TV_V_BURST_LEVEL_MASK) << RADEON_TV_V_BURST_LEVEL_SHIFT);
579         } else {
580                 tv_modulator_cntl1 |= RADEON_ALT_PHASE_EN |
581                         (0x3b << RADEON_SET_UP_LEVEL_SHIFT) |
582                         (0x3b << RADEON_BLANK_LEVEL_SHIFT);
583                 tv_modulator_cntl2 = (-78 & RADEON_TV_U_BURST_LEVEL_MASK) |
584                         ((62 & RADEON_TV_V_BURST_LEVEL_MASK) << RADEON_TV_V_BURST_LEVEL_SHIFT);
585         }
586
587
588         tv_rgb_cntl = (RADEON_RGB_DITHER_EN
589                        | RADEON_TVOUT_SCALE_EN
590                        | (0x0b << RADEON_UVRAM_READ_MARGIN_SHIFT)
591                        | (0x07 << RADEON_FIFORAM_FFMACRO_READ_MARGIN_SHIFT)
592                        | RADEON_RGB_ATTEN_SEL(0x3)
593                        | RADEON_RGB_ATTEN_VAL(0xc));
594
595         if (radeon_crtc->crtc_id == 1)
596                 tv_rgb_cntl |= RADEON_RGB_SRC_SEL_CRTC2;
597         else {
598                 if (radeon_crtc->rmx_type != RMX_OFF)
599                         tv_rgb_cntl |= RADEON_RGB_SRC_SEL_RMX;
600                 else
601                         tv_rgb_cntl |= RADEON_RGB_SRC_SEL_CRTC1;
602         }
603
604         if (tv_dac->tv_std == TV_STD_NTSC ||
605             tv_dac->tv_std == TV_STD_NTSC_J ||
606             tv_dac->tv_std == TV_STD_PAL_M ||
607             tv_dac->tv_std == TV_STD_PAL_60)
608                 vert_space = const_ptr->ver_total * 2 * 10000 / NTSC_TV_LINES_PER_FRAME;
609         else
610                 vert_space = const_ptr->ver_total * 2 * 10000 / PAL_TV_LINES_PER_FRAME;
611
612         tmp = RREG32(RADEON_TV_VSCALER_CNTL1);
613         tmp &= 0xe3ff0000;
614         tmp |= (vert_space * (1 << FRAC_BITS) / 10000);
615         tv_vscaler_cntl1 = tmp;
616
617         if (pll_ref_freq == 2700)
618                 tv_vscaler_cntl1 |= RADEON_RESTART_FIELD;
619
620         if (const_ptr->hor_resolution == 1024)
621                 tv_vscaler_cntl1 |= (4 << RADEON_Y_DEL_W_SIG_SHIFT);
622         else
623                 tv_vscaler_cntl1 |= (2 << RADEON_Y_DEL_W_SIG_SHIFT);
624
625         /* scale up for int divide */
626         tmp = const_ptr->ver_total * 2 * 1000;
627         if (tv_dac->tv_std == TV_STD_NTSC ||
628             tv_dac->tv_std == TV_STD_NTSC_J ||
629             tv_dac->tv_std == TV_STD_PAL_M ||
630             tv_dac->tv_std == TV_STD_PAL_60) {
631                 tmp /= NTSC_TV_LINES_PER_FRAME;
632         } else {
633                 tmp /= PAL_TV_LINES_PER_FRAME;
634         }
635         flicker_removal = (tmp + 500) / 1000;
636
637         if (flicker_removal < 3)
638                 flicker_removal = 3;
639         for (i = 0; i < ARRAY_SIZE(SLOPE_limit); ++i) {
640                 if (flicker_removal == SLOPE_limit[i])
641                         break;
642         }
643
644         tv_y_saw_tooth_cntl = (vert_space * SLOPE_value[i] * (1 << (FRAC_BITS - 1)) +
645                                 5001) / 10000 / 8 | ((SLOPE_value[i] *
646                                 (1 << (FRAC_BITS - 1)) / 8) << 16);
647         tv_y_fall_cntl =
648                 (YCOEF_EN_value[i] << 17) | ((YCOEF_value[i] * (1 << 8) / 8) << 24) |
649                 RADEON_Y_FALL_PING_PONG | (272 * SLOPE_value[i] / 8) * (1 << (FRAC_BITS - 1)) /
650                 1024;
651         tv_y_rise_cntl = RADEON_Y_RISE_PING_PONG|
652                 (flicker_removal * 1024 - 272) * SLOPE_value[i] / 8 * (1 << (FRAC_BITS - 1)) / 1024;
653
654         tv_vscaler_cntl2 = RREG32(RADEON_TV_VSCALER_CNTL2) & 0x00fffff0;
655         tv_vscaler_cntl2 |= (0x10 << 24) |
656                 RADEON_DITHER_MODE |
657                 RADEON_Y_OUTPUT_DITHER_EN |
658                 RADEON_UV_OUTPUT_DITHER_EN |
659                 RADEON_UV_TO_BUF_DITHER_EN;
660
661         tmp = (tv_vscaler_cntl1 >> RADEON_UV_INC_SHIFT) & RADEON_UV_INC_MASK;
662         tmp = ((16384 * 256 * 10) / tmp + 5) / 10;
663         tmp = (tmp << RADEON_UV_OUTPUT_POST_SCALE_SHIFT) | 0x000b0000;
664         tv_dac->tv.timing_cntl = tmp;
665
666         if (tv_dac->tv_std == TV_STD_NTSC ||
667             tv_dac->tv_std == TV_STD_NTSC_J ||
668             tv_dac->tv_std == TV_STD_PAL_M ||
669             tv_dac->tv_std == TV_STD_PAL_60)
670                 tv_dac_cntl = tv_dac->ntsc_tvdac_adj;
671         else
672                 tv_dac_cntl = tv_dac->pal_tvdac_adj;
673
674         tv_dac_cntl |= RADEON_TV_DAC_NBLANK | RADEON_TV_DAC_NHOLD;
675
676         if (tv_dac->tv_std == TV_STD_NTSC ||
677             tv_dac->tv_std == TV_STD_NTSC_J)
678                 tv_dac_cntl |= RADEON_TV_DAC_STD_NTSC;
679         else
680                 tv_dac_cntl |= RADEON_TV_DAC_STD_PAL;
681
682         if (tv_dac->tv_std == TV_STD_NTSC ||
683             tv_dac->tv_std == TV_STD_NTSC_J) {
684                 if (pll_ref_freq == 2700) {
685                         m = NTSC_TV_PLL_M_27;
686                         n = NTSC_TV_PLL_N_27;
687                         p = NTSC_TV_PLL_P_27;
688                 } else {
689                         m = NTSC_TV_PLL_M_14;
690                         n = NTSC_TV_PLL_N_14;
691                         p = NTSC_TV_PLL_P_14;
692                 }
693         } else {
694                 if (pll_ref_freq == 2700) {
695                         m = PAL_TV_PLL_M_27;
696                         n = PAL_TV_PLL_N_27;
697                         p = PAL_TV_PLL_P_27;
698                 } else {
699                         m = PAL_TV_PLL_M_14;
700                         n = PAL_TV_PLL_N_14;
701                         p = PAL_TV_PLL_P_14;
702                 }
703         }
704
705         tv_pll_cntl = (m & RADEON_TV_M0LO_MASK) |
706                 (((m >> 8) & RADEON_TV_M0HI_MASK) << RADEON_TV_M0HI_SHIFT) |
707                 ((n & RADEON_TV_N0LO_MASK) << RADEON_TV_N0LO_SHIFT) |
708                 (((n >> 9) & RADEON_TV_N0HI_MASK) << RADEON_TV_N0HI_SHIFT) |
709                 ((p & RADEON_TV_P_MASK) << RADEON_TV_P_SHIFT);
710
711         tv_dac->tv.tv_uv_adr = 0xc8;
712
713         if (tv_dac->tv_std == TV_STD_NTSC ||
714             tv_dac->tv_std == TV_STD_NTSC_J ||
715             tv_dac->tv_std == TV_STD_PAL_M ||
716             tv_dac->tv_std == TV_STD_PAL_60) {
717                 tv_ftotal = NTSC_TV_VFTOTAL;
718                 hor_timing = hor_timing_NTSC;
719                 vert_timing = vert_timing_NTSC;
720         } else {
721                 hor_timing = hor_timing_PAL;
722                 vert_timing = vert_timing_PAL;
723                 tv_ftotal = PAL_TV_VFTOTAL;
724         }
725
726         for (i = 0; i < MAX_H_CODE_TIMING_LEN; i++) {
727                 if ((tv_dac->tv.h_code_timing[i] = hor_timing[i]) == 0)
728                         break;
729         }
730
731         for (i = 0; i < MAX_V_CODE_TIMING_LEN; i++) {
732                 if ((tv_dac->tv.v_code_timing[i] = vert_timing[i]) == 0)
733                         break;
734         }
735
736         radeon_legacy_tv_init_restarts(encoder);
737
738         /* play with DAC_CNTL */
739         /* play with GPIOPAD_A */
740         /* DISP_OUTPUT_CNTL */
741         /* use reference freq */
742
743         /* program the TV registers */
744         WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST |
745                                        RADEON_CRT_ASYNC_RST | RADEON_TV_FIFO_ASYNC_RST));
746
747         tmp = RREG32(RADEON_TV_DAC_CNTL);
748         tmp &= ~RADEON_TV_DAC_NBLANK;
749         tmp |= RADEON_TV_DAC_BGSLEEP |
750                 RADEON_TV_DAC_RDACPD |
751                 RADEON_TV_DAC_GDACPD |
752                 RADEON_TV_DAC_BDACPD;
753         WREG32(RADEON_TV_DAC_CNTL, tmp);
754
755         /* TV PLL */
756         WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~RADEON_TVCLK_SRC_SEL_TVPLL);
757         WREG32_PLL(RADEON_TV_PLL_CNTL, tv_pll_cntl);
758         WREG32_PLL_P(RADEON_TV_PLL_CNTL1, RADEON_TVPLL_RESET, ~RADEON_TVPLL_RESET);
759
760         radeon_wait_pll_lock(encoder, 200, 800, 135);
761
762         WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~RADEON_TVPLL_RESET);
763
764         radeon_wait_pll_lock(encoder, 300, 160, 27);
765         radeon_wait_pll_lock(encoder, 200, 800, 135);
766
767         WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~0xf);
768         WREG32_PLL_P(RADEON_TV_PLL_CNTL1, RADEON_TVCLK_SRC_SEL_TVPLL, ~RADEON_TVCLK_SRC_SEL_TVPLL);
769
770         WREG32_PLL_P(RADEON_TV_PLL_CNTL1, (1 << RADEON_TVPDC_SHIFT), ~RADEON_TVPDC_MASK);
771         WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~RADEON_TVPLL_SLEEP);
772
773         /* TV HV */
774         WREG32(RADEON_TV_RGB_CNTL, tv_rgb_cntl);
775         WREG32(RADEON_TV_HTOTAL, const_ptr->hor_total - 1);
776         WREG32(RADEON_TV_HDISP, const_ptr->hor_resolution - 1);
777         WREG32(RADEON_TV_HSTART, const_ptr->hor_start);
778
779         WREG32(RADEON_TV_VTOTAL, const_ptr->ver_total - 1);
780         WREG32(RADEON_TV_VDISP, const_ptr->ver_resolution - 1);
781         WREG32(RADEON_TV_FTOTAL, tv_ftotal);
782         WREG32(RADEON_TV_VSCALER_CNTL1, tv_vscaler_cntl1);
783         WREG32(RADEON_TV_VSCALER_CNTL2, tv_vscaler_cntl2);
784
785         WREG32(RADEON_TV_Y_FALL_CNTL, tv_y_fall_cntl);
786         WREG32(RADEON_TV_Y_RISE_CNTL, tv_y_rise_cntl);
787         WREG32(RADEON_TV_Y_SAW_TOOTH_CNTL, tv_y_saw_tooth_cntl);
788
789         WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST |
790                                        RADEON_CRT_ASYNC_RST));
791
792         /* TV restarts */
793         radeon_legacy_write_tv_restarts(radeon_encoder);
794
795         /* tv timings */
796         radeon_restore_tv_timing_tables(radeon_encoder);
797
798         WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST));
799
800         /* tv std */
801         WREG32(RADEON_TV_SYNC_CNTL, (RADEON_SYNC_PUB | RADEON_TV_SYNC_IO_DRIVE));
802         WREG32(RADEON_TV_TIMING_CNTL, tv_dac->tv.timing_cntl);
803         WREG32(RADEON_TV_MODULATOR_CNTL1, tv_modulator_cntl1);
804         WREG32(RADEON_TV_MODULATOR_CNTL2, tv_modulator_cntl2);
805         WREG32(RADEON_TV_PRE_DAC_MUX_CNTL, (RADEON_Y_RED_EN |
806                                             RADEON_C_GRN_EN |
807                                             RADEON_CMP_BLU_EN |
808                                             RADEON_DAC_DITHER_EN));
809
810         WREG32(RADEON_TV_CRC_CNTL, 0);
811
812         WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl);
813
814         WREG32(RADEON_TV_GAIN_LIMIT_SETTINGS, ((0x17f << RADEON_UV_GAIN_LIMIT_SHIFT) |
815                                                (0x5ff << RADEON_Y_GAIN_LIMIT_SHIFT)));
816         WREG32(RADEON_TV_LINEAR_GAIN_SETTINGS, ((0x100 << RADEON_UV_GAIN_SHIFT) |
817                                                 (0x100 << RADEON_Y_GAIN_SHIFT)));
818
819         WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
820
821 }
822
823 void radeon_legacy_tv_adjust_crtc_reg(struct drm_encoder *encoder,
824                                       uint32_t *h_total_disp, uint32_t *h_sync_strt_wid,
825                                       uint32_t *v_total_disp, uint32_t *v_sync_strt_wid)
826 {
827         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
828         const struct radeon_tv_mode_constants *const_ptr;
829         uint32_t tmp;
830
831         const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
832         if (!const_ptr)
833                 return;
834
835         *h_total_disp = (((const_ptr->hor_resolution / 8) - 1) << RADEON_CRTC_H_DISP_SHIFT) |
836                 (((const_ptr->hor_total / 8) - 1) << RADEON_CRTC_H_TOTAL_SHIFT);
837
838         tmp = *h_sync_strt_wid;
839         tmp &= ~(RADEON_CRTC_H_SYNC_STRT_PIX | RADEON_CRTC_H_SYNC_STRT_CHAR);
840         tmp |= (((const_ptr->hor_syncstart / 8) - 1) << RADEON_CRTC_H_SYNC_STRT_CHAR_SHIFT) |
841                 (const_ptr->hor_syncstart & 7);
842         *h_sync_strt_wid = tmp;
843
844         *v_total_disp = ((const_ptr->ver_resolution - 1) << RADEON_CRTC_V_DISP_SHIFT) |
845                 ((const_ptr->ver_total - 1) << RADEON_CRTC_V_TOTAL_SHIFT);
846
847         tmp = *v_sync_strt_wid;
848         tmp &= ~RADEON_CRTC_V_SYNC_STRT;
849         tmp |= ((const_ptr->ver_syncstart - 1) << RADEON_CRTC_V_SYNC_STRT_SHIFT);
850         *v_sync_strt_wid = tmp;
851 }
852
853 static int get_post_div(int value)
854 {
855         int post_div;
856         switch (value) {
857         case 1: post_div = 0; break;
858         case 2: post_div = 1; break;
859         case 3: post_div = 4; break;
860         case 4: post_div = 2; break;
861         case 6: post_div = 6; break;
862         case 8: post_div = 3; break;
863         case 12: post_div = 7; break;
864         case 16:
865         default: post_div = 5; break;
866         }
867         return post_div;
868 }
869
870 void radeon_legacy_tv_adjust_pll1(struct drm_encoder *encoder,
871                                   uint32_t *htotal_cntl, uint32_t *ppll_ref_div,
872                                   uint32_t *ppll_div_3, uint32_t *pixclks_cntl)
873 {
874         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
875         const struct radeon_tv_mode_constants *const_ptr;
876
877         const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
878         if (!const_ptr)
879                 return;
880
881         *htotal_cntl = (const_ptr->hor_total & 0x7) | RADEON_HTOT_CNTL_VGA_EN;
882
883         *ppll_ref_div = const_ptr->crtcPLL_M;
884
885         *ppll_div_3 = (const_ptr->crtcPLL_N & 0x7ff) | (get_post_div(const_ptr->crtcPLL_post_div) << 16);
886         *pixclks_cntl &= ~(RADEON_PIX2CLK_SRC_SEL_MASK | RADEON_PIXCLK_TV_SRC_SEL);
887         *pixclks_cntl |= RADEON_PIX2CLK_SRC_SEL_P2PLLCLK;
888 }
889
890 void radeon_legacy_tv_adjust_pll2(struct drm_encoder *encoder,
891                                   uint32_t *htotal2_cntl, uint32_t *p2pll_ref_div,
892                                   uint32_t *p2pll_div_0, uint32_t *pixclks_cntl)
893 {
894         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
895         const struct radeon_tv_mode_constants *const_ptr;
896
897         const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
898         if (!const_ptr)
899                 return;
900
901         *htotal2_cntl = (const_ptr->hor_total & 0x7);
902
903         *p2pll_ref_div = const_ptr->crtcPLL_M;
904
905         *p2pll_div_0 = (const_ptr->crtcPLL_N & 0x7ff) | (get_post_div(const_ptr->crtcPLL_post_div) << 16);
906         *pixclks_cntl &= ~RADEON_PIX2CLK_SRC_SEL_MASK;
907         *pixclks_cntl |= RADEON_PIX2CLK_SRC_SEL_P2PLLCLK | RADEON_PIXCLK_TV_SRC_SEL;
908 }
909