Subversion Repositories Kolibri OS

Rev

Rev 5078 | Rev 5271 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1125 serge 1
/*
2
 * Copyright 2007-8 Advanced Micro Devices, Inc.
3
 * Copyright 2008 Red Hat Inc.
4
 *
5
 * Permission is hereby granted, free of charge, to any person obtaining a
6
 * copy of this software and associated documentation files (the "Software"),
7
 * to deal in the Software without restriction, including without limitation
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9
 * and/or sell copies of the Software, and to permit persons to whom the
10
 * Software is furnished to do so, subject to the following conditions:
11
 *
12
 * The above copyright notice and this permission notice shall be included in
13
 * all copies or substantial portions of the Software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21
 * OTHER DEALINGS IN THE SOFTWARE.
22
 *
23
 * Authors: Dave Airlie
24
 *          Alex Deucher
25
 */
2997 Serge 26
#include 
27
#include 
28
#include 
1125 serge 29
#include "radeon.h"
30
#include "atom.h"
31
 
2997 Serge 32
extern void
33
radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder,
34
			     struct drm_connector *drm_connector);
35
extern void
36
radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder,
37
			   struct drm_connector *drm_connector);
1125 serge 38
 
1268 serge 39
 
1321 serge 40
static uint32_t radeon_encoder_clones(struct drm_encoder *encoder)
41
{
42
	struct drm_device *dev = encoder->dev;
43
	struct radeon_device *rdev = dev->dev_private;
44
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
45
	struct drm_encoder *clone_encoder;
46
	uint32_t index_mask = 0;
47
	int count;
48
 
49
	/* DIG routing gets problematic */
50
	if (rdev->family >= CHIP_R600)
51
		return index_mask;
52
	/* LVDS/TV are too wacky */
53
	if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
54
		return index_mask;
55
	/* DVO requires 2x ppll clocks depending on tmds chip */
56
	if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT)
57
		return index_mask;
1963 serge 58
 
1321 serge 59
	count = -1;
60
	list_for_each_entry(clone_encoder, &dev->mode_config.encoder_list, head) {
61
		struct radeon_encoder *radeon_clone = to_radeon_encoder(clone_encoder);
62
		count++;
63
 
64
		if (clone_encoder == encoder)
65
			continue;
66
		if (radeon_clone->devices & (ATOM_DEVICE_LCD_SUPPORT))
67
			continue;
68
		if (radeon_clone->devices & ATOM_DEVICE_DFP2_SUPPORT)
69
			continue;
70
		else
71
			index_mask |= (1 << count);
72
	}
73
	return index_mask;
74
}
75
 
76
void radeon_setup_encoder_clones(struct drm_device *dev)
77
{
78
	struct drm_encoder *encoder;
79
 
80
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
81
		encoder->possible_clones = radeon_encoder_clones(encoder);
82
	}
83
}
84
 
