diff options
author | Dave Airlie <airlied@redhat.com> | 2013-06-10 18:38:56 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2013-06-10 18:38:56 -0400 |
commit | e6dfcc5303d5d31cb36e36405acd766c8ed2c923 (patch) | |
tree | 986beb9aba4a62ea1449dde210005e82084e8c5e /drivers/gpu/drm/i915/intel_dp.c | |
parent | 9bc3cd5673d84d29272fa7181a4dfca83cbb48c1 (diff) | |
parent | 92d44621ad2d083bc03920c904ca0a5eb10d9ded (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.c | 145 |
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 | */ | ||
68 | static 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 | |||
78 | static struct intel_dp *intel_attached_dp(struct drm_connector *connector) | 62 | static 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 | ||
1337 | static 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 | |||
1349 | static void intel_disable_dp(struct intel_encoder *encoder) | 1359 | static 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 | ||
1365 | static void intel_post_disable_dp(struct intel_encoder *encoder) | 1377 | static 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) | |||
1405 | static void intel_pre_enable_dp(struct intel_encoder *encoder) | 1418 | static 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 | |||
1524 | intel_dp_voltage_max(struct intel_dp *intel_dp) | 1533 | intel_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 | |||
1539 | intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing) | 1549 | intel_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 | |||
1853 | intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP) | 1862 | intel_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 | |||
2168 | intel_dp_link_down(struct intel_dp *intel_dp) | 2177 | intel_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 | ||