diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 607 |
1 files changed, 337 insertions, 270 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index ffa43eca14d3..0c5ba3410a1e 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -262,7 +262,7 @@ static void pps_lock(struct intel_dp *intel_dp) | |||
262 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 262 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
263 | struct intel_encoder *encoder = &intel_dig_port->base; | 263 | struct intel_encoder *encoder = &intel_dig_port->base; |
264 | struct drm_device *dev = encoder->base.dev; | 264 | struct drm_device *dev = encoder->base.dev; |
265 | struct drm_i915_private *dev_priv = dev->dev_private; | 265 | struct drm_i915_private *dev_priv = to_i915(dev); |
266 | enum intel_display_power_domain power_domain; | 266 | enum intel_display_power_domain power_domain; |
267 | 267 | ||
268 | /* | 268 | /* |
@@ -280,7 +280,7 @@ static void pps_unlock(struct intel_dp *intel_dp) | |||
280 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 280 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
281 | struct intel_encoder *encoder = &intel_dig_port->base; | 281 | struct intel_encoder *encoder = &intel_dig_port->base; |
282 | struct drm_device *dev = encoder->base.dev; | 282 | struct drm_device *dev = encoder->base.dev; |
283 | struct drm_i915_private *dev_priv = dev->dev_private; | 283 | struct drm_i915_private *dev_priv = to_i915(dev); |
284 | enum intel_display_power_domain power_domain; | 284 | enum intel_display_power_domain power_domain; |
285 | 285 | ||
286 | mutex_unlock(&dev_priv->pps_mutex); | 286 | mutex_unlock(&dev_priv->pps_mutex); |
@@ -294,7 +294,7 @@ vlv_power_sequencer_kick(struct intel_dp *intel_dp) | |||
294 | { | 294 | { |
295 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 295 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
296 | struct drm_device *dev = intel_dig_port->base.base.dev; | 296 | struct drm_device *dev = intel_dig_port->base.base.dev; |
297 | struct drm_i915_private *dev_priv = dev->dev_private; | 297 | struct drm_i915_private *dev_priv = to_i915(dev); |
298 | enum pipe pipe = intel_dp->pps_pipe; | 298 | enum pipe pipe = intel_dp->pps_pipe; |
299 | bool pll_enabled, release_cl_override = false; | 299 | bool pll_enabled, release_cl_override = false; |
300 | enum dpio_phy phy = DPIO_PHY(pipe); | 300 | enum dpio_phy phy = DPIO_PHY(pipe); |
@@ -368,7 +368,7 @@ vlv_power_sequencer_pipe(struct intel_dp *intel_dp) | |||
368 | { | 368 | { |
369 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 369 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
370 | struct drm_device *dev = intel_dig_port->base.base.dev; | 370 | struct drm_device *dev = intel_dig_port->base.base.dev; |
371 | struct drm_i915_private *dev_priv = dev->dev_private; | 371 | struct drm_i915_private *dev_priv = to_i915(dev); |
372 | struct intel_encoder *encoder; | 372 | struct intel_encoder *encoder; |
373 | unsigned int pipes = (1 << PIPE_A) | (1 << PIPE_B); | 373 | unsigned int pipes = (1 << PIPE_A) | (1 << PIPE_B); |
374 | enum pipe pipe; | 374 | enum pipe pipe; |
@@ -426,6 +426,37 @@ vlv_power_sequencer_pipe(struct intel_dp *intel_dp) | |||
426 | return intel_dp->pps_pipe; | 426 | return intel_dp->pps_pipe; |
427 | } | 427 | } |
428 | 428 | ||
429 | static int | ||
430 | bxt_power_sequencer_idx(struct intel_dp *intel_dp) | ||
431 | { | ||
432 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | ||
433 | struct drm_device *dev = intel_dig_port->base.base.dev; | ||
434 | struct drm_i915_private *dev_priv = to_i915(dev); | ||
435 | |||
436 | lockdep_assert_held(&dev_priv->pps_mutex); | ||
437 | |||
438 | /* We should never land here with regular DP ports */ | ||
439 | WARN_ON(!is_edp(intel_dp)); | ||
440 | |||
441 | /* | ||
442 | * TODO: BXT has 2 PPS instances. The correct port->PPS instance | ||
443 | * mapping needs to be retrieved from VBT, for now just hard-code to | ||
444 | * use instance #0 always. | ||
445 | */ | ||
446 | if (!intel_dp->pps_reset) | ||
447 | return 0; | ||
448 | |||
449 | intel_dp->pps_reset = false; | ||
450 | |||
451 | /* | ||
452 | * Only the HW needs to be reprogrammed, the SW state is fixed and | ||
453 | * has been setup during connector init. | ||
454 | */ | ||
455 | intel_dp_init_panel_power_sequencer_registers(dev, intel_dp); | ||
456 | |||
457 | return 0; | ||
458 | } | ||
459 | |||
429 | typedef bool (*vlv_pipe_check)(struct drm_i915_private *dev_priv, | 460 | typedef bool (*vlv_pipe_check)(struct drm_i915_private *dev_priv, |
430 | enum pipe pipe); | 461 | enum pipe pipe); |
431 | 462 | ||
@@ -475,7 +506,7 @@ vlv_initial_power_sequencer_setup(struct intel_dp *intel_dp) | |||
475 | { | 506 | { |
476 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 507 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
477 | struct drm_device *dev = intel_dig_port->base.base.dev; | 508 | struct drm_device *dev = intel_dig_port->base.base.dev; |
478 | struct drm_i915_private *dev_priv = dev->dev_private; | 509 | struct drm_i915_private *dev_priv = to_i915(dev); |
479 | enum port port = intel_dig_port->port; | 510 | enum port port = intel_dig_port->port; |
480 | 511 | ||
481 | lockdep_assert_held(&dev_priv->pps_mutex); | 512 | lockdep_assert_held(&dev_priv->pps_mutex); |
@@ -507,12 +538,13 @@ vlv_initial_power_sequencer_setup(struct intel_dp *intel_dp) | |||
507 | intel_dp_init_panel_power_sequencer_registers(dev, intel_dp); | 538 | intel_dp_init_panel_power_sequencer_registers(dev, intel_dp); |
508 | } | 539 | } |
509 | 540 | ||
510 | void vlv_power_sequencer_reset(struct drm_i915_private *dev_priv) | 541 | void intel_power_sequencer_reset(struct drm_i915_private *dev_priv) |
511 | { | 542 | { |
512 | struct drm_device *dev = dev_priv->dev; | 543 | struct drm_device *dev = &dev_priv->drm; |
513 | struct intel_encoder *encoder; | 544 | struct intel_encoder *encoder; |
514 | 545 | ||
515 | if (WARN_ON(!IS_VALLEYVIEW(dev) && !IS_CHERRYVIEW(dev))) | 546 | if (WARN_ON(!IS_VALLEYVIEW(dev) && !IS_CHERRYVIEW(dev) && |
547 | !IS_BROXTON(dev))) | ||
516 | return; | 548 | return; |
517 | 549 | ||
518 | /* | 550 | /* |
@@ -532,34 +564,71 @@ void vlv_power_sequencer_reset(struct drm_i915_private *dev_priv) | |||
532 | continue; | 564 | continue; |
533 | 565 | ||
534 | intel_dp = enc_to_intel_dp(&encoder->base); | 566 | intel_dp = enc_to_intel_dp(&encoder->base); |
535 | intel_dp->pps_pipe = INVALID_PIPE; | 567 | if (IS_BROXTON(dev)) |
568 | intel_dp->pps_reset = true; | ||
569 | else | ||
570 | intel_dp->pps_pipe = INVALID_PIPE; | ||
571 | } | ||
572 | } | ||
573 | |||
574 | struct pps_registers { | ||
575 | i915_reg_t pp_ctrl; | ||
576 | i915_reg_t pp_stat; | ||
577 | i915_reg_t pp_on; | ||
578 | i915_reg_t pp_off; | ||
579 | i915_reg_t pp_div; | ||
580 | }; | ||
581 | |||
582 | static void intel_pps_get_registers(struct drm_i915_private *dev_priv, | ||
583 | struct intel_dp *intel_dp, | ||
584 | struct pps_registers *regs) | ||
585 | { | ||
586 | memset(regs, 0, sizeof(*regs)); | ||
587 | |||
588 | if (IS_BROXTON(dev_priv)) { | ||
589 | int idx = bxt_power_sequencer_idx(intel_dp); | ||
590 | |||
591 | regs->pp_ctrl = BXT_PP_CONTROL(idx); | ||
592 | regs->pp_stat = BXT_PP_STATUS(idx); | ||
593 | regs->pp_on = BXT_PP_ON_DELAYS(idx); | ||
594 | regs->pp_off = BXT_PP_OFF_DELAYS(idx); | ||
595 | } else if (HAS_PCH_SPLIT(dev_priv)) { | ||
596 | regs->pp_ctrl = PCH_PP_CONTROL; | ||
597 | regs->pp_stat = PCH_PP_STATUS; | ||
598 | regs->pp_on = PCH_PP_ON_DELAYS; | ||
599 | regs->pp_off = PCH_PP_OFF_DELAYS; | ||
600 | regs->pp_div = PCH_PP_DIVISOR; | ||
601 | } else { | ||
602 | enum pipe pipe = vlv_power_sequencer_pipe(intel_dp); | ||
603 | |||
604 | regs->pp_ctrl = VLV_PIPE_PP_CONTROL(pipe); | ||
605 | regs->pp_stat = VLV_PIPE_PP_STATUS(pipe); | ||
606 | regs->pp_on = VLV_PIPE_PP_ON_DELAYS(pipe); | ||
607 | regs->pp_off = VLV_PIPE_PP_OFF_DELAYS(pipe); | ||
608 | regs->pp_div = VLV_PIPE_PP_DIVISOR(pipe); | ||
536 | } | 609 | } |
537 | } | 610 | } |
538 | 611 | ||
539 | static i915_reg_t | 612 | static i915_reg_t |
540 | _pp_ctrl_reg(struct intel_dp *intel_dp) | 613 | _pp_ctrl_reg(struct intel_dp *intel_dp) |
541 | { | 614 | { |
542 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 615 | struct pps_registers regs; |
543 | 616 | ||
544 | if (IS_BROXTON(dev)) | 617 | intel_pps_get_registers(to_i915(intel_dp_to_dev(intel_dp)), intel_dp, |
545 | return BXT_PP_CONTROL(0); | 618 | ®s); |
546 | else if (HAS_PCH_SPLIT(dev)) | 619 | |
547 | return PCH_PP_CONTROL; | 620 | return regs.pp_ctrl; |
548 | else | ||
549 | return VLV_PIPE_PP_CONTROL(vlv_power_sequencer_pipe(intel_dp)); | ||
550 | } | 621 | } |
551 | 622 | ||
552 | static i915_reg_t | 623 | static i915_reg_t |
553 | _pp_stat_reg(struct intel_dp *intel_dp) | 624 | _pp_stat_reg(struct intel_dp *intel_dp) |
554 | { | 625 | { |
555 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 626 | struct pps_registers regs; |
556 | 627 | ||
557 | if (IS_BROXTON(dev)) | 628 | intel_pps_get_registers(to_i915(intel_dp_to_dev(intel_dp)), intel_dp, |
558 | return BXT_PP_STATUS(0); | 629 | ®s); |
559 | else if (HAS_PCH_SPLIT(dev)) | 630 | |
560 | return PCH_PP_STATUS; | 631 | return regs.pp_stat; |
561 | else | ||
562 | return VLV_PIPE_PP_STATUS(vlv_power_sequencer_pipe(intel_dp)); | ||
563 | } | 632 | } |
564 | 633 | ||
565 | /* Reboot notifier handler to shutdown panel power to guarantee T12 timing | 634 | /* Reboot notifier handler to shutdown panel power to guarantee T12 timing |
@@ -570,7 +639,7 @@ static int edp_notify_handler(struct notifier_block *this, unsigned long code, | |||
570 | struct intel_dp *intel_dp = container_of(this, typeof(* intel_dp), | 639 | struct intel_dp *intel_dp = container_of(this, typeof(* intel_dp), |
571 | edp_notifier); | 640 | edp_notifier); |
572 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 641 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
573 | struct drm_i915_private *dev_priv = dev->dev_private; | 642 | struct drm_i915_private *dev_priv = to_i915(dev); |
574 | 643 | ||
575 | if (!is_edp(intel_dp) || code != SYS_RESTART) | 644 | if (!is_edp(intel_dp) || code != SYS_RESTART) |
576 | return 0; | 645 | return 0; |
@@ -601,7 +670,7 @@ static int edp_notify_handler(struct notifier_block *this, unsigned long code, | |||
601 | static bool edp_have_panel_power(struct intel_dp *intel_dp) | 670 | static bool edp_have_panel_power(struct intel_dp *intel_dp) |
602 | { | 671 | { |
603 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 672 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
604 | struct drm_i915_private *dev_priv = dev->dev_private; | 673 | struct drm_i915_private *dev_priv = to_i915(dev); |
605 | 674 | ||
606 | lockdep_assert_held(&dev_priv->pps_mutex); | 675 | lockdep_assert_held(&dev_priv->pps_mutex); |
607 | 676 | ||
@@ -615,7 +684,7 @@ static bool edp_have_panel_power(struct intel_dp *intel_dp) | |||
615 | static bool edp_have_panel_vdd(struct intel_dp *intel_dp) | 684 | static bool edp_have_panel_vdd(struct intel_dp *intel_dp) |
616 | { | 685 | { |
617 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 686 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
618 | struct drm_i915_private *dev_priv = dev->dev_private; | 687 | struct drm_i915_private *dev_priv = to_i915(dev); |
619 | 688 | ||
620 | lockdep_assert_held(&dev_priv->pps_mutex); | 689 | lockdep_assert_held(&dev_priv->pps_mutex); |
621 | 690 | ||
@@ -630,7 +699,7 @@ static void | |||
630 | intel_dp_check_edp(struct intel_dp *intel_dp) | 699 | intel_dp_check_edp(struct intel_dp *intel_dp) |
631 | { | 700 | { |
632 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 701 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
633 | struct drm_i915_private *dev_priv = dev->dev_private; | 702 | struct drm_i915_private *dev_priv = to_i915(dev); |
634 | 703 | ||
635 | if (!is_edp(intel_dp)) | 704 | if (!is_edp(intel_dp)) |
636 | return; | 705 | return; |
@@ -648,7 +717,7 @@ intel_dp_aux_wait_done(struct intel_dp *intel_dp, bool has_aux_irq) | |||
648 | { | 717 | { |
649 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 718 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
650 | struct drm_device *dev = intel_dig_port->base.base.dev; | 719 | struct drm_device *dev = intel_dig_port->base.base.dev; |
651 | struct drm_i915_private *dev_priv = dev->dev_private; | 720 | struct drm_i915_private *dev_priv = to_i915(dev); |
652 | i915_reg_t ch_ctl = intel_dp->aux_ch_ctl_reg; | 721 | i915_reg_t ch_ctl = intel_dp->aux_ch_ctl_reg; |
653 | uint32_t status; | 722 | uint32_t status; |
654 | bool done; | 723 | bool done; |
@@ -658,7 +727,7 @@ intel_dp_aux_wait_done(struct intel_dp *intel_dp, bool has_aux_irq) | |||
658 | done = wait_event_timeout(dev_priv->gmbus_wait_queue, C, | 727 | done = wait_event_timeout(dev_priv->gmbus_wait_queue, C, |
659 | msecs_to_jiffies_timeout(10)); | 728 | msecs_to_jiffies_timeout(10)); |
660 | else | 729 | else |
661 | done = wait_for_atomic(C, 10) == 0; | 730 | done = wait_for(C, 10) == 0; |
662 | if (!done) | 731 | if (!done) |
663 | DRM_ERROR("dp aux hw did not signal timeout (has irq: %i)!\n", | 732 | DRM_ERROR("dp aux hw did not signal timeout (has irq: %i)!\n", |
664 | has_aux_irq); | 733 | has_aux_irq); |
@@ -781,7 +850,7 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, | |||
781 | { | 850 | { |
782 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 851 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
783 | struct drm_device *dev = intel_dig_port->base.base.dev; | 852 | struct drm_device *dev = intel_dig_port->base.base.dev; |
784 | struct drm_i915_private *dev_priv = dev->dev_private; | 853 | struct drm_i915_private *dev_priv = to_i915(dev); |
785 | i915_reg_t ch_ctl = intel_dp->aux_ch_ctl_reg; | 854 | i915_reg_t ch_ctl = intel_dp->aux_ch_ctl_reg; |
786 | uint32_t aux_clock_divider; | 855 | uint32_t aux_clock_divider; |
787 | int i, ret, recv_bytes; | 856 | int i, ret, recv_bytes; |
@@ -1180,35 +1249,18 @@ intel_dp_aux_fini(struct intel_dp *intel_dp) | |||
1180 | kfree(intel_dp->aux.name); | 1249 | kfree(intel_dp->aux.name); |
1181 | } | 1250 | } |
1182 | 1251 | ||
1183 | static int | 1252 | static void |
1184 | intel_dp_aux_init(struct intel_dp *intel_dp, struct intel_connector *connector) | 1253 | intel_dp_aux_init(struct intel_dp *intel_dp, struct intel_connector *connector) |
1185 | { | 1254 | { |
1186 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 1255 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
1187 | enum port port = intel_dig_port->port; | 1256 | enum port port = intel_dig_port->port; |
1188 | int ret; | ||
1189 | 1257 | ||
1190 | intel_aux_reg_init(intel_dp); | 1258 | intel_aux_reg_init(intel_dp); |
1259 | drm_dp_aux_init(&intel_dp->aux); | ||
1191 | 1260 | ||
1261 | /* Failure to allocate our preferred name is not critical */ | ||
1192 | intel_dp->aux.name = kasprintf(GFP_KERNEL, "DPDDC-%c", port_name(port)); | 1262 | intel_dp->aux.name = kasprintf(GFP_KERNEL, "DPDDC-%c", port_name(port)); |
1193 | if (!intel_dp->aux.name) | ||
1194 | return -ENOMEM; | ||
1195 | |||
1196 | intel_dp->aux.dev = connector->base.kdev; | ||
1197 | intel_dp->aux.transfer = intel_dp_aux_transfer; | 1263 | intel_dp->aux.transfer = intel_dp_aux_transfer; |
1198 | |||
1199 | DRM_DEBUG_KMS("registering %s bus for %s\n", | ||
1200 | intel_dp->aux.name, | ||
1201 | connector->base.kdev->kobj.name); | ||
1202 | |||
1203 | ret = drm_dp_aux_register(&intel_dp->aux); | ||
1204 | if (ret < 0) { | ||
1205 | DRM_ERROR("drm_dp_aux_register() for %s failed (%d)\n", | ||
1206 | intel_dp->aux.name, ret); | ||
1207 | kfree(intel_dp->aux.name); | ||
1208 | return ret; | ||
1209 | } | ||
1210 | |||
1211 | return 0; | ||
1212 | } | 1264 | } |
1213 | 1265 | ||
1214 | static int | 1266 | static int |
@@ -1421,7 +1473,7 @@ intel_dp_compute_config(struct intel_encoder *encoder, | |||
1421 | struct intel_crtc_state *pipe_config) | 1473 | struct intel_crtc_state *pipe_config) |
1422 | { | 1474 | { |
1423 | struct drm_device *dev = encoder->base.dev; | 1475 | struct drm_device *dev = encoder->base.dev; |
1424 | struct drm_i915_private *dev_priv = dev->dev_private; | 1476 | struct drm_i915_private *dev_priv = to_i915(dev); |
1425 | struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode; | 1477 | struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode; |
1426 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); | 1478 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); |
1427 | enum port port = dp_to_dig_port(intel_dp)->port; | 1479 | enum port port = dp_to_dig_port(intel_dp)->port; |
@@ -1449,7 +1501,6 @@ intel_dp_compute_config(struct intel_encoder *encoder, | |||
1449 | if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev) && port != PORT_A) | 1501 | if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev) && port != PORT_A) |
1450 | pipe_config->has_pch_encoder = true; | 1502 | pipe_config->has_pch_encoder = true; |
1451 | 1503 | ||
1452 | pipe_config->has_dp_encoder = true; | ||
1453 | pipe_config->has_drrs = false; | 1504 | pipe_config->has_drrs = false; |
1454 | pipe_config->has_audio = intel_dp->has_audio && port != PORT_A; | 1505 | pipe_config->has_audio = intel_dp->has_audio && port != PORT_A; |
1455 | 1506 | ||
@@ -1605,7 +1656,7 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp, | |||
1605 | static void intel_dp_prepare(struct intel_encoder *encoder) | 1656 | static void intel_dp_prepare(struct intel_encoder *encoder) |
1606 | { | 1657 | { |
1607 | struct drm_device *dev = encoder->base.dev; | 1658 | struct drm_device *dev = encoder->base.dev; |
1608 | struct drm_i915_private *dev_priv = dev->dev_private; | 1659 | struct drm_i915_private *dev_priv = to_i915(dev); |
1609 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); | 1660 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); |
1610 | enum port port = dp_to_dig_port(intel_dp)->port; | 1661 | enum port port = dp_to_dig_port(intel_dp)->port; |
1611 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); | 1662 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); |
@@ -1693,16 +1744,21 @@ static void intel_dp_prepare(struct intel_encoder *encoder) | |||
1693 | #define IDLE_CYCLE_MASK (PP_ON | PP_SEQUENCE_MASK | PP_CYCLE_DELAY_ACTIVE | PP_SEQUENCE_STATE_MASK) | 1744 | #define IDLE_CYCLE_MASK (PP_ON | PP_SEQUENCE_MASK | PP_CYCLE_DELAY_ACTIVE | PP_SEQUENCE_STATE_MASK) |
1694 | #define IDLE_CYCLE_VALUE (0 | PP_SEQUENCE_NONE | 0 | PP_SEQUENCE_STATE_OFF_IDLE) | 1745 | #define IDLE_CYCLE_VALUE (0 | PP_SEQUENCE_NONE | 0 | PP_SEQUENCE_STATE_OFF_IDLE) |
1695 | 1746 | ||
1747 | static void intel_pps_verify_state(struct drm_i915_private *dev_priv, | ||
1748 | struct intel_dp *intel_dp); | ||
1749 | |||
1696 | static void wait_panel_status(struct intel_dp *intel_dp, | 1750 | static void wait_panel_status(struct intel_dp *intel_dp, |
1697 | u32 mask, | 1751 | u32 mask, |
1698 | u32 value) | 1752 | u32 value) |
1699 | { | 1753 | { |
1700 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 1754 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
1701 | struct drm_i915_private *dev_priv = dev->dev_private; | 1755 | struct drm_i915_private *dev_priv = to_i915(dev); |
1702 | i915_reg_t pp_stat_reg, pp_ctrl_reg; | 1756 | i915_reg_t pp_stat_reg, pp_ctrl_reg; |
1703 | 1757 | ||
1704 | lockdep_assert_held(&dev_priv->pps_mutex); | 1758 | lockdep_assert_held(&dev_priv->pps_mutex); |
1705 | 1759 | ||
1760 | intel_pps_verify_state(dev_priv, intel_dp); | ||
1761 | |||
1706 | pp_stat_reg = _pp_stat_reg(intel_dp); | 1762 | pp_stat_reg = _pp_stat_reg(intel_dp); |
1707 | pp_ctrl_reg = _pp_ctrl_reg(intel_dp); | 1763 | pp_ctrl_reg = _pp_ctrl_reg(intel_dp); |
1708 | 1764 | ||
@@ -1711,8 +1767,9 @@ static void wait_panel_status(struct intel_dp *intel_dp, | |||
1711 | I915_READ(pp_stat_reg), | 1767 | I915_READ(pp_stat_reg), |
1712 | I915_READ(pp_ctrl_reg)); | 1768 | I915_READ(pp_ctrl_reg)); |
1713 | 1769 | ||
1714 | if (_wait_for((I915_READ(pp_stat_reg) & mask) == value, | 1770 | if (intel_wait_for_register(dev_priv, |
1715 | 5 * USEC_PER_SEC, 10 * USEC_PER_MSEC)) | 1771 | pp_stat_reg, mask, value, |
1772 | 5000)) | ||
1716 | DRM_ERROR("Panel status timeout: status %08x control %08x\n", | 1773 | DRM_ERROR("Panel status timeout: status %08x control %08x\n", |
1717 | I915_READ(pp_stat_reg), | 1774 | I915_READ(pp_stat_reg), |
1718 | I915_READ(pp_ctrl_reg)); | 1775 | I915_READ(pp_ctrl_reg)); |
@@ -1772,7 +1829,7 @@ static void edp_wait_backlight_off(struct intel_dp *intel_dp) | |||
1772 | static u32 ironlake_get_pp_control(struct intel_dp *intel_dp) | 1829 | static u32 ironlake_get_pp_control(struct intel_dp *intel_dp) |
1773 | { | 1830 | { |
1774 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 1831 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
1775 | struct drm_i915_private *dev_priv = dev->dev_private; | 1832 | struct drm_i915_private *dev_priv = to_i915(dev); |
1776 | u32 control; | 1833 | u32 control; |
1777 | 1834 | ||
1778 | lockdep_assert_held(&dev_priv->pps_mutex); | 1835 | lockdep_assert_held(&dev_priv->pps_mutex); |
@@ -1795,7 +1852,7 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp) | |||
1795 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 1852 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
1796 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 1853 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
1797 | struct intel_encoder *intel_encoder = &intel_dig_port->base; | 1854 | struct intel_encoder *intel_encoder = &intel_dig_port->base; |
1798 | struct drm_i915_private *dev_priv = dev->dev_private; | 1855 | struct drm_i915_private *dev_priv = to_i915(dev); |
1799 | enum intel_display_power_domain power_domain; | 1856 | enum intel_display_power_domain power_domain; |
1800 | u32 pp; | 1857 | u32 pp; |
1801 | i915_reg_t pp_stat_reg, pp_ctrl_reg; | 1858 | i915_reg_t pp_stat_reg, pp_ctrl_reg; |
@@ -1868,7 +1925,7 @@ void intel_edp_panel_vdd_on(struct intel_dp *intel_dp) | |||
1868 | static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp) | 1925 | static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp) |
1869 | { | 1926 | { |
1870 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 1927 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
1871 | struct drm_i915_private *dev_priv = dev->dev_private; | 1928 | struct drm_i915_private *dev_priv = to_i915(dev); |
1872 | struct intel_digital_port *intel_dig_port = | 1929 | struct intel_digital_port *intel_dig_port = |
1873 | dp_to_dig_port(intel_dp); | 1930 | dp_to_dig_port(intel_dp); |
1874 | struct intel_encoder *intel_encoder = &intel_dig_port->base; | 1931 | struct intel_encoder *intel_encoder = &intel_dig_port->base; |
@@ -1937,8 +1994,7 @@ static void edp_panel_vdd_schedule_off(struct intel_dp *intel_dp) | |||
1937 | */ | 1994 | */ |
1938 | static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync) | 1995 | static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync) |
1939 | { | 1996 | { |
1940 | struct drm_i915_private *dev_priv = | 1997 | struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp)); |
1941 | intel_dp_to_dev(intel_dp)->dev_private; | ||
1942 | 1998 | ||
1943 | lockdep_assert_held(&dev_priv->pps_mutex); | 1999 | lockdep_assert_held(&dev_priv->pps_mutex); |
1944 | 2000 | ||
@@ -1959,7 +2015,7 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync) | |||
1959 | static void edp_panel_on(struct intel_dp *intel_dp) | 2015 | static void edp_panel_on(struct intel_dp *intel_dp) |
1960 | { | 2016 | { |
1961 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 2017 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
1962 | struct drm_i915_private *dev_priv = dev->dev_private; | 2018 | struct drm_i915_private *dev_priv = to_i915(dev); |
1963 | u32 pp; | 2019 | u32 pp; |
1964 | i915_reg_t pp_ctrl_reg; | 2020 | i915_reg_t pp_ctrl_reg; |
1965 | 2021 | ||
@@ -2020,7 +2076,7 @@ static void edp_panel_off(struct intel_dp *intel_dp) | |||
2020 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 2076 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
2021 | struct intel_encoder *intel_encoder = &intel_dig_port->base; | 2077 | struct intel_encoder *intel_encoder = &intel_dig_port->base; |
2022 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 2078 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
2023 | struct drm_i915_private *dev_priv = dev->dev_private; | 2079 | struct drm_i915_private *dev_priv = to_i915(dev); |
2024 | enum intel_display_power_domain power_domain; | 2080 | enum intel_display_power_domain power_domain; |
2025 | u32 pp; | 2081 | u32 pp; |
2026 | i915_reg_t pp_ctrl_reg; | 2082 | i915_reg_t pp_ctrl_reg; |
@@ -2072,7 +2128,7 @@ static void _intel_edp_backlight_on(struct intel_dp *intel_dp) | |||
2072 | { | 2128 | { |
2073 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 2129 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
2074 | struct drm_device *dev = intel_dig_port->base.base.dev; | 2130 | struct drm_device *dev = intel_dig_port->base.base.dev; |
2075 | struct drm_i915_private *dev_priv = dev->dev_private; | 2131 | struct drm_i915_private *dev_priv = to_i915(dev); |
2076 | u32 pp; | 2132 | u32 pp; |
2077 | i915_reg_t pp_ctrl_reg; | 2133 | i915_reg_t pp_ctrl_reg; |
2078 | 2134 | ||
@@ -2113,7 +2169,7 @@ void intel_edp_backlight_on(struct intel_dp *intel_dp) | |||
2113 | static void _intel_edp_backlight_off(struct intel_dp *intel_dp) | 2169 | static void _intel_edp_backlight_off(struct intel_dp *intel_dp) |
2114 | { | 2170 | { |
2115 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 2171 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
2116 | struct drm_i915_private *dev_priv = dev->dev_private; | 2172 | struct drm_i915_private *dev_priv = to_i915(dev); |
2117 | u32 pp; | 2173 | u32 pp; |
2118 | i915_reg_t pp_ctrl_reg; | 2174 | i915_reg_t pp_ctrl_reg; |
2119 | 2175 | ||
@@ -2229,7 +2285,7 @@ static void ironlake_edp_pll_on(struct intel_dp *intel_dp) | |||
2229 | * 2. Program DP PLL enable | 2285 | * 2. Program DP PLL enable |
2230 | */ | 2286 | */ |
2231 | if (IS_GEN5(dev_priv)) | 2287 | if (IS_GEN5(dev_priv)) |
2232 | intel_wait_for_vblank_if_active(dev_priv->dev, !crtc->pipe); | 2288 | intel_wait_for_vblank_if_active(&dev_priv->drm, !crtc->pipe); |
2233 | 2289 | ||
2234 | intel_dp->DP |= DP_PLL_ENABLE; | 2290 | intel_dp->DP |= DP_PLL_ENABLE; |
2235 | 2291 | ||
@@ -2294,7 +2350,7 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder, | |||
2294 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); | 2350 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); |
2295 | enum port port = dp_to_dig_port(intel_dp)->port; | 2351 | enum port port = dp_to_dig_port(intel_dp)->port; |
2296 | struct drm_device *dev = encoder->base.dev; | 2352 | struct drm_device *dev = encoder->base.dev; |
2297 | struct drm_i915_private *dev_priv = dev->dev_private; | 2353 | struct drm_i915_private *dev_priv = to_i915(dev); |
2298 | enum intel_display_power_domain power_domain; | 2354 | enum intel_display_power_domain power_domain; |
2299 | u32 tmp; | 2355 | u32 tmp; |
2300 | bool ret; | 2356 | bool ret; |
@@ -2347,7 +2403,7 @@ static void intel_dp_get_config(struct intel_encoder *encoder, | |||
2347 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); | 2403 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); |
2348 | u32 tmp, flags = 0; | 2404 | u32 tmp, flags = 0; |
2349 | struct drm_device *dev = encoder->base.dev; | 2405 | struct drm_device *dev = encoder->base.dev; |
2350 | struct drm_i915_private *dev_priv = dev->dev_private; | 2406 | struct drm_i915_private *dev_priv = to_i915(dev); |
2351 | enum port port = dp_to_dig_port(intel_dp)->port; | 2407 | enum port port = dp_to_dig_port(intel_dp)->port; |
2352 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); | 2408 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); |
2353 | 2409 | ||
@@ -2385,8 +2441,6 @@ static void intel_dp_get_config(struct intel_encoder *encoder, | |||
2385 | !IS_CHERRYVIEW(dev) && tmp & DP_COLOR_RANGE_16_235) | 2441 | !IS_CHERRYVIEW(dev) && tmp & DP_COLOR_RANGE_16_235) |
2386 | pipe_config->limited_color_range = true; | 2442 | pipe_config->limited_color_range = true; |
2387 | 2443 | ||
2388 | pipe_config->has_dp_encoder = true; | ||
2389 | |||
2390 | pipe_config->lane_count = | 2444 | pipe_config->lane_count = |
2391 | ((tmp & DP_PORT_WIDTH_MASK) >> DP_PORT_WIDTH_SHIFT) + 1; | 2445 | ((tmp & DP_PORT_WIDTH_MASK) >> DP_PORT_WIDTH_SHIFT) + 1; |
2392 | 2446 | ||
@@ -2471,7 +2525,7 @@ static void chv_post_disable_dp(struct intel_encoder *encoder) | |||
2471 | { | 2525 | { |
2472 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); | 2526 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); |
2473 | struct drm_device *dev = encoder->base.dev; | 2527 | struct drm_device *dev = encoder->base.dev; |
2474 | struct drm_i915_private *dev_priv = dev->dev_private; | 2528 | struct drm_i915_private *dev_priv = to_i915(dev); |
2475 | 2529 | ||
2476 | intel_dp_link_down(intel_dp); | 2530 | intel_dp_link_down(intel_dp); |
2477 | 2531 | ||
@@ -2490,7 +2544,7 @@ _intel_dp_set_link_train(struct intel_dp *intel_dp, | |||
2490 | { | 2544 | { |
2491 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 2545 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
2492 | struct drm_device *dev = intel_dig_port->base.base.dev; | 2546 | struct drm_device *dev = intel_dig_port->base.base.dev; |
2493 | struct drm_i915_private *dev_priv = dev->dev_private; | 2547 | struct drm_i915_private *dev_priv = to_i915(dev); |
2494 | enum port port = intel_dig_port->port; | 2548 | enum port port = intel_dig_port->port; |
2495 | 2549 | ||
2496 | if (HAS_DDI(dev)) { | 2550 | if (HAS_DDI(dev)) { |
@@ -2570,7 +2624,7 @@ _intel_dp_set_link_train(struct intel_dp *intel_dp, | |||
2570 | static void intel_dp_enable_port(struct intel_dp *intel_dp) | 2624 | static void intel_dp_enable_port(struct intel_dp *intel_dp) |
2571 | { | 2625 | { |
2572 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 2626 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
2573 | struct drm_i915_private *dev_priv = dev->dev_private; | 2627 | struct drm_i915_private *dev_priv = to_i915(dev); |
2574 | struct intel_crtc *crtc = | 2628 | struct intel_crtc *crtc = |
2575 | to_intel_crtc(dp_to_dig_port(intel_dp)->base.base.crtc); | 2629 | to_intel_crtc(dp_to_dig_port(intel_dp)->base.base.crtc); |
2576 | 2630 | ||
@@ -2599,7 +2653,7 @@ static void intel_enable_dp(struct intel_encoder *encoder) | |||
2599 | { | 2653 | { |
2600 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); | 2654 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); |
2601 | struct drm_device *dev = encoder->base.dev; | 2655 | struct drm_device *dev = encoder->base.dev; |
2602 | struct drm_i915_private *dev_priv = dev->dev_private; | 2656 | struct drm_i915_private *dev_priv = to_i915(dev); |
2603 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); | 2657 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); |
2604 | uint32_t dp_reg = I915_READ(intel_dp->output_reg); | 2658 | uint32_t dp_reg = I915_READ(intel_dp->output_reg); |
2605 | enum pipe pipe = crtc->pipe; | 2659 | enum pipe pipe = crtc->pipe; |
@@ -2672,7 +2726,7 @@ static void g4x_pre_enable_dp(struct intel_encoder *encoder) | |||
2672 | static void vlv_detach_power_sequencer(struct intel_dp *intel_dp) | 2726 | static void vlv_detach_power_sequencer(struct intel_dp *intel_dp) |
2673 | { | 2727 | { |
2674 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 2728 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
2675 | struct drm_i915_private *dev_priv = intel_dig_port->base.base.dev->dev_private; | 2729 | struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev); |
2676 | enum pipe pipe = intel_dp->pps_pipe; | 2730 | enum pipe pipe = intel_dp->pps_pipe; |
2677 | i915_reg_t pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe); | 2731 | i915_reg_t pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe); |
2678 | 2732 | ||
@@ -2698,7 +2752,7 @@ static void vlv_detach_power_sequencer(struct intel_dp *intel_dp) | |||
2698 | static void vlv_steal_power_sequencer(struct drm_device *dev, | 2752 | static void vlv_steal_power_sequencer(struct drm_device *dev, |
2699 | enum pipe pipe) | 2753 | enum pipe pipe) |
2700 | { | 2754 | { |
2701 | struct drm_i915_private *dev_priv = dev->dev_private; | 2755 | struct drm_i915_private *dev_priv = to_i915(dev); |
2702 | struct intel_encoder *encoder; | 2756 | struct intel_encoder *encoder; |
2703 | 2757 | ||
2704 | lockdep_assert_held(&dev_priv->pps_mutex); | 2758 | lockdep_assert_held(&dev_priv->pps_mutex); |
@@ -2736,7 +2790,7 @@ static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp) | |||
2736 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 2790 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
2737 | struct intel_encoder *encoder = &intel_dig_port->base; | 2791 | struct intel_encoder *encoder = &intel_dig_port->base; |
2738 | struct drm_device *dev = encoder->base.dev; | 2792 | struct drm_device *dev = encoder->base.dev; |
2739 | struct drm_i915_private *dev_priv = dev->dev_private; | 2793 | struct drm_i915_private *dev_priv = to_i915(dev); |
2740 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); | 2794 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); |
2741 | 2795 | ||
2742 | lockdep_assert_held(&dev_priv->pps_mutex); | 2796 | lockdep_assert_held(&dev_priv->pps_mutex); |
@@ -2824,7 +2878,7 @@ uint8_t | |||
2824 | intel_dp_voltage_max(struct intel_dp *intel_dp) | 2878 | intel_dp_voltage_max(struct intel_dp *intel_dp) |
2825 | { | 2879 | { |
2826 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 2880 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
2827 | struct drm_i915_private *dev_priv = dev->dev_private; | 2881 | struct drm_i915_private *dev_priv = to_i915(dev); |
2828 | enum port port = dp_to_dig_port(intel_dp)->port; | 2882 | enum port port = dp_to_dig_port(intel_dp)->port; |
2829 | 2883 | ||
2830 | if (IS_BROXTON(dev)) | 2884 | if (IS_BROXTON(dev)) |
@@ -3242,7 +3296,7 @@ void intel_dp_set_idle_link_train(struct intel_dp *intel_dp) | |||
3242 | { | 3296 | { |
3243 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 3297 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
3244 | struct drm_device *dev = intel_dig_port->base.base.dev; | 3298 | struct drm_device *dev = intel_dig_port->base.base.dev; |
3245 | struct drm_i915_private *dev_priv = dev->dev_private; | 3299 | struct drm_i915_private *dev_priv = to_i915(dev); |
3246 | enum port port = intel_dig_port->port; | 3300 | enum port port = intel_dig_port->port; |
3247 | uint32_t val; | 3301 | uint32_t val; |
3248 | 3302 | ||
@@ -3264,8 +3318,10 @@ void intel_dp_set_idle_link_train(struct intel_dp *intel_dp) | |||
3264 | if (port == PORT_A) | 3318 | if (port == PORT_A) |
3265 | return; | 3319 | return; |
3266 | 3320 | ||
3267 | if (wait_for((I915_READ(DP_TP_STATUS(port)) & DP_TP_STATUS_IDLE_DONE), | 3321 | if (intel_wait_for_register(dev_priv,DP_TP_STATUS(port), |
3268 | 1)) | 3322 | DP_TP_STATUS_IDLE_DONE, |
3323 | DP_TP_STATUS_IDLE_DONE, | ||
3324 | 1)) | ||
3269 | DRM_ERROR("Timed out waiting for DP idle patterns\n"); | 3325 | DRM_ERROR("Timed out waiting for DP idle patterns\n"); |
3270 | } | 3326 | } |
3271 | 3327 | ||
@@ -3276,7 +3332,7 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
3276 | struct intel_crtc *crtc = to_intel_crtc(intel_dig_port->base.base.crtc); | 3332 | struct intel_crtc *crtc = to_intel_crtc(intel_dig_port->base.base.crtc); |
3277 | enum port port = intel_dig_port->port; | 3333 | enum port port = intel_dig_port->port; |
3278 | struct drm_device *dev = intel_dig_port->base.base.dev; | 3334 | struct drm_device *dev = intel_dig_port->base.base.dev; |
3279 | struct drm_i915_private *dev_priv = dev->dev_private; | 3335 | struct drm_i915_private *dev_priv = to_i915(dev); |
3280 | uint32_t DP = intel_dp->DP; | 3336 | uint32_t DP = intel_dp->DP; |
3281 | 3337 | ||
3282 | if (WARN_ON(HAS_DDI(dev))) | 3338 | if (WARN_ON(HAS_DDI(dev))) |
@@ -3328,7 +3384,7 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
3328 | I915_WRITE(intel_dp->output_reg, DP); | 3384 | I915_WRITE(intel_dp->output_reg, DP); |
3329 | POSTING_READ(intel_dp->output_reg); | 3385 | POSTING_READ(intel_dp->output_reg); |
3330 | 3386 | ||
3331 | intel_wait_for_vblank_if_active(dev_priv->dev, PIPE_A); | 3387 | intel_wait_for_vblank_if_active(&dev_priv->drm, PIPE_A); |
3332 | intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true); | 3388 | intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true); |
3333 | intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true); | 3389 | intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true); |
3334 | } | 3390 | } |
@@ -3343,7 +3399,7 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp) | |||
3343 | { | 3399 | { |
3344 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 3400 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
3345 | struct drm_device *dev = dig_port->base.base.dev; | 3401 | struct drm_device *dev = dig_port->base.base.dev; |
3346 | struct drm_i915_private *dev_priv = dev->dev_private; | 3402 | struct drm_i915_private *dev_priv = to_i915(dev); |
3347 | 3403 | ||
3348 | if (drm_dp_dpcd_read(&intel_dp->aux, 0x000, intel_dp->dpcd, | 3404 | if (drm_dp_dpcd_read(&intel_dp->aux, 0x000, intel_dp->dpcd, |
3349 | sizeof(intel_dp->dpcd)) < 0) | 3405 | sizeof(intel_dp->dpcd)) < 0) |
@@ -4194,7 +4250,7 @@ intel_dp_long_pulse(struct intel_connector *intel_connector) | |||
4194 | } | 4250 | } |
4195 | 4251 | ||
4196 | if (intel_encoder->type != INTEL_OUTPUT_EDP) | 4252 | if (intel_encoder->type != INTEL_OUTPUT_EDP) |
4197 | intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT; | 4253 | intel_encoder->type = INTEL_OUTPUT_DP; |
4198 | 4254 | ||
4199 | intel_dp_probe_oui(intel_dp); | 4255 | intel_dp_probe_oui(intel_dp); |
4200 | 4256 | ||
@@ -4270,7 +4326,7 @@ intel_dp_detect(struct drm_connector *connector, bool force) | |||
4270 | /* MST devices are disconnected from a monitor POV */ | 4326 | /* MST devices are disconnected from a monitor POV */ |
4271 | intel_dp_unset_edid(intel_dp); | 4327 | intel_dp_unset_edid(intel_dp); |
4272 | if (intel_encoder->type != INTEL_OUTPUT_EDP) | 4328 | if (intel_encoder->type != INTEL_OUTPUT_EDP) |
4273 | intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT; | 4329 | intel_encoder->type = INTEL_OUTPUT_DP; |
4274 | return connector_status_disconnected; | 4330 | return connector_status_disconnected; |
4275 | } | 4331 | } |
4276 | 4332 | ||
@@ -4309,7 +4365,7 @@ intel_dp_force(struct drm_connector *connector) | |||
4309 | intel_display_power_put(dev_priv, power_domain); | 4365 | intel_display_power_put(dev_priv, power_domain); |
4310 | 4366 | ||
4311 | if (intel_encoder->type != INTEL_OUTPUT_EDP) | 4367 | if (intel_encoder->type != INTEL_OUTPUT_EDP) |
4312 | intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT; | 4368 | intel_encoder->type = INTEL_OUTPUT_DP; |
4313 | } | 4369 | } |
4314 | 4370 | ||
4315 | static int intel_dp_get_modes(struct drm_connector *connector) | 4371 | static int intel_dp_get_modes(struct drm_connector *connector) |
@@ -4358,7 +4414,7 @@ intel_dp_set_property(struct drm_connector *connector, | |||
4358 | struct drm_property *property, | 4414 | struct drm_property *property, |
4359 | uint64_t val) | 4415 | uint64_t val) |
4360 | { | 4416 | { |
4361 | struct drm_i915_private *dev_priv = connector->dev->dev_private; | 4417 | struct drm_i915_private *dev_priv = to_i915(connector->dev); |
4362 | struct intel_connector *intel_connector = to_intel_connector(connector); | 4418 | struct intel_connector *intel_connector = to_intel_connector(connector); |
4363 | struct intel_encoder *intel_encoder = intel_attached_encoder(connector); | 4419 | struct intel_encoder *intel_encoder = intel_attached_encoder(connector); |
4364 | struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base); | 4420 | struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base); |
@@ -4446,6 +4502,25 @@ done: | |||
4446 | return 0; | 4502 | return 0; |
4447 | } | 4503 | } |
4448 | 4504 | ||
4505 | static int | ||
4506 | intel_dp_connector_register(struct drm_connector *connector) | ||
4507 | { | ||
4508 | struct intel_dp *intel_dp = intel_attached_dp(connector); | ||
4509 | int ret; | ||
4510 | |||
4511 | ret = intel_connector_register(connector); | ||
4512 | if (ret) | ||
4513 | return ret; | ||
4514 | |||
4515 | i915_debugfs_connector_add(connector); | ||
4516 | |||
4517 | DRM_DEBUG_KMS("registering %s bus for %s\n", | ||
4518 | intel_dp->aux.name, connector->kdev->kobj.name); | ||
4519 | |||
4520 | intel_dp->aux.dev = connector->kdev; | ||
4521 | return drm_dp_aux_register(&intel_dp->aux); | ||
4522 | } | ||
4523 | |||
4449 | static void | 4524 | static void |
4450 | intel_dp_connector_unregister(struct drm_connector *connector) | 4525 | intel_dp_connector_unregister(struct drm_connector *connector) |
4451 | { | 4526 | { |
@@ -4521,7 +4596,7 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp) | |||
4521 | { | 4596 | { |
4522 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 4597 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
4523 | struct drm_device *dev = intel_dig_port->base.base.dev; | 4598 | struct drm_device *dev = intel_dig_port->base.base.dev; |
4524 | struct drm_i915_private *dev_priv = dev->dev_private; | 4599 | struct drm_i915_private *dev_priv = to_i915(dev); |
4525 | enum intel_display_power_domain power_domain; | 4600 | enum intel_display_power_domain power_domain; |
4526 | 4601 | ||
4527 | lockdep_assert_held(&dev_priv->pps_mutex); | 4602 | lockdep_assert_held(&dev_priv->pps_mutex); |
@@ -4544,13 +4619,15 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp) | |||
4544 | 4619 | ||
4545 | void intel_dp_encoder_reset(struct drm_encoder *encoder) | 4620 | void intel_dp_encoder_reset(struct drm_encoder *encoder) |
4546 | { | 4621 | { |
4547 | struct intel_dp *intel_dp; | 4622 | struct drm_i915_private *dev_priv = to_i915(encoder->dev); |
4623 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); | ||
4624 | |||
4625 | if (!HAS_DDI(dev_priv)) | ||
4626 | intel_dp->DP = I915_READ(intel_dp->output_reg); | ||
4548 | 4627 | ||
4549 | if (to_intel_encoder(encoder)->type != INTEL_OUTPUT_EDP) | 4628 | if (to_intel_encoder(encoder)->type != INTEL_OUTPUT_EDP) |
4550 | return; | 4629 | return; |
4551 | 4630 | ||
4552 | intel_dp = enc_to_intel_dp(encoder); | ||
4553 | |||
4554 | pps_lock(intel_dp); | 4631 | pps_lock(intel_dp); |
4555 | 4632 | ||
4556 | /* | 4633 | /* |
@@ -4572,6 +4649,7 @@ static const struct drm_connector_funcs intel_dp_connector_funcs = { | |||
4572 | .fill_modes = drm_helper_probe_single_connector_modes, | 4649 | .fill_modes = drm_helper_probe_single_connector_modes, |
4573 | .set_property = intel_dp_set_property, | 4650 | .set_property = intel_dp_set_property, |
4574 | .atomic_get_property = intel_connector_atomic_get_property, | 4651 | .atomic_get_property = intel_connector_atomic_get_property, |
4652 | .late_register = intel_dp_connector_register, | ||
4575 | .early_unregister = intel_dp_connector_unregister, | 4653 | .early_unregister = intel_dp_connector_unregister, |
4576 | .destroy = intel_dp_connector_destroy, | 4654 | .destroy = intel_dp_connector_destroy, |
4577 | .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, | 4655 | .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, |
@@ -4594,13 +4672,13 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd) | |||
4594 | struct intel_dp *intel_dp = &intel_dig_port->dp; | 4672 | struct intel_dp *intel_dp = &intel_dig_port->dp; |
4595 | struct intel_encoder *intel_encoder = &intel_dig_port->base; | 4673 | struct intel_encoder *intel_encoder = &intel_dig_port->base; |
4596 | struct drm_device *dev = intel_dig_port->base.base.dev; | 4674 | struct drm_device *dev = intel_dig_port->base.base.dev; |
4597 | struct drm_i915_private *dev_priv = dev->dev_private; | 4675 | struct drm_i915_private *dev_priv = to_i915(dev); |
4598 | enum intel_display_power_domain power_domain; | 4676 | enum intel_display_power_domain power_domain; |
4599 | enum irqreturn ret = IRQ_NONE; | 4677 | enum irqreturn ret = IRQ_NONE; |
4600 | 4678 | ||
4601 | if (intel_dig_port->base.type != INTEL_OUTPUT_EDP && | 4679 | if (intel_dig_port->base.type != INTEL_OUTPUT_EDP && |
4602 | intel_dig_port->base.type != INTEL_OUTPUT_HDMI) | 4680 | intel_dig_port->base.type != INTEL_OUTPUT_HDMI) |
4603 | intel_dig_port->base.type = INTEL_OUTPUT_DISPLAYPORT; | 4681 | intel_dig_port->base.type = INTEL_OUTPUT_DP; |
4604 | 4682 | ||
4605 | if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) { | 4683 | if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) { |
4606 | /* | 4684 | /* |
@@ -4662,7 +4740,7 @@ put_power: | |||
4662 | /* check the VBT to see whether the eDP is on another port */ | 4740 | /* check the VBT to see whether the eDP is on another port */ |
4663 | bool intel_dp_is_edp(struct drm_device *dev, enum port port) | 4741 | bool intel_dp_is_edp(struct drm_device *dev, enum port port) |
4664 | { | 4742 | { |
4665 | struct drm_i915_private *dev_priv = dev->dev_private; | 4743 | struct drm_i915_private *dev_priv = to_i915(dev); |
4666 | 4744 | ||
4667 | /* | 4745 | /* |
4668 | * eDP not supported on g4x. so bail out early just | 4746 | * eDP not supported on g4x. so bail out early just |
@@ -4704,82 +4782,93 @@ static void intel_dp_init_panel_power_timestamps(struct intel_dp *intel_dp) | |||
4704 | } | 4782 | } |
4705 | 4783 | ||
4706 | static void | 4784 | static void |
4707 | intel_dp_init_panel_power_sequencer(struct drm_device *dev, | 4785 | intel_pps_readout_hw_state(struct drm_i915_private *dev_priv, |
4708 | struct intel_dp *intel_dp) | 4786 | struct intel_dp *intel_dp, struct edp_power_seq *seq) |
4709 | { | 4787 | { |
4710 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
4711 | struct edp_power_seq cur, vbt, spec, | ||
4712 | *final = &intel_dp->pps_delays; | ||
4713 | u32 pp_on, pp_off, pp_div = 0, pp_ctl = 0; | 4788 | u32 pp_on, pp_off, pp_div = 0, pp_ctl = 0; |
4714 | i915_reg_t pp_ctrl_reg, pp_on_reg, pp_off_reg, pp_div_reg; | 4789 | struct pps_registers regs; |
4715 | 4790 | ||
4716 | lockdep_assert_held(&dev_priv->pps_mutex); | 4791 | intel_pps_get_registers(dev_priv, intel_dp, ®s); |
4717 | |||
4718 | /* already initialized? */ | ||
4719 | if (final->t11_t12 != 0) | ||
4720 | return; | ||
4721 | |||
4722 | if (IS_BROXTON(dev)) { | ||
4723 | /* | ||
4724 | * TODO: BXT has 2 sets of PPS registers. | ||
4725 | * Correct Register for Broxton need to be identified | ||
4726 | * using VBT. hardcoding for now | ||
4727 | */ | ||
4728 | pp_ctrl_reg = BXT_PP_CONTROL(0); | ||
4729 | pp_on_reg = BXT_PP_ON_DELAYS(0); | ||
4730 | pp_off_reg = BXT_PP_OFF_DELAYS(0); | ||
4731 | } else if (HAS_PCH_SPLIT(dev)) { | ||
4732 | pp_ctrl_reg = PCH_PP_CONTROL; | ||
4733 | pp_on_reg = PCH_PP_ON_DELAYS; | ||
4734 | pp_off_reg = PCH_PP_OFF_DELAYS; | ||
4735 | pp_div_reg = PCH_PP_DIVISOR; | ||
4736 | } else { | ||
4737 | enum pipe pipe = vlv_power_sequencer_pipe(intel_dp); | ||
4738 | |||
4739 | pp_ctrl_reg = VLV_PIPE_PP_CONTROL(pipe); | ||
4740 | pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe); | ||
4741 | pp_off_reg = VLV_PIPE_PP_OFF_DELAYS(pipe); | ||
4742 | pp_div_reg = VLV_PIPE_PP_DIVISOR(pipe); | ||
4743 | } | ||
4744 | 4792 | ||
4745 | /* Workaround: Need to write PP_CONTROL with the unlock key as | 4793 | /* Workaround: Need to write PP_CONTROL with the unlock key as |
4746 | * the very first thing. */ | 4794 | * the very first thing. */ |
4747 | pp_ctl = ironlake_get_pp_control(intel_dp); | 4795 | pp_ctl = ironlake_get_pp_control(intel_dp); |
4748 | 4796 | ||
4749 | pp_on = I915_READ(pp_on_reg); | 4797 | pp_on = I915_READ(regs.pp_on); |
4750 | pp_off = I915_READ(pp_off_reg); | 4798 | pp_off = I915_READ(regs.pp_off); |
4751 | if (!IS_BROXTON(dev)) { | 4799 | if (!IS_BROXTON(dev_priv)) { |
4752 | I915_WRITE(pp_ctrl_reg, pp_ctl); | 4800 | I915_WRITE(regs.pp_ctrl, pp_ctl); |
4753 | pp_div = I915_READ(pp_div_reg); | 4801 | pp_div = I915_READ(regs.pp_div); |
4754 | } | 4802 | } |
4755 | 4803 | ||
4756 | /* Pull timing values out of registers */ | 4804 | /* Pull timing values out of registers */ |
4757 | cur.t1_t3 = (pp_on & PANEL_POWER_UP_DELAY_MASK) >> | 4805 | seq->t1_t3 = (pp_on & PANEL_POWER_UP_DELAY_MASK) >> |
4758 | PANEL_POWER_UP_DELAY_SHIFT; | 4806 | PANEL_POWER_UP_DELAY_SHIFT; |
4759 | 4807 | ||
4760 | cur.t8 = (pp_on & PANEL_LIGHT_ON_DELAY_MASK) >> | 4808 | seq->t8 = (pp_on & PANEL_LIGHT_ON_DELAY_MASK) >> |
4761 | PANEL_LIGHT_ON_DELAY_SHIFT; | 4809 | PANEL_LIGHT_ON_DELAY_SHIFT; |
4762 | 4810 | ||
4763 | cur.t9 = (pp_off & PANEL_LIGHT_OFF_DELAY_MASK) >> | 4811 | seq->t9 = (pp_off & PANEL_LIGHT_OFF_DELAY_MASK) >> |
4764 | PANEL_LIGHT_OFF_DELAY_SHIFT; | 4812 | PANEL_LIGHT_OFF_DELAY_SHIFT; |
4765 | 4813 | ||
4766 | cur.t10 = (pp_off & PANEL_POWER_DOWN_DELAY_MASK) >> | 4814 | seq->t10 = (pp_off & PANEL_POWER_DOWN_DELAY_MASK) >> |
4767 | PANEL_POWER_DOWN_DELAY_SHIFT; | 4815 | PANEL_POWER_DOWN_DELAY_SHIFT; |
4768 | 4816 | ||
4769 | if (IS_BROXTON(dev)) { | 4817 | if (IS_BROXTON(dev_priv)) { |
4770 | u16 tmp = (pp_ctl & BXT_POWER_CYCLE_DELAY_MASK) >> | 4818 | u16 tmp = (pp_ctl & BXT_POWER_CYCLE_DELAY_MASK) >> |
4771 | BXT_POWER_CYCLE_DELAY_SHIFT; | 4819 | BXT_POWER_CYCLE_DELAY_SHIFT; |
4772 | if (tmp > 0) | 4820 | if (tmp > 0) |
4773 | cur.t11_t12 = (tmp - 1) * 1000; | 4821 | seq->t11_t12 = (tmp - 1) * 1000; |
4774 | else | 4822 | else |
4775 | cur.t11_t12 = 0; | 4823 | seq->t11_t12 = 0; |
4776 | } else { | 4824 | } else { |
4777 | cur.t11_t12 = ((pp_div & PANEL_POWER_CYCLE_DELAY_MASK) >> | 4825 | seq->t11_t12 = ((pp_div & PANEL_POWER_CYCLE_DELAY_MASK) >> |
4778 | PANEL_POWER_CYCLE_DELAY_SHIFT) * 1000; | 4826 | PANEL_POWER_CYCLE_DELAY_SHIFT) * 1000; |
4779 | } | 4827 | } |
4828 | } | ||
4829 | |||
4830 | static void | ||
4831 | intel_pps_dump_state(const char *state_name, const struct edp_power_seq *seq) | ||
4832 | { | ||
4833 | DRM_DEBUG_KMS("%s t1_t3 %d t8 %d t9 %d t10 %d t11_t12 %d\n", | ||
4834 | state_name, | ||
4835 | seq->t1_t3, seq->t8, seq->t9, seq->t10, seq->t11_t12); | ||
4836 | } | ||
4837 | |||
4838 | static void | ||
4839 | intel_pps_verify_state(struct drm_i915_private *dev_priv, | ||
4840 | struct intel_dp *intel_dp) | ||
4841 | { | ||
4842 | struct edp_power_seq hw; | ||
4843 | struct edp_power_seq *sw = &intel_dp->pps_delays; | ||
4844 | |||
4845 | intel_pps_readout_hw_state(dev_priv, intel_dp, &hw); | ||
4846 | |||
4847 | if (hw.t1_t3 != sw->t1_t3 || hw.t8 != sw->t8 || hw.t9 != sw->t9 || | ||
4848 | hw.t10 != sw->t10 || hw.t11_t12 != sw->t11_t12) { | ||
4849 | DRM_ERROR("PPS state mismatch\n"); | ||
4850 | intel_pps_dump_state("sw", sw); | ||
4851 | intel_pps_dump_state("hw", &hw); | ||
4852 | } | ||
4853 | } | ||
4854 | |||
4855 | static void | ||
4856 | intel_dp_init_panel_power_sequencer(struct drm_device *dev, | ||
4857 | struct intel_dp *intel_dp) | ||
4858 | { | ||
4859 | struct drm_i915_private *dev_priv = to_i915(dev); | ||
4860 | struct edp_power_seq cur, vbt, spec, | ||
4861 | *final = &intel_dp->pps_delays; | ||
4862 | |||
4863 | lockdep_assert_held(&dev_priv->pps_mutex); | ||
4780 | 4864 | ||
4781 | DRM_DEBUG_KMS("cur t1_t3 %d t8 %d t9 %d t10 %d t11_t12 %d\n", | 4865 | /* already initialized? */ |
4782 | cur.t1_t3, cur.t8, cur.t9, cur.t10, cur.t11_t12); | 4866 | if (final->t11_t12 != 0) |
4867 | return; | ||
4868 | |||
4869 | intel_pps_readout_hw_state(dev_priv, intel_dp, &cur); | ||
4870 | |||
4871 | intel_pps_dump_state("cur", &cur); | ||
4783 | 4872 | ||
4784 | vbt = dev_priv->vbt.edp.pps; | 4873 | vbt = dev_priv->vbt.edp.pps; |
4785 | 4874 | ||
@@ -4795,8 +4884,7 @@ intel_dp_init_panel_power_sequencer(struct drm_device *dev, | |||
4795 | * too. */ | 4884 | * too. */ |
4796 | spec.t11_t12 = (510 + 100) * 10; | 4885 | spec.t11_t12 = (510 + 100) * 10; |
4797 | 4886 | ||
4798 | DRM_DEBUG_KMS("vbt t1_t3 %d t8 %d t9 %d t10 %d t11_t12 %d\n", | 4887 | intel_pps_dump_state("vbt", &vbt); |
4799 | vbt.t1_t3, vbt.t8, vbt.t9, vbt.t10, vbt.t11_t12); | ||
4800 | 4888 | ||
4801 | /* Use the max of the register settings and vbt. If both are | 4889 | /* Use the max of the register settings and vbt. If both are |
4802 | * unset, fall back to the spec limits. */ | 4890 | * unset, fall back to the spec limits. */ |
@@ -4824,59 +4912,41 @@ intel_dp_init_panel_power_sequencer(struct drm_device *dev, | |||
4824 | 4912 | ||
4825 | DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n", | 4913 | DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n", |
4826 | intel_dp->backlight_on_delay, intel_dp->backlight_off_delay); | 4914 | intel_dp->backlight_on_delay, intel_dp->backlight_off_delay); |
4915 | |||
4916 | /* | ||
4917 | * We override the HW backlight delays to 1 because we do manual waits | ||
4918 | * on them. For T8, even BSpec recommends doing it. For T9, if we | ||
4919 | * don't do this, we'll end up waiting for the backlight off delay | ||
4920 | * twice: once when we do the manual sleep, and once when we disable | ||
4921 | * the panel and wait for the PP_STATUS bit to become zero. | ||
4922 | */ | ||
4923 | final->t8 = 1; | ||
4924 | final->t9 = 1; | ||
4827 | } | 4925 | } |
4828 | 4926 | ||
4829 | static void | 4927 | static void |
4830 | intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev, | 4928 | intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev, |
4831 | struct intel_dp *intel_dp) | 4929 | struct intel_dp *intel_dp) |
4832 | { | 4930 | { |
4833 | struct drm_i915_private *dev_priv = dev->dev_private; | 4931 | struct drm_i915_private *dev_priv = to_i915(dev); |
4834 | u32 pp_on, pp_off, pp_div, port_sel = 0; | 4932 | u32 pp_on, pp_off, pp_div, port_sel = 0; |
4835 | int div = dev_priv->rawclk_freq / 1000; | 4933 | int div = dev_priv->rawclk_freq / 1000; |
4836 | i915_reg_t pp_on_reg, pp_off_reg, pp_div_reg, pp_ctrl_reg; | 4934 | struct pps_registers regs; |
4837 | enum port port = dp_to_dig_port(intel_dp)->port; | 4935 | enum port port = dp_to_dig_port(intel_dp)->port; |
4838 | const struct edp_power_seq *seq = &intel_dp->pps_delays; | 4936 | const struct edp_power_seq *seq = &intel_dp->pps_delays; |
4839 | 4937 | ||
4840 | lockdep_assert_held(&dev_priv->pps_mutex); | 4938 | lockdep_assert_held(&dev_priv->pps_mutex); |
4841 | 4939 | ||
4842 | if (IS_BROXTON(dev)) { | 4940 | intel_pps_get_registers(dev_priv, intel_dp, ®s); |
4843 | /* | ||
4844 | * TODO: BXT has 2 sets of PPS registers. | ||
4845 | * Correct Register for Broxton need to be identified | ||
4846 | * using VBT. hardcoding for now | ||
4847 | */ | ||
4848 | pp_ctrl_reg = BXT_PP_CONTROL(0); | ||
4849 | pp_on_reg = BXT_PP_ON_DELAYS(0); | ||
4850 | pp_off_reg = BXT_PP_OFF_DELAYS(0); | ||
4851 | |||
4852 | } else if (HAS_PCH_SPLIT(dev)) { | ||
4853 | pp_on_reg = PCH_PP_ON_DELAYS; | ||
4854 | pp_off_reg = PCH_PP_OFF_DELAYS; | ||
4855 | pp_div_reg = PCH_PP_DIVISOR; | ||
4856 | } else { | ||
4857 | enum pipe pipe = vlv_power_sequencer_pipe(intel_dp); | ||
4858 | 4941 | ||
4859 | pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe); | ||
4860 | pp_off_reg = VLV_PIPE_PP_OFF_DELAYS(pipe); | ||
4861 | pp_div_reg = VLV_PIPE_PP_DIVISOR(pipe); | ||
4862 | } | ||
4863 | |||
4864 | /* | ||
4865 | * And finally store the new values in the power sequencer. The | ||
4866 | * backlight delays are set to 1 because we do manual waits on them. For | ||
4867 | * T8, even BSpec recommends doing it. For T9, if we don't do this, | ||
4868 | * we'll end up waiting for the backlight off delay twice: once when we | ||
4869 | * do the manual sleep, and once when we disable the panel and wait for | ||
4870 | * the PP_STATUS bit to become zero. | ||
4871 | */ | ||
4872 | pp_on = (seq->t1_t3 << PANEL_POWER_UP_DELAY_SHIFT) | | 4942 | pp_on = (seq->t1_t3 << PANEL_POWER_UP_DELAY_SHIFT) | |
4873 | (1 << PANEL_LIGHT_ON_DELAY_SHIFT); | 4943 | (seq->t8 << PANEL_LIGHT_ON_DELAY_SHIFT); |
4874 | pp_off = (1 << PANEL_LIGHT_OFF_DELAY_SHIFT) | | 4944 | pp_off = (seq->t9 << PANEL_LIGHT_OFF_DELAY_SHIFT) | |
4875 | (seq->t10 << PANEL_POWER_DOWN_DELAY_SHIFT); | 4945 | (seq->t10 << PANEL_POWER_DOWN_DELAY_SHIFT); |
4876 | /* Compute the divisor for the pp clock, simply match the Bspec | 4946 | /* Compute the divisor for the pp clock, simply match the Bspec |
4877 | * formula. */ | 4947 | * formula. */ |
4878 | if (IS_BROXTON(dev)) { | 4948 | if (IS_BROXTON(dev)) { |
4879 | pp_div = I915_READ(pp_ctrl_reg); | 4949 | pp_div = I915_READ(regs.pp_ctrl); |
4880 | pp_div &= ~BXT_POWER_CYCLE_DELAY_MASK; | 4950 | pp_div &= ~BXT_POWER_CYCLE_DELAY_MASK; |
4881 | pp_div |= (DIV_ROUND_UP((seq->t11_t12 + 1), 1000) | 4951 | pp_div |= (DIV_ROUND_UP((seq->t11_t12 + 1), 1000) |
4882 | << BXT_POWER_CYCLE_DELAY_SHIFT); | 4952 | << BXT_POWER_CYCLE_DELAY_SHIFT); |
@@ -4899,19 +4969,19 @@ intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev, | |||
4899 | 4969 | ||
4900 | pp_on |= port_sel; | 4970 | pp_on |= port_sel; |
4901 | 4971 | ||
4902 | I915_WRITE(pp_on_reg, pp_on); | 4972 | I915_WRITE(regs.pp_on, pp_on); |
4903 | I915_WRITE(pp_off_reg, pp_off); | 4973 | I915_WRITE(regs.pp_off, pp_off); |
4904 | if (IS_BROXTON(dev)) | 4974 | if (IS_BROXTON(dev)) |
4905 | I915_WRITE(pp_ctrl_reg, pp_div); | 4975 | I915_WRITE(regs.pp_ctrl, pp_div); |
4906 | else | 4976 | else |
4907 | I915_WRITE(pp_div_reg, pp_div); | 4977 | I915_WRITE(regs.pp_div, pp_div); |
4908 | 4978 | ||
4909 | DRM_DEBUG_KMS("panel power sequencer register settings: PP_ON %#x, PP_OFF %#x, PP_DIV %#x\n", | 4979 | DRM_DEBUG_KMS("panel power sequencer register settings: PP_ON %#x, PP_OFF %#x, PP_DIV %#x\n", |
4910 | I915_READ(pp_on_reg), | 4980 | I915_READ(regs.pp_on), |
4911 | I915_READ(pp_off_reg), | 4981 | I915_READ(regs.pp_off), |
4912 | IS_BROXTON(dev) ? | 4982 | IS_BROXTON(dev) ? |
4913 | (I915_READ(pp_ctrl_reg) & BXT_POWER_CYCLE_DELAY_MASK) : | 4983 | (I915_READ(regs.pp_ctrl) & BXT_POWER_CYCLE_DELAY_MASK) : |
4914 | I915_READ(pp_div_reg)); | 4984 | I915_READ(regs.pp_div)); |
4915 | } | 4985 | } |
4916 | 4986 | ||
4917 | /** | 4987 | /** |
@@ -4928,7 +4998,7 @@ intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev, | |||
4928 | */ | 4998 | */ |
4929 | static void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate) | 4999 | static void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate) |
4930 | { | 5000 | { |
4931 | struct drm_i915_private *dev_priv = dev->dev_private; | 5001 | struct drm_i915_private *dev_priv = to_i915(dev); |
4932 | struct intel_encoder *encoder; | 5002 | struct intel_encoder *encoder; |
4933 | struct intel_digital_port *dig_port = NULL; | 5003 | struct intel_digital_port *dig_port = NULL; |
4934 | struct intel_dp *intel_dp = dev_priv->drrs.dp; | 5004 | struct intel_dp *intel_dp = dev_priv->drrs.dp; |
@@ -5027,7 +5097,7 @@ static void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate) | |||
5027 | void intel_edp_drrs_enable(struct intel_dp *intel_dp) | 5097 | void intel_edp_drrs_enable(struct intel_dp *intel_dp) |
5028 | { | 5098 | { |
5029 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 5099 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
5030 | struct drm_i915_private *dev_priv = dev->dev_private; | 5100 | struct drm_i915_private *dev_priv = to_i915(dev); |
5031 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 5101 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
5032 | struct drm_crtc *crtc = dig_port->base.base.crtc; | 5102 | struct drm_crtc *crtc = dig_port->base.base.crtc; |
5033 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 5103 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
@@ -5059,7 +5129,7 @@ unlock: | |||
5059 | void intel_edp_drrs_disable(struct intel_dp *intel_dp) | 5129 | void intel_edp_drrs_disable(struct intel_dp *intel_dp) |
5060 | { | 5130 | { |
5061 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 5131 | struct drm_device *dev = intel_dp_to_dev(intel_dp); |
5062 | struct drm_i915_private *dev_priv = dev->dev_private; | 5132 | struct drm_i915_private *dev_priv = to_i915(dev); |
5063 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 5133 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
5064 | struct drm_crtc *crtc = dig_port->base.base.crtc; | 5134 | struct drm_crtc *crtc = dig_port->base.base.crtc; |
5065 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 5135 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
@@ -5074,9 +5144,9 @@ void intel_edp_drrs_disable(struct intel_dp *intel_dp) | |||
5074 | } | 5144 | } |
5075 | 5145 | ||
5076 | if (dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR) | 5146 | if (dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR) |
5077 | intel_dp_set_drrs_state(dev_priv->dev, | 5147 | intel_dp_set_drrs_state(&dev_priv->drm, |
5078 | intel_dp->attached_connector->panel. | 5148 | intel_dp->attached_connector->panel. |
5079 | fixed_mode->vrefresh); | 5149 | fixed_mode->vrefresh); |
5080 | 5150 | ||
5081 | dev_priv->drrs.dp = NULL; | 5151 | dev_priv->drrs.dp = NULL; |
5082 | mutex_unlock(&dev_priv->drrs.mutex); | 5152 | mutex_unlock(&dev_priv->drrs.mutex); |
@@ -5106,9 +5176,9 @@ static void intel_edp_drrs_downclock_work(struct work_struct *work) | |||
5106 | goto unlock; | 5176 | goto unlock; |
5107 | 5177 | ||
5108 | if (dev_priv->drrs.refresh_rate_type != DRRS_LOW_RR) | 5178 | if (dev_priv->drrs.refresh_rate_type != DRRS_LOW_RR) |
5109 | intel_dp_set_drrs_state(dev_priv->dev, | 5179 | intel_dp_set_drrs_state(&dev_priv->drm, |
5110 | intel_dp->attached_connector->panel. | 5180 | intel_dp->attached_connector->panel. |
5111 | downclock_mode->vrefresh); | 5181 | downclock_mode->vrefresh); |
5112 | 5182 | ||
5113 | unlock: | 5183 | unlock: |
5114 | mutex_unlock(&dev_priv->drrs.mutex); | 5184 | mutex_unlock(&dev_priv->drrs.mutex); |
@@ -5127,7 +5197,7 @@ unlock: | |||
5127 | void intel_edp_drrs_invalidate(struct drm_device *dev, | 5197 | void intel_edp_drrs_invalidate(struct drm_device *dev, |
5128 | unsigned frontbuffer_bits) | 5198 | unsigned frontbuffer_bits) |
5129 | { | 5199 | { |
5130 | struct drm_i915_private *dev_priv = dev->dev_private; | 5200 | struct drm_i915_private *dev_priv = to_i915(dev); |
5131 | struct drm_crtc *crtc; | 5201 | struct drm_crtc *crtc; |
5132 | enum pipe pipe; | 5202 | enum pipe pipe; |
5133 | 5203 | ||
@@ -5150,9 +5220,9 @@ void intel_edp_drrs_invalidate(struct drm_device *dev, | |||
5150 | 5220 | ||
5151 | /* invalidate means busy screen hence upclock */ | 5221 | /* invalidate means busy screen hence upclock */ |
5152 | if (frontbuffer_bits && dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR) | 5222 | if (frontbuffer_bits && dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR) |
5153 | intel_dp_set_drrs_state(dev_priv->dev, | 5223 | intel_dp_set_drrs_state(&dev_priv->drm, |
5154 | dev_priv->drrs.dp->attached_connector->panel. | 5224 | dev_priv->drrs.dp->attached_connector->panel. |
5155 | fixed_mode->vrefresh); | 5225 | fixed_mode->vrefresh); |
5156 | 5226 | ||
5157 | mutex_unlock(&dev_priv->drrs.mutex); | 5227 | mutex_unlock(&dev_priv->drrs.mutex); |
5158 | } | 5228 | } |
@@ -5172,7 +5242,7 @@ void intel_edp_drrs_invalidate(struct drm_device *dev, | |||
5172 | void intel_edp_drrs_flush(struct drm_device *dev, | 5242 | void intel_edp_drrs_flush(struct drm_device *dev, |
5173 | unsigned frontbuffer_bits) | 5243 | unsigned frontbuffer_bits) |
5174 | { | 5244 | { |
5175 | struct drm_i915_private *dev_priv = dev->dev_private; | 5245 | struct drm_i915_private *dev_priv = to_i915(dev); |
5176 | struct drm_crtc *crtc; | 5246 | struct drm_crtc *crtc; |
5177 | enum pipe pipe; | 5247 | enum pipe pipe; |
5178 | 5248 | ||
@@ -5195,9 +5265,9 @@ void intel_edp_drrs_flush(struct drm_device *dev, | |||
5195 | 5265 | ||
5196 | /* flush means busy screen hence upclock */ | 5266 | /* flush means busy screen hence upclock */ |
5197 | if (frontbuffer_bits && dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR) | 5267 | if (frontbuffer_bits && dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR) |
5198 | intel_dp_set_drrs_state(dev_priv->dev, | 5268 | intel_dp_set_drrs_state(&dev_priv->drm, |
5199 | dev_priv->drrs.dp->attached_connector->panel. | 5269 | dev_priv->drrs.dp->attached_connector->panel. |
5200 | fixed_mode->vrefresh); | 5270 | fixed_mode->vrefresh); |
5201 | 5271 | ||
5202 | /* | 5272 | /* |
5203 | * flush also means no more activity hence schedule downclock, if all | 5273 | * flush also means no more activity hence schedule downclock, if all |
@@ -5265,7 +5335,7 @@ intel_dp_drrs_init(struct intel_connector *intel_connector, | |||
5265 | { | 5335 | { |
5266 | struct drm_connector *connector = &intel_connector->base; | 5336 | struct drm_connector *connector = &intel_connector->base; |
5267 | struct drm_device *dev = connector->dev; | 5337 | struct drm_device *dev = connector->dev; |
5268 | struct drm_i915_private *dev_priv = dev->dev_private; | 5338 | struct drm_i915_private *dev_priv = to_i915(dev); |
5269 | struct drm_display_mode *downclock_mode = NULL; | 5339 | struct drm_display_mode *downclock_mode = NULL; |
5270 | 5340 | ||
5271 | INIT_DELAYED_WORK(&dev_priv->drrs.work, intel_edp_drrs_downclock_work); | 5341 | INIT_DELAYED_WORK(&dev_priv->drrs.work, intel_edp_drrs_downclock_work); |
@@ -5303,7 +5373,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, | |||
5303 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 5373 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
5304 | struct intel_encoder *intel_encoder = &intel_dig_port->base; | 5374 | struct intel_encoder *intel_encoder = &intel_dig_port->base; |
5305 | struct drm_device *dev = intel_encoder->base.dev; | 5375 | struct drm_device *dev = intel_encoder->base.dev; |
5306 | struct drm_i915_private *dev_priv = dev->dev_private; | 5376 | struct drm_i915_private *dev_priv = to_i915(dev); |
5307 | struct drm_display_mode *fixed_mode = NULL; | 5377 | struct drm_display_mode *fixed_mode = NULL; |
5308 | struct drm_display_mode *downclock_mode = NULL; | 5378 | struct drm_display_mode *downclock_mode = NULL; |
5309 | bool has_dpcd; | 5379 | bool has_dpcd; |
@@ -5314,8 +5384,32 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, | |||
5314 | if (!is_edp(intel_dp)) | 5384 | if (!is_edp(intel_dp)) |
5315 | return true; | 5385 | return true; |
5316 | 5386 | ||
5387 | /* | ||
5388 | * On IBX/CPT we may get here with LVDS already registered. Since the | ||
5389 | * driver uses the only internal power sequencer available for both | ||
5390 | * eDP and LVDS bail out early in this case to prevent interfering | ||
5391 | * with an already powered-on LVDS power sequencer. | ||
5392 | */ | ||
5393 | if (intel_get_lvds_encoder(dev)) { | ||
5394 | WARN_ON(!(HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv))); | ||
5395 | DRM_INFO("LVDS was detected, not registering eDP\n"); | ||
5396 | |||
5397 | return false; | ||
5398 | } | ||
5399 | |||
5317 | pps_lock(intel_dp); | 5400 | pps_lock(intel_dp); |
5401 | |||
5402 | intel_dp_init_panel_power_timestamps(intel_dp); | ||
5403 | |||
5404 | if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) { | ||
5405 | vlv_initial_power_sequencer_setup(intel_dp); | ||
5406 | } else { | ||
5407 | intel_dp_init_panel_power_sequencer(dev, intel_dp); | ||
5408 | intel_dp_init_panel_power_sequencer_registers(dev, intel_dp); | ||
5409 | } | ||
5410 | |||
5318 | intel_edp_panel_vdd_sanitize(intel_dp); | 5411 | intel_edp_panel_vdd_sanitize(intel_dp); |
5412 | |||
5319 | pps_unlock(intel_dp); | 5413 | pps_unlock(intel_dp); |
5320 | 5414 | ||
5321 | /* Cache DPCD and EDID for edp. */ | 5415 | /* Cache DPCD and EDID for edp. */ |
@@ -5329,14 +5423,9 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, | |||
5329 | } else { | 5423 | } else { |
5330 | /* if this fails, presume the device is a ghost */ | 5424 | /* if this fails, presume the device is a ghost */ |
5331 | DRM_INFO("failed to retrieve link info, disabling eDP\n"); | 5425 | DRM_INFO("failed to retrieve link info, disabling eDP\n"); |
5332 | return false; | 5426 | goto out_vdd_off; |
5333 | } | 5427 | } |
5334 | 5428 | ||
5335 | /* We now know it's not a ghost, init power sequence regs. */ | ||
5336 | pps_lock(intel_dp); | ||
5337 | intel_dp_init_panel_power_sequencer_registers(dev, intel_dp); | ||
5338 | pps_unlock(intel_dp); | ||
5339 | |||
5340 | mutex_lock(&dev->mode_config.mutex); | 5429 | mutex_lock(&dev->mode_config.mutex); |
5341 | edid = drm_get_edid(connector, &intel_dp->aux.ddc); | 5430 | edid = drm_get_edid(connector, &intel_dp->aux.ddc); |
5342 | if (edid) { | 5431 | if (edid) { |
@@ -5404,6 +5493,18 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, | |||
5404 | intel_panel_setup_backlight(connector, pipe); | 5493 | intel_panel_setup_backlight(connector, pipe); |
5405 | 5494 | ||
5406 | return true; | 5495 | return true; |
5496 | |||
5497 | out_vdd_off: | ||
5498 | cancel_delayed_work_sync(&intel_dp->panel_vdd_work); | ||
5499 | /* | ||
5500 | * vdd might still be enabled do to the delayed vdd off. | ||
5501 | * Make sure vdd is actually turned off here. | ||
5502 | */ | ||
5503 | pps_lock(intel_dp); | ||
5504 | edp_panel_vdd_off_sync(intel_dp); | ||
5505 | pps_unlock(intel_dp); | ||
5506 | |||
5507 | return false; | ||
5407 | } | 5508 | } |
5408 | 5509 | ||
5409 | bool | 5510 | bool |
@@ -5414,9 +5515,9 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port, | |||
5414 | struct intel_dp *intel_dp = &intel_dig_port->dp; | 5515 | struct intel_dp *intel_dp = &intel_dig_port->dp; |
5415 | struct intel_encoder *intel_encoder = &intel_dig_port->base; | 5516 | struct intel_encoder *intel_encoder = &intel_dig_port->base; |
5416 | struct drm_device *dev = intel_encoder->base.dev; | 5517 | struct drm_device *dev = intel_encoder->base.dev; |
5417 | struct drm_i915_private *dev_priv = dev->dev_private; | 5518 | struct drm_i915_private *dev_priv = to_i915(dev); |
5418 | enum port port = intel_dig_port->port; | 5519 | enum port port = intel_dig_port->port; |
5419 | int type, ret; | 5520 | int type; |
5420 | 5521 | ||
5421 | if (WARN(intel_dig_port->max_lanes < 1, | 5522 | if (WARN(intel_dig_port->max_lanes < 1, |
5422 | "Not enough lanes (%d) for DP on port %c\n", | 5523 | "Not enough lanes (%d) for DP on port %c\n", |
@@ -5475,11 +5576,12 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port, | |||
5475 | connector->interlace_allowed = true; | 5576 | connector->interlace_allowed = true; |
5476 | connector->doublescan_allowed = 0; | 5577 | connector->doublescan_allowed = 0; |
5477 | 5578 | ||
5579 | intel_dp_aux_init(intel_dp, intel_connector); | ||
5580 | |||
5478 | INIT_DELAYED_WORK(&intel_dp->panel_vdd_work, | 5581 | INIT_DELAYED_WORK(&intel_dp->panel_vdd_work, |
5479 | edp_panel_vdd_work); | 5582 | edp_panel_vdd_work); |
5480 | 5583 | ||
5481 | intel_connector_attach_encoder(intel_connector, intel_encoder); | 5584 | intel_connector_attach_encoder(intel_connector, intel_encoder); |
5482 | drm_connector_register(connector); | ||
5483 | 5585 | ||
5484 | if (HAS_DDI(dev)) | 5586 | if (HAS_DDI(dev)) |
5485 | intel_connector->get_hw_state = intel_ddi_connector_get_hw_state; | 5587 | intel_connector->get_hw_state = intel_ddi_connector_get_hw_state; |
@@ -5509,22 +5611,8 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port, | |||
5509 | BUG(); | 5611 | BUG(); |
5510 | } | 5612 | } |
5511 | 5613 | ||
5512 | if (is_edp(intel_dp)) { | ||
5513 | pps_lock(intel_dp); | ||
5514 | intel_dp_init_panel_power_timestamps(intel_dp); | ||
5515 | if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) | ||
5516 | vlv_initial_power_sequencer_setup(intel_dp); | ||
5517 | else | ||
5518 | intel_dp_init_panel_power_sequencer(dev, intel_dp); | ||
5519 | pps_unlock(intel_dp); | ||
5520 | } | ||
5521 | |||
5522 | ret = intel_dp_aux_init(intel_dp, intel_connector); | ||
5523 | if (ret) | ||
5524 | goto fail; | ||
5525 | |||
5526 | /* init MST on ports that can support it */ | 5614 | /* init MST on ports that can support it */ |
5527 | if (HAS_DP_MST(dev) && | 5615 | if (HAS_DP_MST(dev) && !is_edp(intel_dp) && |
5528 | (port == PORT_B || port == PORT_C || port == PORT_D)) | 5616 | (port == PORT_B || port == PORT_C || port == PORT_D)) |
5529 | intel_dp_mst_encoder_init(intel_dig_port, | 5617 | intel_dp_mst_encoder_init(intel_dig_port, |
5530 | intel_connector->base.base.id); | 5618 | intel_connector->base.base.id); |
@@ -5546,22 +5634,9 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port, | |||
5546 | I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd); | 5634 | I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd); |
5547 | } | 5635 | } |
5548 | 5636 | ||
5549 | i915_debugfs_connector_add(connector); | ||
5550 | |||
5551 | return true; | 5637 | return true; |
5552 | 5638 | ||
5553 | fail: | 5639 | fail: |
5554 | if (is_edp(intel_dp)) { | ||
5555 | cancel_delayed_work_sync(&intel_dp->panel_vdd_work); | ||
5556 | /* | ||
5557 | * vdd might still be enabled do to the delayed vdd off. | ||
5558 | * Make sure vdd is actually turned off here. | ||
5559 | */ | ||
5560 | pps_lock(intel_dp); | ||
5561 | edp_panel_vdd_off_sync(intel_dp); | ||
5562 | pps_unlock(intel_dp); | ||
5563 | } | ||
5564 | drm_connector_unregister(connector); | ||
5565 | drm_connector_cleanup(connector); | 5640 | drm_connector_cleanup(connector); |
5566 | 5641 | ||
5567 | return false; | 5642 | return false; |
@@ -5571,7 +5646,7 @@ bool intel_dp_init(struct drm_device *dev, | |||
5571 | i915_reg_t output_reg, | 5646 | i915_reg_t output_reg, |
5572 | enum port port) | 5647 | enum port port) |
5573 | { | 5648 | { |
5574 | struct drm_i915_private *dev_priv = dev->dev_private; | 5649 | struct drm_i915_private *dev_priv = to_i915(dev); |
5575 | struct intel_digital_port *intel_dig_port; | 5650 | struct intel_digital_port *intel_dig_port; |
5576 | struct intel_encoder *intel_encoder; | 5651 | struct intel_encoder *intel_encoder; |
5577 | struct drm_encoder *encoder; | 5652 | struct drm_encoder *encoder; |
@@ -5619,7 +5694,7 @@ bool intel_dp_init(struct drm_device *dev, | |||
5619 | intel_dig_port->dp.output_reg = output_reg; | 5694 | intel_dig_port->dp.output_reg = output_reg; |
5620 | intel_dig_port->max_lanes = 4; | 5695 | intel_dig_port->max_lanes = 4; |
5621 | 5696 | ||
5622 | intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT; | 5697 | intel_encoder->type = INTEL_OUTPUT_DP; |
5623 | if (IS_CHERRYVIEW(dev)) { | 5698 | if (IS_CHERRYVIEW(dev)) { |
5624 | if (port == PORT_D) | 5699 | if (port == PORT_D) |
5625 | intel_encoder->crtc_mask = 1 << 2; | 5700 | intel_encoder->crtc_mask = 1 << 2; |
@@ -5649,43 +5724,35 @@ err_connector_alloc: | |||
5649 | 5724 | ||
5650 | void intel_dp_mst_suspend(struct drm_device *dev) | 5725 | void intel_dp_mst_suspend(struct drm_device *dev) |
5651 | { | 5726 | { |
5652 | struct drm_i915_private *dev_priv = dev->dev_private; | 5727 | struct drm_i915_private *dev_priv = to_i915(dev); |
5653 | int i; | 5728 | int i; |
5654 | 5729 | ||
5655 | /* disable MST */ | 5730 | /* disable MST */ |
5656 | for (i = 0; i < I915_MAX_PORTS; i++) { | 5731 | for (i = 0; i < I915_MAX_PORTS; i++) { |
5657 | struct intel_digital_port *intel_dig_port = dev_priv->hotplug.irq_port[i]; | 5732 | struct intel_digital_port *intel_dig_port = dev_priv->hotplug.irq_port[i]; |
5658 | if (!intel_dig_port) | 5733 | |
5734 | if (!intel_dig_port || !intel_dig_port->dp.can_mst) | ||
5659 | continue; | 5735 | continue; |
5660 | 5736 | ||
5661 | if (intel_dig_port->base.type == INTEL_OUTPUT_DISPLAYPORT) { | 5737 | if (intel_dig_port->dp.is_mst) |
5662 | if (!intel_dig_port->dp.can_mst) | 5738 | drm_dp_mst_topology_mgr_suspend(&intel_dig_port->dp.mst_mgr); |
5663 | continue; | ||
5664 | if (intel_dig_port->dp.is_mst) | ||
5665 | drm_dp_mst_topology_mgr_suspend(&intel_dig_port->dp.mst_mgr); | ||
5666 | } | ||
5667 | } | 5739 | } |
5668 | } | 5740 | } |
5669 | 5741 | ||
5670 | void intel_dp_mst_resume(struct drm_device *dev) | 5742 | void intel_dp_mst_resume(struct drm_device *dev) |
5671 | { | 5743 | { |
5672 | struct drm_i915_private *dev_priv = dev->dev_private; | 5744 | struct drm_i915_private *dev_priv = to_i915(dev); |
5673 | int i; | 5745 | int i; |
5674 | 5746 | ||
5675 | for (i = 0; i < I915_MAX_PORTS; i++) { | 5747 | for (i = 0; i < I915_MAX_PORTS; i++) { |
5676 | struct intel_digital_port *intel_dig_port = dev_priv->hotplug.irq_port[i]; | 5748 | struct intel_digital_port *intel_dig_port = dev_priv->hotplug.irq_port[i]; |
5677 | if (!intel_dig_port) | 5749 | int ret; |
5678 | continue; | ||
5679 | if (intel_dig_port->base.type == INTEL_OUTPUT_DISPLAYPORT) { | ||
5680 | int ret; | ||
5681 | 5750 | ||
5682 | if (!intel_dig_port->dp.can_mst) | 5751 | if (!intel_dig_port || !intel_dig_port->dp.can_mst) |
5683 | continue; | 5752 | continue; |
5684 | 5753 | ||
5685 | ret = drm_dp_mst_topology_mgr_resume(&intel_dig_port->dp.mst_mgr); | 5754 | ret = drm_dp_mst_topology_mgr_resume(&intel_dig_port->dp.mst_mgr); |
5686 | if (ret != 0) { | 5755 | if (ret) |
5687 | intel_dp_check_mst_status(&intel_dig_port->dp); | 5756 | intel_dp_check_mst_status(&intel_dig_port->dp); |
5688 | } | ||
5689 | } | ||
5690 | } | 5757 | } |
5691 | } | 5758 | } |