diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 99 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 12 |
6 files changed, 31 insertions, 88 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 9de993d5fed2..f17a2b0c2493 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -1077,7 +1077,6 @@ static int bxt_resume_prepare(struct drm_i915_private *dev_priv) | |||
1077 | */ | 1077 | */ |
1078 | broxton_init_cdclk(dev); | 1078 | broxton_init_cdclk(dev); |
1079 | broxton_ddi_phy_init(dev); | 1079 | broxton_ddi_phy_init(dev); |
1080 | intel_prepare_ddi(dev); | ||
1081 | 1080 | ||
1082 | return 0; | 1081 | return 0; |
1083 | } | 1082 | } |
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c index 3edb10a4f0b4..2ed64725470a 100644 --- a/drivers/gpu/drm/i915/intel_ddi.c +++ b/drivers/gpu/drm/i915/intel_ddi.c | |||
@@ -342,12 +342,6 @@ enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder) | |||
342 | return port; | 342 | return port; |
343 | } | 343 | } |
344 | 344 | ||
345 | static bool | ||
346 | intel_dig_port_supports_hdmi(const struct intel_digital_port *intel_dig_port) | ||
347 | { | ||
348 | return i915_mmio_reg_valid(intel_dig_port->hdmi.hdmi_reg); | ||
349 | } | ||
350 | |||
351 | static const struct ddi_buf_trans * | 345 | static const struct ddi_buf_trans * |
352 | skl_get_buf_trans_dp(struct drm_i915_private *dev_priv, int *n_entries) | 346 | skl_get_buf_trans_dp(struct drm_i915_private *dev_priv, int *n_entries) |
353 | { | 347 | { |
@@ -401,28 +395,34 @@ skl_get_buf_trans_hdmi(struct drm_i915_private *dev_priv, int *n_entries) | |||
401 | * in either FDI or DP modes only, as HDMI connections will work with both | 395 | * in either FDI or DP modes only, as HDMI connections will work with both |
402 | * of those | 396 | * of those |
403 | */ | 397 | */ |
404 | static void intel_prepare_ddi_buffers(struct drm_i915_private *dev_priv, | 398 | void intel_prepare_ddi_buffer(struct intel_encoder *encoder) |
405 | enum port port, bool supports_hdmi) | ||
406 | { | 399 | { |
400 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); | ||
407 | u32 iboost_bit = 0; | 401 | u32 iboost_bit = 0; |
408 | int i, n_hdmi_entries, n_dp_entries, n_edp_entries, hdmi_default_entry, | 402 | int i, n_hdmi_entries, n_dp_entries, n_edp_entries, hdmi_default_entry, |
409 | size; | 403 | size; |
410 | int hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift; | 404 | int hdmi_level; |
405 | enum port port; | ||
411 | const struct ddi_buf_trans *ddi_translations_fdi; | 406 | const struct ddi_buf_trans *ddi_translations_fdi; |
412 | const struct ddi_buf_trans *ddi_translations_dp; | 407 | const struct ddi_buf_trans *ddi_translations_dp; |
413 | const struct ddi_buf_trans *ddi_translations_edp; | 408 | const struct ddi_buf_trans *ddi_translations_edp; |
414 | const struct ddi_buf_trans *ddi_translations_hdmi; | 409 | const struct ddi_buf_trans *ddi_translations_hdmi; |
415 | const struct ddi_buf_trans *ddi_translations; | 410 | const struct ddi_buf_trans *ddi_translations; |
416 | 411 | ||
412 | port = intel_ddi_get_encoder_port(encoder); | ||
413 | hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift; | ||
414 | |||
417 | if (IS_BROXTON(dev_priv)) { | 415 | if (IS_BROXTON(dev_priv)) { |
418 | if (!supports_hdmi) | 416 | if (encoder->type != INTEL_OUTPUT_HDMI) |
419 | return; | 417 | return; |
420 | 418 | ||
421 | /* Vswing programming for HDMI */ | 419 | /* Vswing programming for HDMI */ |
422 | bxt_ddi_vswing_sequence(dev_priv, hdmi_level, port, | 420 | bxt_ddi_vswing_sequence(dev_priv, hdmi_level, port, |
423 | INTEL_OUTPUT_HDMI); | 421 | INTEL_OUTPUT_HDMI); |
424 | return; | 422 | return; |
425 | } else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) { | 423 | } |
424 | |||
425 | if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) { | ||
426 | ddi_translations_fdi = NULL; | 426 | ddi_translations_fdi = NULL; |
427 | ddi_translations_dp = | 427 | ddi_translations_dp = |
428 | skl_get_buf_trans_dp(dev_priv, &n_dp_entries); | 428 | skl_get_buf_trans_dp(dev_priv, &n_dp_entries); |
@@ -468,30 +468,18 @@ static void intel_prepare_ddi_buffers(struct drm_i915_private *dev_priv, | |||
468 | hdmi_default_entry = 7; | 468 | hdmi_default_entry = 7; |
469 | } | 469 | } |
470 | 470 | ||
471 | switch (port) { | 471 | switch (encoder->type) { |
472 | case PORT_A: | 472 | case INTEL_OUTPUT_EDP: |
473 | ddi_translations = ddi_translations_edp; | 473 | ddi_translations = ddi_translations_edp; |
474 | size = n_edp_entries; | 474 | size = n_edp_entries; |
475 | break; | 475 | break; |
476 | case PORT_B: | 476 | case INTEL_OUTPUT_DISPLAYPORT: |
477 | case PORT_C: | 477 | case INTEL_OUTPUT_HDMI: |
478 | ddi_translations = ddi_translations_dp; | 478 | ddi_translations = ddi_translations_dp; |
479 | size = n_dp_entries; | 479 | size = n_dp_entries; |
480 | break; | 480 | break; |
481 | case PORT_D: | 481 | case INTEL_OUTPUT_ANALOG: |
482 | if (intel_dp_is_edp(dev_priv->dev, PORT_D)) { | 482 | ddi_translations = ddi_translations_fdi; |
483 | ddi_translations = ddi_translations_edp; | ||
484 | size = n_edp_entries; | ||
485 | } else { | ||
486 | ddi_translations = ddi_translations_dp; | ||
487 | size = n_dp_entries; | ||
488 | } | ||
489 | break; | ||
490 | case PORT_E: | ||
491 | if (ddi_translations_fdi) | ||
492 | ddi_translations = ddi_translations_fdi; | ||
493 | else | ||
494 | ddi_translations = ddi_translations_dp; | ||
495 | size = n_dp_entries; | 483 | size = n_dp_entries; |
496 | break; | 484 | break; |
497 | default: | 485 | default: |
@@ -505,7 +493,7 @@ static void intel_prepare_ddi_buffers(struct drm_i915_private *dev_priv, | |||
505 | ddi_translations[i].trans2); | 493 | ddi_translations[i].trans2); |
506 | } | 494 | } |
507 | 495 | ||
508 | if (!supports_hdmi) | 496 | if (encoder->type != INTEL_OUTPUT_HDMI) |
509 | return; | 497 | return; |
510 | 498 | ||
511 | /* Choose a good default if VBT is badly populated */ | 499 | /* Choose a good default if VBT is badly populated */ |
@@ -520,37 +508,6 @@ static void intel_prepare_ddi_buffers(struct drm_i915_private *dev_priv, | |||
520 | ddi_translations_hdmi[hdmi_level].trans2); | 508 | ddi_translations_hdmi[hdmi_level].trans2); |
521 | } | 509 | } |
522 | 510 | ||
523 | /* Program DDI buffers translations for DP. By default, program ports A-D in DP | ||
524 | * mode and port E for FDI. | ||
525 | */ | ||
526 | void intel_prepare_ddi(struct drm_device *dev) | ||
527 | { | ||
528 | struct intel_encoder *intel_encoder; | ||
529 | bool visited[I915_MAX_PORTS] = { 0, }; | ||
530 | |||
531 | if (!HAS_DDI(dev)) | ||
532 | return; | ||
533 | |||
534 | for_each_intel_encoder(dev, intel_encoder) { | ||
535 | struct intel_digital_port *intel_dig_port; | ||
536 | enum port port; | ||
537 | bool supports_hdmi; | ||
538 | |||
539 | if (intel_encoder->type == INTEL_OUTPUT_DSI) | ||
540 | continue; | ||
541 | |||
542 | ddi_get_encoder_port(intel_encoder, &intel_dig_port, &port); | ||
543 | if (visited[port]) | ||
544 | continue; | ||
545 | |||
546 | supports_hdmi = intel_dig_port && | ||
547 | intel_dig_port_supports_hdmi(intel_dig_port); | ||
548 | |||
549 | intel_prepare_ddi_buffers(to_i915(dev), port, supports_hdmi); | ||
550 | visited[port] = true; | ||
551 | } | ||
552 | } | ||
553 | |||
554 | static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv, | 511 | static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv, |
555 | enum port port) | 512 | enum port port) |
556 | { | 513 | { |
@@ -579,8 +536,14 @@ void hsw_fdi_link_train(struct drm_crtc *crtc) | |||
579 | struct drm_device *dev = crtc->dev; | 536 | struct drm_device *dev = crtc->dev; |
580 | struct drm_i915_private *dev_priv = dev->dev_private; | 537 | struct drm_i915_private *dev_priv = dev->dev_private; |
581 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 538 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
539 | struct intel_encoder *encoder; | ||
582 | u32 temp, i, rx_ctl_val; | 540 | u32 temp, i, rx_ctl_val; |
583 | 541 | ||
542 | for_each_encoder_on_crtc(dev, crtc, encoder) { | ||
543 | WARN_ON(encoder->type != INTEL_OUTPUT_ANALOG); | ||
544 | intel_prepare_ddi_buffer(encoder); | ||
545 | } | ||
546 | |||
584 | /* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the | 547 | /* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the |
585 | * mode set "sequence for CRT port" document: | 548 | * mode set "sequence for CRT port" document: |
586 | * - TP1 to TP2 time with the default value | 549 | * - TP1 to TP2 time with the default value |
@@ -2306,12 +2269,12 @@ void intel_ddi_clk_select(struct intel_encoder *encoder, | |||
2306 | static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder) | 2269 | static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder) |
2307 | { | 2270 | { |
2308 | struct drm_encoder *encoder = &intel_encoder->base; | 2271 | struct drm_encoder *encoder = &intel_encoder->base; |
2309 | struct drm_device *dev = encoder->dev; | 2272 | struct drm_i915_private *dev_priv = to_i915(encoder->dev); |
2310 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2311 | struct intel_crtc *crtc = to_intel_crtc(encoder->crtc); | 2273 | struct intel_crtc *crtc = to_intel_crtc(encoder->crtc); |
2312 | enum port port = intel_ddi_get_encoder_port(intel_encoder); | 2274 | enum port port = intel_ddi_get_encoder_port(intel_encoder); |
2313 | int type = intel_encoder->type; | 2275 | int type = intel_encoder->type; |
2314 | int hdmi_level; | 2276 | |
2277 | intel_prepare_ddi_buffer(intel_encoder); | ||
2315 | 2278 | ||
2316 | if (type == INTEL_OUTPUT_EDP) { | 2279 | if (type == INTEL_OUTPUT_EDP) { |
2317 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); | 2280 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); |
@@ -2329,17 +2292,11 @@ static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder) | |||
2329 | 2292 | ||
2330 | intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON); | 2293 | intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON); |
2331 | intel_dp_start_link_train(intel_dp); | 2294 | intel_dp_start_link_train(intel_dp); |
2332 | if (port != PORT_A || INTEL_INFO(dev)->gen >= 9) | 2295 | if (port != PORT_A || INTEL_INFO(dev_priv)->gen >= 9) |
2333 | intel_dp_stop_link_train(intel_dp); | 2296 | intel_dp_stop_link_train(intel_dp); |
2334 | } else if (type == INTEL_OUTPUT_HDMI) { | 2297 | } else if (type == INTEL_OUTPUT_HDMI) { |
2335 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); | 2298 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); |
2336 | 2299 | ||
2337 | if (IS_BROXTON(dev)) { | ||
2338 | hdmi_level = dev_priv->vbt. | ||
2339 | ddi_port_info[port].hdmi_level_shift; | ||
2340 | bxt_ddi_vswing_sequence(dev_priv, hdmi_level, port, | ||
2341 | INTEL_OUTPUT_HDMI); | ||
2342 | } | ||
2343 | intel_hdmi->set_infoframes(encoder, | 2300 | intel_hdmi->set_infoframes(encoder, |
2344 | crtc->config->has_hdmi_sink, | 2301 | crtc->config->has_hdmi_sink, |
2345 | &crtc->config->base.adjusted_mode); | 2302 | &crtc->config->base.adjusted_mode); |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 259f2ca57447..20e99a0c5536 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -9710,8 +9710,6 @@ void hsw_disable_pc8(struct drm_i915_private *dev_priv) | |||
9710 | val |= PCH_LP_PARTITION_LEVEL_DISABLE; | 9710 | val |= PCH_LP_PARTITION_LEVEL_DISABLE; |
9711 | I915_WRITE(SOUTH_DSPCLK_GATE_D, val); | 9711 | I915_WRITE(SOUTH_DSPCLK_GATE_D, val); |
9712 | } | 9712 | } |
9713 | |||
9714 | intel_prepare_ddi(dev); | ||
9715 | } | 9713 | } |
9716 | 9714 | ||
9717 | static void broxton_modeset_commit_cdclk(struct drm_atomic_state *old_state) | 9715 | static void broxton_modeset_commit_cdclk(struct drm_atomic_state *old_state) |
@@ -15312,7 +15310,6 @@ void intel_modeset_init_hw(struct drm_device *dev) | |||
15312 | 15310 | ||
15313 | dev_priv->atomic_cdclk_freq = dev_priv->cdclk_freq; | 15311 | dev_priv->atomic_cdclk_freq = dev_priv->cdclk_freq; |
15314 | 15312 | ||
15315 | intel_prepare_ddi(dev); | ||
15316 | intel_init_clock_gating(dev); | 15313 | intel_init_clock_gating(dev); |
15317 | intel_enable_gt_powersave(dev); | 15314 | intel_enable_gt_powersave(dev); |
15318 | } | 15315 | } |
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 5cb168dc2f0c..6f4762dc5a94 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
@@ -184,6 +184,8 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder) | |||
184 | intel_mst->port = found->port; | 184 | intel_mst->port = found->port; |
185 | 185 | ||
186 | if (intel_dp->active_mst_links == 0) { | 186 | if (intel_dp->active_mst_links == 0) { |
187 | intel_prepare_ddi_buffer(&intel_dig_port->base); | ||
188 | |||
187 | intel_ddi_clk_select(&intel_dig_port->base, intel_crtc->config); | 189 | intel_ddi_clk_select(&intel_dig_port->base, intel_crtc->config); |
188 | 190 | ||
189 | intel_dp_set_link_params(intel_dp, intel_crtc->config); | 191 | intel_dp_set_link_params(intel_dp, intel_crtc->config); |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 32de7e478f8f..e27954d2edad 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -1025,7 +1025,7 @@ void intel_crt_init(struct drm_device *dev); | |||
1025 | /* intel_ddi.c */ | 1025 | /* intel_ddi.c */ |
1026 | void intel_ddi_clk_select(struct intel_encoder *encoder, | 1026 | void intel_ddi_clk_select(struct intel_encoder *encoder, |
1027 | const struct intel_crtc_state *pipe_config); | 1027 | const struct intel_crtc_state *pipe_config); |
1028 | void intel_prepare_ddi(struct drm_device *dev); | 1028 | void intel_prepare_ddi_buffer(struct intel_encoder *encoder); |
1029 | void hsw_fdi_link_train(struct drm_crtc *crtc); | 1029 | void hsw_fdi_link_train(struct drm_crtc *crtc); |
1030 | void intel_ddi_init(struct drm_device *dev, enum port port); | 1030 | void intel_ddi_init(struct drm_device *dev, enum port port); |
1031 | enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder); | 1031 | enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder); |
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index 89a7dd83e91f..bbca527184d0 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c | |||
@@ -626,7 +626,6 @@ void skl_disable_dc6(struct drm_i915_private *dev_priv) | |||
626 | static void skl_set_power_well(struct drm_i915_private *dev_priv, | 626 | static void skl_set_power_well(struct drm_i915_private *dev_priv, |
627 | struct i915_power_well *power_well, bool enable) | 627 | struct i915_power_well *power_well, bool enable) |
628 | { | 628 | { |
629 | struct drm_device *dev = dev_priv->dev; | ||
630 | uint32_t tmp, fuse_status; | 629 | uint32_t tmp, fuse_status; |
631 | uint32_t req_mask, state_mask; | 630 | uint32_t req_mask, state_mask; |
632 | bool is_enabled, enable_requested, check_fuse_status = false; | 631 | bool is_enabled, enable_requested, check_fuse_status = false; |
@@ -670,17 +669,6 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv, | |||
670 | !I915_READ(HSW_PWR_WELL_BIOS), | 669 | !I915_READ(HSW_PWR_WELL_BIOS), |
671 | "Invalid for power well status to be enabled, unless done by the BIOS, \ | 670 | "Invalid for power well status to be enabled, unless done by the BIOS, \ |
672 | when request is to disable!\n"); | 671 | when request is to disable!\n"); |
673 | if (power_well->data == SKL_DISP_PW_2) { | ||
674 | /* | ||
675 | * DDI buffer programming unnecessary during | ||
676 | * driver-load/resume as it's already done | ||
677 | * during modeset initialization then. It's | ||
678 | * also invalid here as encoder list is still | ||
679 | * uninitialized. | ||
680 | */ | ||
681 | if (!dev_priv->power_domains.initializing) | ||
682 | intel_prepare_ddi(dev); | ||
683 | } | ||
684 | I915_WRITE(HSW_PWR_WELL_DRIVER, tmp | req_mask); | 672 | I915_WRITE(HSW_PWR_WELL_DRIVER, tmp | req_mask); |
685 | } | 673 | } |
686 | 674 | ||