Linux Audio

Check our new training course

Yocto / OpenEmbedded training

Feb 10-13, 2025
Register
Loading...
v6.2
   1/*
   2 * Copyright 2007-11 Advanced Micro Devices, Inc.
   3 * Copyright 2008 Red Hat Inc.
   4 *
   5 * Permission is hereby granted, free of charge, to any person obtaining a
   6 * copy of this software and associated documentation files (the "Software"),
   7 * to deal in the Software without restriction, including without limitation
   8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   9 * and/or sell copies of the Software, and to permit persons to whom the
  10 * Software is furnished to do so, subject to the following conditions:
  11 *
  12 * The above copyright notice and this permission notice shall be included in
  13 * all copies or substantial portions of the Software.
  14 *
  15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  21 * OTHER DEALINGS IN THE SOFTWARE.
  22 *
  23 * Authors: Dave Airlie
  24 *          Alex Deucher
  25 */
  26
  27#include <linux/pci.h>
  28
  29#include <acpi/video.h>
  30
  31#include <drm/drm_crtc_helper.h>
  32#include <drm/amdgpu_drm.h>
  33#include "amdgpu.h"
  34#include "amdgpu_connectors.h"
  35#include "amdgpu_display.h"
  36#include "atom.h"
  37#include "atombios_encoders.h"
  38#include "atombios_dp.h"
  39#include <linux/backlight.h>
  40#include "bif/bif_4_1_d.h"
  41
  42u8
  43amdgpu_atombios_encoder_get_backlight_level_from_reg(struct amdgpu_device *adev)
  44{
  45	u8 backlight_level;
  46	u32 bios_2_scratch;
  47
  48	bios_2_scratch = RREG32(mmBIOS_SCRATCH_2);
  49
  50	backlight_level = ((bios_2_scratch & ATOM_S2_CURRENT_BL_LEVEL_MASK) >>
  51			   ATOM_S2_CURRENT_BL_LEVEL_SHIFT);
  52
  53	return backlight_level;
  54}
  55
  56void
  57amdgpu_atombios_encoder_set_backlight_level_to_reg(struct amdgpu_device *adev,
  58					    u8 backlight_level)
  59{
  60	u32 bios_2_scratch;
  61
  62	bios_2_scratch = RREG32(mmBIOS_SCRATCH_2);
  63
  64	bios_2_scratch &= ~ATOM_S2_CURRENT_BL_LEVEL_MASK;
  65	bios_2_scratch |= ((backlight_level << ATOM_S2_CURRENT_BL_LEVEL_SHIFT) &
  66			   ATOM_S2_CURRENT_BL_LEVEL_MASK);
  67
  68	WREG32(mmBIOS_SCRATCH_2, bios_2_scratch);
  69}
  70
  71u8
  72amdgpu_atombios_encoder_get_backlight_level(struct amdgpu_encoder *amdgpu_encoder)
  73{
  74	struct drm_device *dev = amdgpu_encoder->base.dev;
  75	struct amdgpu_device *adev = drm_to_adev(dev);
  76
  77	if (!(adev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
  78		return 0;
  79
  80	return amdgpu_atombios_encoder_get_backlight_level_from_reg(adev);
  81}
  82
  83void
  84amdgpu_atombios_encoder_set_backlight_level(struct amdgpu_encoder *amdgpu_encoder,
  85				     u8 level)
  86{
  87	struct drm_encoder *encoder = &amdgpu_encoder->base;
  88	struct drm_device *dev = amdgpu_encoder->base.dev;
  89	struct amdgpu_device *adev = drm_to_adev(dev);
  90	struct amdgpu_encoder_atom_dig *dig;
  91
  92	if (!(adev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
  93		return;
  94
  95	if ((amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) &&
  96	    amdgpu_encoder->enc_priv) {
  97		dig = amdgpu_encoder->enc_priv;
  98		dig->backlight_level = level;
  99		amdgpu_atombios_encoder_set_backlight_level_to_reg(adev, dig->backlight_level);
 100
 101		switch (amdgpu_encoder->encoder_id) {
 102		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
 103		case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
 104		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
 105		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
 106		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
 107			if (dig->backlight_level == 0)
 108				amdgpu_atombios_encoder_setup_dig_transmitter(encoder,
 109								       ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0);
 110			else {
 111				amdgpu_atombios_encoder_setup_dig_transmitter(encoder,
 112								       ATOM_TRANSMITTER_ACTION_BL_BRIGHTNESS_CONTROL, 0, 0);
 113				amdgpu_atombios_encoder_setup_dig_transmitter(encoder,
 114								       ATOM_TRANSMITTER_ACTION_LCD_BLON, 0, 0);
 115			}
 116			break;
 117		default:
 118			break;
 119		}
 120	}
 121}
 122
 
 
 123static u8 amdgpu_atombios_encoder_backlight_level(struct backlight_device *bd)
 124{
 125	u8 level;
 126
 127	/* Convert brightness to hardware level */
 128	if (bd->props.brightness < 0)
 129		level = 0;
 130	else if (bd->props.brightness > AMDGPU_MAX_BL_LEVEL)
 131		level = AMDGPU_MAX_BL_LEVEL;
 132	else
 133		level = bd->props.brightness;
 134
 135	return level;
 136}
 137
 138static int amdgpu_atombios_encoder_update_backlight_status(struct backlight_device *bd)
 139{
 140	struct amdgpu_backlight_privdata *pdata = bl_get_data(bd);
 141	struct amdgpu_encoder *amdgpu_encoder = pdata->encoder;
 142
 143	amdgpu_atombios_encoder_set_backlight_level(amdgpu_encoder,
 144					     amdgpu_atombios_encoder_backlight_level(bd));
 145
 146	return 0;
 147}
 148
 149static int
 150amdgpu_atombios_encoder_get_backlight_brightness(struct backlight_device *bd)
 151{
 152	struct amdgpu_backlight_privdata *pdata = bl_get_data(bd);
 153	struct amdgpu_encoder *amdgpu_encoder = pdata->encoder;
 154	struct drm_device *dev = amdgpu_encoder->base.dev;
 155	struct amdgpu_device *adev = drm_to_adev(dev);
 156
 157	return amdgpu_atombios_encoder_get_backlight_level_from_reg(adev);
 158}
 159
 160static const struct backlight_ops amdgpu_atombios_encoder_backlight_ops = {
 161	.get_brightness = amdgpu_atombios_encoder_get_backlight_brightness,
 162	.update_status	= amdgpu_atombios_encoder_update_backlight_status,
 163};
 164
 165void amdgpu_atombios_encoder_init_backlight(struct amdgpu_encoder *amdgpu_encoder,
 166				     struct drm_connector *drm_connector)
 167{
 168	struct drm_device *dev = amdgpu_encoder->base.dev;
 169	struct amdgpu_device *adev = drm_to_adev(dev);
 170	struct backlight_device *bd;
 171	struct backlight_properties props;
 172	struct amdgpu_backlight_privdata *pdata;
 173	struct amdgpu_encoder_atom_dig *dig;
 
 174	char bl_name[16];
 175
 176	/* Mac laptops with multiple GPUs use the gmux driver for backlight
 177	 * so don't register a backlight device
 178	 */
 179	if ((adev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) &&
 180	    (adev->pdev->device == 0x6741))
 181		return;
 182
 183	if (!amdgpu_encoder->enc_priv)
 184		return;
 185
 186	if (!(adev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
 187		goto register_acpi_backlight;
 188
 189	if (!acpi_video_backlight_use_native()) {
 190		drm_info(dev, "Skipping amdgpu atom DIG backlight registration\n");
 191		goto register_acpi_backlight;
 192	}
 193
 194	pdata = kmalloc(sizeof(struct amdgpu_backlight_privdata), GFP_KERNEL);
 195	if (!pdata) {
 196		DRM_ERROR("Memory allocation failed\n");
 197		goto error;
 198	}
 199
 200	memset(&props, 0, sizeof(props));
 201	props.max_brightness = AMDGPU_MAX_BL_LEVEL;
 202	props.type = BACKLIGHT_RAW;
 203	snprintf(bl_name, sizeof(bl_name),
 204		 "amdgpu_bl%d", dev->primary->index);
 205	bd = backlight_device_register(bl_name, drm_connector->kdev,
 206				       pdata, &amdgpu_atombios_encoder_backlight_ops, &props);
 207	if (IS_ERR(bd)) {
 208		DRM_ERROR("Backlight registration failed\n");
 209		goto error;
 210	}
 211
 212	pdata->encoder = amdgpu_encoder;
 213
 
 
 214	dig = amdgpu_encoder->enc_priv;
 215	dig->bl_dev = bd;
 216
 217	bd->props.brightness = amdgpu_atombios_encoder_get_backlight_brightness(bd);
 218	bd->props.power = FB_BLANK_UNBLANK;
 219	backlight_update_status(bd);
 220
 221	DRM_INFO("amdgpu atom DIG backlight initialized\n");
 222
 223	return;
 224
 225error:
 226	kfree(pdata);
 227	return;
 228
 229register_acpi_backlight:
 230	/* Try registering an ACPI video backlight device instead. */
 231	acpi_video_register_backlight();
 232	return;
 233}
 234
 235void
 236amdgpu_atombios_encoder_fini_backlight(struct amdgpu_encoder *amdgpu_encoder)
 237{
 238	struct drm_device *dev = amdgpu_encoder->base.dev;
 239	struct amdgpu_device *adev = drm_to_adev(dev);
 240	struct backlight_device *bd = NULL;
 241	struct amdgpu_encoder_atom_dig *dig;
 242
 243	if (!amdgpu_encoder->enc_priv)
 244		return;
 245
 
 
 
 246	if (!(adev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
 247		return;
 248
 249	dig = amdgpu_encoder->enc_priv;
 250	bd = dig->bl_dev;
 251	dig->bl_dev = NULL;
 252
 253	if (bd) {
 254		struct amdgpu_legacy_backlight_privdata *pdata;
 255
 256		pdata = bl_get_data(bd);
 257		backlight_device_unregister(bd);
 258		kfree(pdata);
 259
 260		DRM_INFO("amdgpu atom LVDS backlight unloaded\n");
 261	}
 262}
 263
 
 
 
 
 
 
 
 
 
 
 
 
 264bool amdgpu_atombios_encoder_is_digital(struct drm_encoder *encoder)
 265{
 266	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 267	switch (amdgpu_encoder->encoder_id) {
 268	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
 269	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
 270	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
 271	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
 272	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
 273		return true;
 274	default:
 275		return false;
 276	}
 277}
 278
 279bool amdgpu_atombios_encoder_mode_fixup(struct drm_encoder *encoder,
 280				 const struct drm_display_mode *mode,
 281				 struct drm_display_mode *adjusted_mode)
 282{
 283	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 284
 285	/* set the active encoder to connector routing */
 286	amdgpu_encoder_set_active_device(encoder);
 287	drm_mode_set_crtcinfo(adjusted_mode, 0);
 288
 289	/* hw bug */
 290	if ((mode->flags & DRM_MODE_FLAG_INTERLACE)
 291	    && (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2)))
 292		adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2;
 293
 294	/* vertical FP must be at least 1 */
 295	if (mode->crtc_vsync_start == mode->crtc_vdisplay)
 296		adjusted_mode->crtc_vsync_start++;
 297
 298	/* get the native mode for scaling */
 299	if (amdgpu_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT))
 300		amdgpu_panel_mode_fixup(encoder, adjusted_mode);
 301	else if (amdgpu_encoder->rmx_type != RMX_OFF)
 302		amdgpu_panel_mode_fixup(encoder, adjusted_mode);
 303
 304	if ((amdgpu_encoder->active_device & (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) ||
 305	    (amdgpu_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE)) {
 306		struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
 307		amdgpu_atombios_dp_set_link_config(connector, adjusted_mode);
 308	}
 309
 310	return true;
 311}
 312
 313static void
 314amdgpu_atombios_encoder_setup_dac(struct drm_encoder *encoder, int action)
 315{
 316	struct drm_device *dev = encoder->dev;
 317	struct amdgpu_device *adev = drm_to_adev(dev);
 318	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 319	DAC_ENCODER_CONTROL_PS_ALLOCATION args;
 320	int index = 0;
 321
 322	memset(&args, 0, sizeof(args));
 323
 324	switch (amdgpu_encoder->encoder_id) {
 325	case ENCODER_OBJECT_ID_INTERNAL_DAC1:
 326	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
 327		index = GetIndexIntoMasterTable(COMMAND, DAC1EncoderControl);
 328		break;
 329	case ENCODER_OBJECT_ID_INTERNAL_DAC2:
 330	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
 331		index = GetIndexIntoMasterTable(COMMAND, DAC2EncoderControl);
 332		break;
 333	}
 334
 335	args.ucAction = action;
 336	args.ucDacStandard = ATOM_DAC1_PS2;
 337	args.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 338
 339	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
 340
 341}
 342
 343static u8 amdgpu_atombios_encoder_get_bpc(struct drm_encoder *encoder)
 344{
 345	int bpc = 8;
 346
 347	if (encoder->crtc) {
 348		struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc);
 349		bpc = amdgpu_crtc->bpc;
 350	}
 351
 352	switch (bpc) {
 353	case 0:
 354		return PANEL_BPC_UNDEFINE;
 355	case 6:
 356		return PANEL_6BIT_PER_COLOR;
 357	case 8:
 358	default:
 359		return PANEL_8BIT_PER_COLOR;
 360	case 10:
 361		return PANEL_10BIT_PER_COLOR;
 362	case 12:
 363		return PANEL_12BIT_PER_COLOR;
 364	case 16:
 365		return PANEL_16BIT_PER_COLOR;
 366	}
 367}
 368
 369union dvo_encoder_control {
 370	ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION ext_tmds;
 371	DVO_ENCODER_CONTROL_PS_ALLOCATION dvo;
 372	DVO_ENCODER_CONTROL_PS_ALLOCATION_V3 dvo_v3;
 373	DVO_ENCODER_CONTROL_PS_ALLOCATION_V1_4 dvo_v4;
 374};
 375
 376static void
 377amdgpu_atombios_encoder_setup_dvo(struct drm_encoder *encoder, int action)
 378{
 379	struct drm_device *dev = encoder->dev;
 380	struct amdgpu_device *adev = drm_to_adev(dev);
 381	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 382	union dvo_encoder_control args;
 383	int index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl);
 384	uint8_t frev, crev;
 385
 386	memset(&args, 0, sizeof(args));
 387
 388	if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
 389		return;
 390
 391	switch (frev) {
 392	case 1:
 393		switch (crev) {
 394		case 1:
 395			/* R4xx, R5xx */
 396			args.ext_tmds.sXTmdsEncoder.ucEnable = action;
 397
 398			if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 399				args.ext_tmds.sXTmdsEncoder.ucMisc |= PANEL_ENCODER_MISC_DUAL;
 400
 401			args.ext_tmds.sXTmdsEncoder.ucMisc |= ATOM_PANEL_MISC_888RGB;
 402			break;
 403		case 2:
 404			/* RS600/690/740 */
 405			args.dvo.sDVOEncoder.ucAction = action;
 406			args.dvo.sDVOEncoder.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 407			/* DFP1, CRT1, TV1 depending on the type of port */
 408			args.dvo.sDVOEncoder.ucDeviceType = ATOM_DEVICE_DFP1_INDEX;
 409
 410			if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 411				args.dvo.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute |= PANEL_ENCODER_MISC_DUAL;
 412			break;
 413		case 3:
 414			/* R6xx */
 415			args.dvo_v3.ucAction = action;
 416			args.dvo_v3.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 417			args.dvo_v3.ucDVOConfig = 0; /* XXX */
 418			break;
 419		case 4:
 420			/* DCE8 */
 421			args.dvo_v4.ucAction = action;
 422			args.dvo_v4.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 423			args.dvo_v4.ucDVOConfig = 0; /* XXX */
 424			args.dvo_v4.ucBitPerColor = amdgpu_atombios_encoder_get_bpc(encoder);
 425			break;
 426		default:
 427			DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
 428			break;
 429		}
 430		break;
 431	default:
 432		DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
 433		break;
 434	}
 435
 436	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
 437}
 438
 439int amdgpu_atombios_encoder_get_encoder_mode(struct drm_encoder *encoder)
 440{
 441	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 442	struct drm_connector *connector;
 443	struct amdgpu_connector *amdgpu_connector;
 444	struct amdgpu_connector_atom_dig *dig_connector;
 445
 446	/* dp bridges are always DP */
 447	if (amdgpu_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE)
 448		return ATOM_ENCODER_MODE_DP;
 449
 450	/* DVO is always DVO */
 451	if ((amdgpu_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DVO1) ||
 452	    (amdgpu_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1))
 453		return ATOM_ENCODER_MODE_DVO;
 454
 455	connector = amdgpu_get_connector_for_encoder(encoder);
 456	/* if we don't have an active device yet, just use one of
 457	 * the connectors tied to the encoder.
 458	 */
 459	if (!connector)
 460		connector = amdgpu_get_connector_for_encoder_init(encoder);
 461	amdgpu_connector = to_amdgpu_connector(connector);
 462
 463	switch (connector->connector_type) {
 464	case DRM_MODE_CONNECTOR_DVII:
 465	case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */
 466		if (amdgpu_audio != 0) {
 467			if (amdgpu_connector->use_digital &&
 468			    (amdgpu_connector->audio == AMDGPU_AUDIO_ENABLE))
 469				return ATOM_ENCODER_MODE_HDMI;
 470			else if (connector->display_info.is_hdmi &&
 471				 (amdgpu_connector->audio == AMDGPU_AUDIO_AUTO))
 472				return ATOM_ENCODER_MODE_HDMI;
 473			else if (amdgpu_connector->use_digital)
 474				return ATOM_ENCODER_MODE_DVI;
 475			else
 476				return ATOM_ENCODER_MODE_CRT;
 477		} else if (amdgpu_connector->use_digital) {
 478			return ATOM_ENCODER_MODE_DVI;
 479		} else {
 480			return ATOM_ENCODER_MODE_CRT;
 481		}
 482		break;
 483	case DRM_MODE_CONNECTOR_DVID:
 484	case DRM_MODE_CONNECTOR_HDMIA:
 485	default:
 486		if (amdgpu_audio != 0) {
 487			if (amdgpu_connector->audio == AMDGPU_AUDIO_ENABLE)
 488				return ATOM_ENCODER_MODE_HDMI;
 489			else if (connector->display_info.is_hdmi &&
 490				 (amdgpu_connector->audio == AMDGPU_AUDIO_AUTO))
 491				return ATOM_ENCODER_MODE_HDMI;
 492			else
 493				return ATOM_ENCODER_MODE_DVI;
 494		} else {
 495			return ATOM_ENCODER_MODE_DVI;
 496		}
 
 497	case DRM_MODE_CONNECTOR_LVDS:
 498		return ATOM_ENCODER_MODE_LVDS;
 
 499	case DRM_MODE_CONNECTOR_DisplayPort:
 500		dig_connector = amdgpu_connector->con_priv;
 501		if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
 502		    (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {
 503			return ATOM_ENCODER_MODE_DP;
 504		} else if (amdgpu_audio != 0) {
 505			if (amdgpu_connector->audio == AMDGPU_AUDIO_ENABLE)
 506				return ATOM_ENCODER_MODE_HDMI;
 507			else if (connector->display_info.is_hdmi &&
 508				 (amdgpu_connector->audio == AMDGPU_AUDIO_AUTO))
 509				return ATOM_ENCODER_MODE_HDMI;
 510			else
 511				return ATOM_ENCODER_MODE_DVI;
 512		} else {
 513			return ATOM_ENCODER_MODE_DVI;
 514		}
 
 515	case DRM_MODE_CONNECTOR_eDP:
 516		return ATOM_ENCODER_MODE_DP;
 517	case DRM_MODE_CONNECTOR_DVIA:
 518	case DRM_MODE_CONNECTOR_VGA:
 519		return ATOM_ENCODER_MODE_CRT;
 
 520	case DRM_MODE_CONNECTOR_Composite:
 521	case DRM_MODE_CONNECTOR_SVIDEO:
 522	case DRM_MODE_CONNECTOR_9PinDIN:
 523		/* fix me */
 524		return ATOM_ENCODER_MODE_TV;
 
 
 525	}
 526}
 527
 528/*
 529 * DIG Encoder/Transmitter Setup
 530 *
 531 * DCE 6.0
 532 * - 3 DIG transmitter blocks UNIPHY0/1/2 (links A and B).
 533 * Supports up to 6 digital outputs
 534 * - 6 DIG encoder blocks.
 535 * - DIG to PHY mapping is hardcoded
 536 * DIG1 drives UNIPHY0 link A, A+B
 537 * DIG2 drives UNIPHY0 link B
 538 * DIG3 drives UNIPHY1 link A, A+B
 539 * DIG4 drives UNIPHY1 link B
 540 * DIG5 drives UNIPHY2 link A, A+B
 541 * DIG6 drives UNIPHY2 link B
 542 *
 543 * Routing
 544 * crtc -> dig encoder -> UNIPHY/LVTMA (1 or 2 links)
 545 * Examples:
 546 * crtc0 -> dig2 -> LVTMA   links A+B -> TMDS/HDMI
 547 * crtc1 -> dig1 -> UNIPHY0 link  B   -> DP
 548 * crtc0 -> dig1 -> UNIPHY2 link  A   -> LVDS
 549 * crtc1 -> dig2 -> UNIPHY1 link  B+A -> TMDS/HDMI
 550 */
 551
 552union dig_encoder_control {
 553	DIG_ENCODER_CONTROL_PS_ALLOCATION v1;
 554	DIG_ENCODER_CONTROL_PARAMETERS_V2 v2;
 555	DIG_ENCODER_CONTROL_PARAMETERS_V3 v3;
 556	DIG_ENCODER_CONTROL_PARAMETERS_V4 v4;
 557	DIG_ENCODER_CONTROL_PARAMETERS_V5 v5;
 558};
 559
 560void
 561amdgpu_atombios_encoder_setup_dig_encoder(struct drm_encoder *encoder,
 562				   int action, int panel_mode)
 563{
 564	struct drm_device *dev = encoder->dev;
 565	struct amdgpu_device *adev = drm_to_adev(dev);
 566	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 567	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 568	struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
 569	union dig_encoder_control args;
 570	int index = GetIndexIntoMasterTable(COMMAND, DIGxEncoderControl);
 571	uint8_t frev, crev;
 572	int dp_clock = 0;
 573	int dp_lane_count = 0;
 574	int hpd_id = AMDGPU_HPD_NONE;
 575
 576	if (connector) {
 577		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 578		struct amdgpu_connector_atom_dig *dig_connector =
 579			amdgpu_connector->con_priv;
 580
 581		dp_clock = dig_connector->dp_clock;
 582		dp_lane_count = dig_connector->dp_lane_count;
 583		hpd_id = amdgpu_connector->hpd.hpd;
 584	}
 585
 586	/* no dig encoder assigned */
 587	if (dig->dig_encoder == -1)
 588		return;
 589
 590	memset(&args, 0, sizeof(args));
 591
 592	if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
 593		return;
 594
 595	switch (frev) {
 596	case 1:
 597		switch (crev) {
 598		case 1:
 599			args.v1.ucAction = action;
 600			args.v1.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 601			if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
 602				args.v3.ucPanelMode = panel_mode;
 603			else
 604				args.v1.ucEncoderMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
 605
 606			if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode))
 607				args.v1.ucLaneNum = dp_lane_count;
 608			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 609				args.v1.ucLaneNum = 8;
 610			else
 611				args.v1.ucLaneNum = 4;
 612
 613			if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000))
 614				args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
 615			switch (amdgpu_encoder->encoder_id) {
 616			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
 617				args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1;
 618				break;
 619			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
 620			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
 621				args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER2;
 622				break;
 623			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
 624				args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER3;
 625				break;
 626			}
 627			if (dig->linkb)
 628				args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKB;
 629			else
 630				args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKA;
 631			break;
 632		case 2:
 633		case 3:
 634			args.v3.ucAction = action;
 635			args.v3.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 636			if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
 637				args.v3.ucPanelMode = panel_mode;
 638			else
 639				args.v3.ucEncoderMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
 640
 641			if (ENCODER_MODE_IS_DP(args.v3.ucEncoderMode))
 642				args.v3.ucLaneNum = dp_lane_count;
 643			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 644				args.v3.ucLaneNum = 8;
 645			else
 646				args.v3.ucLaneNum = 4;
 647
 648			if (ENCODER_MODE_IS_DP(args.v3.ucEncoderMode) && (dp_clock == 270000))
 649				args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
 650			args.v3.acConfig.ucDigSel = dig->dig_encoder;
 651			args.v3.ucBitPerColor = amdgpu_atombios_encoder_get_bpc(encoder);
 652			break;
 653		case 4:
 654			args.v4.ucAction = action;
 655			args.v4.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 656			if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
 657				args.v4.ucPanelMode = panel_mode;
 658			else
 659				args.v4.ucEncoderMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
 660
 661			if (ENCODER_MODE_IS_DP(args.v4.ucEncoderMode))
 662				args.v4.ucLaneNum = dp_lane_count;
 663			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 664				args.v4.ucLaneNum = 8;
 665			else
 666				args.v4.ucLaneNum = 4;
 667
 668			if (ENCODER_MODE_IS_DP(args.v4.ucEncoderMode)) {
 669				if (dp_clock == 540000)
 670					args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_5_40GHZ;
 671				else if (dp_clock == 324000)
 672					args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_3_24GHZ;
 673				else if (dp_clock == 270000)
 674					args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_2_70GHZ;
 675				else
 676					args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_1_62GHZ;
 677			}
 678			args.v4.acConfig.ucDigSel = dig->dig_encoder;
 679			args.v4.ucBitPerColor = amdgpu_atombios_encoder_get_bpc(encoder);
 680			if (hpd_id == AMDGPU_HPD_NONE)
 681				args.v4.ucHPD_ID = 0;
 682			else
 683				args.v4.ucHPD_ID = hpd_id + 1;
 684			break;
 685		case 5:
 686			switch (action) {
 687			case ATOM_ENCODER_CMD_SETUP_PANEL_MODE:
 688				args.v5.asDPPanelModeParam.ucAction = action;
 689				args.v5.asDPPanelModeParam.ucPanelMode = panel_mode;
 690				args.v5.asDPPanelModeParam.ucDigId = dig->dig_encoder;
 691				break;
 692			case ATOM_ENCODER_CMD_STREAM_SETUP:
 693				args.v5.asStreamParam.ucAction = action;
 694				args.v5.asStreamParam.ucDigId = dig->dig_encoder;
 695				args.v5.asStreamParam.ucDigMode =
 696					amdgpu_atombios_encoder_get_encoder_mode(encoder);
 697				if (ENCODER_MODE_IS_DP(args.v5.asStreamParam.ucDigMode))
 698					args.v5.asStreamParam.ucLaneNum = dp_lane_count;
 699				else if (amdgpu_dig_monitor_is_duallink(encoder,
 700									amdgpu_encoder->pixel_clock))
 701					args.v5.asStreamParam.ucLaneNum = 8;
 702				else
 703					args.v5.asStreamParam.ucLaneNum = 4;
 704				args.v5.asStreamParam.ulPixelClock =
 705					cpu_to_le32(amdgpu_encoder->pixel_clock / 10);
 706				args.v5.asStreamParam.ucBitPerColor =
 707					amdgpu_atombios_encoder_get_bpc(encoder);
 708				args.v5.asStreamParam.ucLinkRateIn270Mhz = dp_clock / 27000;
 709				break;
 710			case ATOM_ENCODER_CMD_DP_LINK_TRAINING_START:
 711			case ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN1:
 712			case ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN2:
 713			case ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN3:
 714			case ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN4:
 715			case ATOM_ENCODER_CMD_DP_LINK_TRAINING_COMPLETE:
 716			case ATOM_ENCODER_CMD_DP_VIDEO_OFF:
 717			case ATOM_ENCODER_CMD_DP_VIDEO_ON:
 718				args.v5.asCmdParam.ucAction = action;
 719				args.v5.asCmdParam.ucDigId = dig->dig_encoder;
 720				break;
 721			default:
 722				DRM_ERROR("Unsupported action 0x%x\n", action);
 723				break;
 724			}
 725			break;
 726		default:
 727			DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
 728			break;
 729		}
 730		break;
 731	default:
 732		DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
 733		break;
 734	}
 735
 736	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
 737
 738}
 739
 740union dig_transmitter_control {
 741	DIG_TRANSMITTER_CONTROL_PS_ALLOCATION v1;
 742	DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 v2;
 743	DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 v3;
 744	DIG_TRANSMITTER_CONTROL_PARAMETERS_V4 v4;
 745	DIG_TRANSMITTER_CONTROL_PARAMETERS_V1_5 v5;
 746	DIG_TRANSMITTER_CONTROL_PARAMETERS_V1_6 v6;
 747};
 748
 749void
 750amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int action,
 751					      uint8_t lane_num, uint8_t lane_set)
 752{
 753	struct drm_device *dev = encoder->dev;
 754	struct amdgpu_device *adev = drm_to_adev(dev);
 755	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 756	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 757	struct drm_connector *connector;
 758	union dig_transmitter_control args;
 759	int index = 0;
 760	uint8_t frev, crev;
 761	bool is_dp = false;
 762	int pll_id = 0;
 763	int dp_clock = 0;
 764	int dp_lane_count = 0;
 765	int connector_object_id = 0;
 
 766	int dig_encoder = dig->dig_encoder;
 767	int hpd_id = AMDGPU_HPD_NONE;
 768
 769	if (action == ATOM_TRANSMITTER_ACTION_INIT) {
 770		connector = amdgpu_get_connector_for_encoder_init(encoder);
 771		/* just needed to avoid bailing in the encoder check.  the encoder
 772		 * isn't used for init
 773		 */
 774		dig_encoder = 0;
 775	} else
 776		connector = amdgpu_get_connector_for_encoder(encoder);
 777
 778	if (connector) {
 779		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 780		struct amdgpu_connector_atom_dig *dig_connector =
 781			amdgpu_connector->con_priv;
 782
 783		hpd_id = amdgpu_connector->hpd.hpd;
 784		dp_clock = dig_connector->dp_clock;
 785		dp_lane_count = dig_connector->dp_lane_count;
 786		connector_object_id =
 787			(amdgpu_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
 788	}
 789
 790	if (encoder->crtc) {
 791		struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc);
 792		pll_id = amdgpu_crtc->pll_id;
 793	}
 794
 795	/* no dig encoder assigned */
 796	if (dig_encoder == -1)
 797		return;
 798
 799	if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(encoder)))
 800		is_dp = true;
 801
 802	memset(&args, 0, sizeof(args));
 803
 804	switch (amdgpu_encoder->encoder_id) {
 805	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
 806		index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl);
 807		break;
 808	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
 809	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
 810	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
 811	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
 812		index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl);
 813		break;
 814	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
 815		index = GetIndexIntoMasterTable(COMMAND, LVTMATransmitterControl);
 816		break;
 817	}
 818
 819	if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
 820		return;
 821
 822	switch (frev) {
 823	case 1:
 824		switch (crev) {
 825		case 1:
 826			args.v1.ucAction = action;
 827			if (action == ATOM_TRANSMITTER_ACTION_INIT) {
 828				args.v1.usInitInfo = cpu_to_le16(connector_object_id);
 829			} else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
 830				args.v1.asMode.ucLaneSel = lane_num;
 831				args.v1.asMode.ucLaneSet = lane_set;
 832			} else {
 833				if (is_dp)
 834					args.v1.usPixelClock = cpu_to_le16(dp_clock / 10);
 835				else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 836					args.v1.usPixelClock = cpu_to_le16((amdgpu_encoder->pixel_clock / 2) / 10);
 837				else
 838					args.v1.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 839			}
 840
 841			args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL;
 842
 843			if (dig_encoder)
 844				args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER;
 845			else
 846				args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER;
 847
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 848			if (dig->linkb)
 849				args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKB;
 850			else
 851				args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKA;
 852
 853			if (is_dp)
 854				args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT;
 855			else if (amdgpu_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
 856				if (dig->coherent_mode)
 857					args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT;
 858				if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 859					args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_8LANE_LINK;
 860			}
 861			break;
 862		case 2:
 863			args.v2.ucAction = action;
 864			if (action == ATOM_TRANSMITTER_ACTION_INIT) {
 865				args.v2.usInitInfo = cpu_to_le16(connector_object_id);
 866			} else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
 867				args.v2.asMode.ucLaneSel = lane_num;
 868				args.v2.asMode.ucLaneSet = lane_set;
 869			} else {
 870				if (is_dp)
 871					args.v2.usPixelClock = cpu_to_le16(dp_clock / 10);
 872				else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 873					args.v2.usPixelClock = cpu_to_le16((amdgpu_encoder->pixel_clock / 2) / 10);
 874				else
 875					args.v2.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 876			}
 877
 878			args.v2.acConfig.ucEncoderSel = dig_encoder;
 879			if (dig->linkb)
 880				args.v2.acConfig.ucLinkSel = 1;
 881
 882			switch (amdgpu_encoder->encoder_id) {
 883			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
 884				args.v2.acConfig.ucTransmitterSel = 0;
 885				break;
 886			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
 887				args.v2.acConfig.ucTransmitterSel = 1;
 888				break;
 889			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
 890				args.v2.acConfig.ucTransmitterSel = 2;
 891				break;
 892			}
 893
 894			if (is_dp) {
 895				args.v2.acConfig.fCoherentMode = 1;
 896				args.v2.acConfig.fDPConnector = 1;
 897			} else if (amdgpu_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
 898				if (dig->coherent_mode)
 899					args.v2.acConfig.fCoherentMode = 1;
 900				if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 901					args.v2.acConfig.fDualLinkConnector = 1;
 902			}
 903			break;
 904		case 3:
 905			args.v3.ucAction = action;
 906			if (action == ATOM_TRANSMITTER_ACTION_INIT) {
 907				args.v3.usInitInfo = cpu_to_le16(connector_object_id);
 908			} else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
 909				args.v3.asMode.ucLaneSel = lane_num;
 910				args.v3.asMode.ucLaneSet = lane_set;
 911			} else {
 912				if (is_dp)
 913					args.v3.usPixelClock = cpu_to_le16(dp_clock / 10);
 914				else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 915					args.v3.usPixelClock = cpu_to_le16((amdgpu_encoder->pixel_clock / 2) / 10);
 916				else
 917					args.v3.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 918			}
 919
 920			if (is_dp)
 921				args.v3.ucLaneNum = dp_lane_count;
 922			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 923				args.v3.ucLaneNum = 8;
 924			else
 925				args.v3.ucLaneNum = 4;
 926
 927			if (dig->linkb)
 928				args.v3.acConfig.ucLinkSel = 1;
 929			if (dig_encoder & 1)
 930				args.v3.acConfig.ucEncoderSel = 1;
 931
 932			/* Select the PLL for the PHY
 933			 * DP PHY should be clocked from external src if there is
 934			 * one.
 935			 */
 936			/* On DCE4, if there is an external clock, it generates the DP ref clock */
 937			if (is_dp && adev->clock.dp_extclk)
 938				args.v3.acConfig.ucRefClkSource = 2; /* external src */
 939			else
 940				args.v3.acConfig.ucRefClkSource = pll_id;
 941
 942			switch (amdgpu_encoder->encoder_id) {
 943			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
 944				args.v3.acConfig.ucTransmitterSel = 0;
 945				break;
 946			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
 947				args.v3.acConfig.ucTransmitterSel = 1;
 948				break;
 949			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
 950				args.v3.acConfig.ucTransmitterSel = 2;
 951				break;
 952			}
 953
 954			if (is_dp)
 955				args.v3.acConfig.fCoherentMode = 1; /* DP requires coherent */
 956			else if (amdgpu_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
 957				if (dig->coherent_mode)
 958					args.v3.acConfig.fCoherentMode = 1;
 959				if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 960					args.v3.acConfig.fDualLinkConnector = 1;
 961			}
 962			break;
 963		case 4:
 964			args.v4.ucAction = action;
 965			if (action == ATOM_TRANSMITTER_ACTION_INIT) {
 966				args.v4.usInitInfo = cpu_to_le16(connector_object_id);
 967			} else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
 968				args.v4.asMode.ucLaneSel = lane_num;
 969				args.v4.asMode.ucLaneSet = lane_set;
 970			} else {
 971				if (is_dp)
 972					args.v4.usPixelClock = cpu_to_le16(dp_clock / 10);
 973				else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 974					args.v4.usPixelClock = cpu_to_le16((amdgpu_encoder->pixel_clock / 2) / 10);
 975				else
 976					args.v4.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 977			}
 978
 979			if (is_dp)
 980				args.v4.ucLaneNum = dp_lane_count;
 981			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 982				args.v4.ucLaneNum = 8;
 983			else
 984				args.v4.ucLaneNum = 4;
 985
 986			if (dig->linkb)
 987				args.v4.acConfig.ucLinkSel = 1;
 988			if (dig_encoder & 1)
 989				args.v4.acConfig.ucEncoderSel = 1;
 990
 991			/* Select the PLL for the PHY
 992			 * DP PHY should be clocked from external src if there is
 993			 * one.
 994			 */
 995			/* On DCE5 DCPLL usually generates the DP ref clock */
 996			if (is_dp) {
 997				if (adev->clock.dp_extclk)
 998					args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_EXTCLK;
 999				else
1000					args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_DCPLL;
1001			} else
1002				args.v4.acConfig.ucRefClkSource = pll_id;
1003
1004			switch (amdgpu_encoder->encoder_id) {
1005			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1006				args.v4.acConfig.ucTransmitterSel = 0;
1007				break;
1008			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1009				args.v4.acConfig.ucTransmitterSel = 1;
1010				break;
1011			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1012				args.v4.acConfig.ucTransmitterSel = 2;
1013				break;
1014			}
1015
1016			if (is_dp)
1017				args.v4.acConfig.fCoherentMode = 1; /* DP requires coherent */
1018			else if (amdgpu_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
1019				if (dig->coherent_mode)
1020					args.v4.acConfig.fCoherentMode = 1;
1021				if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
1022					args.v4.acConfig.fDualLinkConnector = 1;
1023			}
1024			break;
1025		case 5:
1026			args.v5.ucAction = action;
1027			if (is_dp)
1028				args.v5.usSymClock = cpu_to_le16(dp_clock / 10);
1029			else
1030				args.v5.usSymClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
1031
1032			switch (amdgpu_encoder->encoder_id) {
1033			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1034				if (dig->linkb)
1035					args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYB;
1036				else
1037					args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYA;
1038				break;
1039			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1040				if (dig->linkb)
1041					args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYD;
1042				else
1043					args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYC;
1044				break;
1045			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1046				if (dig->linkb)
1047					args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYF;
1048				else
1049					args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYE;
1050				break;
1051			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1052				args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYG;
1053				break;
1054			}
1055			if (is_dp)
1056				args.v5.ucLaneNum = dp_lane_count;
1057			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
1058				args.v5.ucLaneNum = 8;
1059			else
1060				args.v5.ucLaneNum = 4;
1061			args.v5.ucConnObjId = connector_object_id;
1062			args.v5.ucDigMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
1063
1064			if (is_dp && adev->clock.dp_extclk)
1065				args.v5.asConfig.ucPhyClkSrcId = ENCODER_REFCLK_SRC_EXTCLK;
1066			else
1067				args.v5.asConfig.ucPhyClkSrcId = pll_id;
1068
1069			if (is_dp)
1070				args.v5.asConfig.ucCoherentMode = 1; /* DP requires coherent */
1071			else if (amdgpu_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
1072				if (dig->coherent_mode)
1073					args.v5.asConfig.ucCoherentMode = 1;
1074			}
1075			if (hpd_id == AMDGPU_HPD_NONE)
1076				args.v5.asConfig.ucHPDSel = 0;
1077			else
1078				args.v5.asConfig.ucHPDSel = hpd_id + 1;
1079			args.v5.ucDigEncoderSel = 1 << dig_encoder;
1080			args.v5.ucDPLaneSet = lane_set;
1081			break;
1082		case 6:
1083			args.v6.ucAction = action;
1084			if (is_dp)
1085				args.v6.ulSymClock = cpu_to_le32(dp_clock / 10);
1086			else
1087				args.v6.ulSymClock = cpu_to_le32(amdgpu_encoder->pixel_clock / 10);
1088
1089			switch (amdgpu_encoder->encoder_id) {
1090			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1091				if (dig->linkb)
1092					args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYB;
1093				else
1094					args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYA;
1095				break;
1096			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1097				if (dig->linkb)
1098					args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYD;
1099				else
1100					args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYC;
1101				break;
1102			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1103				if (dig->linkb)
1104					args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYF;
1105				else
1106					args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYE;
1107				break;
1108			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1109				args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYG;
1110				break;
1111			}
1112			if (is_dp)
1113				args.v6.ucLaneNum = dp_lane_count;
1114			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
1115				args.v6.ucLaneNum = 8;
1116			else
1117				args.v6.ucLaneNum = 4;
1118			args.v6.ucConnObjId = connector_object_id;
1119			if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH)
1120				args.v6.ucDPLaneSet = lane_set;
1121			else
1122				args.v6.ucDigMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
1123
1124			if (hpd_id == AMDGPU_HPD_NONE)
1125				args.v6.ucHPDSel = 0;
1126			else
1127				args.v6.ucHPDSel = hpd_id + 1;
1128			args.v6.ucDigEncoderSel = 1 << dig_encoder;
1129			break;
1130		default:
1131			DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
1132			break;
1133		}
1134		break;
1135	default:
1136		DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
1137		break;
1138	}
1139
1140	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1141}
1142
1143bool
1144amdgpu_atombios_encoder_set_edp_panel_power(struct drm_connector *connector,
1145				     int action)
1146{
1147	struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1148	struct drm_device *dev = amdgpu_connector->base.dev;
1149	struct amdgpu_device *adev = drm_to_adev(dev);
1150	union dig_transmitter_control args;
1151	int index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl);
1152	uint8_t frev, crev;
1153
1154	if (connector->connector_type != DRM_MODE_CONNECTOR_eDP)
1155		goto done;
1156
1157	if ((action != ATOM_TRANSMITTER_ACTION_POWER_ON) &&
1158	    (action != ATOM_TRANSMITTER_ACTION_POWER_OFF))
1159		goto done;
1160
1161	if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
1162		goto done;
1163
1164	memset(&args, 0, sizeof(args));
1165
1166	args.v1.ucAction = action;
1167
1168	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1169
1170	/* wait for the panel to power up */
1171	if (action == ATOM_TRANSMITTER_ACTION_POWER_ON) {
1172		int i;
1173
1174		for (i = 0; i < 300; i++) {
1175			if (amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd))
1176				return true;
1177			mdelay(1);
1178		}
1179		return false;
1180	}
1181done:
1182	return true;
1183}
1184
1185union external_encoder_control {
1186	EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION v1;
1187	EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION_V3 v3;
1188};
1189
1190static void
1191amdgpu_atombios_encoder_setup_external_encoder(struct drm_encoder *encoder,
1192					struct drm_encoder *ext_encoder,
1193					int action)
1194{
1195	struct drm_device *dev = encoder->dev;
1196	struct amdgpu_device *adev = drm_to_adev(dev);
1197	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1198	struct amdgpu_encoder *ext_amdgpu_encoder = to_amdgpu_encoder(ext_encoder);
1199	union external_encoder_control args;
1200	struct drm_connector *connector;
1201	int index = GetIndexIntoMasterTable(COMMAND, ExternalEncoderControl);
1202	u8 frev, crev;
1203	int dp_clock = 0;
1204	int dp_lane_count = 0;
1205	int connector_object_id = 0;
1206	u32 ext_enum = (ext_amdgpu_encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
1207
1208	if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT)
1209		connector = amdgpu_get_connector_for_encoder_init(encoder);
1210	else
1211		connector = amdgpu_get_connector_for_encoder(encoder);
1212
1213	if (connector) {
1214		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1215		struct amdgpu_connector_atom_dig *dig_connector =
1216			amdgpu_connector->con_priv;
1217
1218		dp_clock = dig_connector->dp_clock;
1219		dp_lane_count = dig_connector->dp_lane_count;
1220		connector_object_id =
1221			(amdgpu_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
1222	}
1223
1224	memset(&args, 0, sizeof(args));
1225
1226	if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
1227		return;
1228
1229	switch (frev) {
1230	case 1:
1231		/* no params on frev 1 */
1232		break;
1233	case 2:
1234		switch (crev) {
1235		case 1:
1236		case 2:
1237			args.v1.sDigEncoder.ucAction = action;
1238			args.v1.sDigEncoder.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
1239			args.v1.sDigEncoder.ucEncoderMode =
1240				amdgpu_atombios_encoder_get_encoder_mode(encoder);
1241
1242			if (ENCODER_MODE_IS_DP(args.v1.sDigEncoder.ucEncoderMode)) {
1243				if (dp_clock == 270000)
1244					args.v1.sDigEncoder.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
1245				args.v1.sDigEncoder.ucLaneNum = dp_lane_count;
1246			} else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
1247				args.v1.sDigEncoder.ucLaneNum = 8;
1248			else
1249				args.v1.sDigEncoder.ucLaneNum = 4;
1250			break;
1251		case 3:
1252			args.v3.sExtEncoder.ucAction = action;
1253			if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT)
1254				args.v3.sExtEncoder.usConnectorId = cpu_to_le16(connector_object_id);
1255			else
1256				args.v3.sExtEncoder.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
1257			args.v3.sExtEncoder.ucEncoderMode =
1258				amdgpu_atombios_encoder_get_encoder_mode(encoder);
1259
1260			if (ENCODER_MODE_IS_DP(args.v3.sExtEncoder.ucEncoderMode)) {
1261				if (dp_clock == 270000)
1262					args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
1263				else if (dp_clock == 540000)
1264					args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_5_40GHZ;
1265				args.v3.sExtEncoder.ucLaneNum = dp_lane_count;
1266			} else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
1267				args.v3.sExtEncoder.ucLaneNum = 8;
1268			else
1269				args.v3.sExtEncoder.ucLaneNum = 4;
1270			switch (ext_enum) {
1271			case GRAPH_OBJECT_ENUM_ID1:
1272				args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER1;
1273				break;
1274			case GRAPH_OBJECT_ENUM_ID2:
1275				args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER2;
1276				break;
1277			case GRAPH_OBJECT_ENUM_ID3:
1278				args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER3;
1279				break;
1280			}
1281			args.v3.sExtEncoder.ucBitPerColor = amdgpu_atombios_encoder_get_bpc(encoder);
1282			break;
1283		default:
1284			DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1285			return;
1286		}
1287		break;
1288	default:
1289		DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1290		return;
1291	}
1292	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1293}
1294
1295static void
1296amdgpu_atombios_encoder_setup_dig(struct drm_encoder *encoder, int action)
1297{
1298	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1299	struct drm_encoder *ext_encoder = amdgpu_get_external_encoder(encoder);
1300	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
1301	struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
1302	struct amdgpu_connector *amdgpu_connector = NULL;
1303	struct amdgpu_connector_atom_dig *amdgpu_dig_connector = NULL;
1304
1305	if (connector) {
1306		amdgpu_connector = to_amdgpu_connector(connector);
1307		amdgpu_dig_connector = amdgpu_connector->con_priv;
1308	}
1309
1310	if (action == ATOM_ENABLE) {
1311		if (!connector)
1312			dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
1313		else
1314			dig->panel_mode = amdgpu_atombios_dp_get_panel_mode(encoder, connector);
1315
1316		/* setup and enable the encoder */
1317		amdgpu_atombios_encoder_setup_dig_encoder(encoder, ATOM_ENCODER_CMD_SETUP, 0);
1318		amdgpu_atombios_encoder_setup_dig_encoder(encoder,
1319						   ATOM_ENCODER_CMD_SETUP_PANEL_MODE,
1320						   dig->panel_mode);
1321		if (ext_encoder)
1322			amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder,
1323								EXTERNAL_ENCODER_ACTION_V3_ENCODER_SETUP);
1324		if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(encoder)) &&
1325		    connector) {
1326			if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1327				amdgpu_atombios_encoder_set_edp_panel_power(connector,
1328								     ATOM_TRANSMITTER_ACTION_POWER_ON);
1329				amdgpu_dig_connector->edp_on = true;
1330			}
1331		}
1332		/* enable the transmitter */
1333		amdgpu_atombios_encoder_setup_dig_transmitter(encoder,
1334						       ATOM_TRANSMITTER_ACTION_ENABLE,
1335						       0, 0);
1336		if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(encoder)) &&
1337		    connector) {
1338			/* DP_SET_POWER_D0 is set in amdgpu_atombios_dp_link_train */
1339			amdgpu_atombios_dp_link_train(encoder, connector);
1340			amdgpu_atombios_encoder_setup_dig_encoder(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0);
1341		}
1342		if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
1343			amdgpu_atombios_encoder_set_backlight_level(amdgpu_encoder, dig->backlight_level);
1344		if (ext_encoder)
1345			amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder, ATOM_ENABLE);
1346	} else {
1347		if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(encoder)) &&
1348		    connector)
1349			amdgpu_atombios_encoder_setup_dig_encoder(encoder,
1350							   ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0);
1351		if (ext_encoder)
1352			amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder, ATOM_DISABLE);
1353		if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
1354			amdgpu_atombios_encoder_setup_dig_transmitter(encoder,
1355							       ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0);
1356
1357		if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(encoder)) &&
1358		    connector)
1359			amdgpu_atombios_dp_set_rx_power_state(connector, DP_SET_POWER_D3);
1360		/* disable the transmitter */
1361		amdgpu_atombios_encoder_setup_dig_transmitter(encoder,
1362						       ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0);
1363		if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(encoder)) &&
1364		    connector) {
1365			if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1366				amdgpu_atombios_encoder_set_edp_panel_power(connector,
1367								     ATOM_TRANSMITTER_ACTION_POWER_OFF);
1368				amdgpu_dig_connector->edp_on = false;
1369			}
1370		}
1371	}
1372}
1373
1374void
1375amdgpu_atombios_encoder_dpms(struct drm_encoder *encoder, int mode)
1376{
1377	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1378
1379	DRM_DEBUG_KMS("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n",
1380		  amdgpu_encoder->encoder_id, mode, amdgpu_encoder->devices,
1381		  amdgpu_encoder->active_device);
1382	switch (amdgpu_encoder->encoder_id) {
1383	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1384	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1385	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1386	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1387		switch (mode) {
1388		case DRM_MODE_DPMS_ON:
1389			amdgpu_atombios_encoder_setup_dig(encoder, ATOM_ENABLE);
1390			break;
1391		case DRM_MODE_DPMS_STANDBY:
1392		case DRM_MODE_DPMS_SUSPEND:
1393		case DRM_MODE_DPMS_OFF:
1394			amdgpu_atombios_encoder_setup_dig(encoder, ATOM_DISABLE);
1395			break;
1396		}
1397		break;
1398	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1399		switch (mode) {
1400		case DRM_MODE_DPMS_ON:
1401			amdgpu_atombios_encoder_setup_dvo(encoder, ATOM_ENABLE);
1402			break;
1403		case DRM_MODE_DPMS_STANDBY:
1404		case DRM_MODE_DPMS_SUSPEND:
1405		case DRM_MODE_DPMS_OFF:
1406			amdgpu_atombios_encoder_setup_dvo(encoder, ATOM_DISABLE);
1407			break;
1408		}
1409		break;
1410	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1411		switch (mode) {
1412		case DRM_MODE_DPMS_ON:
1413			amdgpu_atombios_encoder_setup_dac(encoder, ATOM_ENABLE);
1414			break;
1415		case DRM_MODE_DPMS_STANDBY:
1416		case DRM_MODE_DPMS_SUSPEND:
1417		case DRM_MODE_DPMS_OFF:
1418			amdgpu_atombios_encoder_setup_dac(encoder, ATOM_DISABLE);
1419			break;
1420		}
1421		break;
1422	default:
1423		return;
1424	}
1425}
1426
1427union crtc_source_param {
1428	SELECT_CRTC_SOURCE_PS_ALLOCATION v1;
1429	SELECT_CRTC_SOURCE_PARAMETERS_V2 v2;
1430	SELECT_CRTC_SOURCE_PARAMETERS_V3 v3;
1431};
1432
1433void
1434amdgpu_atombios_encoder_set_crtc_source(struct drm_encoder *encoder)
1435{
1436	struct drm_device *dev = encoder->dev;
1437	struct amdgpu_device *adev = drm_to_adev(dev);
1438	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1439	struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc);
1440	union crtc_source_param args;
1441	int index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source);
1442	uint8_t frev, crev;
1443	struct amdgpu_encoder_atom_dig *dig;
1444
1445	memset(&args, 0, sizeof(args));
1446
1447	if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
1448		return;
1449
1450	switch (frev) {
1451	case 1:
1452		switch (crev) {
1453		case 1:
1454		default:
1455			args.v1.ucCRTC = amdgpu_crtc->crtc_id;
1456			switch (amdgpu_encoder->encoder_id) {
1457			case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
1458			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
1459				args.v1.ucDevice = ATOM_DEVICE_DFP1_INDEX;
1460				break;
1461			case ENCODER_OBJECT_ID_INTERNAL_LVDS:
1462			case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
1463				if (amdgpu_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT)
1464					args.v1.ucDevice = ATOM_DEVICE_LCD1_INDEX;
1465				else
1466					args.v1.ucDevice = ATOM_DEVICE_DFP3_INDEX;
1467				break;
1468			case ENCODER_OBJECT_ID_INTERNAL_DVO1:
1469			case ENCODER_OBJECT_ID_INTERNAL_DDI:
1470			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1471				args.v1.ucDevice = ATOM_DEVICE_DFP2_INDEX;
1472				break;
1473			case ENCODER_OBJECT_ID_INTERNAL_DAC1:
1474			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1475				if (amdgpu_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1476					args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX;
1477				else if (amdgpu_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1478					args.v1.ucDevice = ATOM_DEVICE_CV_INDEX;
1479				else
1480					args.v1.ucDevice = ATOM_DEVICE_CRT1_INDEX;
1481				break;
1482			case ENCODER_OBJECT_ID_INTERNAL_DAC2:
1483			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1484				if (amdgpu_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1485					args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX;
1486				else if (amdgpu_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1487					args.v1.ucDevice = ATOM_DEVICE_CV_INDEX;
1488				else
1489					args.v1.ucDevice = ATOM_DEVICE_CRT2_INDEX;
1490				break;
1491			}
1492			break;
1493		case 2:
1494			args.v2.ucCRTC = amdgpu_crtc->crtc_id;
1495			if (amdgpu_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE) {
1496				struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
1497
1498				if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
1499					args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS;
1500				else if (connector->connector_type == DRM_MODE_CONNECTOR_VGA)
1501					args.v2.ucEncodeMode = ATOM_ENCODER_MODE_CRT;
1502				else
1503					args.v2.ucEncodeMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
1504			} else if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1505				args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS;
1506			} else {
1507				args.v2.ucEncodeMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
1508			}
1509			switch (amdgpu_encoder->encoder_id) {
1510			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1511			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1512			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1513			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1514			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
1515				dig = amdgpu_encoder->enc_priv;
1516				switch (dig->dig_encoder) {
1517				case 0:
1518					args.v2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID;
1519					break;
1520				case 1:
1521					args.v2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID;
1522					break;
1523				case 2:
1524					args.v2.ucEncoderID = ASIC_INT_DIG3_ENCODER_ID;
1525					break;
1526				case 3:
1527					args.v2.ucEncoderID = ASIC_INT_DIG4_ENCODER_ID;
1528					break;
1529				case 4:
1530					args.v2.ucEncoderID = ASIC_INT_DIG5_ENCODER_ID;
1531					break;
1532				case 5:
1533					args.v2.ucEncoderID = ASIC_INT_DIG6_ENCODER_ID;
1534					break;
1535				case 6:
1536					args.v2.ucEncoderID = ASIC_INT_DIG7_ENCODER_ID;
1537					break;
1538				}
1539				break;
1540			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1541				args.v2.ucEncoderID = ASIC_INT_DVO_ENCODER_ID;
1542				break;
1543			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1544				if (amdgpu_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1545					args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1546				else if (amdgpu_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1547					args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1548				else
1549					args.v2.ucEncoderID = ASIC_INT_DAC1_ENCODER_ID;
1550				break;
1551			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1552				if (amdgpu_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1553					args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1554				else if (amdgpu_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1555					args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1556				else
1557					args.v2.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID;
1558				break;
1559			}
1560			break;
1561		case 3:
1562			args.v3.ucCRTC = amdgpu_crtc->crtc_id;
1563			if (amdgpu_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE) {
1564				struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
1565
1566				if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
1567					args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS;
1568				else if (connector->connector_type == DRM_MODE_CONNECTOR_VGA)
1569					args.v2.ucEncodeMode = ATOM_ENCODER_MODE_CRT;
1570				else
1571					args.v2.ucEncodeMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
1572			} else if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1573				args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS;
1574			} else {
1575				args.v2.ucEncodeMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
1576			}
1577			args.v3.ucDstBpc = amdgpu_atombios_encoder_get_bpc(encoder);
1578			switch (amdgpu_encoder->encoder_id) {
1579			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1580			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1581			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1582			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1583			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
1584				dig = amdgpu_encoder->enc_priv;
1585				switch (dig->dig_encoder) {
1586				case 0:
1587					args.v3.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID;
1588					break;
1589				case 1:
1590					args.v3.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID;
1591					break;
1592				case 2:
1593					args.v3.ucEncoderID = ASIC_INT_DIG3_ENCODER_ID;
1594					break;
1595				case 3:
1596					args.v3.ucEncoderID = ASIC_INT_DIG4_ENCODER_ID;
1597					break;
1598				case 4:
1599					args.v3.ucEncoderID = ASIC_INT_DIG5_ENCODER_ID;
1600					break;
1601				case 5:
1602					args.v3.ucEncoderID = ASIC_INT_DIG6_ENCODER_ID;
1603					break;
1604				case 6:
1605					args.v3.ucEncoderID = ASIC_INT_DIG7_ENCODER_ID;
1606					break;
1607				}
1608				break;
1609			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1610				args.v3.ucEncoderID = ASIC_INT_DVO_ENCODER_ID;
1611				break;
1612			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1613				if (amdgpu_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1614					args.v3.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1615				else if (amdgpu_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1616					args.v3.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1617				else
1618					args.v3.ucEncoderID = ASIC_INT_DAC1_ENCODER_ID;
1619				break;
1620			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1621				if (amdgpu_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1622					args.v3.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1623				else if (amdgpu_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1624					args.v3.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1625				else
1626					args.v3.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID;
1627				break;
1628			}
1629			break;
1630		}
1631		break;
1632	default:
1633		DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1634		return;
1635	}
1636
1637	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1638}
1639
1640/* This only needs to be called once at startup */
1641void
1642amdgpu_atombios_encoder_init_dig(struct amdgpu_device *adev)
1643{
1644	struct drm_device *dev = adev_to_drm(adev);
1645	struct drm_encoder *encoder;
1646
1647	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
1648		struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1649		struct drm_encoder *ext_encoder = amdgpu_get_external_encoder(encoder);
1650
1651		switch (amdgpu_encoder->encoder_id) {
1652		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1653		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1654		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1655		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1656			amdgpu_atombios_encoder_setup_dig_transmitter(encoder, ATOM_TRANSMITTER_ACTION_INIT,
1657							       0, 0);
1658			break;
1659		}
1660
1661		if (ext_encoder)
1662			amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder,
1663								EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT);
1664	}
1665}
1666
1667static bool
1668amdgpu_atombios_encoder_dac_load_detect(struct drm_encoder *encoder,
1669				 struct drm_connector *connector)
1670{
1671	struct drm_device *dev = encoder->dev;
1672	struct amdgpu_device *adev = drm_to_adev(dev);
1673	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1674	struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1675
1676	if (amdgpu_encoder->devices & (ATOM_DEVICE_TV_SUPPORT |
1677				       ATOM_DEVICE_CV_SUPPORT |
1678				       ATOM_DEVICE_CRT_SUPPORT)) {
1679		DAC_LOAD_DETECTION_PS_ALLOCATION args;
1680		int index = GetIndexIntoMasterTable(COMMAND, DAC_LoadDetection);
1681		uint8_t frev, crev;
1682
1683		memset(&args, 0, sizeof(args));
1684
1685		if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
1686			return false;
1687
1688		args.sDacload.ucMisc = 0;
1689
1690		if ((amdgpu_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DAC1) ||
1691		    (amdgpu_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1))
1692			args.sDacload.ucDacType = ATOM_DAC_A;
1693		else
1694			args.sDacload.ucDacType = ATOM_DAC_B;
1695
1696		if (amdgpu_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)
1697			args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT1_SUPPORT);
1698		else if (amdgpu_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)
1699			args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT2_SUPPORT);
1700		else if (amdgpu_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
1701			args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CV_SUPPORT);
1702			if (crev >= 3)
1703				args.sDacload.ucMisc = DAC_LOAD_MISC_YPrPb;
1704		} else if (amdgpu_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
1705			args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_TV1_SUPPORT);
1706			if (crev >= 3)
1707				args.sDacload.ucMisc = DAC_LOAD_MISC_YPrPb;
1708		}
1709
1710		amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1711
1712		return true;
1713	} else
1714		return false;
1715}
1716
1717enum drm_connector_status
1718amdgpu_atombios_encoder_dac_detect(struct drm_encoder *encoder,
1719			    struct drm_connector *connector)
1720{
1721	struct drm_device *dev = encoder->dev;
1722	struct amdgpu_device *adev = drm_to_adev(dev);
1723	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1724	struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1725	uint32_t bios_0_scratch;
1726
1727	if (!amdgpu_atombios_encoder_dac_load_detect(encoder, connector)) {
1728		DRM_DEBUG_KMS("detect returned false \n");
1729		return connector_status_unknown;
1730	}
1731
1732	bios_0_scratch = RREG32(mmBIOS_SCRATCH_0);
1733
1734	DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, amdgpu_encoder->devices);
1735	if (amdgpu_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) {
1736		if (bios_0_scratch & ATOM_S0_CRT1_MASK)
1737			return connector_status_connected;
1738	}
1739	if (amdgpu_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) {
1740		if (bios_0_scratch & ATOM_S0_CRT2_MASK)
1741			return connector_status_connected;
1742	}
1743	if (amdgpu_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
1744		if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A))
1745			return connector_status_connected;
1746	}
1747	if (amdgpu_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
1748		if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A))
1749			return connector_status_connected; /* CTV */
1750		else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A))
1751			return connector_status_connected; /* STV */
1752	}
1753	return connector_status_disconnected;
1754}
1755
1756enum drm_connector_status
1757amdgpu_atombios_encoder_dig_detect(struct drm_encoder *encoder,
1758			    struct drm_connector *connector)
1759{
1760	struct drm_device *dev = encoder->dev;
1761	struct amdgpu_device *adev = drm_to_adev(dev);
1762	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1763	struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1764	struct drm_encoder *ext_encoder = amdgpu_get_external_encoder(encoder);
1765	u32 bios_0_scratch;
1766
1767	if (!ext_encoder)
1768		return connector_status_unknown;
1769
1770	if ((amdgpu_connector->devices & ATOM_DEVICE_CRT_SUPPORT) == 0)
1771		return connector_status_unknown;
1772
1773	/* load detect on the dp bridge */
1774	amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder,
1775						EXTERNAL_ENCODER_ACTION_V3_DACLOAD_DETECTION);
1776
1777	bios_0_scratch = RREG32(mmBIOS_SCRATCH_0);
1778
1779	DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, amdgpu_encoder->devices);
1780	if (amdgpu_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) {
1781		if (bios_0_scratch & ATOM_S0_CRT1_MASK)
1782			return connector_status_connected;
1783	}
1784	if (amdgpu_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) {
1785		if (bios_0_scratch & ATOM_S0_CRT2_MASK)
1786			return connector_status_connected;
1787	}
1788	if (amdgpu_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
1789		if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A))
1790			return connector_status_connected;
1791	}
1792	if (amdgpu_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
1793		if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A))
1794			return connector_status_connected; /* CTV */
1795		else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A))
1796			return connector_status_connected; /* STV */
1797	}
1798	return connector_status_disconnected;
1799}
1800
1801void
1802amdgpu_atombios_encoder_setup_ext_encoder_ddc(struct drm_encoder *encoder)
1803{
1804	struct drm_encoder *ext_encoder = amdgpu_get_external_encoder(encoder);
1805
1806	if (ext_encoder)
1807		/* ddc_setup on the dp bridge */
1808		amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder,
1809							EXTERNAL_ENCODER_ACTION_V3_DDC_SETUP);
1810
1811}
1812
1813void
1814amdgpu_atombios_encoder_set_bios_scratch_regs(struct drm_connector *connector,
1815				       struct drm_encoder *encoder,
1816				       bool connected)
1817{
1818	struct drm_device *dev = connector->dev;
1819	struct amdgpu_device *adev = drm_to_adev(dev);
1820	struct amdgpu_connector *amdgpu_connector =
1821	    to_amdgpu_connector(connector);
1822	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1823	uint32_t bios_0_scratch, bios_3_scratch, bios_6_scratch;
1824
1825	bios_0_scratch = RREG32(mmBIOS_SCRATCH_0);
1826	bios_3_scratch = RREG32(mmBIOS_SCRATCH_3);
1827	bios_6_scratch = RREG32(mmBIOS_SCRATCH_6);
1828
1829	if ((amdgpu_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) &&
1830	    (amdgpu_connector->devices & ATOM_DEVICE_LCD1_SUPPORT)) {
1831		if (connected) {
1832			DRM_DEBUG_KMS("LCD1 connected\n");
1833			bios_0_scratch |= ATOM_S0_LCD1;
1834			bios_3_scratch |= ATOM_S3_LCD1_ACTIVE;
1835			bios_6_scratch |= ATOM_S6_ACC_REQ_LCD1;
1836		} else {
1837			DRM_DEBUG_KMS("LCD1 disconnected\n");
1838			bios_0_scratch &= ~ATOM_S0_LCD1;
1839			bios_3_scratch &= ~ATOM_S3_LCD1_ACTIVE;
1840			bios_6_scratch &= ~ATOM_S6_ACC_REQ_LCD1;
1841		}
1842	}
1843	if ((amdgpu_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) &&
1844	    (amdgpu_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)) {
1845		if (connected) {
1846			DRM_DEBUG_KMS("CRT1 connected\n");
1847			bios_0_scratch |= ATOM_S0_CRT1_COLOR;
1848			bios_3_scratch |= ATOM_S3_CRT1_ACTIVE;
1849			bios_6_scratch |= ATOM_S6_ACC_REQ_CRT1;
1850		} else {
1851			DRM_DEBUG_KMS("CRT1 disconnected\n");
1852			bios_0_scratch &= ~ATOM_S0_CRT1_MASK;
1853			bios_3_scratch &= ~ATOM_S3_CRT1_ACTIVE;
1854			bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT1;
1855		}
1856	}
1857	if ((amdgpu_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) &&
1858	    (amdgpu_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)) {
1859		if (connected) {
1860			DRM_DEBUG_KMS("CRT2 connected\n");
1861			bios_0_scratch |= ATOM_S0_CRT2_COLOR;
1862			bios_3_scratch |= ATOM_S3_CRT2_ACTIVE;
1863			bios_6_scratch |= ATOM_S6_ACC_REQ_CRT2;
1864		} else {
1865			DRM_DEBUG_KMS("CRT2 disconnected\n");
1866			bios_0_scratch &= ~ATOM_S0_CRT2_MASK;
1867			bios_3_scratch &= ~ATOM_S3_CRT2_ACTIVE;
1868			bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT2;
1869		}
1870	}
1871	if ((amdgpu_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) &&
1872	    (amdgpu_connector->devices & ATOM_DEVICE_DFP1_SUPPORT)) {
1873		if (connected) {
1874			DRM_DEBUG_KMS("DFP1 connected\n");
1875			bios_0_scratch |= ATOM_S0_DFP1;
1876			bios_3_scratch |= ATOM_S3_DFP1_ACTIVE;
1877			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP1;
1878		} else {
1879			DRM_DEBUG_KMS("DFP1 disconnected\n");
1880			bios_0_scratch &= ~ATOM_S0_DFP1;
1881			bios_3_scratch &= ~ATOM_S3_DFP1_ACTIVE;
1882			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP1;
1883		}
1884	}
1885	if ((amdgpu_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) &&
1886	    (amdgpu_connector->devices & ATOM_DEVICE_DFP2_SUPPORT)) {
1887		if (connected) {
1888			DRM_DEBUG_KMS("DFP2 connected\n");
1889			bios_0_scratch |= ATOM_S0_DFP2;
1890			bios_3_scratch |= ATOM_S3_DFP2_ACTIVE;
1891			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP2;
1892		} else {
1893			DRM_DEBUG_KMS("DFP2 disconnected\n");
1894			bios_0_scratch &= ~ATOM_S0_DFP2;
1895			bios_3_scratch &= ~ATOM_S3_DFP2_ACTIVE;
1896			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP2;
1897		}
1898	}
1899	if ((amdgpu_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) &&
1900	    (amdgpu_connector->devices & ATOM_DEVICE_DFP3_SUPPORT)) {
1901		if (connected) {
1902			DRM_DEBUG_KMS("DFP3 connected\n");
1903			bios_0_scratch |= ATOM_S0_DFP3;
1904			bios_3_scratch |= ATOM_S3_DFP3_ACTIVE;
1905			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP3;
1906		} else {
1907			DRM_DEBUG_KMS("DFP3 disconnected\n");
1908			bios_0_scratch &= ~ATOM_S0_DFP3;
1909			bios_3_scratch &= ~ATOM_S3_DFP3_ACTIVE;
1910			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP3;
1911		}
1912	}
1913	if ((amdgpu_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) &&
1914	    (amdgpu_connector->devices & ATOM_DEVICE_DFP4_SUPPORT)) {
1915		if (connected) {
1916			DRM_DEBUG_KMS("DFP4 connected\n");
1917			bios_0_scratch |= ATOM_S0_DFP4;
1918			bios_3_scratch |= ATOM_S3_DFP4_ACTIVE;
1919			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP4;
1920		} else {
1921			DRM_DEBUG_KMS("DFP4 disconnected\n");
1922			bios_0_scratch &= ~ATOM_S0_DFP4;
1923			bios_3_scratch &= ~ATOM_S3_DFP4_ACTIVE;
1924			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP4;
1925		}
1926	}
1927	if ((amdgpu_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) &&
1928	    (amdgpu_connector->devices & ATOM_DEVICE_DFP5_SUPPORT)) {
1929		if (connected) {
1930			DRM_DEBUG_KMS("DFP5 connected\n");
1931			bios_0_scratch |= ATOM_S0_DFP5;
1932			bios_3_scratch |= ATOM_S3_DFP5_ACTIVE;
1933			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP5;
1934		} else {
1935			DRM_DEBUG_KMS("DFP5 disconnected\n");
1936			bios_0_scratch &= ~ATOM_S0_DFP5;
1937			bios_3_scratch &= ~ATOM_S3_DFP5_ACTIVE;
1938			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5;
1939		}
1940	}
1941	if ((amdgpu_encoder->devices & ATOM_DEVICE_DFP6_SUPPORT) &&
1942	    (amdgpu_connector->devices & ATOM_DEVICE_DFP6_SUPPORT)) {
1943		if (connected) {
1944			DRM_DEBUG_KMS("DFP6 connected\n");
1945			bios_0_scratch |= ATOM_S0_DFP6;
1946			bios_3_scratch |= ATOM_S3_DFP6_ACTIVE;
1947			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP6;
1948		} else {
1949			DRM_DEBUG_KMS("DFP6 disconnected\n");
1950			bios_0_scratch &= ~ATOM_S0_DFP6;
1951			bios_3_scratch &= ~ATOM_S3_DFP6_ACTIVE;
1952			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP6;
1953		}
1954	}
1955
1956	WREG32(mmBIOS_SCRATCH_0, bios_0_scratch);
1957	WREG32(mmBIOS_SCRATCH_3, bios_3_scratch);
1958	WREG32(mmBIOS_SCRATCH_6, bios_6_scratch);
1959}
1960
1961union lvds_info {
1962	struct _ATOM_LVDS_INFO info;
1963	struct _ATOM_LVDS_INFO_V12 info_12;
1964};
1965
1966struct amdgpu_encoder_atom_dig *
1967amdgpu_atombios_encoder_get_lcd_info(struct amdgpu_encoder *encoder)
1968{
1969	struct drm_device *dev = encoder->base.dev;
1970	struct amdgpu_device *adev = drm_to_adev(dev);
1971	struct amdgpu_mode_info *mode_info = &adev->mode_info;
1972	int index = GetIndexIntoMasterTable(DATA, LVDS_Info);
1973	uint16_t data_offset, misc;
1974	union lvds_info *lvds_info;
1975	uint8_t frev, crev;
1976	struct amdgpu_encoder_atom_dig *lvds = NULL;
1977	int encoder_enum = (encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
1978
1979	if (amdgpu_atom_parse_data_header(mode_info->atom_context, index, NULL,
1980				   &frev, &crev, &data_offset)) {
1981		lvds_info =
1982			(union lvds_info *)(mode_info->atom_context->bios + data_offset);
1983		lvds =
1984		    kzalloc(sizeof(struct amdgpu_encoder_atom_dig), GFP_KERNEL);
1985
1986		if (!lvds)
1987			return NULL;
1988
1989		lvds->native_mode.clock =
1990		    le16_to_cpu(lvds_info->info.sLCDTiming.usPixClk) * 10;
1991		lvds->native_mode.hdisplay =
1992		    le16_to_cpu(lvds_info->info.sLCDTiming.usHActive);
1993		lvds->native_mode.vdisplay =
1994		    le16_to_cpu(lvds_info->info.sLCDTiming.usVActive);
1995		lvds->native_mode.htotal = lvds->native_mode.hdisplay +
1996			le16_to_cpu(lvds_info->info.sLCDTiming.usHBlanking_Time);
1997		lvds->native_mode.hsync_start = lvds->native_mode.hdisplay +
1998			le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncOffset);
1999		lvds->native_mode.hsync_end = lvds->native_mode.hsync_start +
2000			le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncWidth);
2001		lvds->native_mode.vtotal = lvds->native_mode.vdisplay +
2002			le16_to_cpu(lvds_info->info.sLCDTiming.usVBlanking_Time);
2003		lvds->native_mode.vsync_start = lvds->native_mode.vdisplay +
2004			le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncOffset);
2005		lvds->native_mode.vsync_end = lvds->native_mode.vsync_start +
2006			le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncWidth);
2007		lvds->panel_pwr_delay =
2008		    le16_to_cpu(lvds_info->info.usOffDelayInMs);
2009		lvds->lcd_misc = lvds_info->info.ucLVDS_Misc;
2010
2011		misc = le16_to_cpu(lvds_info->info.sLCDTiming.susModeMiscInfo.usAccess);
2012		if (misc & ATOM_VSYNC_POLARITY)
2013			lvds->native_mode.flags |= DRM_MODE_FLAG_NVSYNC;
2014		if (misc & ATOM_HSYNC_POLARITY)
2015			lvds->native_mode.flags |= DRM_MODE_FLAG_NHSYNC;
2016		if (misc & ATOM_COMPOSITESYNC)
2017			lvds->native_mode.flags |= DRM_MODE_FLAG_CSYNC;
2018		if (misc & ATOM_INTERLACE)
2019			lvds->native_mode.flags |= DRM_MODE_FLAG_INTERLACE;
2020		if (misc & ATOM_DOUBLE_CLOCK_MODE)
2021			lvds->native_mode.flags |= DRM_MODE_FLAG_DBLSCAN;
2022
2023		lvds->native_mode.width_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageHSize);
2024		lvds->native_mode.height_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageVSize);
2025
2026		/* set crtc values */
2027		drm_mode_set_crtcinfo(&lvds->native_mode, CRTC_INTERLACE_HALVE_V);
2028
2029		lvds->lcd_ss_id = lvds_info->info.ucSS_Id;
2030
2031		encoder->native_mode = lvds->native_mode;
2032
2033		if (encoder_enum == 2)
2034			lvds->linkb = true;
2035		else
2036			lvds->linkb = false;
2037
2038		/* parse the lcd record table */
2039		if (le16_to_cpu(lvds_info->info.usModePatchTableOffset)) {
2040			ATOM_FAKE_EDID_PATCH_RECORD *fake_edid_record;
2041			ATOM_PANEL_RESOLUTION_PATCH_RECORD *panel_res_record;
2042			bool bad_record = false;
2043			u8 *record;
2044
2045			if ((frev == 1) && (crev < 2))
2046				/* absolute */
2047				record = (u8 *)(mode_info->atom_context->bios +
2048						le16_to_cpu(lvds_info->info.usModePatchTableOffset));
2049			else
2050				/* relative */
2051				record = (u8 *)(mode_info->atom_context->bios +
2052						data_offset +
2053						le16_to_cpu(lvds_info->info.usModePatchTableOffset));
2054			while (*record != ATOM_RECORD_END_TYPE) {
2055				switch (*record) {
2056				case LCD_MODE_PATCH_RECORD_MODE_TYPE:
2057					record += sizeof(ATOM_PATCH_RECORD_MODE);
2058					break;
2059				case LCD_RTS_RECORD_TYPE:
2060					record += sizeof(ATOM_LCD_RTS_RECORD);
2061					break;
2062				case LCD_CAP_RECORD_TYPE:
2063					record += sizeof(ATOM_LCD_MODE_CONTROL_CAP);
2064					break;
2065				case LCD_FAKE_EDID_PATCH_RECORD_TYPE:
2066					fake_edid_record = (ATOM_FAKE_EDID_PATCH_RECORD *)record;
2067					if (fake_edid_record->ucFakeEDIDLength) {
2068						struct edid *edid;
2069						int edid_size =
2070							max((int)EDID_LENGTH, (int)fake_edid_record->ucFakeEDIDLength);
2071						edid = kmalloc(edid_size, GFP_KERNEL);
2072						if (edid) {
2073							memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0],
2074							       fake_edid_record->ucFakeEDIDLength);
2075
2076							if (drm_edid_is_valid(edid)) {
2077								adev->mode_info.bios_hardcoded_edid = edid;
2078								adev->mode_info.bios_hardcoded_edid_size = edid_size;
2079							} else
2080								kfree(edid);
2081						}
2082					}
2083					record += fake_edid_record->ucFakeEDIDLength ?
2084						  struct_size(fake_edid_record,
2085							      ucFakeEDIDString,
2086							      fake_edid_record->ucFakeEDIDLength) :
2087						  /* empty fake edid record must be 3 bytes long */
2088						  sizeof(ATOM_FAKE_EDID_PATCH_RECORD) + 1;
2089					break;
2090				case LCD_PANEL_RESOLUTION_RECORD_TYPE:
2091					panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record;
2092					lvds->native_mode.width_mm = panel_res_record->usHSize;
2093					lvds->native_mode.height_mm = panel_res_record->usVSize;
2094					record += sizeof(ATOM_PANEL_RESOLUTION_PATCH_RECORD);
2095					break;
2096				default:
2097					DRM_ERROR("Bad LCD record %d\n", *record);
2098					bad_record = true;
2099					break;
2100				}
2101				if (bad_record)
2102					break;
2103			}
2104		}
2105	}
2106	return lvds;
2107}
2108
2109struct amdgpu_encoder_atom_dig *
2110amdgpu_atombios_encoder_get_dig_info(struct amdgpu_encoder *amdgpu_encoder)
2111{
2112	int encoder_enum = (amdgpu_encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
2113	struct amdgpu_encoder_atom_dig *dig = kzalloc(sizeof(struct amdgpu_encoder_atom_dig), GFP_KERNEL);
2114
2115	if (!dig)
2116		return NULL;
2117
2118	/* coherent mode by default */
2119	dig->coherent_mode = true;
2120	dig->dig_encoder = -1;
2121
2122	if (encoder_enum == 2)
2123		dig->linkb = true;
2124	else
2125		dig->linkb = false;
2126
2127	return dig;
2128}
2129
v4.10.11
   1/*
   2 * Copyright 2007-11 Advanced Micro Devices, Inc.
   3 * Copyright 2008 Red Hat Inc.
   4 *
   5 * Permission is hereby granted, free of charge, to any person obtaining a
   6 * copy of this software and associated documentation files (the "Software"),
   7 * to deal in the Software without restriction, including without limitation
   8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   9 * and/or sell copies of the Software, and to permit persons to whom the
  10 * Software is furnished to do so, subject to the following conditions:
  11 *
  12 * The above copyright notice and this permission notice shall be included in
  13 * all copies or substantial portions of the Software.
  14 *
  15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  21 * OTHER DEALINGS IN THE SOFTWARE.
  22 *
  23 * Authors: Dave Airlie
  24 *          Alex Deucher
  25 */
  26#include <drm/drmP.h>
 
 
 
 
  27#include <drm/drm_crtc_helper.h>
  28#include <drm/amdgpu_drm.h>
  29#include "amdgpu.h"
  30#include "amdgpu_connectors.h"
 
  31#include "atom.h"
  32#include "atombios_encoders.h"
  33#include "atombios_dp.h"
  34#include <linux/backlight.h>
  35#include "bif/bif_4_1_d.h"
  36
  37static u8
  38amdgpu_atombios_encoder_get_backlight_level_from_reg(struct amdgpu_device *adev)
  39{
  40	u8 backlight_level;
  41	u32 bios_2_scratch;
  42
  43	bios_2_scratch = RREG32(mmBIOS_SCRATCH_2);
  44
  45	backlight_level = ((bios_2_scratch & ATOM_S2_CURRENT_BL_LEVEL_MASK) >>
  46			   ATOM_S2_CURRENT_BL_LEVEL_SHIFT);
  47
  48	return backlight_level;
  49}
  50
  51static void
  52amdgpu_atombios_encoder_set_backlight_level_to_reg(struct amdgpu_device *adev,
  53					    u8 backlight_level)
  54{
  55	u32 bios_2_scratch;
  56
  57	bios_2_scratch = RREG32(mmBIOS_SCRATCH_2);
  58
  59	bios_2_scratch &= ~ATOM_S2_CURRENT_BL_LEVEL_MASK;
  60	bios_2_scratch |= ((backlight_level << ATOM_S2_CURRENT_BL_LEVEL_SHIFT) &
  61			   ATOM_S2_CURRENT_BL_LEVEL_MASK);
  62
  63	WREG32(mmBIOS_SCRATCH_2, bios_2_scratch);
  64}
  65
  66u8
  67amdgpu_atombios_encoder_get_backlight_level(struct amdgpu_encoder *amdgpu_encoder)
  68{
  69	struct drm_device *dev = amdgpu_encoder->base.dev;
  70	struct amdgpu_device *adev = dev->dev_private;
  71
  72	if (!(adev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
  73		return 0;
  74
  75	return amdgpu_atombios_encoder_get_backlight_level_from_reg(adev);
  76}
  77
  78void
  79amdgpu_atombios_encoder_set_backlight_level(struct amdgpu_encoder *amdgpu_encoder,
  80				     u8 level)
  81{
  82	struct drm_encoder *encoder = &amdgpu_encoder->base;
  83	struct drm_device *dev = amdgpu_encoder->base.dev;
  84	struct amdgpu_device *adev = dev->dev_private;
  85	struct amdgpu_encoder_atom_dig *dig;
  86
  87	if (!(adev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
  88		return;
  89
  90	if ((amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) &&
  91	    amdgpu_encoder->enc_priv) {
  92		dig = amdgpu_encoder->enc_priv;
  93		dig->backlight_level = level;
  94		amdgpu_atombios_encoder_set_backlight_level_to_reg(adev, dig->backlight_level);
  95
  96		switch (amdgpu_encoder->encoder_id) {
  97		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
  98		case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
  99		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
 100		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
 101		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
 102			if (dig->backlight_level == 0)
 103				amdgpu_atombios_encoder_setup_dig_transmitter(encoder,
 104								       ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0);
 105			else {
 106				amdgpu_atombios_encoder_setup_dig_transmitter(encoder,
 107								       ATOM_TRANSMITTER_ACTION_BL_BRIGHTNESS_CONTROL, 0, 0);
 108				amdgpu_atombios_encoder_setup_dig_transmitter(encoder,
 109								       ATOM_TRANSMITTER_ACTION_LCD_BLON, 0, 0);
 110			}
 111			break;
 112		default:
 113			break;
 114		}
 115	}
 116}
 117
 118#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
 119
 120static u8 amdgpu_atombios_encoder_backlight_level(struct backlight_device *bd)
 121{
 122	u8 level;
 123
 124	/* Convert brightness to hardware level */
 125	if (bd->props.brightness < 0)
 126		level = 0;
 127	else if (bd->props.brightness > AMDGPU_MAX_BL_LEVEL)
 128		level = AMDGPU_MAX_BL_LEVEL;
 129	else
 130		level = bd->props.brightness;
 131
 132	return level;
 133}
 134
 135static int amdgpu_atombios_encoder_update_backlight_status(struct backlight_device *bd)
 136{
 137	struct amdgpu_backlight_privdata *pdata = bl_get_data(bd);
 138	struct amdgpu_encoder *amdgpu_encoder = pdata->encoder;
 139
 140	amdgpu_atombios_encoder_set_backlight_level(amdgpu_encoder,
 141					     amdgpu_atombios_encoder_backlight_level(bd));
 142
 143	return 0;
 144}
 145
 146static int
 147amdgpu_atombios_encoder_get_backlight_brightness(struct backlight_device *bd)
 148{
 149	struct amdgpu_backlight_privdata *pdata = bl_get_data(bd);
 150	struct amdgpu_encoder *amdgpu_encoder = pdata->encoder;
 151	struct drm_device *dev = amdgpu_encoder->base.dev;
 152	struct amdgpu_device *adev = dev->dev_private;
 153
 154	return amdgpu_atombios_encoder_get_backlight_level_from_reg(adev);
 155}
 156
 157static const struct backlight_ops amdgpu_atombios_encoder_backlight_ops = {
 158	.get_brightness = amdgpu_atombios_encoder_get_backlight_brightness,
 159	.update_status	= amdgpu_atombios_encoder_update_backlight_status,
 160};
 161
 162void amdgpu_atombios_encoder_init_backlight(struct amdgpu_encoder *amdgpu_encoder,
 163				     struct drm_connector *drm_connector)
 164{
 165	struct drm_device *dev = amdgpu_encoder->base.dev;
 166	struct amdgpu_device *adev = dev->dev_private;
 167	struct backlight_device *bd;
 168	struct backlight_properties props;
 169	struct amdgpu_backlight_privdata *pdata;
 170	struct amdgpu_encoder_atom_dig *dig;
 171	u8 backlight_level;
 172	char bl_name[16];
 173
 174	/* Mac laptops with multiple GPUs use the gmux driver for backlight
 175	 * so don't register a backlight device
 176	 */
 177	if ((adev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) &&
 178	    (adev->pdev->device == 0x6741))
 179		return;
 180
 181	if (!amdgpu_encoder->enc_priv)
 182		return;
 183
 184	if (!adev->is_atom_bios)
 185		return;
 186
 187	if (!(adev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
 188		return;
 
 
 189
 190	pdata = kmalloc(sizeof(struct amdgpu_backlight_privdata), GFP_KERNEL);
 191	if (!pdata) {
 192		DRM_ERROR("Memory allocation failed\n");
 193		goto error;
 194	}
 195
 196	memset(&props, 0, sizeof(props));
 197	props.max_brightness = AMDGPU_MAX_BL_LEVEL;
 198	props.type = BACKLIGHT_RAW;
 199	snprintf(bl_name, sizeof(bl_name),
 200		 "amdgpu_bl%d", dev->primary->index);
 201	bd = backlight_device_register(bl_name, drm_connector->kdev,
 202				       pdata, &amdgpu_atombios_encoder_backlight_ops, &props);
 203	if (IS_ERR(bd)) {
 204		DRM_ERROR("Backlight registration failed\n");
 205		goto error;
 206	}
 207
 208	pdata->encoder = amdgpu_encoder;
 209
 210	backlight_level = amdgpu_atombios_encoder_get_backlight_level_from_reg(adev);
 211
 212	dig = amdgpu_encoder->enc_priv;
 213	dig->bl_dev = bd;
 214
 215	bd->props.brightness = amdgpu_atombios_encoder_get_backlight_brightness(bd);
 216	bd->props.power = FB_BLANK_UNBLANK;
 217	backlight_update_status(bd);
 218
 219	DRM_INFO("amdgpu atom DIG backlight initialized\n");
 220
 221	return;
 222
 223error:
 224	kfree(pdata);
 225	return;
 
 
 
 
 
 226}
 227
 228void
 229amdgpu_atombios_encoder_fini_backlight(struct amdgpu_encoder *amdgpu_encoder)
 230{
 231	struct drm_device *dev = amdgpu_encoder->base.dev;
 232	struct amdgpu_device *adev = dev->dev_private;
 233	struct backlight_device *bd = NULL;
 234	struct amdgpu_encoder_atom_dig *dig;
 235
 236	if (!amdgpu_encoder->enc_priv)
 237		return;
 238
 239	if (!adev->is_atom_bios)
 240		return;
 241
 242	if (!(adev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
 243		return;
 244
 245	dig = amdgpu_encoder->enc_priv;
 246	bd = dig->bl_dev;
 247	dig->bl_dev = NULL;
 248
 249	if (bd) {
 250		struct amdgpu_legacy_backlight_privdata *pdata;
 251
 252		pdata = bl_get_data(bd);
 253		backlight_device_unregister(bd);
 254		kfree(pdata);
 255
 256		DRM_INFO("amdgpu atom LVDS backlight unloaded\n");
 257	}
 258}
 259
 260#else /* !CONFIG_BACKLIGHT_CLASS_DEVICE */
 261
 262void amdgpu_atombios_encoder_init_backlight(struct amdgpu_encoder *encoder)
 263{
 264}
 265
 266void amdgpu_atombios_encoder_fini_backlight(struct amdgpu_encoder *encoder)
 267{
 268}
 269
 270#endif
 271
 272bool amdgpu_atombios_encoder_is_digital(struct drm_encoder *encoder)
 273{
 274	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 275	switch (amdgpu_encoder->encoder_id) {
 276	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
 277	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
 278	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
 279	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
 280	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
 281		return true;
 282	default:
 283		return false;
 284	}
 285}
 286
 287bool amdgpu_atombios_encoder_mode_fixup(struct drm_encoder *encoder,
 288				 const struct drm_display_mode *mode,
 289				 struct drm_display_mode *adjusted_mode)
 290{
 291	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 292
 293	/* set the active encoder to connector routing */
 294	amdgpu_encoder_set_active_device(encoder);
 295	drm_mode_set_crtcinfo(adjusted_mode, 0);
 296
 297	/* hw bug */
 298	if ((mode->flags & DRM_MODE_FLAG_INTERLACE)
 299	    && (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2)))
 300		adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2;
 301
 302	/* vertical FP must be at least 1 */
 303	if (mode->crtc_vsync_start == mode->crtc_vdisplay)
 304		adjusted_mode->crtc_vsync_start++;
 305
 306	/* get the native mode for scaling */
 307	if (amdgpu_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT))
 308		amdgpu_panel_mode_fixup(encoder, adjusted_mode);
 309	else if (amdgpu_encoder->rmx_type != RMX_OFF)
 310		amdgpu_panel_mode_fixup(encoder, adjusted_mode);
 311
 312	if ((amdgpu_encoder->active_device & (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) ||
 313	    (amdgpu_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE)) {
 314		struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
 315		amdgpu_atombios_dp_set_link_config(connector, adjusted_mode);
 316	}
 317
 318	return true;
 319}
 320
 321static void
 322amdgpu_atombios_encoder_setup_dac(struct drm_encoder *encoder, int action)
 323{
 324	struct drm_device *dev = encoder->dev;
 325	struct amdgpu_device *adev = dev->dev_private;
 326	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 327	DAC_ENCODER_CONTROL_PS_ALLOCATION args;
 328	int index = 0;
 329
 330	memset(&args, 0, sizeof(args));
 331
 332	switch (amdgpu_encoder->encoder_id) {
 333	case ENCODER_OBJECT_ID_INTERNAL_DAC1:
 334	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
 335		index = GetIndexIntoMasterTable(COMMAND, DAC1EncoderControl);
 336		break;
 337	case ENCODER_OBJECT_ID_INTERNAL_DAC2:
 338	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
 339		index = GetIndexIntoMasterTable(COMMAND, DAC2EncoderControl);
 340		break;
 341	}
 342
 343	args.ucAction = action;
 344	args.ucDacStandard = ATOM_DAC1_PS2;
 345	args.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 346
 347	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
 348
 349}
 350
 351static u8 amdgpu_atombios_encoder_get_bpc(struct drm_encoder *encoder)
 352{
 353	int bpc = 8;
 354
 355	if (encoder->crtc) {
 356		struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc);
 357		bpc = amdgpu_crtc->bpc;
 358	}
 359
 360	switch (bpc) {
 361	case 0:
 362		return PANEL_BPC_UNDEFINE;
 363	case 6:
 364		return PANEL_6BIT_PER_COLOR;
 365	case 8:
 366	default:
 367		return PANEL_8BIT_PER_COLOR;
 368	case 10:
 369		return PANEL_10BIT_PER_COLOR;
 370	case 12:
 371		return PANEL_12BIT_PER_COLOR;
 372	case 16:
 373		return PANEL_16BIT_PER_COLOR;
 374	}
 375}
 376
 377union dvo_encoder_control {
 378	ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION ext_tmds;
 379	DVO_ENCODER_CONTROL_PS_ALLOCATION dvo;
 380	DVO_ENCODER_CONTROL_PS_ALLOCATION_V3 dvo_v3;
 381	DVO_ENCODER_CONTROL_PS_ALLOCATION_V1_4 dvo_v4;
 382};
 383
 384static void
 385amdgpu_atombios_encoder_setup_dvo(struct drm_encoder *encoder, int action)
 386{
 387	struct drm_device *dev = encoder->dev;
 388	struct amdgpu_device *adev = dev->dev_private;
 389	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 390	union dvo_encoder_control args;
 391	int index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl);
 392	uint8_t frev, crev;
 393
 394	memset(&args, 0, sizeof(args));
 395
 396	if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
 397		return;
 398
 399	switch (frev) {
 400	case 1:
 401		switch (crev) {
 402		case 1:
 403			/* R4xx, R5xx */
 404			args.ext_tmds.sXTmdsEncoder.ucEnable = action;
 405
 406			if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 407				args.ext_tmds.sXTmdsEncoder.ucMisc |= PANEL_ENCODER_MISC_DUAL;
 408
 409			args.ext_tmds.sXTmdsEncoder.ucMisc |= ATOM_PANEL_MISC_888RGB;
 410			break;
 411		case 2:
 412			/* RS600/690/740 */
 413			args.dvo.sDVOEncoder.ucAction = action;
 414			args.dvo.sDVOEncoder.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 415			/* DFP1, CRT1, TV1 depending on the type of port */
 416			args.dvo.sDVOEncoder.ucDeviceType = ATOM_DEVICE_DFP1_INDEX;
 417
 418			if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 419				args.dvo.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute |= PANEL_ENCODER_MISC_DUAL;
 420			break;
 421		case 3:
 422			/* R6xx */
 423			args.dvo_v3.ucAction = action;
 424			args.dvo_v3.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 425			args.dvo_v3.ucDVOConfig = 0; /* XXX */
 426			break;
 427		case 4:
 428			/* DCE8 */
 429			args.dvo_v4.ucAction = action;
 430			args.dvo_v4.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 431			args.dvo_v4.ucDVOConfig = 0; /* XXX */
 432			args.dvo_v4.ucBitPerColor = amdgpu_atombios_encoder_get_bpc(encoder);
 433			break;
 434		default:
 435			DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
 436			break;
 437		}
 438		break;
 439	default:
 440		DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
 441		break;
 442	}
 443
 444	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
 445}
 446
 447int amdgpu_atombios_encoder_get_encoder_mode(struct drm_encoder *encoder)
 448{
 449	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 450	struct drm_connector *connector;
 451	struct amdgpu_connector *amdgpu_connector;
 452	struct amdgpu_connector_atom_dig *dig_connector;
 453
 454	/* dp bridges are always DP */
 455	if (amdgpu_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE)
 456		return ATOM_ENCODER_MODE_DP;
 457
 458	/* DVO is always DVO */
 459	if ((amdgpu_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DVO1) ||
 460	    (amdgpu_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1))
 461		return ATOM_ENCODER_MODE_DVO;
 462
 463	connector = amdgpu_get_connector_for_encoder(encoder);
 464	/* if we don't have an active device yet, just use one of
 465	 * the connectors tied to the encoder.
 466	 */
 467	if (!connector)
 468		connector = amdgpu_get_connector_for_encoder_init(encoder);
 469	amdgpu_connector = to_amdgpu_connector(connector);
 470
 471	switch (connector->connector_type) {
 472	case DRM_MODE_CONNECTOR_DVII:
 473	case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */
 474		if (amdgpu_audio != 0) {
 475			if (amdgpu_connector->use_digital &&
 476			    (amdgpu_connector->audio == AMDGPU_AUDIO_ENABLE))
 477				return ATOM_ENCODER_MODE_HDMI;
 478			else if (drm_detect_hdmi_monitor(amdgpu_connector_edid(connector)) &&
 479				 (amdgpu_connector->audio == AMDGPU_AUDIO_AUTO))
 480				return ATOM_ENCODER_MODE_HDMI;
 481			else if (amdgpu_connector->use_digital)
 482				return ATOM_ENCODER_MODE_DVI;
 483			else
 484				return ATOM_ENCODER_MODE_CRT;
 485		} else if (amdgpu_connector->use_digital) {
 486			return ATOM_ENCODER_MODE_DVI;
 487		} else {
 488			return ATOM_ENCODER_MODE_CRT;
 489		}
 490		break;
 491	case DRM_MODE_CONNECTOR_DVID:
 492	case DRM_MODE_CONNECTOR_HDMIA:
 493	default:
 494		if (amdgpu_audio != 0) {
 495			if (amdgpu_connector->audio == AMDGPU_AUDIO_ENABLE)
 496				return ATOM_ENCODER_MODE_HDMI;
 497			else if (drm_detect_hdmi_monitor(amdgpu_connector_edid(connector)) &&
 498				 (amdgpu_connector->audio == AMDGPU_AUDIO_AUTO))
 499				return ATOM_ENCODER_MODE_HDMI;
 500			else
 501				return ATOM_ENCODER_MODE_DVI;
 502		} else {
 503			return ATOM_ENCODER_MODE_DVI;
 504		}
 505		break;
 506	case DRM_MODE_CONNECTOR_LVDS:
 507		return ATOM_ENCODER_MODE_LVDS;
 508		break;
 509	case DRM_MODE_CONNECTOR_DisplayPort:
 510		dig_connector = amdgpu_connector->con_priv;
 511		if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
 512		    (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {
 513			return ATOM_ENCODER_MODE_DP;
 514		} else if (amdgpu_audio != 0) {
 515			if (amdgpu_connector->audio == AMDGPU_AUDIO_ENABLE)
 516				return ATOM_ENCODER_MODE_HDMI;
 517			else if (drm_detect_hdmi_monitor(amdgpu_connector_edid(connector)) &&
 518				 (amdgpu_connector->audio == AMDGPU_AUDIO_AUTO))
 519				return ATOM_ENCODER_MODE_HDMI;
 520			else
 521				return ATOM_ENCODER_MODE_DVI;
 522		} else {
 523			return ATOM_ENCODER_MODE_DVI;
 524		}
 525		break;
 526	case DRM_MODE_CONNECTOR_eDP:
 527		return ATOM_ENCODER_MODE_DP;
 528	case DRM_MODE_CONNECTOR_DVIA:
 529	case DRM_MODE_CONNECTOR_VGA:
 530		return ATOM_ENCODER_MODE_CRT;
 531		break;
 532	case DRM_MODE_CONNECTOR_Composite:
 533	case DRM_MODE_CONNECTOR_SVIDEO:
 534	case DRM_MODE_CONNECTOR_9PinDIN:
 535		/* fix me */
 536		return ATOM_ENCODER_MODE_TV;
 537		/*return ATOM_ENCODER_MODE_CV;*/
 538		break;
 539	}
 540}
 541
 542/*
 543 * DIG Encoder/Transmitter Setup
 544 *
 545 * DCE 6.0
 546 * - 3 DIG transmitter blocks UNIPHY0/1/2 (links A and B).
 547 * Supports up to 6 digital outputs
 548 * - 6 DIG encoder blocks.
 549 * - DIG to PHY mapping is hardcoded
 550 * DIG1 drives UNIPHY0 link A, A+B
 551 * DIG2 drives UNIPHY0 link B
 552 * DIG3 drives UNIPHY1 link A, A+B
 553 * DIG4 drives UNIPHY1 link B
 554 * DIG5 drives UNIPHY2 link A, A+B
 555 * DIG6 drives UNIPHY2 link B
 556 *
 557 * Routing
 558 * crtc -> dig encoder -> UNIPHY/LVTMA (1 or 2 links)
 559 * Examples:
 560 * crtc0 -> dig2 -> LVTMA   links A+B -> TMDS/HDMI
 561 * crtc1 -> dig1 -> UNIPHY0 link  B   -> DP
 562 * crtc0 -> dig1 -> UNIPHY2 link  A   -> LVDS
 563 * crtc1 -> dig2 -> UNIPHY1 link  B+A -> TMDS/HDMI
 564 */
 565
 566union dig_encoder_control {
 567	DIG_ENCODER_CONTROL_PS_ALLOCATION v1;
 568	DIG_ENCODER_CONTROL_PARAMETERS_V2 v2;
 569	DIG_ENCODER_CONTROL_PARAMETERS_V3 v3;
 570	DIG_ENCODER_CONTROL_PARAMETERS_V4 v4;
 571	DIG_ENCODER_CONTROL_PARAMETERS_V5 v5;
 572};
 573
 574void
 575amdgpu_atombios_encoder_setup_dig_encoder(struct drm_encoder *encoder,
 576				   int action, int panel_mode)
 577{
 578	struct drm_device *dev = encoder->dev;
 579	struct amdgpu_device *adev = dev->dev_private;
 580	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 581	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 582	struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
 583	union dig_encoder_control args;
 584	int index = GetIndexIntoMasterTable(COMMAND, DIGxEncoderControl);
 585	uint8_t frev, crev;
 586	int dp_clock = 0;
 587	int dp_lane_count = 0;
 588	int hpd_id = AMDGPU_HPD_NONE;
 589
 590	if (connector) {
 591		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 592		struct amdgpu_connector_atom_dig *dig_connector =
 593			amdgpu_connector->con_priv;
 594
 595		dp_clock = dig_connector->dp_clock;
 596		dp_lane_count = dig_connector->dp_lane_count;
 597		hpd_id = amdgpu_connector->hpd.hpd;
 598	}
 599
 600	/* no dig encoder assigned */
 601	if (dig->dig_encoder == -1)
 602		return;
 603
 604	memset(&args, 0, sizeof(args));
 605
 606	if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
 607		return;
 608
 609	switch (frev) {
 610	case 1:
 611		switch (crev) {
 612		case 1:
 613			args.v1.ucAction = action;
 614			args.v1.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 615			if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
 616				args.v3.ucPanelMode = panel_mode;
 617			else
 618				args.v1.ucEncoderMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
 619
 620			if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode))
 621				args.v1.ucLaneNum = dp_lane_count;
 622			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 623				args.v1.ucLaneNum = 8;
 624			else
 625				args.v1.ucLaneNum = 4;
 626
 627			if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000))
 628				args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
 629			switch (amdgpu_encoder->encoder_id) {
 630			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
 631				args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1;
 632				break;
 633			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
 634			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
 635				args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER2;
 636				break;
 637			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
 638				args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER3;
 639				break;
 640			}
 641			if (dig->linkb)
 642				args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKB;
 643			else
 644				args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKA;
 645			break;
 646		case 2:
 647		case 3:
 648			args.v3.ucAction = action;
 649			args.v3.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 650			if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
 651				args.v3.ucPanelMode = panel_mode;
 652			else
 653				args.v3.ucEncoderMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
 654
 655			if (ENCODER_MODE_IS_DP(args.v3.ucEncoderMode))
 656				args.v3.ucLaneNum = dp_lane_count;
 657			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 658				args.v3.ucLaneNum = 8;
 659			else
 660				args.v3.ucLaneNum = 4;
 661
 662			if (ENCODER_MODE_IS_DP(args.v3.ucEncoderMode) && (dp_clock == 270000))
 663				args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
 664			args.v3.acConfig.ucDigSel = dig->dig_encoder;
 665			args.v3.ucBitPerColor = amdgpu_atombios_encoder_get_bpc(encoder);
 666			break;
 667		case 4:
 668			args.v4.ucAction = action;
 669			args.v4.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 670			if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
 671				args.v4.ucPanelMode = panel_mode;
 672			else
 673				args.v4.ucEncoderMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
 674
 675			if (ENCODER_MODE_IS_DP(args.v4.ucEncoderMode))
 676				args.v4.ucLaneNum = dp_lane_count;
 677			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 678				args.v4.ucLaneNum = 8;
 679			else
 680				args.v4.ucLaneNum = 4;
 681
 682			if (ENCODER_MODE_IS_DP(args.v4.ucEncoderMode)) {
 683				if (dp_clock == 540000)
 684					args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_5_40GHZ;
 685				else if (dp_clock == 324000)
 686					args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_3_24GHZ;
 687				else if (dp_clock == 270000)
 688					args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_2_70GHZ;
 689				else
 690					args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_1_62GHZ;
 691			}
 692			args.v4.acConfig.ucDigSel = dig->dig_encoder;
 693			args.v4.ucBitPerColor = amdgpu_atombios_encoder_get_bpc(encoder);
 694			if (hpd_id == AMDGPU_HPD_NONE)
 695				args.v4.ucHPD_ID = 0;
 696			else
 697				args.v4.ucHPD_ID = hpd_id + 1;
 698			break;
 699		case 5:
 700			switch (action) {
 701			case ATOM_ENCODER_CMD_SETUP_PANEL_MODE:
 702				args.v5.asDPPanelModeParam.ucAction = action;
 703				args.v5.asDPPanelModeParam.ucPanelMode = panel_mode;
 704				args.v5.asDPPanelModeParam.ucDigId = dig->dig_encoder;
 705				break;
 706			case ATOM_ENCODER_CMD_STREAM_SETUP:
 707				args.v5.asStreamParam.ucAction = action;
 708				args.v5.asStreamParam.ucDigId = dig->dig_encoder;
 709				args.v5.asStreamParam.ucDigMode =
 710					amdgpu_atombios_encoder_get_encoder_mode(encoder);
 711				if (ENCODER_MODE_IS_DP(args.v5.asStreamParam.ucDigMode))
 712					args.v5.asStreamParam.ucLaneNum = dp_lane_count;
 713				else if (amdgpu_dig_monitor_is_duallink(encoder,
 714									amdgpu_encoder->pixel_clock))
 715					args.v5.asStreamParam.ucLaneNum = 8;
 716				else
 717					args.v5.asStreamParam.ucLaneNum = 4;
 718				args.v5.asStreamParam.ulPixelClock =
 719					cpu_to_le32(amdgpu_encoder->pixel_clock / 10);
 720				args.v5.asStreamParam.ucBitPerColor =
 721					amdgpu_atombios_encoder_get_bpc(encoder);
 722				args.v5.asStreamParam.ucLinkRateIn270Mhz = dp_clock / 27000;
 723				break;
 724			case ATOM_ENCODER_CMD_DP_LINK_TRAINING_START:
 725			case ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN1:
 726			case ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN2:
 727			case ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN3:
 728			case ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN4:
 729			case ATOM_ENCODER_CMD_DP_LINK_TRAINING_COMPLETE:
 730			case ATOM_ENCODER_CMD_DP_VIDEO_OFF:
 731			case ATOM_ENCODER_CMD_DP_VIDEO_ON:
 732				args.v5.asCmdParam.ucAction = action;
 733				args.v5.asCmdParam.ucDigId = dig->dig_encoder;
 734				break;
 735			default:
 736				DRM_ERROR("Unsupported action 0x%x\n", action);
 737				break;
 738			}
 739			break;
 740		default:
 741			DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
 742			break;
 743		}
 744		break;
 745	default:
 746		DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
 747		break;
 748	}
 749
 750	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
 751
 752}
 753
 754union dig_transmitter_control {
 755	DIG_TRANSMITTER_CONTROL_PS_ALLOCATION v1;
 756	DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 v2;
 757	DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 v3;
 758	DIG_TRANSMITTER_CONTROL_PARAMETERS_V4 v4;
 759	DIG_TRANSMITTER_CONTROL_PARAMETERS_V1_5 v5;
 760	DIG_TRANSMITTER_CONTROL_PARAMETERS_V1_6 v6;
 761};
 762
 763void
 764amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int action,
 765					      uint8_t lane_num, uint8_t lane_set)
 766{
 767	struct drm_device *dev = encoder->dev;
 768	struct amdgpu_device *adev = dev->dev_private;
 769	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 770	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 771	struct drm_connector *connector;
 772	union dig_transmitter_control args;
 773	int index = 0;
 774	uint8_t frev, crev;
 775	bool is_dp = false;
 776	int pll_id = 0;
 777	int dp_clock = 0;
 778	int dp_lane_count = 0;
 779	int connector_object_id = 0;
 780	int igp_lane_info = 0;
 781	int dig_encoder = dig->dig_encoder;
 782	int hpd_id = AMDGPU_HPD_NONE;
 783
 784	if (action == ATOM_TRANSMITTER_ACTION_INIT) {
 785		connector = amdgpu_get_connector_for_encoder_init(encoder);
 786		/* just needed to avoid bailing in the encoder check.  the encoder
 787		 * isn't used for init
 788		 */
 789		dig_encoder = 0;
 790	} else
 791		connector = amdgpu_get_connector_for_encoder(encoder);
 792
 793	if (connector) {
 794		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 795		struct amdgpu_connector_atom_dig *dig_connector =
 796			amdgpu_connector->con_priv;
 797
 798		hpd_id = amdgpu_connector->hpd.hpd;
 799		dp_clock = dig_connector->dp_clock;
 800		dp_lane_count = dig_connector->dp_lane_count;
 801		connector_object_id =
 802			(amdgpu_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
 803	}
 804
 805	if (encoder->crtc) {
 806		struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc);
 807		pll_id = amdgpu_crtc->pll_id;
 808	}
 809
 810	/* no dig encoder assigned */
 811	if (dig_encoder == -1)
 812		return;
 813
 814	if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(encoder)))
 815		is_dp = true;
 816
 817	memset(&args, 0, sizeof(args));
 818
 819	switch (amdgpu_encoder->encoder_id) {
 820	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
 821		index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl);
 822		break;
 823	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
 824	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
 825	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
 826	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
 827		index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl);
 828		break;
 829	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
 830		index = GetIndexIntoMasterTable(COMMAND, LVTMATransmitterControl);
 831		break;
 832	}
 833
 834	if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
 835		return;
 836
 837	switch (frev) {
 838	case 1:
 839		switch (crev) {
 840		case 1:
 841			args.v1.ucAction = action;
 842			if (action == ATOM_TRANSMITTER_ACTION_INIT) {
 843				args.v1.usInitInfo = cpu_to_le16(connector_object_id);
 844			} else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
 845				args.v1.asMode.ucLaneSel = lane_num;
 846				args.v1.asMode.ucLaneSet = lane_set;
 847			} else {
 848				if (is_dp)
 849					args.v1.usPixelClock = cpu_to_le16(dp_clock / 10);
 850				else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 851					args.v1.usPixelClock = cpu_to_le16((amdgpu_encoder->pixel_clock / 2) / 10);
 852				else
 853					args.v1.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 854			}
 855
 856			args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL;
 857
 858			if (dig_encoder)
 859				args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER;
 860			else
 861				args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER;
 862
 863			if ((adev->flags & AMD_IS_APU) &&
 864			    (amdgpu_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_UNIPHY)) {
 865				if (is_dp ||
 866				    !amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock)) {
 867					if (igp_lane_info & 0x1)
 868						args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_3;
 869					else if (igp_lane_info & 0x2)
 870						args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_4_7;
 871					else if (igp_lane_info & 0x4)
 872						args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_8_11;
 873					else if (igp_lane_info & 0x8)
 874						args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_12_15;
 875				} else {
 876					if (igp_lane_info & 0x3)
 877						args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_7;
 878					else if (igp_lane_info & 0xc)
 879						args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_8_15;
 880				}
 881			}
 882
 883			if (dig->linkb)
 884				args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKB;
 885			else
 886				args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKA;
 887
 888			if (is_dp)
 889				args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT;
 890			else if (amdgpu_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
 891				if (dig->coherent_mode)
 892					args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT;
 893				if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 894					args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_8LANE_LINK;
 895			}
 896			break;
 897		case 2:
 898			args.v2.ucAction = action;
 899			if (action == ATOM_TRANSMITTER_ACTION_INIT) {
 900				args.v2.usInitInfo = cpu_to_le16(connector_object_id);
 901			} else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
 902				args.v2.asMode.ucLaneSel = lane_num;
 903				args.v2.asMode.ucLaneSet = lane_set;
 904			} else {
 905				if (is_dp)
 906					args.v2.usPixelClock = cpu_to_le16(dp_clock / 10);
 907				else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 908					args.v2.usPixelClock = cpu_to_le16((amdgpu_encoder->pixel_clock / 2) / 10);
 909				else
 910					args.v2.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 911			}
 912
 913			args.v2.acConfig.ucEncoderSel = dig_encoder;
 914			if (dig->linkb)
 915				args.v2.acConfig.ucLinkSel = 1;
 916
 917			switch (amdgpu_encoder->encoder_id) {
 918			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
 919				args.v2.acConfig.ucTransmitterSel = 0;
 920				break;
 921			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
 922				args.v2.acConfig.ucTransmitterSel = 1;
 923				break;
 924			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
 925				args.v2.acConfig.ucTransmitterSel = 2;
 926				break;
 927			}
 928
 929			if (is_dp) {
 930				args.v2.acConfig.fCoherentMode = 1;
 931				args.v2.acConfig.fDPConnector = 1;
 932			} else if (amdgpu_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
 933				if (dig->coherent_mode)
 934					args.v2.acConfig.fCoherentMode = 1;
 935				if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 936					args.v2.acConfig.fDualLinkConnector = 1;
 937			}
 938			break;
 939		case 3:
 940			args.v3.ucAction = action;
 941			if (action == ATOM_TRANSMITTER_ACTION_INIT) {
 942				args.v3.usInitInfo = cpu_to_le16(connector_object_id);
 943			} else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
 944				args.v3.asMode.ucLaneSel = lane_num;
 945				args.v3.asMode.ucLaneSet = lane_set;
 946			} else {
 947				if (is_dp)
 948					args.v3.usPixelClock = cpu_to_le16(dp_clock / 10);
 949				else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 950					args.v3.usPixelClock = cpu_to_le16((amdgpu_encoder->pixel_clock / 2) / 10);
 951				else
 952					args.v3.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
 953			}
 954
 955			if (is_dp)
 956				args.v3.ucLaneNum = dp_lane_count;
 957			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 958				args.v3.ucLaneNum = 8;
 959			else
 960				args.v3.ucLaneNum = 4;
 961
 962			if (dig->linkb)
 963				args.v3.acConfig.ucLinkSel = 1;
 964			if (dig_encoder & 1)
 965				args.v3.acConfig.ucEncoderSel = 1;
 966
 967			/* Select the PLL for the PHY
 968			 * DP PHY should be clocked from external src if there is
 969			 * one.
 970			 */
 971			/* On DCE4, if there is an external clock, it generates the DP ref clock */
 972			if (is_dp && adev->clock.dp_extclk)
 973				args.v3.acConfig.ucRefClkSource = 2; /* external src */
 974			else
 975				args.v3.acConfig.ucRefClkSource = pll_id;
 976
 977			switch (amdgpu_encoder->encoder_id) {
 978			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
 979				args.v3.acConfig.ucTransmitterSel = 0;
 980				break;
 981			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
 982				args.v3.acConfig.ucTransmitterSel = 1;
 983				break;
 984			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
 985				args.v3.acConfig.ucTransmitterSel = 2;
 986				break;
 987			}
 988
 989			if (is_dp)
 990				args.v3.acConfig.fCoherentMode = 1; /* DP requires coherent */
 991			else if (amdgpu_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
 992				if (dig->coherent_mode)
 993					args.v3.acConfig.fCoherentMode = 1;
 994				if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
 995					args.v3.acConfig.fDualLinkConnector = 1;
 996			}
 997			break;
 998		case 4:
 999			args.v4.ucAction = action;
