diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 258 |
1 files changed, 112 insertions, 146 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 3c2293bd24bf..9df331b3305b 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -213,6 +213,81 @@ intel_dp_downstream_max_dotclock(struct intel_dp *intel_dp) | |||
213 | return max_dotclk; | 213 | return max_dotclk; |
214 | } | 214 | } |
215 | 215 | ||
216 | static int | ||
217 | intel_dp_sink_rates(struct intel_dp *intel_dp, const int **sink_rates) | ||
218 | { | ||
219 | if (intel_dp->num_sink_rates) { | ||
220 | *sink_rates = intel_dp->sink_rates; | ||
221 | return intel_dp->num_sink_rates; | ||
222 | } | ||
223 | |||
224 | *sink_rates = default_rates; | ||
225 | |||
226 | return (intel_dp_max_link_bw(intel_dp) >> 3) + 1; | ||
227 | } | ||
228 | |||
229 | static int | ||
230 | intel_dp_source_rates(struct intel_dp *intel_dp, const int **source_rates) | ||
231 | { | ||
232 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | ||
233 | struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); | ||
234 | int size; | ||
235 | |||
236 | if (IS_BROXTON(dev_priv)) { | ||
237 | *source_rates = bxt_rates; | ||
238 | size = ARRAY_SIZE(bxt_rates); | ||
239 | } else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) { | ||
240 | *source_rates = skl_rates; | ||
241 | size = ARRAY_SIZE(skl_rates); | ||
242 | } else { | ||
243 | *source_rates = default_rates; | ||
244 | size = ARRAY_SIZE(default_rates); | ||
245 | } | ||
246 | |||
247 | /* This depends on the fact that 5.4 is last value in the array */ | ||
248 | if (!intel_dp_source_supports_hbr2(intel_dp)) | ||
249 | size--; | ||
250 | |||
251 | return size; | ||
252 | } | ||
253 | |||
254 | static int intersect_rates(const int *source_rates, int source_len, | ||
255 | const int *sink_rates, int sink_len, | ||
256 | int *common_rates) | ||
257 | { | ||
258 | int i = 0, j = 0, k = 0; | ||
259 | |||
260 | while (i < source_len && j < sink_len) { | ||
261 | if (source_rates[i] == sink_rates[j]) { | ||
262 | if (WARN_ON(k >= DP_MAX_SUPPORTED_RATES)) | ||
263 | return k; | ||
264 | common_rates[k] = source_rates[i]; | ||
265 | ++k; | ||
266 | ++i; | ||
267 | ++j; | ||
268 | } else if (source_rates[i] < sink_rates[j]) { | ||
269 | ++i; | ||
270 | } else { | ||
271 | ++j; | ||
272 | } | ||
273 | } | ||
274 | return k; | ||
275 | } | ||
276 | |||
277 | static int intel_dp_common_rates(struct intel_dp *intel_dp, | ||
278 | int *common_rates) | ||
279 | { | ||
280 | const int *source_rates, *sink_rates; | ||
281 | int source_len, sink_len; | ||
282 | |||
283 | sink_len = intel_dp_sink_rates(intel_dp, &sink_rates); | ||
284 | source_len = intel_dp_source_rates(intel_dp, &source_rates); | ||
285 | |||
286 | return intersect_rates(source_rates, source_len, | ||
287 | sink_rates, sink_len, | ||
288 | common_rates); | ||
289 | } | ||
290 | |||
216 | static enum drm_mode_status | 291 | static enum drm_mode_status |
217 | intel_dp_mode_valid(struct drm_connector *connector, | 292 | intel_dp_mode_valid(struct drm_connector *connector, |
218 | struct drm_display_mode *mode) | 293 | struct drm_display_mode *mode) |
@@ -320,8 +395,7 @@ static void | |||
320 | vlv_power_sequencer_kick(struct intel_dp *intel_dp) | 395 | vlv_power_sequencer_kick(struct intel_dp *intel_dp) |
321 | { | 396 | { |
322 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 397 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
323 | struct drm_device *dev = intel_dig_port->base.base.dev; | 398 | struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev); |
324 | struct drm_i915_private *dev_priv = to_i915(dev); | ||
325 | enum pipe pipe = intel_dp->pps_pipe; | 399 | enum pipe pipe = intel_dp->pps_pipe; |
326 | bool pll_enabled, release_cl_override = false; | 400 | bool pll_enabled, release_cl_override = false; |
327 | enum dpio_phy phy = DPIO_PHY(pipe); | 401 | enum dpio_phy phy = DPIO_PHY(pipe); |
@@ -359,7 +433,7 @@ vlv_power_sequencer_kick(struct intel_dp *intel_dp) | |||
359 | release_cl_override = IS_CHERRYVIEW(dev_priv) && | 433 | release_cl_override = IS_CHERRYVIEW(dev_priv) && |
360 | !chv_phy_powergate_ch(dev_priv, phy, ch, true); | 434 | !chv_phy_powergate_ch(dev_priv, phy, ch, true); |
361 | 435 | ||
362 | if (vlv_force_pll_on(dev, pipe, IS_CHERRYVIEW(dev_priv) ? | 436 | if (vlv_force_pll_on(dev_priv, pipe, IS_CHERRYVIEW(dev_priv) ? |
363 | &chv_dpll[0].dpll : &vlv_dpll[0].dpll)) { | 437 | &chv_dpll[0].dpll : &vlv_dpll[0].dpll)) { |
364 | DRM_ERROR("Failed to force on pll for pipe %c!\n", | 438 | DRM_ERROR("Failed to force on pll for pipe %c!\n", |
365 | pipe_name(pipe)); | 439 | pipe_name(pipe)); |
@@ -383,7 +457,7 @@ vlv_power_sequencer_kick(struct intel_dp *intel_dp) | |||
383 | POSTING_READ(intel_dp->output_reg); | 457 | POSTING_READ(intel_dp->output_reg); |
384 | 458 | ||
385 | if (!pll_enabled) { | 459 | if (!pll_enabled) { |
386 | vlv_force_pll_off(dev, pipe); | 460 | vlv_force_pll_off(dev_priv, pipe); |
387 | 461 | ||
388 | if (release_cl_override) | 462 | if (release_cl_override) |
389 | chv_phy_powergate_ch(dev_priv, phy, ch, false); | 463 | chv_phy_powergate_ch(dev_priv, phy, ch, false); |
@@ -1291,19 +1365,6 @@ intel_dp_aux_init(struct intel_dp *intel_dp) | |||
1291 | intel_dp->aux.transfer = intel_dp_aux_transfer; | 1365 | intel_dp->aux.transfer = intel_dp_aux_transfer; |
1292 | } | 1366 | } |
1293 | 1367 | ||
1294 | static int | ||
1295 | intel_dp_sink_rates(struct intel_dp *intel_dp, const int **sink_rates) | ||
1296 | { | ||
1297 | if (intel_dp->num_sink_rates) { | ||
1298 | *sink_rates = intel_dp->sink_rates; | ||
1299 | return intel_dp->num_sink_rates; | ||
1300 | } | ||
1301 | |||
1302 | *sink_rates = default_rates; | ||
1303 | |||
1304 | return (intel_dp_max_link_bw(intel_dp) >> 3) + 1; | ||
1305 | } | ||
1306 | |||
1307 | bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp) | 1368 | bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp) |
1308 | { | 1369 | { |
1309 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 1370 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
@@ -1316,31 +1377,6 @@ bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp) | |||
1316 | return false; | 1377 | return false; |
1317 | } | 1378 | } |
1318 | 1379 | ||
1319 | static int | ||
1320 | intel_dp_source_rates(struct intel_dp *intel_dp, const int **source_rates) | ||
1321 | { | ||
1322 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | ||
1323 | struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); | ||
1324 | int size; | ||
1325 | |||
1326 | if (IS_BROXTON(dev_priv)) { | ||
1327 | *source_rates = bxt_rates; | ||
1328 | size = ARRAY_SIZE(bxt_rates); | ||
1329 | } else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) { | ||
1330 | *source_rates = skl_rates; | ||
1331 | size = ARRAY_SIZE(skl_rates); | ||
1332 | } else { | ||
1333 | *source_rates = default_rates; | ||
1334 | size = ARRAY_SIZE(default_rates); | ||
1335 | } | ||
1336 | |||
1337 | /* This depends on the fact that 5.4 is last value in the array */ | ||
1338 | if (!intel_dp_source_supports_hbr2(intel_dp)) | ||
1339 | size--; | ||
1340 | |||
1341 | return size; | ||
1342 | } | ||
1343 | |||
1344 | static void | 1380 | static void |
1345 | intel_dp_set_clock(struct intel_encoder *encoder, | 1381 | intel_dp_set_clock(struct intel_encoder *encoder, |
1346 | struct intel_crtc_state *pipe_config) | 1382 | struct intel_crtc_state *pipe_config) |
@@ -1375,43 +1411,6 @@ intel_dp_set_clock(struct intel_encoder *encoder, | |||
1375 | } | 1411 | } |
1376 | } | 1412 | } |
1377 | 1413 | ||
1378 | static int intersect_rates(const int *source_rates, int source_len, | ||
1379 | const int *sink_rates, int sink_len, | ||
1380 | int *common_rates) | ||
1381 | { | ||
1382 | int i = 0, j = 0, k = 0; | ||
1383 | |||
1384 | while (i < source_len && j < sink_len) { | ||
1385 | if (source_rates[i] == sink_rates[j]) { | ||
1386 | if (WARN_ON(k >= DP_MAX_SUPPORTED_RATES)) | ||
1387 | return k; | ||
1388 | common_rates[k] = source_rates[i]; | ||
1389 | ++k; | ||
1390 | ++i; | ||
1391 | ++j; | ||
1392 | } else if (source_rates[i] < sink_rates[j]) { | ||
1393 | ++i; | ||
1394 | } else { | ||
1395 | ++j; | ||
1396 | } | ||
1397 | } | ||
1398 | return k; | ||
1399 | } | ||
1400 | |||
1401 | static int intel_dp_common_rates(struct intel_dp *intel_dp, | ||
1402 | int *common_rates) | ||
1403 | { | ||
1404 | const int *source_rates, *sink_rates; | ||
1405 | int source_len, sink_len; | ||
1406 | |||
1407 | sink_len = intel_dp_sink_rates(intel_dp, &sink_rates); | ||
1408 | source_len = intel_dp_source_rates(intel_dp, &source_rates); | ||
1409 | |||
1410 | return intersect_rates(source_rates, source_len, | ||
1411 | sink_rates, sink_len, | ||
1412 | common_rates); | ||
1413 | } | ||
1414 | |||
1415 | static void snprintf_int_array(char *str, size_t len, | 1414 | static void snprintf_int_array(char *str, size_t len, |
1416 | const int *array, int nelem) | 1415 | const int *array, int nelem) |
1417 | { | 1416 | { |
@@ -1451,40 +1450,35 @@ static void intel_dp_print_rates(struct intel_dp *intel_dp) | |||
1451 | DRM_DEBUG_KMS("common rates: %s\n", str); | 1450 | DRM_DEBUG_KMS("common rates: %s\n", str); |
1452 | } | 1451 | } |
1453 | 1452 | ||
1454 | static void intel_dp_print_hw_revision(struct intel_dp *intel_dp) | 1453 | bool |
1454 | __intel_dp_read_desc(struct intel_dp *intel_dp, struct intel_dp_desc *desc) | ||
1455 | { | 1455 | { |
1456 | uint8_t rev; | 1456 | u32 base = drm_dp_is_branch(intel_dp->dpcd) ? DP_BRANCH_OUI : |
1457 | int len; | 1457 | DP_SINK_OUI; |
1458 | |||
1459 | if ((drm_debug & DRM_UT_KMS) == 0) | ||
1460 | return; | ||
1461 | 1458 | ||
1462 | if (!drm_dp_is_branch(intel_dp->dpcd)) | 1459 | return drm_dp_dpcd_read(&intel_dp->aux, base, desc, sizeof(*desc)) == |
1463 | return; | 1460 | sizeof(*desc); |
1464 | |||
1465 | len = drm_dp_dpcd_read(&intel_dp->aux, DP_BRANCH_HW_REV, &rev, 1); | ||
1466 | if (len < 0) | ||
1467 | return; | ||
1468 | |||
1469 | DRM_DEBUG_KMS("sink hw revision: %d.%d\n", (rev & 0xf0) >> 4, rev & 0xf); | ||
1470 | } | 1461 | } |
1471 | 1462 | ||
1472 | static void intel_dp_print_sw_revision(struct intel_dp *intel_dp) | 1463 | bool intel_dp_read_desc(struct intel_dp *intel_dp) |
1473 | { | 1464 | { |
1474 | uint8_t rev[2]; | 1465 | struct intel_dp_desc *desc = &intel_dp->desc; |
1475 | int len; | 1466 | bool oui_sup = intel_dp->dpcd[DP_DOWN_STREAM_PORT_COUNT] & |
1467 | DP_OUI_SUPPORT; | ||
1468 | int dev_id_len; | ||
1476 | 1469 | ||
1477 | if ((drm_debug & DRM_UT_KMS) == 0) | 1470 | if (!__intel_dp_read_desc(intel_dp, desc)) |
1478 | return; | 1471 | return false; |
1479 | |||
1480 | if (!drm_dp_is_branch(intel_dp->dpcd)) | ||
1481 | return; | ||
1482 | 1472 | ||
1483 | len = drm_dp_dpcd_read(&intel_dp->aux, DP_BRANCH_SW_REV, &rev, 2); | 1473 | dev_id_len = strnlen(desc->device_id, sizeof(desc->device_id)); |
1484 | if (len < 0) | 1474 | DRM_DEBUG_KMS("DP %s: OUI %*phD%s dev-ID %*pE HW-rev %d.%d SW-rev %d.%d\n", |
1485 | return; | 1475 | drm_dp_is_branch(intel_dp->dpcd) ? "branch" : "sink", |
1476 | (int)sizeof(desc->oui), desc->oui, oui_sup ? "" : "(NS)", | ||
1477 | dev_id_len, desc->device_id, | ||
1478 | desc->hw_rev >> 4, desc->hw_rev & 0xf, | ||
1479 | desc->sw_major_rev, desc->sw_minor_rev); | ||
1486 | 1480 | ||
1487 | DRM_DEBUG_KMS("sink sw revision: %d.%d\n", rev[0], rev[1]); | 1481 | return true; |
1488 | } | 1482 | } |
1489 | 1483 | ||
1490 | static int rate_to_index(int find, const int *rates) | 1484 | static int rate_to_index(int find, const int *rates) |
@@ -2369,7 +2363,7 @@ static void ironlake_edp_pll_on(struct intel_dp *intel_dp, | |||
2369 | * 2. Program DP PLL enable | 2363 | * 2. Program DP PLL enable |
2370 | */ | 2364 | */ |
2371 | if (IS_GEN5(dev_priv)) | 2365 | if (IS_GEN5(dev_priv)) |
2372 | intel_wait_for_vblank_if_active(&dev_priv->drm, !crtc->pipe); | 2366 | intel_wait_for_vblank_if_active(dev_priv, !crtc->pipe); |
2373 | 2367 | ||
2374 | intel_dp->DP |= DP_PLL_ENABLE; | 2368 | intel_dp->DP |= DP_PLL_ENABLE; |
2375 | 2369 | ||
@@ -3492,7 +3486,7 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
3492 | I915_WRITE(intel_dp->output_reg, DP); | 3486 | I915_WRITE(intel_dp->output_reg, DP); |
3493 | POSTING_READ(intel_dp->output_reg); | 3487 | POSTING_READ(intel_dp->output_reg); |
3494 | 3488 | ||
3495 | intel_wait_for_vblank_if_active(&dev_priv->drm, PIPE_A); | 3489 | intel_wait_for_vblank_if_active(dev_priv, PIPE_A); |
3496 | intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true); | 3490 | intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true); |
3497 | intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true); | 3491 | intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true); |
3498 | } | 3492 | } |
@@ -3502,7 +3496,7 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
3502 | intel_dp->DP = DP; | 3496 | intel_dp->DP = DP; |
3503 | } | 3497 | } |
3504 | 3498 | ||
3505 | static bool | 3499 | bool |
3506 | intel_dp_read_dpcd(struct intel_dp *intel_dp) | 3500 | intel_dp_read_dpcd(struct intel_dp *intel_dp) |
3507 | { | 3501 | { |
3508 | if (drm_dp_dpcd_read(&intel_dp->aux, 0x000, intel_dp->dpcd, | 3502 | if (drm_dp_dpcd_read(&intel_dp->aux, 0x000, intel_dp->dpcd, |
@@ -3526,6 +3520,8 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp) | |||
3526 | if (!intel_dp_read_dpcd(intel_dp)) | 3520 | if (!intel_dp_read_dpcd(intel_dp)) |
3527 | return false; | 3521 | return false; |
3528 | 3522 | ||
3523 | intel_dp_read_desc(intel_dp); | ||
3524 | |||
3529 | if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11) | 3525 | if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11) |
3530 | dev_priv->no_aux_handshake = intel_dp->dpcd[DP_MAX_DOWNSPREAD] & | 3526 | dev_priv->no_aux_handshake = intel_dp->dpcd[DP_MAX_DOWNSPREAD] & |
3531 | DP_NO_AUX_HANDSHAKE_LINK_TRAINING; | 3527 | DP_NO_AUX_HANDSHAKE_LINK_TRAINING; |
@@ -3627,23 +3623,6 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp) | |||
3627 | return true; | 3623 | return true; |
3628 | } | 3624 | } |
3629 | 3625 | ||
3630 | static void | ||
3631 | intel_dp_probe_oui(struct intel_dp *intel_dp) | ||
3632 | { | ||
3633 | u8 buf[3]; | ||
3634 | |||
3635 | if (!(intel_dp->dpcd[DP_DOWN_STREAM_PORT_COUNT] & DP_OUI_SUPPORT)) | ||
3636 | return; | ||
3637 | |||
3638 | if (drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_OUI, buf, 3) == 3) | ||
3639 | DRM_DEBUG_KMS("Sink OUI: %02hx%02hx%02hx\n", | ||
3640 | buf[0], buf[1], buf[2]); | ||
3641 | |||
3642 | if (drm_dp_dpcd_read(&intel_dp->aux, DP_BRANCH_OUI, buf, 3) == 3) | ||
3643 | DRM_DEBUG_KMS("Branch OUI: %02hx%02hx%02hx\n", | ||
3644 | buf[0], buf[1], buf[2]); | ||
3645 | } | ||
3646 | |||
3647 | static bool | 3626 | static bool |
3648 | intel_dp_can_mst(struct intel_dp *intel_dp) | 3627 | intel_dp_can_mst(struct intel_dp *intel_dp) |
3649 | { | 3628 | { |
@@ -3687,7 +3666,7 @@ intel_dp_configure_mst(struct intel_dp *intel_dp) | |||
3687 | static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp) | 3666 | static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp) |
3688 | { | 3667 | { |
3689 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 3668 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
3690 | struct drm_device *dev = dig_port->base.base.dev; | 3669 | struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); |
3691 | struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc); | 3670 | struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc); |
3692 | u8 buf; | 3671 | u8 buf; |
3693 | int ret = 0; | 3672 | int ret = 0; |
@@ -3708,7 +3687,7 @@ static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp) | |||
3708 | } | 3687 | } |
3709 | 3688 | ||
3710 | do { | 3689 | do { |
3711 | intel_wait_for_vblank(dev, intel_crtc->pipe); | 3690 | intel_wait_for_vblank(dev_priv, intel_crtc->pipe); |
3712 | 3691 | ||
3713 | if (drm_dp_dpcd_readb(&intel_dp->aux, | 3692 | if (drm_dp_dpcd_readb(&intel_dp->aux, |
3714 | DP_TEST_SINK_MISC, &buf) < 0) { | 3693 | DP_TEST_SINK_MISC, &buf) < 0) { |
@@ -3731,7 +3710,7 @@ static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp) | |||
3731 | static int intel_dp_sink_crc_start(struct intel_dp *intel_dp) | 3710 | static int intel_dp_sink_crc_start(struct intel_dp *intel_dp) |
3732 | { | 3711 | { |
3733 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 3712 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
3734 | struct drm_device *dev = dig_port->base.base.dev; | 3713 | struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); |
3735 | struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc); | 3714 | struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc); |
3736 | u8 buf; | 3715 | u8 buf; |
3737 | int ret; | 3716 | int ret; |
@@ -3759,14 +3738,14 @@ static int intel_dp_sink_crc_start(struct intel_dp *intel_dp) | |||
3759 | return -EIO; | 3738 | return -EIO; |
3760 | } | 3739 | } |
3761 | 3740 | ||
3762 | intel_wait_for_vblank(dev, intel_crtc->pipe); | 3741 | intel_wait_for_vblank(dev_priv, intel_crtc->pipe); |
3763 | return 0; | 3742 | return 0; |
3764 | } | 3743 | } |
3765 | 3744 | ||
3766 | int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc) | 3745 | int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc) |
3767 | { | 3746 | { |
3768 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 3747 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
3769 | struct drm_device *dev = dig_port->base.base.dev; | 3748 | struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); |
3770 | struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc); | 3749 | struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc); |
3771 | u8 buf; | 3750 | u8 buf; |
3772 | int count, ret; | 3751 | int count, ret; |
@@ -3777,7 +3756,7 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc) | |||
3777 | return ret; | 3756 | return ret; |
3778 | 3757 | ||
3779 | do { | 3758 | do { |
3780 | intel_wait_for_vblank(dev, intel_crtc->pipe); | 3759 | intel_wait_for_vblank(dev_priv, intel_crtc->pipe); |
3781 | 3760 | ||
3782 | if (drm_dp_dpcd_readb(&intel_dp->aux, | 3761 | if (drm_dp_dpcd_readb(&intel_dp->aux, |
3783 | DP_TEST_SINK_MISC, &buf) < 0) { | 3762 | DP_TEST_SINK_MISC, &buf) < 0) { |
@@ -4010,7 +3989,7 @@ intel_dp_retrain_link(struct intel_dp *intel_dp) | |||
4010 | intel_dp_stop_link_train(intel_dp); | 3989 | intel_dp_stop_link_train(intel_dp); |
4011 | 3990 | ||
4012 | /* Keep underrun reporting disabled until things are stable */ | 3991 | /* Keep underrun reporting disabled until things are stable */ |
4013 | intel_wait_for_vblank(&dev_priv->drm, crtc->pipe); | 3992 | intel_wait_for_vblank(dev_priv, crtc->pipe); |
4014 | 3993 | ||
4015 | intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true); | 3994 | intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true); |
4016 | if (crtc->config->has_pch_encoder) | 3995 | if (crtc->config->has_pch_encoder) |
@@ -4422,10 +4401,7 @@ intel_dp_long_pulse(struct intel_connector *intel_connector) | |||
4422 | 4401 | ||
4423 | intel_dp_print_rates(intel_dp); | 4402 | intel_dp_print_rates(intel_dp); |
4424 | 4403 | ||
4425 | intel_dp_probe_oui(intel_dp); | 4404 | intel_dp_read_desc(intel_dp); |
4426 | |||
4427 | intel_dp_print_hw_revision(intel_dp); | ||
4428 | intel_dp_print_sw_revision(intel_dp); | ||
4429 | 4405 | ||
4430 | intel_dp_configure_mst(intel_dp); | 4406 | intel_dp_configure_mst(intel_dp); |
4431 | 4407 | ||
@@ -4489,21 +4465,11 @@ static enum drm_connector_status | |||
4489 | intel_dp_detect(struct drm_connector *connector, bool force) | 4465 | intel_dp_detect(struct drm_connector *connector, bool force) |
4490 | { | 4466 | { |
4491 | struct intel_dp *intel_dp = intel_attached_dp(connector); | 4467 | struct intel_dp *intel_dp = intel_attached_dp(connector); |
4492 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | ||
4493 | struct intel_encoder *intel_encoder = &intel_dig_port->base; | ||
4494 | enum drm_connector_status status = connector->status; | 4468 | enum drm_connector_status status = connector->status; |
4495 | 4469 | ||
4496 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", | 4470 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", |
4497 | connector->base.id, connector->name); | 4471 | connector->base.id, connector->name); |
4498 | 4472 | ||
4499 | if (intel_dp->is_mst) { | ||
4500 | /* MST devices are disconnected from a monitor POV */ | ||
4501 | intel_dp_unset_edid(intel_dp); | ||
4502 | if (intel_encoder->type != INTEL_OUTPUT_EDP) | ||
4503 | intel_encoder->type = INTEL_OUTPUT_DP; | ||
4504 | return connector_status_disconnected; | ||
4505 | } | ||
4506 | |||
4507 | /* If full detect is not performed yet, do a full detect */ | 4473 | /* If full detect is not performed yet, do a full detect */ |
4508 | if (!intel_dp->detect_done) | 4474 | if (!intel_dp->detect_done) |
4509 | status = intel_dp_long_pulse(intel_dp->attached_connector); | 4475 | status = intel_dp_long_pulse(intel_dp->attached_connector); |