1125 serge 85
uint32_t
1963 serge 86
radeon_get_encoder_enum(struct drm_device *dev, uint32_t supported_device, uint8_t dac)
1125 serge 87
{
88
	struct radeon_device *rdev = dev->dev_private;
89
	uint32_t ret = 0;
90
 
91
	switch (supported_device) {
92
	case ATOM_DEVICE_CRT1_SUPPORT:
93
	case ATOM_DEVICE_TV1_SUPPORT:
94
	case ATOM_DEVICE_TV2_SUPPORT:
95
	case ATOM_DEVICE_CRT2_SUPPORT:
96
	case ATOM_DEVICE_CV_SUPPORT:
97
		switch (dac) {
98
		case 1: /* dac a */
99
			if ((rdev->family == CHIP_RS300) ||
100
			    (rdev->family == CHIP_RS400) ||
101
			    (rdev->family == CHIP_RS480))
1963 serge 102
				ret = ENCODER_INTERNAL_DAC2_ENUM_ID1;
1125 serge 103
			else if (ASIC_IS_AVIVO(rdev))
1963 serge 104
				ret = ENCODER_INTERNAL_KLDSCP_DAC1_ENUM_ID1;
1125 serge 105
			else
1963 serge 106
				ret = ENCODER_INTERNAL_DAC1_ENUM_ID1;
1125 serge 107
			break;
108
		case 2: /* dac b */
109
			if (ASIC_IS_AVIVO(rdev))
1963 serge 110
				ret = ENCODER_INTERNAL_KLDSCP_DAC2_ENUM_ID1;
1125 serge 111
			else {
112
				/*if (rdev->family == CHIP_R200)
1963 serge 113
				  ret = ENCODER_INTERNAL_DVO1_ENUM_ID1;
1125 serge 114
				  else*/
1963 serge 115
				ret = ENCODER_INTERNAL_DAC2_ENUM_ID1;
1125 serge 116
			}
117
			break;
118
		case 3: /* external dac */
119
			if (ASIC_IS_AVIVO(rdev))
1963 serge 120
				ret = ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1;
1125 serge 121
			else
1963 serge 122
				ret = ENCODER_INTERNAL_DVO1_ENUM_ID1;
1125 serge 123
			break;
124
		}
125
		break;
126
	case ATOM_DEVICE_LCD1_SUPPORT:
127
		if (ASIC_IS_AVIVO(rdev))
1963 serge 128
			ret = ENCODER_INTERNAL_LVTM1_ENUM_ID1;
1125 serge 129
		else
1963 serge 130
			ret = ENCODER_INTERNAL_LVDS_ENUM_ID1;
1125 serge 131
		break;
132
	case ATOM_DEVICE_DFP1_SUPPORT:
133
		if ((rdev->family == CHIP_RS300) ||
134
		    (rdev->family == CHIP_RS400) ||
135
		    (rdev->family == CHIP_RS480))
1963 serge 136
			ret = ENCODER_INTERNAL_DVO1_ENUM_ID1;
1125 serge 137
		else if (ASIC_IS_AVIVO(rdev))
1963 serge 138
			ret = ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID1;
1125 serge 139
		else
1963 serge 140
			ret = ENCODER_INTERNAL_TMDS1_ENUM_ID1;
1125 serge 141
		break;
142
	case ATOM_DEVICE_LCD2_SUPPORT:
143
	case ATOM_DEVICE_DFP2_SUPPORT:
144
		if ((rdev->family == CHIP_RS600) ||
145
		    (rdev->family == CHIP_RS690) ||
146
		    (rdev->family == CHIP_RS740))
1963 serge 147
			ret = ENCODER_INTERNAL_DDI_ENUM_ID1;
1125 serge 148
		else if (ASIC_IS_AVIVO(rdev))
1963 serge 149
			ret = ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1;
1125 serge 150
		else
1963 serge 151
			ret = ENCODER_INTERNAL_DVO1_ENUM_ID1;
1125 serge 152
		break;
153
	case ATOM_DEVICE_DFP3_SUPPORT:
1963 serge 154
		ret = ENCODER_INTERNAL_LVTM1_ENUM_ID1;
1125 serge 155
		break;
156
	}
157
 
158
	return ret;
159
}
160
 
5179 serge 161
static void radeon_encoder_add_backlight(struct radeon_encoder *radeon_encoder,
162
					 struct drm_connector *connector)
163
{
164
	struct drm_device *dev = radeon_encoder->base.dev;
165
	struct radeon_device *rdev = dev->dev_private;
166
	bool use_bl = false;
167
 
168
	if (!(radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)))
169
		return;
170
 
171
	if (radeon_backlight == 0) {
172
		return;
173
	} else if (radeon_backlight == 1) {
174
		use_bl = true;
175
	} else if (radeon_backlight == -1) {
176
		/* Quirks */
177
		/* Amilo Xi 2550 only works with acpi bl */
178
		if ((rdev->pdev->device == 0x9583) &&
179
		    (rdev->pdev->subsystem_vendor == 0x1734) &&
180
		    (rdev->pdev->subsystem_device == 0x1107))
181
			use_bl = false;
182
		else
183
			use_bl = true;
184
	}
185
 
186
	if (use_bl) {
187
		if (rdev->is_atom_bios)
188
			radeon_atom_backlight_init(radeon_encoder, connector);
189
		else
190
			radeon_legacy_backlight_init(radeon_encoder, connector);
191
		rdev->mode_info.bl_encoder = radeon_encoder;
192
	}
193
}
194
 
1125 serge 195
void
196
radeon_link_encoder_connector(struct drm_device *dev)
197
{
198
	struct drm_connector *connector;
199
	struct radeon_connector *radeon_connector;
200
	struct drm_encoder *encoder;
201
	struct radeon_encoder *radeon_encoder;
202
 
203
	/* walk the list and link encoders to connectors */
204
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
205
		radeon_connector = to_radeon_connector(connector);
206
		list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
207
			radeon_encoder = to_radeon_encoder(encoder);
2997 Serge 208
			if (radeon_encoder->devices & radeon_connector->devices) {
1125 serge 209
				drm_mode_connector_attach_encoder(connector, encoder);
5179 serge 210
				if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
211
					radeon_encoder_add_backlight(radeon_encoder, connector);
2997 Serge 212
			}
1125 serge 213
		}
