aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c1
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c99
-rw-r--r--drivers/gpu/drm/i915/intel_display.c3
-rw-r--r--drivers/gpu/drm/i915/intel_dp_mst.c2
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_runtime_pm.c12
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
345static bool
346intel_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
351static const struct ddi_buf_trans * 345static const struct ddi_buf_trans *
352skl_get_buf_trans_dp(struct drm_i915_private *dev_priv, int *n_entries) 346skl_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 */
404static void intel_prepare_ddi_buffers(struct drm_i915_private *dev_priv, 398void 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 */
526void 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
554static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv, 511static 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,
2306static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder) 2269static 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
9717static void broxton_modeset_commit_cdclk(struct drm_atomic_state *old_state) 9715static 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 */
1026void intel_ddi_clk_select(struct intel_encoder *encoder, 1026void intel_ddi_clk_select(struct intel_encoder *encoder,
1027 const struct intel_crtc_state *pipe_config); 1027 const struct intel_crtc_state *pipe_config);
1028void intel_prepare_ddi(struct drm_device *dev); 1028void intel_prepare_ddi_buffer(struct intel_encoder *encoder);
1029void hsw_fdi_link_train(struct drm_crtc *crtc); 1029void hsw_fdi_link_train(struct drm_crtc *crtc);
1030void intel_ddi_init(struct drm_device *dev, enum port port); 1030void intel_ddi_init(struct drm_device *dev, enum port port);
1031enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder); 1031enum 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)
626static void skl_set_power_well(struct drm_i915_private *dev_priv, 626static 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