1 /* $FreeBSD: head/sys/dev/drm2/radeon/radeon_legacy_tv.c 254885 2013-08-25 19:37:15Z dumbbell $ */
2 
3 #include <drm/drmP.h>
4 #include <drm/drm_crtc_helper.h>
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 DRM_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 drm_device *dev = encoder->dev;
426 	struct radeon_device *rdev = dev->dev_private;
427 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
428 	struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
429 	struct radeon_crtc *radeon_crtc;
430 	int restart;
431 	unsigned int h_total, v_total, f_total;
432 	int v_offset, h_offset;
433 	u16 p1, p2, h_inc;
434 	bool h_changed;
435 	const struct radeon_tv_mode_constants *const_ptr;
436 	struct radeon_pll *pll;
437 
438 	radeon_crtc = to_radeon_crtc(radeon_encoder->base.crtc);
439 	if (radeon_crtc->crtc_id == 1)
440 		pll = &rdev->clock.p2pll;
441 	else
442 		pll = &rdev->clock.p1pll;
443 
444 	const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
445 	if (!const_ptr)
446 		return false;
447 
448 	h_total = const_ptr->hor_total;
449 	v_total = const_ptr->ver_total;
450 
451 	if (tv_dac->tv_std == TV_STD_NTSC ||
452 	    tv_dac->tv_std == TV_STD_NTSC_J ||
453 	    tv_dac->tv_std == TV_STD_PAL_M ||
454 	    tv_dac->tv_std == TV_STD_PAL_60)
455 		f_total = NTSC_TV_VFTOTAL + 1;
456 	else
457 		f_total = PAL_TV_VFTOTAL + 1;
458 
459 	/* adjust positions 1&2 in hor. cod timing table */
460 	h_offset = tv_dac->h_pos * H_POS_UNIT;
461 
462 	if (tv_dac->tv_std == TV_STD_NTSC ||
463 	    tv_dac->tv_std == TV_STD_NTSC_J ||
464 	    tv_dac->tv_std == TV_STD_PAL_M) {
465 		h_offset -= 50;
466 		p1 = hor_timing_NTSC[H_TABLE_POS1];
467 		p2 = hor_timing_NTSC[H_TABLE_POS2];
468 	} else {
469 		p1 = hor_timing_PAL[H_TABLE_POS1];
470 		p2 = hor_timing_PAL[H_TABLE_POS2];
471 	}
472 
473 	p1 = (u16)((int)p1 + h_offset);
474 	p2 = (u16)((int)p2 - h_offset);
475 
476 	h_changed = (p1 != tv_dac->tv.h_code_timing[H_TABLE_POS1] ||
477 		     p2 != tv_dac->tv.h_code_timing[H_TABLE_POS2]);
478 
479 	tv_dac->tv.h_code_timing[H_TABLE_POS1] = p1;
480 	tv_dac->tv.h_code_timing[H_TABLE_POS2] = p2;
481 
482 	/* Convert hOffset from n. of TV clock periods to n. of CRTC clock periods (CRTC pixels) */
483 	h_offset = (h_offset * (int)(const_ptr->pix_to_tv)) / 1000;
484 
485 	/* adjust restart */
486 	restart = const_ptr->def_restart;
487 
488 	/*
489 	 * convert v_pos TV lines to n. of CRTC pixels
490 	 */
491 	if (tv_dac->tv_std == TV_STD_NTSC ||
492 	    tv_dac->tv_std == TV_STD_NTSC_J ||
493 	    tv_dac->tv_std == TV_STD_PAL_M ||
494 	    tv_dac->tv_std == TV_STD_PAL_60)
495 		v_offset = ((int)(v_total * h_total) * 2 * tv_dac->v_pos) / (int)(NTSC_TV_LINES_PER_FRAME);
496 	else
497 		v_offset = ((int)(v_total * h_total) * 2 * tv_dac->v_pos) / (int)(PAL_TV_LINES_PER_FRAME);
498 
499 	restart -= v_offset + h_offset;
500 
501 	DRM_DEBUG_KMS("compute_restarts: def = %u h = %d v = %d, p1 = %04x, p2 = %04x, restart = %d\n",
502 		  const_ptr->def_restart, tv_dac->h_pos, tv_dac->v_pos, p1, p2, restart);
503 
504 	tv_dac->tv.hrestart = restart % h_total;
505 	restart /= h_total;
506 	tv_dac->tv.vrestart = restart % v_total;
507 	restart /= v_total;
508 	tv_dac->tv.frestart = restart % f_total;
509 
510 	DRM_DEBUG_KMS("compute_restart: F/H/V=%u,%u,%u\n",
511 		  (unsigned)tv_dac->tv.frestart,
512 		  (unsigned)tv_dac->tv.vrestart,
513 		  (unsigned)tv_dac->tv.hrestart);
514 
515 	/* compute h_inc from hsize */
516 	if (tv_dac->tv_std == TV_STD_NTSC ||
517 	    tv_dac->tv_std == TV_STD_NTSC_J ||
518 	    tv_dac->tv_std == TV_STD_PAL_M)
519 		h_inc = (u16)((int)(const_ptr->hor_resolution * 4096 * NTSC_TV_CLOCK_T) /
520 			      (tv_dac->h_size * (int)(NTSC_TV_H_SIZE_UNIT) + (int)(NTSC_TV_ZERO_H_SIZE)));
521 	else
522 		h_inc = (u16)((int)(const_ptr->hor_resolution * 4096 * PAL_TV_CLOCK_T) /
523 			      (tv_dac->h_size * (int)(PAL_TV_H_SIZE_UNIT) + (int)(PAL_TV_ZERO_H_SIZE)));
524 
525 	tv_dac->tv.timing_cntl = (tv_dac->tv.timing_cntl & ~RADEON_H_INC_MASK) |
526 		((u32)h_inc << RADEON_H_INC_SHIFT);
527 
528 	DRM_DEBUG_KMS("compute_restart: h_size = %d h_inc = %d\n", tv_dac->h_size, h_inc);
529 
530 	return h_changed;
531 }
532 
533 void radeon_legacy_tv_mode_set(struct drm_encoder *encoder,
534 			       struct drm_display_mode *mode,
535 			       struct drm_display_mode *adjusted_mode)
536 {
537 	struct drm_device *dev = encoder->dev;
538 	struct radeon_device *rdev = dev->dev_private;
539 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
540 	struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
541 	const struct radeon_tv_mode_constants *const_ptr;
542 	struct radeon_crtc *radeon_crtc;
543 	int i;
544 	uint16_t pll_ref_freq;
545 	uint32_t vert_space, flicker_removal, tmp;
546 	uint32_t tv_master_cntl, tv_rgb_cntl, tv_dac_cntl;
547 	uint32_t tv_modulator_cntl1, tv_modulator_cntl2;
548 	uint32_t tv_vscaler_cntl1, tv_vscaler_cntl2;
549 	uint32_t tv_pll_cntl, tv_pll_cntl1, tv_ftotal;
550 	uint32_t tv_y_fall_cntl, tv_y_rise_cntl, tv_y_saw_tooth_cntl;
551 	uint32_t m, n, p;
552 	const uint16_t *hor_timing;
553 	const uint16_t *vert_timing;
554 
555 	const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, &pll_ref_freq);
556 	if (!const_ptr)
557 		return;
558 
559 	radeon_crtc = to_radeon_crtc(encoder->crtc);
560 
561 	tv_master_cntl = (RADEON_VIN_ASYNC_RST |
562 			  RADEON_CRT_FIFO_CE_EN |
563 			  RADEON_TV_FIFO_CE_EN |
564 			  RADEON_TV_ON);
565 
566 	if (!ASIC_IS_R300(rdev))
567 		tv_master_cntl |= RADEON_TVCLK_ALWAYS_ONb;
568 
569 	if (tv_dac->tv_std == TV_STD_NTSC ||
570 	    tv_dac->tv_std == TV_STD_NTSC_J)
571 		tv_master_cntl |= RADEON_RESTART_PHASE_FIX;
572 
573 	tv_modulator_cntl1 = (RADEON_SLEW_RATE_LIMIT |
574 			      RADEON_SYNC_TIP_LEVEL |
575 			      RADEON_YFLT_EN |
576 			      RADEON_UVFLT_EN |
577 			      (6 << RADEON_CY_FILT_BLEND_SHIFT));
578 
579 	if (tv_dac->tv_std == TV_STD_NTSC ||
580 	    tv_dac->tv_std == TV_STD_NTSC_J) {
581 		tv_modulator_cntl1 |= (0x46 << RADEON_SET_UP_LEVEL_SHIFT) |
582 			(0x3b << RADEON_BLANK_LEVEL_SHIFT);
583 		tv_modulator_cntl2 = (-111 & RADEON_TV_U_BURST_LEVEL_MASK) |
584 			((0 & RADEON_TV_V_BURST_LEVEL_MASK) << RADEON_TV_V_BURST_LEVEL_SHIFT);
585 	} else if (tv_dac->tv_std == TV_STD_SCART_PAL) {
586 		tv_modulator_cntl1 |= RADEON_ALT_PHASE_EN;
587 		tv_modulator_cntl2 = (0 & RADEON_TV_U_BURST_LEVEL_MASK) |
588 			((0 & RADEON_TV_V_BURST_LEVEL_MASK) << RADEON_TV_V_BURST_LEVEL_SHIFT);
589 	} else {
590 		tv_modulator_cntl1 |= RADEON_ALT_PHASE_EN |
591 			(0x3b << RADEON_SET_UP_LEVEL_SHIFT) |
592 			(0x3b << RADEON_BLANK_LEVEL_SHIFT);
593 		tv_modulator_cntl2 = (-78 & RADEON_TV_U_BURST_LEVEL_MASK) |
594 			((62 & RADEON_TV_V_BURST_LEVEL_MASK) << RADEON_TV_V_BURST_LEVEL_SHIFT);
595 	}
596 
597 
598 	tv_rgb_cntl = (RADEON_RGB_DITHER_EN
599 		       | RADEON_TVOUT_SCALE_EN
600 		       | (0x0b << RADEON_UVRAM_READ_MARGIN_SHIFT)
601 		       | (0x07 << RADEON_FIFORAM_FFMACRO_READ_MARGIN_SHIFT)
602 		       | RADEON_RGB_ATTEN_SEL(0x3)
603 		       | RADEON_RGB_ATTEN_VAL(0xc));
604 
605 	if (radeon_crtc->crtc_id == 1)
606 		tv_rgb_cntl |= RADEON_RGB_SRC_SEL_CRTC2;
607 	else {
608 		if (radeon_crtc->rmx_type != RMX_OFF)
609 			tv_rgb_cntl |= RADEON_RGB_SRC_SEL_RMX;
610 		else
611 			tv_rgb_cntl |= RADEON_RGB_SRC_SEL_CRTC1;
612 	}
613 
614 	if (tv_dac->tv_std == TV_STD_NTSC ||
615 	    tv_dac->tv_std == TV_STD_NTSC_J ||
616 	    tv_dac->tv_std == TV_STD_PAL_M ||
617 	    tv_dac->tv_std == TV_STD_PAL_60)
618 		vert_space = const_ptr->ver_total * 2 * 10000 / NTSC_TV_LINES_PER_FRAME;
619 	else
620 		vert_space = const_ptr->ver_total * 2 * 10000 / PAL_TV_LINES_PER_FRAME;
621 
622 	tmp = RREG32(RADEON_TV_VSCALER_CNTL1);
623 	tmp &= 0xe3ff0000;
624 	tmp |= (vert_space * (1 << FRAC_BITS) / 10000);
625 	tv_vscaler_cntl1 = tmp;
626 
627 	if (pll_ref_freq == 2700)
628 		tv_vscaler_cntl1 |= RADEON_RESTART_FIELD;
629 
630 	if (const_ptr->hor_resolution == 1024)
631 		tv_vscaler_cntl1 |= (4 << RADEON_Y_DEL_W_SIG_SHIFT);
632 	else
633 		tv_vscaler_cntl1 |= (2 << RADEON_Y_DEL_W_SIG_SHIFT);
634 
635 	/* scale up for int divide */
636 	tmp = const_ptr->ver_total * 2 * 1000;
637 	if (tv_dac->tv_std == TV_STD_NTSC ||
638 	    tv_dac->tv_std == TV_STD_NTSC_J ||
639 	    tv_dac->tv_std == TV_STD_PAL_M ||
640 	    tv_dac->tv_std == TV_STD_PAL_60) {
641 		tmp /= NTSC_TV_LINES_PER_FRAME;
642 	} else {
643 		tmp /= PAL_TV_LINES_PER_FRAME;
644 	}
645 	flicker_removal = (tmp + 500) / 1000;
646 
647 	if (flicker_removal < 3)
648 		flicker_removal = 3;
649 	for (i = 0; i < DRM_ARRAY_SIZE(SLOPE_limit); ++i) {
650 		if (flicker_removal == SLOPE_limit[i])
651 			break;
652 	}
653 
654 	tv_y_saw_tooth_cntl = (vert_space * SLOPE_value[i] * (1 << (FRAC_BITS - 1)) +
655 				5001) / 10000 / 8 | ((SLOPE_value[i] *
656 				(1 << (FRAC_BITS - 1)) / 8) << 16);
657 	tv_y_fall_cntl =
658 		(YCOEF_EN_value[i] << 17) | ((YCOEF_value[i] * (1 << 8) / 8) << 24) |
659 		RADEON_Y_FALL_PING_PONG | (272 * SLOPE_value[i] / 8) * (1 << (FRAC_BITS - 1)) /
660 		1024;
661 	tv_y_rise_cntl = RADEON_Y_RISE_PING_PONG|
662 		(flicker_removal * 1024 - 272) * SLOPE_value[i] / 8 * (1 << (FRAC_BITS - 1)) / 1024;
663 
664 	tv_vscaler_cntl2 = RREG32(RADEON_TV_VSCALER_CNTL2) & 0x00fffff0;
665 	tv_vscaler_cntl2 |= (0x10 << 24) |
666 		RADEON_DITHER_MODE |
667 		RADEON_Y_OUTPUT_DITHER_EN |
668 		RADEON_UV_OUTPUT_DITHER_EN |
669 		RADEON_UV_TO_BUF_DITHER_EN;
670 
671 	tmp = (tv_vscaler_cntl1 >> RADEON_UV_INC_SHIFT) & RADEON_UV_INC_MASK;
672 	tmp = ((16384 * 256 * 10) / tmp + 5) / 10;
673 	tmp = (tmp << RADEON_UV_OUTPUT_POST_SCALE_SHIFT) | 0x000b0000;
674 	tv_dac->tv.timing_cntl = tmp;
675 
676 	if (tv_dac->tv_std == TV_STD_NTSC ||
677 	    tv_dac->tv_std == TV_STD_NTSC_J ||
678 	    tv_dac->tv_std == TV_STD_PAL_M ||
679 	    tv_dac->tv_std == TV_STD_PAL_60)
680 		tv_dac_cntl = tv_dac->ntsc_tvdac_adj;
681 	else
682 		tv_dac_cntl = tv_dac->pal_tvdac_adj;
683 
684 	tv_dac_cntl |= RADEON_TV_DAC_NBLANK | RADEON_TV_DAC_NHOLD;
685 
686 	if (tv_dac->tv_std == TV_STD_NTSC ||
687 	    tv_dac->tv_std == TV_STD_NTSC_J)
688 		tv_dac_cntl |= RADEON_TV_DAC_STD_NTSC;
689 	else
690 		tv_dac_cntl |= RADEON_TV_DAC_STD_PAL;
691 
692 	if (tv_dac->tv_std == TV_STD_NTSC ||
693 	    tv_dac->tv_std == TV_STD_NTSC_J) {
694 		if (pll_ref_freq == 2700) {
695 			m = NTSC_TV_PLL_M_27;
696 			n = NTSC_TV_PLL_N_27;
697 			p = NTSC_TV_PLL_P_27;
698 		} else {
699 			m = NTSC_TV_PLL_M_14;
700 			n = NTSC_TV_PLL_N_14;
701 			p = NTSC_TV_PLL_P_14;
702 		}
703 	} else {
704 		if (pll_ref_freq == 2700) {
705 			m = PAL_TV_PLL_M_27;
706 			n = PAL_TV_PLL_N_27;
707 			p = PAL_TV_PLL_P_27;
708 		} else {
709 			m = PAL_TV_PLL_M_14;
710 			n = PAL_TV_PLL_N_14;
711 			p = PAL_TV_PLL_P_14;
712 		}
713 	}
714 
715 	tv_pll_cntl = (m & RADEON_TV_M0LO_MASK) |
716 		(((m >> 8) & RADEON_TV_M0HI_MASK) << RADEON_TV_M0HI_SHIFT) |
717 		((n & RADEON_TV_N0LO_MASK) << RADEON_TV_N0LO_SHIFT) |
718 		(((n >> 9) & RADEON_TV_N0HI_MASK) << RADEON_TV_N0HI_SHIFT) |
719 		((p & RADEON_TV_P_MASK) << RADEON_TV_P_SHIFT);
720 
721 	tv_pll_cntl1 = (((4 & RADEON_TVPCP_MASK) << RADEON_TVPCP_SHIFT) |
722 			((4 & RADEON_TVPVG_MASK) << RADEON_TVPVG_SHIFT) |
723 			((1 & RADEON_TVPDC_MASK) << RADEON_TVPDC_SHIFT) |
724 			RADEON_TVCLK_SRC_SEL_TVPLL |
725 			RADEON_TVPLL_TEST_DIS);
726 
727 	tv_dac->tv.tv_uv_adr = 0xc8;
728 
729 	if (tv_dac->tv_std == TV_STD_NTSC ||
730 	    tv_dac->tv_std == TV_STD_NTSC_J ||
731 	    tv_dac->tv_std == TV_STD_PAL_M ||
732 	    tv_dac->tv_std == TV_STD_PAL_60) {
733 		tv_ftotal = NTSC_TV_VFTOTAL;
734 		hor_timing = hor_timing_NTSC;
735 		vert_timing = vert_timing_NTSC;
736 	} else {
737 		hor_timing = hor_timing_PAL;
738 		vert_timing = vert_timing_PAL;
739 		tv_ftotal = PAL_TV_VFTOTAL;
740 	}
741 
742 	for (i = 0; i < MAX_H_CODE_TIMING_LEN; i++) {
743 		if ((tv_dac->tv.h_code_timing[i] = hor_timing[i]) == 0)
744 			break;
745 	}
746 
747 	for (i = 0; i < MAX_V_CODE_TIMING_LEN; i++) {
748 		if ((tv_dac->tv.v_code_timing[i] = vert_timing[i]) == 0)
749 			break;
750 	}
751 
752 	radeon_legacy_tv_init_restarts(encoder);
753 
754 	/* play with DAC_CNTL */
755 	/* play with GPIOPAD_A */
756 	/* DISP_OUTPUT_CNTL */
757 	/* use reference freq */
758 
759 	/* program the TV registers */
760 	WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST |
761 				       RADEON_CRT_ASYNC_RST | RADEON_TV_FIFO_ASYNC_RST));
762 
763 	tmp = RREG32(RADEON_TV_DAC_CNTL);
764 	tmp &= ~RADEON_TV_DAC_NBLANK;
765 	tmp |= RADEON_TV_DAC_BGSLEEP |
766 		RADEON_TV_DAC_RDACPD |
767 		RADEON_TV_DAC_GDACPD |
768 		RADEON_TV_DAC_BDACPD;
769 	WREG32(RADEON_TV_DAC_CNTL, tmp);
770 
771 	/* TV PLL */
772 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~RADEON_TVCLK_SRC_SEL_TVPLL);
773 	WREG32_PLL(RADEON_TV_PLL_CNTL, tv_pll_cntl);
774 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, RADEON_TVPLL_RESET, ~RADEON_TVPLL_RESET);
775 
776 	radeon_wait_pll_lock(encoder, 200, 800, 135);
777 
778 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~RADEON_TVPLL_RESET);
779 
780 	radeon_wait_pll_lock(encoder, 300, 160, 27);
781 	radeon_wait_pll_lock(encoder, 200, 800, 135);
782 
783 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~0xf);
784 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, RADEON_TVCLK_SRC_SEL_TVPLL, ~RADEON_TVCLK_SRC_SEL_TVPLL);
785 
786 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, (1 << RADEON_TVPDC_SHIFT), ~RADEON_TVPDC_MASK);
787 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~RADEON_TVPLL_SLEEP);
788 
789 	/* TV HV */
790 	WREG32(RADEON_TV_RGB_CNTL, tv_rgb_cntl);
791 	WREG32(RADEON_TV_HTOTAL, const_ptr->hor_total - 1);
792 	WREG32(RADEON_TV_HDISP, const_ptr->hor_resolution - 1);
793 	WREG32(RADEON_TV_HSTART, const_ptr->hor_start);
794 
795 	WREG32(RADEON_TV_VTOTAL, const_ptr->ver_total - 1);
796 	WREG32(RADEON_TV_VDISP, const_ptr->ver_resolution - 1);
797 	WREG32(RADEON_TV_FTOTAL, tv_ftotal);
798 	WREG32(RADEON_TV_VSCALER_CNTL1, tv_vscaler_cntl1);
799 	WREG32(RADEON_TV_VSCALER_CNTL2, tv_vscaler_cntl2);
800 
801 	WREG32(RADEON_TV_Y_FALL_CNTL, tv_y_fall_cntl);
802 	WREG32(RADEON_TV_Y_RISE_CNTL, tv_y_rise_cntl);
803 	WREG32(RADEON_TV_Y_SAW_TOOTH_CNTL, tv_y_saw_tooth_cntl);
804 
805 	WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST |
806 				       RADEON_CRT_ASYNC_RST));
807 
808 	/* TV restarts */
809 	radeon_legacy_write_tv_restarts(radeon_encoder);
810 
811 	/* tv timings */
812 	radeon_restore_tv_timing_tables(radeon_encoder);
813 
814 	WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST));
815 
816 	/* tv std */
817 	WREG32(RADEON_TV_SYNC_CNTL, (RADEON_SYNC_PUB | RADEON_TV_SYNC_IO_DRIVE));
818 	WREG32(RADEON_TV_TIMING_CNTL, tv_dac->tv.timing_cntl);
819 	WREG32(RADEON_TV_MODULATOR_CNTL1, tv_modulator_cntl1);
820 	WREG32(RADEON_TV_MODULATOR_CNTL2, tv_modulator_cntl2);
821 	WREG32(RADEON_TV_PRE_DAC_MUX_CNTL, (RADEON_Y_RED_EN |
822 					    RADEON_C_GRN_EN |
823 					    RADEON_CMP_BLU_EN |
824 					    RADEON_DAC_DITHER_EN));
825 
826 	WREG32(RADEON_TV_CRC_CNTL, 0);
827 
828 	WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl);
829 
830 	WREG32(RADEON_TV_GAIN_LIMIT_SETTINGS, ((0x17f << RADEON_UV_GAIN_LIMIT_SHIFT) |
831 					       (0x5ff << RADEON_Y_GAIN_LIMIT_SHIFT)));
832 	WREG32(RADEON_TV_LINEAR_GAIN_SETTINGS, ((0x100 << RADEON_UV_GAIN_SHIFT) |
833 						(0x100 << RADEON_Y_GAIN_SHIFT)));
834 
835 	WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
836 
837 }
838 
839 void radeon_legacy_tv_adjust_crtc_reg(struct drm_encoder *encoder,
840 				      uint32_t *h_total_disp, uint32_t *h_sync_strt_wid,
841 				      uint32_t *v_total_disp, uint32_t *v_sync_strt_wid)
842 {
843 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
844 	const struct radeon_tv_mode_constants *const_ptr;
845 	uint32_t tmp;
846 
847 	const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
848 	if (!const_ptr)
849 		return;
850 
851 	*h_total_disp = (((const_ptr->hor_resolution / 8) - 1) << RADEON_CRTC_H_DISP_SHIFT) |
852 		(((const_ptr->hor_total / 8) - 1) << RADEON_CRTC_H_TOTAL_SHIFT);
853 
854 	tmp = *h_sync_strt_wid;
855 	tmp &= ~(RADEON_CRTC_H_SYNC_STRT_PIX | RADEON_CRTC_H_SYNC_STRT_CHAR);
856 	tmp |= (((const_ptr->hor_syncstart / 8) - 1) << RADEON_CRTC_H_SYNC_STRT_CHAR_SHIFT) |
857 		(const_ptr->hor_syncstart & 7);
858 	*h_sync_strt_wid = tmp;
859 
860 	*v_total_disp = ((const_ptr->ver_resolution - 1) << RADEON_CRTC_V_DISP_SHIFT) |
861 		((const_ptr->ver_total - 1) << RADEON_CRTC_V_TOTAL_SHIFT);
862 
863 	tmp = *v_sync_strt_wid;
864 	tmp &= ~RADEON_CRTC_V_SYNC_STRT;
865 	tmp |= ((const_ptr->ver_syncstart - 1) << RADEON_CRTC_V_SYNC_STRT_SHIFT);
866 	*v_sync_strt_wid = tmp;
867 }
868 
869 static int get_post_div(int value)
870 {
871 	int post_div;
872 	switch (value) {
873 	case 1: post_div = 0; break;
874 	case 2: post_div = 1; break;
875 	case 3: post_div = 4; break;
876 	case 4: post_div = 2; break;
877 	case 6: post_div = 6; break;
878 	case 8: post_div = 3; break;
879 	case 12: post_div = 7; break;
880 	case 16:
881 	default: post_div = 5; break;
882 	}
883 	return post_div;
884 }
885 
886 void radeon_legacy_tv_adjust_pll1(struct drm_encoder *encoder,
887 				  uint32_t *htotal_cntl, uint32_t *ppll_ref_div,
888 				  uint32_t *ppll_div_3, uint32_t *pixclks_cntl)
889 {
890 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
891 	const struct radeon_tv_mode_constants *const_ptr;
892 
893 	const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
894 	if (!const_ptr)
895 		return;
896 
897 	*htotal_cntl = (const_ptr->hor_total & 0x7) | RADEON_HTOT_CNTL_VGA_EN;
898 
899 	*ppll_ref_div = const_ptr->crtcPLL_M;
900 
901 	*ppll_div_3 = (const_ptr->crtcPLL_N & 0x7ff) | (get_post_div(const_ptr->crtcPLL_post_div) << 16);
902 	*pixclks_cntl &= ~(RADEON_PIX2CLK_SRC_SEL_MASK | RADEON_PIXCLK_TV_SRC_SEL);
903 	*pixclks_cntl |= RADEON_PIX2CLK_SRC_SEL_P2PLLCLK;
904 }
905 
906 void radeon_legacy_tv_adjust_pll2(struct drm_encoder *encoder,
907 				  uint32_t *htotal2_cntl, uint32_t *p2pll_ref_div,
908 				  uint32_t *p2pll_div_0, uint32_t *pixclks_cntl)
909 {
910 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
911 	const struct radeon_tv_mode_constants *const_ptr;
912 
913 	const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
914 	if (!const_ptr)
915 		return;
916 
917 	*htotal2_cntl = (const_ptr->hor_total & 0x7);
918 
919 	*p2pll_ref_div = const_ptr->crtcPLL_M;
920 
921 	*p2pll_div_0 = (const_ptr->crtcPLL_N & 0x7ff) | (get_post_div(const_ptr->crtcPLL_post_div) << 16);
922 	*pixclks_cntl &= ~RADEON_PIX2CLK_SRC_SEL_MASK;
923 	*pixclks_cntl |= RADEON_PIX2CLK_SRC_SEL_P2PLLCLK | RADEON_PIXCLK_TV_SRC_SEL;
924 }
925 
926