214
	}
215
}
216
 
1179 serge 217
void radeon_encoder_set_active_device(struct drm_encoder *encoder)
218
{
219
	struct drm_device *dev = encoder->dev;
220
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
221
	struct drm_connector *connector;
222
 
223
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
224
		if (connector->encoder == encoder) {
225
			struct radeon_connector *radeon_connector = to_radeon_connector(connector);
226
			radeon_encoder->active_device = radeon_encoder->devices & radeon_connector->devices;
1963 serge 227
			DRM_DEBUG_KMS("setting active device to %08x from %08x %08x for encoder %d\n",
1179 serge 228
				  radeon_encoder->active_device, radeon_encoder->devices,
229
				  radeon_connector->devices, encoder->encoder_type);
230
		}
231
	}
232
}
233
 
1963 serge 234
struct drm_connector *
1125 serge 235
radeon_get_connector_for_encoder(struct drm_encoder *encoder)
236
{
237
	struct drm_device *dev = encoder->dev;
238
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
239
	struct drm_connector *connector;
240
	struct radeon_connector *radeon_connector;
241
 
242
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
243
		radeon_connector = to_radeon_connector(connector);
1403 serge 244
		if (radeon_encoder->active_device & radeon_connector->devices)
1125 serge 245
			return connector;
246
	}
247
	return NULL;
248
}
249
 
2997 Serge 250
struct drm_connector *
1963 serge 251
radeon_get_connector_for_encoder_init(struct drm_encoder *encoder)
1430 serge 252
{
253
	struct drm_device *dev = encoder->dev;
1963 serge 254
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1430 serge 255
	struct drm_connector *connector;
256
	struct radeon_connector *radeon_connector;
257
 
1963 serge 258
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
259
		radeon_connector = to_radeon_connector(connector);
260
		if (radeon_encoder->devices & radeon_connector->devices)
261
			return connector;
262
	}
263
	return NULL;
264
}
1430 serge 265
 
2997 Serge 266
struct drm_encoder *radeon_get_external_encoder(struct drm_encoder *encoder)
1963 serge 267
{
268
	struct drm_device *dev = encoder->dev;
269
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
270
	struct drm_encoder *other_encoder;
271
	struct radeon_encoder *other_radeon_encoder;
272
 
273
	if (radeon_encoder->is_ext_encoder)
1430 serge 274
		return NULL;
275
 
1963 serge 276
	list_for_each_entry(other_encoder, &dev->mode_config.encoder_list, head) {
277
		if (other_encoder == encoder)
278
			continue;
279
		other_radeon_encoder = to_radeon_encoder(other_encoder);
280
		if (other_radeon_encoder->is_ext_encoder &&
281
		    (radeon_encoder->devices & other_radeon_encoder->devices))
282
			return other_encoder;
283
	}
284
	return NULL;
285
}
1430 serge 286
 
2997 Serge 287
u16 radeon_encoder_get_dp_bridge_encoder_id(struct drm_encoder *encoder)
1963 serge 288
{
2997 Serge 289
	struct drm_encoder *other_encoder = radeon_get_external_encoder(encoder);
1430 serge 290
 
1963 serge 291
	if (other_encoder) {
292
		struct radeon_encoder *radeon_encoder = to_radeon_encoder(other_encoder);
1430 serge 293
 
1963 serge 294
		switch (radeon_encoder->encoder_id) {
295
		case ENCODER_OBJECT_ID_TRAVIS:
296
		case ENCODER_OBJECT_ID_NUTMEG:
2997 Serge 297
			return radeon_encoder->encoder_id;
1963 serge 298
		default:
2997 Serge 299
			return ENCODER_OBJECT_ID_NONE;
1963 serge 300
		}
301
	}
2997 Serge 302
	return ENCODER_OBJECT_ID_NONE;
1430 serge 303
}
304
 
1963 serge 305
void radeon_panel_mode_fixup(struct drm_encoder *encoder,
306
			     struct drm_display_mode *adjusted_mode)
