aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_dp.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2013-06-10 18:38:56 -0400
committerDave Airlie <airlied@redhat.com>2013-06-10 18:38:56 -0400
commite6dfcc5303d5d31cb36e36405acd766c8ed2c923 (patch)
tree986beb9aba4a62ea1449dde210005e82084e8c5e /drivers/gpu/drm/i915/intel_dp.c
parent9bc3cd5673d84d29272fa7181a4dfca83cbb48c1 (diff)
parent92d44621ad2d083bc03920c904ca0a5eb10d9ded (diff)
Merge tag 'drm-intel-next-2013-06-01' of git://people.freedesktop.org/~danvet/drm-intel into drm-next
Daniel writes: Another round of drm-intel-next for 3.11. Highlights: - Haswell IPS support (Paulo Zanoni) - VECS support on Haswell (Ben Widawsky, Xiang Haihao, ...) - Haswell watermark fixes (Paulo Zanoni) - "Make the gun bigger again" multithread fence fix from Chris. - i915_error_state finnally no longer fails with -ENOMEM! Big thanks to Mika for tackling this. - vlv sideband locking fixes from Jani - Hangcheck prep work for arb_robustness support (Mika&Chris) - edp vs cpu port confusion clean-up from Imre - pile of smaller fixes and cleanups all over. * tag 'drm-intel-next-2013-06-01' of git://people.freedesktop.org/~danvet/drm-intel: (70 commits) drm/i915: add i915_ips_status debugfs entry drm/i915: add enable_ips module option drm/i915: implement IPS feature drm/i915: fix up the edp power well check drm/i915: add I915_PARAM_HAS_VEBOX to i915_getparam drm/i915: add I915_EXEC_VEBOX to i915_gem_do_execbuffer() drm/i915: add VEBOX into debugfs drm/i915: Enable vebox interrupts drm/i915: vebox interrupt get/put drm/i915: consolidate interrupt naming scheme drm/i915: Convert irq_refounct to struct drm/i915: make PM interrupt writes non-destructive drm/i915: Add PM regs to pre/post install drm/i915: Create an ivybridge_irq_preinstall drm/i915: Create a more generic pm handler for hsw+ drm/i915: add support for 5/6 data buffer partitioning on Haswell drm/i915: properly set HSW WM_LP watermarks drm/i915: properly set HSW WM_PIPE registers drm/i915: fix pch_nop support drm/i915: Vebox ringbuffer init ...
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c145
1 files changed, 77 insertions, 68 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index bfc8664be8dc..91a31b3b9829 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -59,22 +59,6 @@ static struct drm_device *intel_dp_to_dev(struct intel_dp *intel_dp)
59 return intel_dig_port->base.base.dev; 59 return intel_dig_port->base.base.dev;
60} 60}
61 61
62/**
63 * is_cpu_edp - is the port on the CPU and attached to an eDP panel?
64 * @intel_dp: DP struct
65 *
66 * Returns true if the given DP struct corresponds to a CPU eDP port.
67 */
68static bool is_cpu_edp(struct intel_dp *intel_dp)
69{
70 struct drm_device *dev = intel_dp_to_dev(intel_dp);
71 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
72 enum port port = intel_dig_port->port;
73
74 return is_edp(intel_dp) &&
75 (port == PORT_A || (port == PORT_C && IS_VALLEYVIEW(dev)));
76}
77
78static struct intel_dp *intel_attached_dp(struct drm_connector *connector) 62static struct intel_dp *intel_attached_dp(struct drm_connector *connector)
79{ 63{
80 return enc_to_intel_dp(&intel_attached_encoder(connector)->base); 64 return enc_to_intel_dp(&intel_attached_encoder(connector)->base);
@@ -317,11 +301,12 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
317 * Note that PCH attached eDP panels should use a 125MHz input 301 * Note that PCH attached eDP panels should use a 125MHz input
318 * clock divider. 302 * clock divider.
319 */ 303 */
320 if (is_cpu_edp(intel_dp)) { 304 if (IS_VALLEYVIEW(dev)) {
305 aux_clock_divider = 100;
306 } else if (intel_dig_port->port == PORT_A) {
321 if (HAS_DDI(dev)) 307 if (HAS_DDI(dev))
322 aux_clock_divider = intel_ddi_get_cdclk_freq(dev_priv) >> 1; 308 aux_clock_divider = DIV_ROUND_CLOSEST(
323 else if (IS_VALLEYVIEW(dev)) 309 intel_ddi_get_cdclk_freq(dev_priv), 2000);
324 aux_clock_divider = 100;
325 else if (IS_GEN6(dev) || IS_GEN7(dev)) 310 else if (IS_GEN6(dev) || IS_GEN7(dev))
326 aux_clock_divider = 200; /* SNB & IVB eDP input clock at 400Mhz */ 311 aux_clock_divider = 200; /* SNB & IVB eDP input clock at 400Mhz */
327 else 312 else
@@ -684,6 +669,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
684 struct drm_i915_private *dev_priv = dev->dev_private; 669 struct drm_i915_private *dev_priv = dev->dev_private;
685 struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode; 670 struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode;
686 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); 671 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
672 enum port port = dp_to_dig_port(intel_dp)->port;
687 struct intel_crtc *intel_crtc = encoder->new_crtc; 673 struct intel_crtc *intel_crtc = encoder->new_crtc;
688 struct intel_connector *intel_connector = intel_dp->attached_connector; 674 struct intel_connector *intel_connector = intel_dp->attached_connector;
689 int lane_count, clock; 675 int lane_count, clock;
@@ -693,7 +679,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
693 static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 }; 679 static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 };
694 int target_clock, link_avail, link_clock; 680 int target_clock, link_avail, link_clock;
695 681
696 if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev) && !is_cpu_edp(intel_dp)) 682 if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev) && port != PORT_A)
697 pipe_config->has_pch_encoder = true; 683 pipe_config->has_pch_encoder = true;
698 684
699 pipe_config->has_dp_encoder = true; 685 pipe_config->has_dp_encoder = true;
@@ -827,6 +813,7 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
827 struct drm_device *dev = encoder->dev; 813 struct drm_device *dev = encoder->dev;
828 struct drm_i915_private *dev_priv = dev->dev_private; 814 struct drm_i915_private *dev_priv = dev->dev_private;
829 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 815 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
816 enum port port = dp_to_dig_port(intel_dp)->port;
830 struct drm_crtc *crtc = encoder->crtc; 817 struct drm_crtc *crtc = encoder->crtc;
831 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 818 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
832 819
@@ -867,7 +854,7 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
867 854
868 /* Split out the IBX/CPU vs CPT settings */ 855 /* Split out the IBX/CPU vs CPT settings */
869 856
870 if (is_cpu_edp(intel_dp) && IS_GEN7(dev) && !IS_VALLEYVIEW(dev)) { 857 if (port == PORT_A && IS_GEN7(dev) && !IS_VALLEYVIEW(dev)) {
871 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) 858 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
872 intel_dp->DP |= DP_SYNC_HS_HIGH; 859 intel_dp->DP |= DP_SYNC_HS_HIGH;
873 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) 860 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
@@ -884,7 +871,7 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
884 intel_dp->DP |= DP_PLL_FREQ_160MHZ; 871 intel_dp->DP |= DP_PLL_FREQ_160MHZ;
885 else 872 else
886 intel_dp->DP |= DP_PLL_FREQ_270MHZ; 873 intel_dp->DP |= DP_PLL_FREQ_270MHZ;
887 } else if (!HAS_PCH_CPT(dev) || is_cpu_edp(intel_dp)) { 874 } else if (!HAS_PCH_CPT(dev) || port == PORT_A) {
888 if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev)) 875 if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev))
889 intel_dp->DP |= intel_dp->color_range; 876 intel_dp->DP |= intel_dp->color_range;
890 877
@@ -900,7 +887,7 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
900 if (intel_crtc->pipe == 1) 887 if (intel_crtc->pipe == 1)
901 intel_dp->DP |= DP_PIPEB_SELECT; 888 intel_dp->DP |= DP_PIPEB_SELECT;
902 889
903 if (is_cpu_edp(intel_dp) && !IS_VALLEYVIEW(dev)) { 890 if (port == PORT_A && !IS_VALLEYVIEW(dev)) {
904 /* don't miss out required setting for eDP */ 891 /* don't miss out required setting for eDP */
905 if (adjusted_mode->clock < 200000) 892 if (adjusted_mode->clock < 200000)
906 intel_dp->DP |= DP_PLL_FREQ_160MHZ; 893 intel_dp->DP |= DP_PLL_FREQ_160MHZ;
@@ -911,7 +898,7 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
911 intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT; 898 intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT;
912 } 899 }
913 900
914 if (is_cpu_edp(intel_dp) && !IS_VALLEYVIEW(dev)) 901 if (port == PORT_A && !IS_VALLEYVIEW(dev))
915 ironlake_set_pll_edp(crtc, adjusted_mode->clock); 902 ironlake_set_pll_edp(crtc, adjusted_mode->clock);
916} 903}
917 904
@@ -1301,6 +1288,7 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
1301 enum pipe *pipe) 1288 enum pipe *pipe)
1302{ 1289{
1303 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); 1290 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
1291 enum port port = dp_to_dig_port(intel_dp)->port;
1304 struct drm_device *dev = encoder->base.dev; 1292 struct drm_device *dev = encoder->base.dev;
1305 struct drm_i915_private *dev_priv = dev->dev_private; 1293 struct drm_i915_private *dev_priv = dev->dev_private;
1306 u32 tmp = I915_READ(intel_dp->output_reg); 1294 u32 tmp = I915_READ(intel_dp->output_reg);
@@ -1308,9 +1296,9 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
1308 if (!(tmp & DP_PORT_EN)) 1296 if (!(tmp & DP_PORT_EN))
1309 return false; 1297 return false;
1310 1298
1311 if (is_cpu_edp(intel_dp) && IS_GEN7(dev) && !IS_VALLEYVIEW(dev)) { 1299 if (port == PORT_A && IS_GEN7(dev) && !IS_VALLEYVIEW(dev)) {
1312 *pipe = PORT_TO_PIPE_CPT(tmp); 1300 *pipe = PORT_TO_PIPE_CPT(tmp);
1313 } else if (!HAS_PCH_CPT(dev) || is_cpu_edp(intel_dp)) { 1301 } else if (!HAS_PCH_CPT(dev) || port == PORT_A) {
1314 *pipe = PORT_TO_PIPE(tmp); 1302 *pipe = PORT_TO_PIPE(tmp);
1315 } else { 1303 } else {
1316 u32 trans_sel; 1304 u32 trans_sel;
@@ -1346,9 +1334,33 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
1346 return true; 1334 return true;
1347} 1335}
1348 1336
1337static void intel_dp_get_config(struct intel_encoder *encoder,
1338 struct intel_crtc_config *pipe_config)
1339{
1340 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
1341 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1342 u32 tmp, flags = 0;
1343
1344 tmp = I915_READ(intel_dp->output_reg);
1345
1346 if (tmp & DP_SYNC_HS_HIGH)
1347 flags |= DRM_MODE_FLAG_PHSYNC;
1348 else
1349 flags |= DRM_MODE_FLAG_NHSYNC;
1350
1351 if (tmp & DP_SYNC_VS_HIGH)
1352 flags |= DRM_MODE_FLAG_PVSYNC;
1353 else
1354 flags |= DRM_MODE_FLAG_NVSYNC;
1355
1356 pipe_config->adjusted_mode.flags |= flags;
1357}
1358
1349static void intel_disable_dp(struct intel_encoder *encoder) 1359static void intel_disable_dp(struct intel_encoder *encoder)
1350{ 1360{
1351 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); 1361 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
1362 enum port port = dp_to_dig_port(intel_dp)->port;
1363 struct drm_device *dev = encoder->base.dev;
1352 1364
1353 /* Make sure the panel is off before trying to change the mode. But also 1365 /* Make sure the panel is off before trying to change the mode. But also
1354 * ensure that we have vdd while we switch off the panel. */ 1366 * ensure that we have vdd while we switch off the panel. */
@@ -1358,16 +1370,17 @@ static void intel_disable_dp(struct intel_encoder *encoder)
1358 ironlake_edp_panel_off(intel_dp); 1370 ironlake_edp_panel_off(intel_dp);
1359 1371
1360 /* cpu edp my only be disable _after_ the cpu pipe/plane is disabled. */ 1372 /* cpu edp my only be disable _after_ the cpu pipe/plane is disabled. */
1361 if (!is_cpu_edp(intel_dp)) 1373 if (!(port == PORT_A || IS_VALLEYVIEW(dev)))
1362 intel_dp_link_down(intel_dp); 1374 intel_dp_link_down(intel_dp);
1363} 1375}
1364 1376
1365static void intel_post_disable_dp(struct intel_encoder *encoder) 1377static void intel_post_disable_dp(struct intel_encoder *encoder)
1366{ 1378{
1367 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); 1379 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
1380 enum port port = dp_to_dig_port(intel_dp)->port;
1368 struct drm_device *dev = encoder->base.dev; 1381 struct drm_device *dev = encoder->base.dev;
1369 1382
1370 if (is_cpu_edp(intel_dp)) { 1383 if (port == PORT_A || IS_VALLEYVIEW(dev)) {
1371 intel_dp_link_down(intel_dp); 1384 intel_dp_link_down(intel_dp);
1372 if (!IS_VALLEYVIEW(dev)) 1385 if (!IS_VALLEYVIEW(dev))
1373 ironlake_edp_pll_off(intel_dp); 1386 ironlake_edp_pll_off(intel_dp);
@@ -1405,34 +1418,32 @@ static void intel_enable_dp(struct intel_encoder *encoder)
1405static void intel_pre_enable_dp(struct intel_encoder *encoder) 1418static void intel_pre_enable_dp(struct intel_encoder *encoder)
1406{ 1419{
1407 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); 1420 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
1421 struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
1408 struct drm_device *dev = encoder->base.dev; 1422 struct drm_device *dev = encoder->base.dev;
1409 struct drm_i915_private *dev_priv = dev->dev_private; 1423 struct drm_i915_private *dev_priv = dev->dev_private;
1410 1424
1411 if (is_cpu_edp(intel_dp) && !IS_VALLEYVIEW(dev)) 1425 if (dport->port == PORT_A && !IS_VALLEYVIEW(dev))
1412 ironlake_edp_pll_on(intel_dp); 1426 ironlake_edp_pll_on(intel_dp);
1413 1427
1414 if (IS_VALLEYVIEW(dev)) { 1428 if (IS_VALLEYVIEW(dev)) {
1415 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1416 struct intel_crtc *intel_crtc = 1429 struct intel_crtc *intel_crtc =
1417 to_intel_crtc(encoder->base.crtc); 1430 to_intel_crtc(encoder->base.crtc);
1418 int port = vlv_dport_to_channel(dport); 1431 int port = vlv_dport_to_channel(dport);
1419 int pipe = intel_crtc->pipe; 1432 int pipe = intel_crtc->pipe;
1420 u32 val; 1433 u32 val;
1421 1434
1422 WARN_ON(!mutex_is_locked(&dev_priv->dpio_lock)); 1435 val = vlv_dpio_read(dev_priv, DPIO_DATA_LANE_A(port));
1423
1424 val = intel_dpio_read(dev_priv, DPIO_DATA_LANE_A(port));
1425 val = 0; 1436 val = 0;
1426 if (pipe) 1437 if (pipe)
1427 val |= (1<<21); 1438 val |= (1<<21);
1428 else 1439 else
1429 val &= ~(1<<21); 1440 val &= ~(1<<21);
1430 val |= 0x001000c4; 1441 val |= 0x001000c4;
1431 intel_dpio_write(dev_priv, DPIO_DATA_CHANNEL(port), val); 1442 vlv_dpio_write(dev_priv, DPIO_DATA_CHANNEL(port), val);
1432 1443
1433 intel_dpio_write(dev_priv, DPIO_PCS_CLOCKBUF0(port), 1444 vlv_dpio_write(dev_priv, DPIO_PCS_CLOCKBUF0(port),
1434 0x00760018); 1445 0x00760018);
1435 intel_dpio_write(dev_priv, DPIO_PCS_CLOCKBUF8(port), 1446 vlv_dpio_write(dev_priv, DPIO_PCS_CLOCKBUF8(port),
1436 0x00400888); 1447 0x00400888);
1437 } 1448 }
1438} 1449}
@@ -1447,22 +1458,20 @@ static void intel_dp_pre_pll_enable(struct intel_encoder *encoder)
1447 if (!IS_VALLEYVIEW(dev)) 1458 if (!IS_VALLEYVIEW(dev))
1448 return; 1459 return;
1449 1460
1450 WARN_ON(!mutex_is_locked(&dev_priv->dpio_lock));
1451
1452 /* Program Tx lane resets to default */ 1461 /* Program Tx lane resets to default */
1453 intel_dpio_write(dev_priv, DPIO_PCS_TX(port), 1462 vlv_dpio_write(dev_priv, DPIO_PCS_TX(port),
1454 DPIO_PCS_TX_LANE2_RESET | 1463 DPIO_PCS_TX_LANE2_RESET |
1455 DPIO_PCS_TX_LANE1_RESET); 1464 DPIO_PCS_TX_LANE1_RESET);
1456 intel_dpio_write(dev_priv, DPIO_PCS_CLK(port), 1465 vlv_dpio_write(dev_priv, DPIO_PCS_CLK(port),
1457 DPIO_PCS_CLK_CRI_RXEB_EIOS_EN | 1466 DPIO_PCS_CLK_CRI_RXEB_EIOS_EN |
1458 DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN | 1467 DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN |
1459 (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT) | 1468 (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT) |
1460 DPIO_PCS_CLK_SOFT_RESET); 1469 DPIO_PCS_CLK_SOFT_RESET);
1461 1470
1462 /* Fix up inter-pair skew failure */ 1471 /* Fix up inter-pair skew failure */
1463 intel_dpio_write(dev_priv, DPIO_PCS_STAGGER1(port), 0x00750f00); 1472 vlv_dpio_write(dev_priv, DPIO_PCS_STAGGER1(port), 0x00750f00);
1464 intel_dpio_write(dev_priv, DPIO_TX_CTL(port), 0x00001500); 1473 vlv_dpio_write(dev_priv, DPIO_TX_CTL(port), 0x00001500);
1465 intel_dpio_write(dev_priv, DPIO_TX_LANE(port), 0x40400000); 1474 vlv_dpio_write(dev_priv, DPIO_TX_LANE(port), 0x40400000);
1466} 1475}
1467 1476
1468/* 1477/*
@@ -1524,12 +1533,13 @@ static uint8_t
1524intel_dp_voltage_max(struct intel_dp *intel_dp) 1533intel_dp_voltage_max(struct intel_dp *intel_dp)
1525{ 1534{
1526 struct drm_device *dev = intel_dp_to_dev(intel_dp); 1535 struct drm_device *dev = intel_dp_to_dev(intel_dp);
1536 enum port port = dp_to_dig_port(intel_dp)->port;
1527 1537
1528 if (IS_VALLEYVIEW(dev)) 1538 if (IS_VALLEYVIEW(dev))
1529 return DP_TRAIN_VOLTAGE_SWING_1200; 1539 return DP_TRAIN_VOLTAGE_SWING_1200;
1530 else if (IS_GEN7(dev) && is_cpu_edp(intel_dp)) 1540 else if (IS_GEN7(dev) && port == PORT_A)
1531 return DP_TRAIN_VOLTAGE_SWING_800; 1541 return DP_TRAIN_VOLTAGE_SWING_800;
1532 else if (HAS_PCH_CPT(dev) && !is_cpu_edp(intel_dp)) 1542 else if (HAS_PCH_CPT(dev) && port != PORT_A)
1533 return DP_TRAIN_VOLTAGE_SWING_1200; 1543 return DP_TRAIN_VOLTAGE_SWING_1200;
1534 else 1544 else
1535 return DP_TRAIN_VOLTAGE_SWING_800; 1545 return DP_TRAIN_VOLTAGE_SWING_800;
@@ -1539,6 +1549,7 @@ static uint8_t
1539intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing) 1549intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing)
1540{ 1550{
1541 struct drm_device *dev = intel_dp_to_dev(intel_dp); 1551 struct drm_device *dev = intel_dp_to_dev(intel_dp);
1552 enum port port = dp_to_dig_port(intel_dp)->port;
1542 1553
1543 if (HAS_DDI(dev)) { 1554 if (HAS_DDI(dev)) {
1544 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) { 1555 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
@@ -1564,7 +1575,7 @@ intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing)
1564 default: 1575 default:
1565 return DP_TRAIN_PRE_EMPHASIS_0; 1576 return DP_TRAIN_PRE_EMPHASIS_0;
1566 } 1577 }
1567 } else if (IS_GEN7(dev) && is_cpu_edp(intel_dp)) { 1578 } else if (IS_GEN7(dev) && port == PORT_A) {
1568 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) { 1579 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
1569 case DP_TRAIN_VOLTAGE_SWING_400: 1580 case DP_TRAIN_VOLTAGE_SWING_400:
1570 return DP_TRAIN_PRE_EMPHASIS_6; 1581 return DP_TRAIN_PRE_EMPHASIS_6;
@@ -1599,8 +1610,6 @@ static uint32_t intel_vlv_signal_levels(struct intel_dp *intel_dp)
1599 uint8_t train_set = intel_dp->train_set[0]; 1610 uint8_t train_set = intel_dp->train_set[0];
1600 int port = vlv_dport_to_channel(dport); 1611 int port = vlv_dport_to_channel(dport);
1601 1612
1602 WARN_ON(!mutex_is_locked(&dev_priv->dpio_lock));
1603
1604 switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) { 1613 switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) {
1605 case DP_TRAIN_PRE_EMPHASIS_0: 1614 case DP_TRAIN_PRE_EMPHASIS_0:
1606 preemph_reg_value = 0x0004000; 1615 preemph_reg_value = 0x0004000;
@@ -1674,14 +1683,14 @@ static uint32_t intel_vlv_signal_levels(struct intel_dp *intel_dp)
1674 return 0; 1683 return 0;
1675 } 1684 }
1676 1685
1677 intel_dpio_write(dev_priv, DPIO_TX_OCALINIT(port), 0x00000000); 1686 vlv_dpio_write(dev_priv, DPIO_TX_OCALINIT(port), 0x00000000);
1678 intel_dpio_write(dev_priv, DPIO_TX_SWING_CTL4(port), demph_reg_value); 1687 vlv_dpio_write(dev_priv, DPIO_TX_SWING_CTL4(port), demph_reg_value);
1679 intel_dpio_write(dev_priv, DPIO_TX_SWING_CTL2(port), 1688 vlv_dpio_write(dev_priv, DPIO_TX_SWING_CTL2(port),
1680 uniqtranscale_reg_value); 1689 uniqtranscale_reg_value);
1681 intel_dpio_write(dev_priv, DPIO_TX_SWING_CTL3(port), 0x0C782040); 1690 vlv_dpio_write(dev_priv, DPIO_TX_SWING_CTL3(port), 0x0C782040);
1682 intel_dpio_write(dev_priv, DPIO_PCS_STAGGER0(port), 0x00030000); 1691 vlv_dpio_write(dev_priv, DPIO_PCS_STAGGER0(port), 0x00030000);
1683 intel_dpio_write(dev_priv, DPIO_PCS_CTL_OVER1(port), preemph_reg_value); 1692 vlv_dpio_write(dev_priv, DPIO_PCS_CTL_OVER1(port), preemph_reg_value);
1684 intel_dpio_write(dev_priv, DPIO_TX_OCALINIT(port), 0x80000000); 1693 vlv_dpio_write(dev_priv, DPIO_TX_OCALINIT(port), 0x80000000);
1685 1694
1686 return 0; 1695 return 0;
1687} 1696}
@@ -1853,6 +1862,7 @@ static void
1853intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP) 1862intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP)
1854{ 1863{
1855 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 1864 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1865 enum port port = intel_dig_port->port;
1856 struct drm_device *dev = intel_dig_port->base.base.dev; 1866 struct drm_device *dev = intel_dig_port->base.base.dev;
1857 uint32_t signal_levels, mask; 1867 uint32_t signal_levels, mask;
1858 uint8_t train_set = intel_dp->train_set[0]; 1868 uint8_t train_set = intel_dp->train_set[0];
@@ -1863,10 +1873,10 @@ intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP)
1863 } else if (IS_VALLEYVIEW(dev)) { 1873 } else if (IS_VALLEYVIEW(dev)) {
1864 signal_levels = intel_vlv_signal_levels(intel_dp); 1874 signal_levels = intel_vlv_signal_levels(intel_dp);
1865 mask = 0; 1875 mask = 0;
1866 } else if (IS_GEN7(dev) && is_cpu_edp(intel_dp)) { 1876 } else if (IS_GEN7(dev) && port == PORT_A) {
1867 signal_levels = intel_gen7_edp_signal_levels(train_set); 1877 signal_levels = intel_gen7_edp_signal_levels(train_set);
1868 mask = EDP_LINK_TRAIN_VOL_EMP_MASK_IVB; 1878 mask = EDP_LINK_TRAIN_VOL_EMP_MASK_IVB;
1869 } else if (IS_GEN6(dev) && is_cpu_edp(intel_dp)) { 1879 } else if (IS_GEN6(dev) && port == PORT_A) {
1870 signal_levels = intel_gen6_edp_signal_levels(train_set); 1880 signal_levels = intel_gen6_edp_signal_levels(train_set);
1871 mask = EDP_LINK_TRAIN_VOL_EMP_MASK_SNB; 1881 mask = EDP_LINK_TRAIN_VOL_EMP_MASK_SNB;
1872 } else { 1882 } else {
@@ -1916,8 +1926,7 @@ intel_dp_set_link_train(struct intel_dp *intel_dp,
1916 } 1926 }
1917 I915_WRITE(DP_TP_CTL(port), temp); 1927 I915_WRITE(DP_TP_CTL(port), temp);
1918 1928
1919 } else if (HAS_PCH_CPT(dev) && 1929 } else if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || port != PORT_A)) {
1920 (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) {
1921 dp_reg_value &= ~DP_LINK_TRAIN_MASK_CPT; 1930 dp_reg_value &= ~DP_LINK_TRAIN_MASK_CPT;
1922 1931
1923 switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) { 1932 switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {
@@ -2168,6 +2177,7 @@ static void
2168intel_dp_link_down(struct intel_dp *intel_dp) 2177intel_dp_link_down(struct intel_dp *intel_dp)
2169{ 2178{
2170 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 2179 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2180 enum port port = intel_dig_port->port;
2171 struct drm_device *dev = intel_dig_port->base.base.dev; 2181 struct drm_device *dev = intel_dig_port->base.base.dev;
2172 struct drm_i915_private *dev_priv = dev->dev_private; 2182 struct drm_i915_private *dev_priv = dev->dev_private;
2173 struct intel_crtc *intel_crtc = 2183 struct intel_crtc *intel_crtc =
@@ -2197,7 +2207,7 @@ intel_dp_link_down(struct intel_dp *intel_dp)
2197 2207
2198 DRM_DEBUG_KMS("\n"); 2208 DRM_DEBUG_KMS("\n");
2199 2209
2200 if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) { 2210 if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || port != PORT_A)) {
2201 DP &= ~DP_LINK_TRAIN_MASK_CPT; 2211 DP &= ~DP_LINK_TRAIN_MASK_CPT;
2202 I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE_CPT); 2212 I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE_CPT);
2203 } else { 2213 } else {
@@ -2488,11 +2498,10 @@ intel_dp_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
2488 return NULL; 2498 return NULL;
2489 2499
2490 size = (intel_connector->edid->extensions + 1) * EDID_LENGTH; 2500 size = (intel_connector->edid->extensions + 1) * EDID_LENGTH;
2491 edid = kmalloc(size, GFP_KERNEL); 2501 edid = kmemdup(intel_connector->edid, size, GFP_KERNEL);
2492 if (!edid) 2502 if (!edid)
2493 return NULL; 2503 return NULL;
2494 2504
2495 memcpy(edid, intel_connector->edid, size);
2496 return edid; 2505 return edid;
2497 } 2506 }
2498 2507
@@ -2925,9 +2934,6 @@ intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev,
2925 pp_div_reg = PIPEA_PP_DIVISOR; 2934 pp_div_reg = PIPEA_PP_DIVISOR;
2926 } 2935 }
2927 2936
2928 if (IS_VALLEYVIEW(dev))
2929 port_sel = I915_READ(pp_on_reg) & 0xc0000000;
2930
2931 /* And finally store the new values in the power sequencer. */ 2937 /* And finally store the new values in the power sequencer. */
2932 pp_on = (seq->t1_t3 << PANEL_POWER_UP_DELAY_SHIFT) | 2938 pp_on = (seq->t1_t3 << PANEL_POWER_UP_DELAY_SHIFT) |
2933 (seq->t8 << PANEL_LIGHT_ON_DELAY_SHIFT); 2939 (seq->t8 << PANEL_LIGHT_ON_DELAY_SHIFT);
@@ -2941,8 +2947,10 @@ intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev,
2941 2947
2942 /* Haswell doesn't have any port selection bits for the panel 2948 /* Haswell doesn't have any port selection bits for the panel
2943 * power sequencer any more. */ 2949 * power sequencer any more. */
2944 if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)) { 2950 if (IS_VALLEYVIEW(dev)) {
2945 if (is_cpu_edp(intel_dp)) 2951 port_sel = I915_READ(pp_on_reg) & 0xc0000000;
2952 } else if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)) {
2953 if (dp_to_dig_port(intel_dp)->port == PORT_A)
2946 port_sel = PANEL_POWER_PORT_DP_A; 2954 port_sel = PANEL_POWER_PORT_DP_A;
2947 else 2955 else
2948 port_sel = PANEL_POWER_PORT_DP_D; 2956 port_sel = PANEL_POWER_PORT_DP_D;
@@ -3184,6 +3192,7 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
3184 intel_encoder->disable = intel_disable_dp; 3192 intel_encoder->disable = intel_disable_dp;
3185 intel_encoder->post_disable = intel_post_disable_dp; 3193 intel_encoder->post_disable = intel_post_disable_dp;
3186 intel_encoder->get_hw_state = intel_dp_get_hw_state; 3194 intel_encoder->get_hw_state = intel_dp_get_hw_state;
3195 intel_encoder->get_config = intel_dp_get_config;
3187 if (IS_VALLEYVIEW(dev)) 3196 if (IS_VALLEYVIEW(dev))
3188 intel_encoder->pre_pll_enable = intel_dp_pre_pll_enable; 3197 intel_encoder->pre_pll_enable = intel_dp_pre_pll_enable;
3189 3198