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