307
{
308
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
309
	struct drm_device *dev = encoder->dev;
310
	struct radeon_device *rdev = dev->dev_private;
311
	struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
312
	unsigned hblank = native_mode->htotal - native_mode->hdisplay;
313
	unsigned vblank = native_mode->vtotal - native_mode->vdisplay;
314
	unsigned hover = native_mode->hsync_start - native_mode->hdisplay;
315
	unsigned vover = native_mode->vsync_start - native_mode->vdisplay;
316
	unsigned hsync_width = native_mode->hsync_end - native_mode->hsync_start;
317
	unsigned vsync_width = native_mode->vsync_end - native_mode->vsync_start;
318
 
319
	adjusted_mode->clock = native_mode->clock;
320
	adjusted_mode->flags = native_mode->flags;
321
 
322
	if (ASIC_IS_AVIVO(rdev)) {
323
		adjusted_mode->hdisplay = native_mode->hdisplay;
324
		adjusted_mode->vdisplay = native_mode->vdisplay;
325
	}
326
 
327
	adjusted_mode->htotal = native_mode->hdisplay + hblank;
328
	adjusted_mode->hsync_start = native_mode->hdisplay + hover;
329
	adjusted_mode->hsync_end = adjusted_mode->hsync_start + hsync_width;
330
 
331
	adjusted_mode->vtotal = native_mode->vdisplay + vblank;
332
	adjusted_mode->vsync_start = native_mode->vdisplay + vover;
333
	adjusted_mode->vsync_end = adjusted_mode->vsync_start + vsync_width;
334
 
335
	drm_mode_set_crtcinfo(adjusted_mode, CRTC_INTERLACE_HALVE_V);
336
 
337
	if (ASIC_IS_AVIVO(rdev)) {
338
		adjusted_mode->crtc_hdisplay = native_mode->hdisplay;
339
		adjusted_mode->crtc_vdisplay = native_mode->vdisplay;
340
	}
341
 
342
	adjusted_mode->crtc_htotal = adjusted_mode->crtc_hdisplay + hblank;
343
	adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hdisplay + hover;
344
	adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_start + hsync_width;
345
 
346
	adjusted_mode->crtc_vtotal = adjusted_mode->crtc_vdisplay + vblank;
347
	adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + vover;
348
	adjusted_mode->crtc_vsync_end = adjusted_mode->crtc_vsync_start + vsync_width;
349
 
350
}
351
 
2997 Serge 352
bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
353
				    u32 pixel_clock)
1125 serge 354
{
1268 serge 355
	struct drm_device *dev = encoder->dev;
356
	struct radeon_device *rdev = dev->dev_private;
1125 serge 357
	struct drm_connector *connector;
358
	struct radeon_connector *radeon_connector;
1430 serge 359
	struct radeon_connector_atom_dig *dig_connector;
1125 serge 360
 
361
	connector = radeon_get_connector_for_encoder(encoder);
1986 serge 362
	/* if we don't have an active device yet, just use one of
363
	 * the connectors tied to the encoder.
364
	 */
365
	if (!connector)
366
		connector = radeon_get_connector_for_encoder_init(encoder);
1125 serge 367
	radeon_connector = to_radeon_connector(connector);
368
 
369
	switch (connector->connector_type) {
370
	case DRM_MODE_CONNECTOR_DVII:
2997 Serge 371
	case DRM_MODE_CONNECTOR_HDMIB:
372
		if (radeon_connector->use_digital) {
373
			/* HDMI 1.3 supports up to 340 Mhz over single link */
5078 serge 374
			if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
2997 Serge 375
				if (pixel_clock > 340000)
376
					return true;
1963 serge 377
			else
2997 Serge 378
					return false;
379
			} else {
380
				if (pixel_clock > 165000)
381
					return true;
1125 serge 382
		else
2997 Serge 383
					return false;
384
			}
385
		} else
386
			return false;
1125 serge 387
	case DRM_MODE_CONNECTOR_DVID:
388
	case DRM_MODE_CONNECTOR_HDMIA:
389
	case DRM_MODE_CONNECTOR_DisplayPort:
1430 serge 390
		dig_connector = radeon_connector->con_priv;
391
		if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
392
		    (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
2997 Serge 393
			return false;
1430 serge 394
	else {
2997 Serge 395
			/* HDMI 1.3 supports up to 340 Mhz over single link */
5078 serge 396
			if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
2997 Serge 397
				if (pixel_clock > 340000)
398
					return true;
1125 serge 399
		else
2997 Serge 400
					return false;
1430 serge 401
	} else {
2997 Serge 402
				if (pixel_clock > 165000)
403
					return true;
1125 serge 404
				else
1963 serge 405
		return false;
406
	}
407
		}
408
		default:
409
			return false;
1125 serge 410
		}
411
}
412