1000			if (action == ATOM_TRANSMITTER_ACTION_INIT) {
1001				args.v4.usInitInfo = cpu_to_le16(connector_object_id);
1002			} else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
1003				args.v4.asMode.ucLaneSel = lane_num;
1004				args.v4.asMode.ucLaneSet = lane_set;
1005			} else {
1006				if (is_dp)
1007					args.v4.usPixelClock = cpu_to_le16(dp_clock / 10);
1008				else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
1009					args.v4.usPixelClock = cpu_to_le16((amdgpu_encoder->pixel_clock / 2) / 10);
1010				else
1011					args.v4.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
1012			}
1013
1014			if (is_dp)
1015				args.v4.ucLaneNum = dp_lane_count;
1016			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
1017				args.v4.ucLaneNum = 8;
1018			else
1019				args.v4.ucLaneNum = 4;
1020
1021			if (dig->linkb)
1022				args.v4.acConfig.ucLinkSel = 1;
1023			if (dig_encoder & 1)
1024				args.v4.acConfig.ucEncoderSel = 1;
1025
1026			/* Select the PLL for the PHY
1027			 * DP PHY should be clocked from external src if there is
1028			 * one.
1029			 */
1030			/* On DCE5 DCPLL usually generates the DP ref clock */
1031			if (is_dp) {
1032				if (adev->clock.dp_extclk)
1033					args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_EXTCLK;
1034				else
1035					args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_DCPLL;
1036			} else
1037				args.v4.acConfig.ucRefClkSource = pll_id;
1038
1039			switch (amdgpu_encoder->encoder_id) {
1040			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1041				args.v4.acConfig.ucTransmitterSel = 0;
1042				break;
1043			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1044				args.v4.acConfig.ucTransmitterSel = 1;
1045				break;
1046			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1047				args.v4.acConfig.ucTransmitterSel = 2;
1048				break;
1049			}
1050
1051			if (is_dp)
1052				args.v4.acConfig.fCoherentMode = 1; /* DP requires coherent */
1053			else if (amdgpu_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
1054				if (dig->coherent_mode)
1055					args.v4.acConfig.fCoherentMode = 1;
1056				if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
1057					args.v4.acConfig.fDualLinkConnector = 1;
1058			}
1059			break;
1060		case 5:
1061			args.v5.ucAction = action;
1062			if (is_dp)
1063				args.v5.usSymClock = cpu_to_le16(dp_clock / 10);
1064			else
1065				args.v5.usSymClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
1066
1067			switch (amdgpu_encoder->encoder_id) {
1068			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1069				if (dig->linkb)
1070					args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYB;
1071				else
1072					args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYA;
1073				break;
1074			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1075				if (dig->linkb)
1076					args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYD;
1077				else
1078					args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYC;
1079				break;
1080			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1081				if (dig->linkb)
1082					args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYF;
1083				else
1084					args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYE;
1085				break;
1086			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1087				args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYG;
1088				break;
1089			}
1090			if (is_dp)
1091				args.v5.ucLaneNum = dp_lane_count;
1092			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
1093				args.v5.ucLaneNum = 8;
1094			else
1095				args.v5.ucLaneNum = 4;
1096			args.v5.ucConnObjId = connector_object_id;
1097			args.v5.ucDigMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
1098
1099			if (is_dp && adev->clock.dp_extclk)
1100				args.v5.asConfig.ucPhyClkSrcId = ENCODER_REFCLK_SRC_EXTCLK;
1101			else
1102				args.v5.asConfig.ucPhyClkSrcId = pll_id;
1103
1104			if (is_dp)
1105				args.v5.asConfig.ucCoherentMode = 1; /* DP requires coherent */
1106			else if (amdgpu_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
1107				if (dig->coherent_mode)
1108					args.v5.asConfig.ucCoherentMode = 1;
1109			}
1110			if (hpd_id == AMDGPU_HPD_NONE)
1111				args.v5.asConfig.ucHPDSel = 0;
1112			else
1113				args.v5.asConfig.ucHPDSel = hpd_id + 1;
1114			args.v5.ucDigEncoderSel = 1 << dig_encoder;
1115			args.v5.ucDPLaneSet = lane_set;
1116			break;
1117		case 6:
1118			args.v6.ucAction = action;
1119			if (is_dp)
1120				args.v6.ulSymClock = cpu_to_le32(dp_clock / 10);
1121			else
1122				args.v6.ulSymClock = cpu_to_le32(amdgpu_encoder->pixel_clock / 10);
1123
1124			switch (amdgpu_encoder->encoder_id) {
1125			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1126				if (dig->linkb)
1127					args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYB;
1128				else
1129					args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYA;
1130				break;
1131			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1132				if (dig->linkb)
1133					args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYD;
1134				else
1135					args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYC;
1136				break;
1137			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1138				if (dig->linkb)
1139					args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYF;
1140				else
1141					args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYE;
1142				break;
1143			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1144				args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYG;
1145				break;
1146			}
1147			if (is_dp)
1148				args.v6.ucLaneNum = dp_lane_count;
1149			else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
1150				args.v6.ucLaneNum = 8;
1151			else
1152				args.v6.ucLaneNum = 4;
1153			args.v6.ucConnObjId = connector_object_id;
1154			if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH)
1155				args.v6.ucDPLaneSet = lane_set;
1156			else
1157				args.v6.ucDigMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
1158
1159			if (hpd_id == AMDGPU_HPD_NONE)
1160				args.v6.ucHPDSel = 0;
1161			else
1162				args.v6.ucHPDSel = hpd_id + 1;
1163			args.v6.ucDigEncoderSel = 1 << dig_encoder;
1164			break;
1165		default:
1166			DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
1167			break;
1168		}
1169		break;
1170	default:
1171		DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
1172		break;
1173	}
1174
1175	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1176}
1177
1178bool
1179amdgpu_atombios_encoder_set_edp_panel_power(struct drm_connector *connector,
1180				     int action)
1181{
1182	struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1183	struct drm_device *dev = amdgpu_connector->base.dev;
1184	struct amdgpu_device *adev = dev->dev_private;
1185	union dig_transmitter_control args;
1186	int index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl);
1187	uint8_t frev, crev;
1188
1189	if (connector->connector_type != DRM_MODE_CONNECTOR_eDP)
1190		goto done;
1191
1192	if ((action != ATOM_TRANSMITTER_ACTION_POWER_ON) &&
1193	    (action != ATOM_TRANSMITTER_ACTION_POWER_OFF))
1194		goto done;
1195
1196	if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
1197		goto done;
1198
1199	memset(&args, 0, sizeof(args));
1200
1201	args.v1.ucAction = action;
1202
1203	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1204
1205	/* wait for the panel to power up */
1206	if (action == ATOM_TRANSMITTER_ACTION_POWER_ON) {
1207		int i;
1208
1209		for (i = 0; i < 300; i++) {
1210			if (amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd))
1211				return true;
1212			mdelay(1);
1213		}
1214		return false;
1215	}
1216done:
1217	return true;
1218}
1219
1220union external_encoder_control {
1221	EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION v1;
1222	EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION_V3 v3;
1223};
1224
1225static void
1226amdgpu_atombios_encoder_setup_external_encoder(struct drm_encoder *encoder,
1227					struct drm_encoder *ext_encoder,
1228					int action)
1229{
1230	struct drm_device *dev = encoder->dev;
1231	struct amdgpu_device *adev = dev->dev_private;
1232	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1233	struct amdgpu_encoder *ext_amdgpu_encoder = to_amdgpu_encoder(ext_encoder);
1234	union external_encoder_control args;
1235	struct drm_connector *connector;
1236	int index = GetIndexIntoMasterTable(COMMAND, ExternalEncoderControl);
1237	u8 frev, crev;
1238	int dp_clock = 0;
1239	int dp_lane_count = 0;
1240	int connector_object_id = 0;
1241	u32 ext_enum = (ext_amdgpu_encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
1242
1243	if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT)
1244		connector = amdgpu_get_connector_for_encoder_init(encoder);
1245	else
1246		connector = amdgpu_get_connector_for_encoder(encoder);
1247
1248	if (connector) {
1249		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1250		struct amdgpu_connector_atom_dig *dig_connector =
1251			amdgpu_connector->con_priv;
1252
1253		dp_clock = dig_connector->dp_clock;
1254		dp_lane_count = dig_connector->dp_lane_count;
1255		connector_object_id =
1256			(amdgpu_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
1257	}
1258
1259	memset(&args, 0, sizeof(args));
1260
1261	if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
1262		return;
1263
1264	switch (frev) {
1265	case 1:
1266		/* no params on frev 1 */
1267		break;
1268	case 2:
1269		switch (crev) {
1270		case 1:
1271		case 2:
1272			args.v1.sDigEncoder.ucAction = action;
1273			args.v1.sDigEncoder.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
1274			args.v1.sDigEncoder.ucEncoderMode =
1275				amdgpu_atombios_encoder_get_encoder_mode(encoder);
1276
1277			if (ENCODER_MODE_IS_DP(args.v1.sDigEncoder.ucEncoderMode)) {
1278				if (dp_clock == 270000)
1279					args.v1.sDigEncoder.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
1280				args.v1.sDigEncoder.ucLaneNum = dp_lane_count;
1281			} else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
1282				args.v1.sDigEncoder.ucLaneNum = 8;
1283			else
1284				args.v1.sDigEncoder.ucLaneNum = 4;
1285			break;
1286		case 3:
1287			args.v3.sExtEncoder.ucAction = action;
1288			if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT)
1289				args.v3.sExtEncoder.usConnectorId = cpu_to_le16(connector_object_id);
1290			else
1291				args.v3.sExtEncoder.usPixelClock = cpu_to_le16(amdgpu_encoder->pixel_clock / 10);
1292			args.v3.sExtEncoder.ucEncoderMode =
1293				amdgpu_atombios_encoder_get_encoder_mode(encoder);
1294
1295			if (ENCODER_MODE_IS_DP(args.v3.sExtEncoder.ucEncoderMode)) {
1296				if (dp_clock == 270000)
1297					args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
1298				else if (dp_clock == 540000)
1299					args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_5_40GHZ;
1300				args.v3.sExtEncoder.ucLaneNum = dp_lane_count;
1301			} else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
1302				args.v3.sExtEncoder.ucLaneNum = 8;
1303			else
1304				args.v3.sExtEncoder.ucLaneNum = 4;
1305			switch (ext_enum) {
1306			case GRAPH_OBJECT_ENUM_ID1:
1307				args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER1;
1308				break;
1309			case GRAPH_OBJECT_ENUM_ID2:
1310				args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER2;
1311				break;
1312			case GRAPH_OBJECT_ENUM_ID3:
1313				args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER3;
1314				break;
1315			}
1316			args.v3.sExtEncoder.ucBitPerColor = amdgpu_atombios_encoder_get_bpc(encoder);
1317			break;
1318		default:
1319			DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1320			return;
1321		}
1322		break;
1323	default:
1324		DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1325		return;
1326	}
1327	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1328}
1329
1330static void
1331amdgpu_atombios_encoder_setup_dig(struct drm_encoder *encoder, int action)
1332{
1333	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1334	struct drm_encoder *ext_encoder = amdgpu_get_external_encoder(encoder);
1335	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
1336	struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
1337	struct amdgpu_connector *amdgpu_connector = NULL;
1338	struct amdgpu_connector_atom_dig *amdgpu_dig_connector = NULL;
1339
1340	if (connector) {
1341		amdgpu_connector = to_amdgpu_connector(connector);
1342		amdgpu_dig_connector = amdgpu_connector->con_priv;
1343	}
1344
1345	if (action == ATOM_ENABLE) {
1346		if (!connector)
1347			dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
1348		else
1349			dig->panel_mode = amdgpu_atombios_dp_get_panel_mode(encoder, connector);
1350
1351		/* setup and enable the encoder */
1352		amdgpu_atombios_encoder_setup_dig_encoder(encoder, ATOM_ENCODER_CMD_SETUP, 0);
1353		amdgpu_atombios_encoder_setup_dig_encoder(encoder,
1354						   ATOM_ENCODER_CMD_SETUP_PANEL_MODE,
1355						   dig->panel_mode);
1356		if (ext_encoder)
1357			amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder,
1358								EXTERNAL_ENCODER_ACTION_V3_ENCODER_SETUP);
1359		if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(encoder)) &&
1360		    connector) {
1361			if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1362				amdgpu_atombios_encoder_set_edp_panel_power(connector,
1363								     ATOM_TRANSMITTER_ACTION_POWER_ON);
1364				amdgpu_dig_connector->edp_on = true;
1365			}
1366		}
1367		/* enable the transmitter */
1368		amdgpu_atombios_encoder_setup_dig_transmitter(encoder,
1369						       ATOM_TRANSMITTER_ACTION_ENABLE,
1370						       0, 0);
1371		if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(encoder)) &&
1372		    connector) {
1373			/* DP_SET_POWER_D0 is set in amdgpu_atombios_dp_link_train */
1374			amdgpu_atombios_dp_link_train(encoder, connector);
1375			amdgpu_atombios_encoder_setup_dig_encoder(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0);
1376		}
1377		if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
1378			amdgpu_atombios_encoder_set_backlight_level(amdgpu_encoder, dig->backlight_level);
1379		if (ext_encoder)
1380			amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder, ATOM_ENABLE);
1381	} else {
1382		if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(encoder)) &&
1383		    connector)
1384			amdgpu_atombios_encoder_setup_dig_encoder(encoder,
1385							   ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0);
1386		if (ext_encoder)
1387			amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder, ATOM_DISABLE);
1388		if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
1389			amdgpu_atombios_encoder_setup_dig_transmitter(encoder,
1390							       ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0);
1391
1392		if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(encoder)) &&
1393		    connector)
1394			amdgpu_atombios_dp_set_rx_power_state(connector, DP_SET_POWER_D3);
1395		/* disable the transmitter */
1396		amdgpu_atombios_encoder_setup_dig_transmitter(encoder,
1397						       ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0);
1398		if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(encoder)) &&
1399		    connector) {
1400			if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1401				amdgpu_atombios_encoder_set_edp_panel_power(connector,
1402								     ATOM_TRANSMITTER_ACTION_POWER_OFF);
1403				amdgpu_dig_connector->edp_on = false;
1404			}
1405		}
1406	}
1407}
1408
1409void
1410amdgpu_atombios_encoder_dpms(struct drm_encoder *encoder, int mode)
1411{
1412	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1413
1414	DRM_DEBUG_KMS("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n",
1415		  amdgpu_encoder->encoder_id, mode, amdgpu_encoder->devices,
1416		  amdgpu_encoder->active_device);
1417	switch (amdgpu_encoder->encoder_id) {
1418	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1419	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1420	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1421	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1422		switch (mode) {
1423		case DRM_MODE_DPMS_ON:
1424			amdgpu_atombios_encoder_setup_dig(encoder, ATOM_ENABLE);
1425			break;
1426		case DRM_MODE_DPMS_STANDBY:
1427		case DRM_MODE_DPMS_SUSPEND:
1428		case DRM_MODE_DPMS_OFF:
1429			amdgpu_atombios_encoder_setup_dig(encoder, ATOM_DISABLE);
1430			break;
1431		}
1432		break;
1433	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1434		switch (mode) {
1435		case DRM_MODE_DPMS_ON:
1436			amdgpu_atombios_encoder_setup_dvo(encoder, ATOM_ENABLE);
1437			break;
1438		case DRM_MODE_DPMS_STANDBY:
1439		case DRM_MODE_DPMS_SUSPEND:
1440		case DRM_MODE_DPMS_OFF:
1441			amdgpu_atombios_encoder_setup_dvo(encoder, ATOM_DISABLE);
1442			break;
1443		}
1444		break;
1445	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1446		switch (mode) {
1447		case DRM_MODE_DPMS_ON:
1448			amdgpu_atombios_encoder_setup_dac(encoder, ATOM_ENABLE);
1449			break;
1450		case DRM_MODE_DPMS_STANDBY:
1451		case DRM_MODE_DPMS_SUSPEND:
1452		case DRM_MODE_DPMS_OFF:
1453			amdgpu_atombios_encoder_setup_dac(encoder, ATOM_DISABLE);
1454			break;
1455		}
1456		break;
1457	default:
1458		return;
1459	}
1460}
1461
1462union crtc_source_param {
1463	SELECT_CRTC_SOURCE_PS_ALLOCATION v1;
1464	SELECT_CRTC_SOURCE_PARAMETERS_V2 v2;
1465	SELECT_CRTC_SOURCE_PARAMETERS_V3 v3;
1466};
1467
1468void
1469amdgpu_atombios_encoder_set_crtc_source(struct drm_encoder *encoder)
1470{
1471	struct drm_device *dev = encoder->dev;
1472	struct amdgpu_device *adev = dev->dev_private;
1473	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1474	struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc);
1475	union crtc_source_param args;
1476	int index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source);
1477	uint8_t frev, crev;
1478	struct amdgpu_encoder_atom_dig *dig;
1479
1480	memset(&args, 0, sizeof(args));
1481
1482	if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
1483		return;
1484
1485	switch (frev) {
1486	case 1:
1487		switch (crev) {
1488		case 1:
1489		default:
1490			args.v1.ucCRTC = amdgpu_crtc->crtc_id;
1491			switch (amdgpu_encoder->encoder_id) {
1492			case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
1493			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
1494				args.v1.ucDevice = ATOM_DEVICE_DFP1_INDEX;
1495				break;
1496			case ENCODER_OBJECT_ID_INTERNAL_LVDS:
1497			case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
1498				if (amdgpu_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT)
1499					args.v1.ucDevice = ATOM_DEVICE_LCD1_INDEX;
1500				else
1501					args.v1.ucDevice = ATOM_DEVICE_DFP3_INDEX;
1502				break;
1503			case ENCODER_OBJECT_ID_INTERNAL_DVO1:
1504			case ENCODER_OBJECT_ID_INTERNAL_DDI:
1505			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1506				args.v1.ucDevice = ATOM_DEVICE_DFP2_INDEX;
1507				break;
1508			case ENCODER_OBJECT_ID_INTERNAL_DAC1:
1509			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1510				if (amdgpu_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1511					args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX;
1512				else if (amdgpu_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1513					args.v1.ucDevice = ATOM_DEVICE_CV_INDEX;
1514				else
1515					args.v1.ucDevice = ATOM_DEVICE_CRT1_INDEX;
1516				break;
1517			case ENCODER_OBJECT_ID_INTERNAL_DAC2:
1518			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1519				if (amdgpu_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1520					args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX;
1521				else if (amdgpu_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1522					args.v1.ucDevice = ATOM_DEVICE_CV_INDEX;
1523				else
1524					args.v1.ucDevice = ATOM_DEVICE_CRT2_INDEX;
1525				break;
1526			}
1527			break;
1528		case 2:
1529			args.v2.ucCRTC = amdgpu_crtc->crtc_id;
1530			if (amdgpu_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE) {
1531				struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
1532
1533				if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
1534					args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS;
1535				else if (connector->connector_type == DRM_MODE_CONNECTOR_VGA)
1536					args.v2.ucEncodeMode = ATOM_ENCODER_MODE_CRT;
1537				else
1538					args.v2.ucEncodeMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
1539			} else if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1540				args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS;
1541			} else {
1542				args.v2.ucEncodeMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
1543			}
1544			switch (amdgpu_encoder->encoder_id) {
1545			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1546			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1547			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1548			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1549			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
1550				dig = amdgpu_encoder->enc_priv;
1551				switch (dig->dig_encoder) {
1552				case 0:
1553					args.v2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID;
1554					break;
1555				case 1:
1556					args.v2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID;
1557					break;
1558				case 2:
1559					args.v2.ucEncoderID = ASIC_INT_DIG3_ENCODER_ID;
1560					break;
1561				case 3:
1562					args.v2.ucEncoderID = ASIC_INT_DIG4_ENCODER_ID;
1563					break;
1564				case 4:
1565					args.v2.ucEncoderID = ASIC_INT_DIG5_ENCODER_ID;
1566					break;
1567				case 5:
1568					args.v2.ucEncoderID = ASIC_INT_DIG6_ENCODER_ID;
1569					break;
1570				case 6:
1571					args.v2.ucEncoderID = ASIC_INT_DIG7_ENCODER_ID;
1572					break;
1573				}
1574				break;
1575			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1576				args.v2.ucEncoderID = ASIC_INT_DVO_ENCODER_ID;
1577				break;
1578			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1579				if (amdgpu_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1580					args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1581				else if (amdgpu_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1582					args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1583				else
1584					args.v2.ucEncoderID = ASIC_INT_DAC1_ENCODER_ID;
1585				break;
1586			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1587				if (amdgpu_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1588					args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1589				else if (amdgpu_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1590					args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1591				else
1592					args.v2.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID;
1593				break;
1594			}
1595			break;
1596		case 3:
1597			args.v3.ucCRTC = amdgpu_crtc->crtc_id;
1598			if (amdgpu_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE) {
1599				struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
1600
1601				if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
1602					args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS;
1603				else if (connector->connector_type == DRM_MODE_CONNECTOR_VGA)
1604					args.v2.ucEncodeMode = ATOM_ENCODER_MODE_CRT;
1605				else
1606					args.v2.ucEncodeMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
1607			} else if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1608				args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS;
1609			} else {
1610				args.v2.ucEncodeMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
1611			}
1612			args.v3.ucDstBpc = amdgpu_atombios_encoder_get_bpc(encoder);
1613			switch (amdgpu_encoder->encoder_id) {
1614			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1615			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1616			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1617			case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1618			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
1619				dig = amdgpu_encoder->enc_priv;
1620				switch (dig->dig_encoder) {
1621				case 0:
1622					args.v3.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID;
1623					break;
1624				case 1:
1625					args.v3.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID;
1626					break;
1627				case 2:
1628					args.v3.ucEncoderID = ASIC_INT_DIG3_ENCODER_ID;
1629					break;
1630				case 3:
1631					args.v3.ucEncoderID = ASIC_INT_DIG4_ENCODER_ID;
1632					break;
1633				case 4:
1634					args.v3.ucEncoderID = ASIC_INT_DIG5_ENCODER_ID;
1635					break;
1636				case 5:
1637					args.v3.ucEncoderID = ASIC_INT_DIG6_ENCODER_ID;
1638					break;
1639				case 6:
1640					args.v3.ucEncoderID = ASIC_INT_DIG7_ENCODER_ID;
1641					break;
1642				}
1643				break;
1644			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1645				args.v3.ucEncoderID = ASIC_INT_DVO_ENCODER_ID;
1646				break;
1647			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1648				if (amdgpu_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1649					args.v3.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1650				else if (amdgpu_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1651					args.v3.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1652				else
1653					args.v3.ucEncoderID = ASIC_INT_DAC1_ENCODER_ID;
1654				break;
1655			case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
1656				if (amdgpu_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1657					args.v3.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1658				else if (amdgpu_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1659					args.v3.ucEncoderID = ASIC_INT_TV_ENCODER_ID;
1660				else
1661					args.v3.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID;
1662				break;
1663			}
1664			break;
1665		}
1666		break;
1667	default:
1668		DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1669		return;
1670	}
1671
1672	amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1673}
1674
1675/* This only needs to be called once at startup */
1676void
1677amdgpu_atombios_encoder_init_dig(struct amdgpu_device *adev)
1678{
1679	struct drm_device *dev = adev->ddev;
1680	struct drm_encoder *encoder;
1681
1682	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
1683		struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1684		struct drm_encoder *ext_encoder = amdgpu_get_external_encoder(encoder);
1685
1686		switch (amdgpu_encoder->encoder_id) {
1687		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1688		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1689		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1690		case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1691			amdgpu_atombios_encoder_setup_dig_transmitter(encoder, ATOM_TRANSMITTER_ACTION_INIT,
1692							       0, 0);
1693			break;
1694		}
1695
1696		if (ext_encoder)
1697			amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder,
1698								EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT);
1699	}
1700}
1701
1702static bool
1703amdgpu_atombios_encoder_dac_load_detect(struct drm_encoder *encoder,
1704				 struct drm_connector *connector)
1705{
1706	struct drm_device *dev = encoder->dev;
1707	struct amdgpu_device *adev = dev->dev_private;
1708	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1709	struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1710
1711	if (amdgpu_encoder->devices & (ATOM_DEVICE_TV_SUPPORT |
1712				       ATOM_DEVICE_CV_SUPPORT |
1713				       ATOM_DEVICE_CRT_SUPPORT)) {
1714		DAC_LOAD_DETECTION_PS_ALLOCATION args;
1715		int index = GetIndexIntoMasterTable(COMMAND, DAC_LoadDetection);
1716		uint8_t frev, crev;
1717
1718		memset(&args, 0, sizeof(args));
1719
1720		if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
1721			return false;
1722
1723		args.sDacload.ucMisc = 0;
1724
1725		if ((amdgpu_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DAC1) ||
1726		    (amdgpu_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1))
1727			args.sDacload.ucDacType = ATOM_DAC_A;
1728		else
1729			args.sDacload.ucDacType = ATOM_DAC_B;
1730
1731		if (amdgpu_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)
1732			args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT1_SUPPORT);
1733		else if (amdgpu_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)
1734			args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT2_SUPPORT);
1735		else if (amdgpu_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
1736			args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CV_SUPPORT);
1737			if (crev >= 3)
1738				args.sDacload.ucMisc = DAC_LOAD_MISC_YPrPb;
1739		} else if (amdgpu_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
1740			args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_TV1_SUPPORT);
1741			if (crev >= 3)
1742				args.sDacload.ucMisc = DAC_LOAD_MISC_YPrPb;
1743		}
1744
1745		amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1746
1747		return true;
1748	} else
1749		return false;
1750}
1751
1752enum drm_connector_status
1753amdgpu_atombios_encoder_dac_detect(struct drm_encoder *encoder,
1754			    struct drm_connector *connector)
1755{
1756	struct drm_device *dev = encoder->dev;
1757	struct amdgpu_device *adev = dev->dev_private;
1758	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1759	struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1760	uint32_t bios_0_scratch;
1761
1762	if (!amdgpu_atombios_encoder_dac_load_detect(encoder, connector)) {
1763		DRM_DEBUG_KMS("detect returned false \n");
1764		return connector_status_unknown;
1765	}
1766
1767	bios_0_scratch = RREG32(mmBIOS_SCRATCH_0);
1768
1769	DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, amdgpu_encoder->devices);
1770	if (amdgpu_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) {
1771		if (bios_0_scratch & ATOM_S0_CRT1_MASK)
1772			return connector_status_connected;
1773	}
1774	if (amdgpu_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) {
1775		if (bios_0_scratch & ATOM_S0_CRT2_MASK)
1776			return connector_status_connected;
1777	}
1778	if (amdgpu_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
1779		if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A))
1780			return connector_status_connected;
1781	}
1782	if (amdgpu_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
1783		if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A))
1784			return connector_status_connected; /* CTV */
1785		else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A))
1786			return connector_status_connected; /* STV */
1787	}
1788	return connector_status_disconnected;
1789}
1790
1791enum drm_connector_status
1792amdgpu_atombios_encoder_dig_detect(struct drm_encoder *encoder,
1793			    struct drm_connector *connector)
1794{
1795	struct drm_device *dev = encoder->dev;
1796	struct amdgpu_device *adev = dev->dev_private;
1797	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1798	struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
1799	struct drm_encoder *ext_encoder = amdgpu_get_external_encoder(encoder);
1800	u32 bios_0_scratch;
1801
1802	if (!ext_encoder)
1803		return connector_status_unknown;
1804
1805	if ((amdgpu_connector->devices & ATOM_DEVICE_CRT_SUPPORT) == 0)
1806		return connector_status_unknown;
1807
1808	/* load detect on the dp bridge */
1809	amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder,
1810						EXTERNAL_ENCODER_ACTION_V3_DACLOAD_DETECTION);
1811
1812	bios_0_scratch = RREG32(mmBIOS_SCRATCH_0);
1813
1814	DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, amdgpu_encoder->devices);
1815	if (amdgpu_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) {
1816		if (bios_0_scratch & ATOM_S0_CRT1_MASK)
1817			return connector_status_connected;
1818	}
1819	if (amdgpu_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) {
1820		if (bios_0_scratch & ATOM_S0_CRT2_MASK)
1821			return connector_status_connected;
1822	}
1823	if (amdgpu_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
1824		if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A))
1825			return connector_status_connected;
1826	}
1827	if (amdgpu_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
1828		if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A))
1829			return connector_status_connected; /* CTV */
1830		else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A))
1831			return connector_status_connected; /* STV */
1832	}
1833	return connector_status_disconnected;
1834}
1835
1836void
1837amdgpu_atombios_encoder_setup_ext_encoder_ddc(struct drm_encoder *encoder)
1838{
1839	struct drm_encoder *ext_encoder = amdgpu_get_external_encoder(encoder);
1840
1841	if (ext_encoder)
1842		/* ddc_setup on the dp bridge */
1843		amdgpu_atombios_encoder_setup_external_encoder(encoder, ext_encoder,
1844							EXTERNAL_ENCODER_ACTION_V3_DDC_SETUP);
1845
1846}
1847
1848void
1849amdgpu_atombios_encoder_set_bios_scratch_regs(struct drm_connector *connector,
1850				       struct drm_encoder *encoder,
1851				       bool connected)
1852{
1853	struct drm_device *dev = connector->dev;
1854	struct amdgpu_device *adev = dev->dev_private;
1855	struct amdgpu_connector *amdgpu_connector =
1856	    to_amdgpu_connector(connector);
1857	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1858	uint32_t bios_0_scratch, bios_3_scratch, bios_6_scratch;
1859
1860	bios_0_scratch = RREG32(mmBIOS_SCRATCH_0);
1861	bios_3_scratch = RREG32(mmBIOS_SCRATCH_3);
1862	bios_6_scratch = RREG32(mmBIOS_SCRATCH_6);
1863
1864	if ((amdgpu_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) &&
1865	    (amdgpu_connector->devices & ATOM_DEVICE_LCD1_SUPPORT)) {
1866		if (connected) {
1867			DRM_DEBUG_KMS("LCD1 connected\n");
1868			bios_0_scratch |= ATOM_S0_LCD1;
1869			bios_3_scratch |= ATOM_S3_LCD1_ACTIVE;
1870			bios_6_scratch |= ATOM_S6_ACC_REQ_LCD1;
1871		} else {
1872			DRM_DEBUG_KMS("LCD1 disconnected\n");
1873			bios_0_scratch &= ~ATOM_S0_LCD1;
1874			bios_3_scratch &= ~ATOM_S3_LCD1_ACTIVE;
1875			bios_6_scratch &= ~ATOM_S6_ACC_REQ_LCD1;
1876		}
1877	}
1878	if ((amdgpu_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) &&
1879	    (amdgpu_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)) {
1880		if (connected) {
1881			DRM_DEBUG_KMS("CRT1 connected\n");
1882			bios_0_scratch |= ATOM_S0_CRT1_COLOR;
1883			bios_3_scratch |= ATOM_S3_CRT1_ACTIVE;
1884			bios_6_scratch |= ATOM_S6_ACC_REQ_CRT1;
1885		} else {
1886			DRM_DEBUG_KMS("CRT1 disconnected\n");
1887			bios_0_scratch &= ~ATOM_S0_CRT1_MASK;
1888			bios_3_scratch &= ~ATOM_S3_CRT1_ACTIVE;
1889			bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT1;
1890		}
1891	}
1892	if ((amdgpu_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) &&
1893	    (amdgpu_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)) {
1894		if (connected) {
1895			DRM_DEBUG_KMS("CRT2 connected\n");
1896			bios_0_scratch |= ATOM_S0_CRT2_COLOR;
1897			bios_3_scratch |= ATOM_S3_CRT2_ACTIVE;
1898			bios_6_scratch |= ATOM_S6_ACC_REQ_CRT2;
1899		} else {
1900			DRM_DEBUG_KMS("CRT2 disconnected\n");
1901			bios_0_scratch &= ~ATOM_S0_CRT2_MASK;
1902			bios_3_scratch &= ~ATOM_S3_CRT2_ACTIVE;
1903			bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT2;
1904		}
1905	}
1906	if ((amdgpu_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) &&
1907	    (amdgpu_connector->devices & ATOM_DEVICE_DFP1_SUPPORT)) {
1908		if (connected) {
1909			DRM_DEBUG_KMS("DFP1 connected\n");
1910			bios_0_scratch |= ATOM_S0_DFP1;
1911			bios_3_scratch |= ATOM_S3_DFP1_ACTIVE;
1912			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP1;
1913		} else {
1914			DRM_DEBUG_KMS("DFP1 disconnected\n");
1915			bios_0_scratch &= ~ATOM_S0_DFP1;
1916			bios_3_scratch &= ~ATOM_S3_DFP1_ACTIVE;
1917			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP1;
1918		}
1919	}
1920	if ((amdgpu_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) &&
1921	    (amdgpu_connector->devices & ATOM_DEVICE_DFP2_SUPPORT)) {
1922		if (connected) {
1923			DRM_DEBUG_KMS("DFP2 connected\n");
1924			bios_0_scratch |= ATOM_S0_DFP2;
1925			bios_3_scratch |= ATOM_S3_DFP2_ACTIVE;
1926			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP2;
1927		} else {
1928			DRM_DEBUG_KMS("DFP2 disconnected\n");
1929			bios_0_scratch &= ~ATOM_S0_DFP2;
1930			bios_3_scratch &= ~ATOM_S3_DFP2_ACTIVE;
1931			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP2;
1932		}
1933	}
1934	if ((amdgpu_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) &&
1935	    (amdgpu_connector->devices & ATOM_DEVICE_DFP3_SUPPORT)) {
1936		if (connected) {
1937			DRM_DEBUG_KMS("DFP3 connected\n");
1938			bios_0_scratch |= ATOM_S0_DFP3;
1939			bios_3_scratch |= ATOM_S3_DFP3_ACTIVE;
1940			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP3;
1941		} else {
1942			DRM_DEBUG_KMS("DFP3 disconnected\n");
1943			bios_0_scratch &= ~ATOM_S0_DFP3;
1944			bios_3_scratch &= ~ATOM_S3_DFP3_ACTIVE;
1945			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP3;
1946		}
1947	}
1948	if ((amdgpu_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) &&
1949	    (amdgpu_connector->devices & ATOM_DEVICE_DFP4_SUPPORT)) {
1950		if (connected) {
1951			DRM_DEBUG_KMS("DFP4 connected\n");
1952			bios_0_scratch |= ATOM_S0_DFP4;
1953			bios_3_scratch |= ATOM_S3_DFP4_ACTIVE;
1954			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP4;
1955		} else {
1956			DRM_DEBUG_KMS("DFP4 disconnected\n");
1957			bios_0_scratch &= ~ATOM_S0_DFP4;
1958			bios_3_scratch &= ~ATOM_S3_DFP4_ACTIVE;
1959			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP4;
1960		}
1961	}
1962	if ((amdgpu_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) &&
1963	    (amdgpu_connector->devices & ATOM_DEVICE_DFP5_SUPPORT)) {
1964		if (connected) {
1965			DRM_DEBUG_KMS("DFP5 connected\n");
1966			bios_0_scratch |= ATOM_S0_DFP5;
1967			bios_3_scratch |= ATOM_S3_DFP5_ACTIVE;
1968			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP5;
1969		} else {
1970			DRM_DEBUG_KMS("DFP5 disconnected\n");
1971			bios_0_scratch &= ~ATOM_S0_DFP5;
1972			bios_3_scratch &= ~ATOM_S3_DFP5_ACTIVE;
1973			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5;
1974		}
1975	}
1976	if ((amdgpu_encoder->devices & ATOM_DEVICE_DFP6_SUPPORT) &&
1977	    (amdgpu_connector->devices & ATOM_DEVICE_DFP6_SUPPORT)) {
1978		if (connected) {
1979			DRM_DEBUG_KMS("DFP6 connected\n");
1980			bios_0_scratch |= ATOM_S0_DFP6;
1981			bios_3_scratch |= ATOM_S3_DFP6_ACTIVE;
1982			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP6;
1983		} else {
1984			DRM_DEBUG_KMS("DFP6 disconnected\n");
1985			bios_0_scratch &= ~ATOM_S0_DFP6;
1986			bios_3_scratch &= ~ATOM_S3_DFP6_ACTIVE;
1987			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP6;
1988		}
1989	}
1990
1991	WREG32(mmBIOS_SCRATCH_0, bios_0_scratch);
1992	WREG32(mmBIOS_SCRATCH_3, bios_3_scratch);
1993	WREG32(mmBIOS_SCRATCH_6, bios_6_scratch);
1994}
1995
1996union lvds_info {
1997	struct _ATOM_LVDS_INFO info;
1998	struct _ATOM_LVDS_INFO_V12 info_12;
1999};
2000
2001struct amdgpu_encoder_atom_dig *
2002amdgpu_atombios_encoder_get_lcd_info(struct amdgpu_encoder *encoder)
2003{
2004	struct drm_device *dev = encoder->base.dev;
2005	struct amdgpu_device *adev = dev->dev_private;
2006	struct amdgpu_mode_info *mode_info = &adev->mode_info;
2007	int index = GetIndexIntoMasterTable(DATA, LVDS_Info);
2008	uint16_t data_offset, misc;
2009	union lvds_info *lvds_info;
2010	uint8_t frev, crev;
2011	struct amdgpu_encoder_atom_dig *lvds = NULL;
2012	int encoder_enum = (encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
2013
2014	if (amdgpu_atom_parse_data_header(mode_info->atom_context, index, NULL,
2015				   &frev, &crev, &data_offset)) {
2016		lvds_info =
2017			(union lvds_info *)(mode_info->atom_context->bios + data_offset);
2018		lvds =
2019		    kzalloc(sizeof(struct amdgpu_encoder_atom_dig), GFP_KERNEL);
2020
2021		if (!lvds)
2022			return NULL;
2023
2024		lvds->native_mode.clock =
2025		    le16_to_cpu(lvds_info->info.sLCDTiming.usPixClk) * 10;
2026		lvds->native_mode.hdisplay =
2027		    le16_to_cpu(lvds_info->info.sLCDTiming.usHActive);
2028		lvds->native_mode.vdisplay =
2029		    le16_to_cpu(lvds_info->info.sLCDTiming.usVActive);
2030		lvds->native_mode.htotal = lvds->native_mode.hdisplay +
2031			le16_to_cpu(lvds_info->info.sLCDTiming.usHBlanking_Time);
2032		lvds->native_mode.hsync_start = lvds->native_mode.hdisplay +
2033			le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncOffset);
2034		lvds->native_mode.hsync_end = lvds->native_mode.hsync_start +
2035			le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncWidth);
2036		lvds->native_mode.vtotal = lvds->native_mode.vdisplay +
2037			le16_to_cpu(lvds_info->info.sLCDTiming.usVBlanking_Time);
2038		lvds->native_mode.vsync_start = lvds->native_mode.vdisplay +
2039			le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncOffset);
2040		lvds->native_mode.vsync_end = lvds->native_mode.vsync_start +
2041			le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncWidth);
2042		lvds->panel_pwr_delay =
2043		    le16_to_cpu(lvds_info->info.usOffDelayInMs);
2044		lvds->lcd_misc = lvds_info->info.ucLVDS_Misc;
2045
2046		misc = le16_to_cpu(lvds_info->info.sLCDTiming.susModeMiscInfo.usAccess);
2047		if (misc & ATOM_VSYNC_POLARITY)
2048			lvds->native_mode.flags |= DRM_MODE_FLAG_NVSYNC;
2049		if (misc & ATOM_HSYNC_POLARITY)
2050			lvds->native_mode.flags |= DRM_MODE_FLAG_NHSYNC;
2051		if (misc & ATOM_COMPOSITESYNC)
2052			lvds->native_mode.flags |= DRM_MODE_FLAG_CSYNC;
2053		if (misc & ATOM_INTERLACE)
2054			lvds->native_mode.flags |= DRM_MODE_FLAG_INTERLACE;
2055		if (misc & ATOM_DOUBLE_CLOCK_MODE)
2056			lvds->native_mode.flags |= DRM_MODE_FLAG_DBLSCAN;
2057
2058		lvds->native_mode.width_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageHSize);
2059		lvds->native_mode.height_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageVSize);
2060
2061		/* set crtc values */
2062		drm_mode_set_crtcinfo(&lvds->native_mode, CRTC_INTERLACE_HALVE_V);
2063
2064		lvds->lcd_ss_id = lvds_info->info.ucSS_Id;
2065
2066		encoder->native_mode = lvds->native_mode;
2067
2068		if (encoder_enum == 2)
2069			lvds->linkb = true;
2070		else
2071			lvds->linkb = false;
2072
2073		/* parse the lcd record table */
2074		if (le16_to_cpu(lvds_info->info.usModePatchTableOffset)) {
2075			ATOM_FAKE_EDID_PATCH_RECORD *fake_edid_record;
2076			ATOM_PANEL_RESOLUTION_PATCH_RECORD *panel_res_record;
2077			bool bad_record = false;
2078			u8 *record;
2079
2080			if ((frev == 1) && (crev < 2))
2081				/* absolute */
2082				record = (u8 *)(mode_info->atom_context->bios +
2083						le16_to_cpu(lvds_info->info.usModePatchTableOffset));
2084			else
2085				/* relative */
2086				record = (u8 *)(mode_info->atom_context->bios +
2087						data_offset +
2088						le16_to_cpu(lvds_info->info.usModePatchTableOffset));
2089			while (*record != ATOM_RECORD_END_TYPE) {
2090				switch (*record) {
2091				case LCD_MODE_PATCH_RECORD_MODE_TYPE:
2092					record += sizeof(ATOM_PATCH_RECORD_MODE);
2093					break;
2094				case LCD_RTS_RECORD_TYPE:
2095					record += sizeof(ATOM_LCD_RTS_RECORD);
2096					break;
2097				case LCD_CAP_RECORD_TYPE:
2098					record += sizeof(ATOM_LCD_MODE_CONTROL_CAP);
2099					break;
2100				case LCD_FAKE_EDID_PATCH_RECORD_TYPE:
2101					fake_edid_record = (ATOM_FAKE_EDID_PATCH_RECORD *)record;
2102					if (fake_edid_record->ucFakeEDIDLength) {
2103						struct edid *edid;
2104						int edid_size =
2105							max((int)EDID_LENGTH, (int)fake_edid_record->ucFakeEDIDLength);
2106						edid = kmalloc(edid_size, GFP_KERNEL);
2107						if (edid) {
2108							memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0],
2109							       fake_edid_record->ucFakeEDIDLength);
2110
2111							if (drm_edid_is_valid(edid)) {
2112								adev->mode_info.bios_hardcoded_edid = edid;
2113								adev->mode_info.bios_hardcoded_edid_size = edid_size;
2114							} else
2115								kfree(edid);
2116						}
2117					}
2118					record += fake_edid_record->ucFakeEDIDLength ?
2119						fake_edid_record->ucFakeEDIDLength + 2 :
2120						sizeof(ATOM_FAKE_EDID_PATCH_RECORD);
 
 
 
2121					break;
2122				case LCD_PANEL_RESOLUTION_RECORD_TYPE:
2123					panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record;
2124					lvds->native_mode.width_mm = panel_res_record->usHSize;
2125					lvds->native_mode.height_mm = panel_res_record->usVSize;
2126					record += sizeof(ATOM_PANEL_RESOLUTION_PATCH_RECORD);
2127					break;
2128				default:
2129					DRM_ERROR("Bad LCD record %d\n", *record);
2130					bad_record = true;
2131					break;
2132				}
2133				if (bad_record)
2134					break;
2135			}
2136		}
2137	}
2138	return lvds;
2139}
2140
2141struct amdgpu_encoder_atom_dig *
2142amdgpu_atombios_encoder_get_dig_info(struct amdgpu_encoder *amdgpu_encoder)
2143{
2144	int encoder_enum = (amdgpu_encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
2145	struct amdgpu_encoder_atom_dig *dig = kzalloc(sizeof(struct amdgpu_encoder_atom_dig), GFP_KERNEL);
2146
2147	if (!dig)
2148		return NULL;
2149
2150	/* coherent mode by default */
2151	dig->coherent_mode = true;
2152	dig->dig_encoder = -1;
2153
2154	if (encoder_enum == 2)
2155		dig->linkb = true;
2156	else
2157		dig->linkb = false;
2158
2159	return dig;
2160}
2161