diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 129 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 35 |
3 files changed, 30 insertions, 150 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index bc5c04d5890f..61fd61969e21 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -1666,127 +1666,20 @@ static int i915_edp_psr_status(struct seq_file *m, void *data) | |||
1666 | struct drm_info_node *node = m->private; | 1666 | struct drm_info_node *node = m->private; |
1667 | struct drm_device *dev = node->minor->dev; | 1667 | struct drm_device *dev = node->minor->dev; |
1668 | struct drm_i915_private *dev_priv = dev->dev_private; | 1668 | struct drm_i915_private *dev_priv = dev->dev_private; |
1669 | u32 psrstat, psrperf; | 1669 | u32 psrperf = 0; |
1670 | bool enabled = false; | ||
1670 | 1671 | ||
1671 | if (!HAS_PSR(dev)) { | 1672 | seq_printf(m, "Sink_Support: %s\n", yesno(dev_priv->psr.sink_support)); |
1672 | seq_puts(m, "PSR not supported on this platform\n"); | 1673 | seq_printf(m, "Source_OK: %s\n", yesno(dev_priv->psr.source_ok)); |
1673 | } else if (HAS_PSR(dev) && | ||
1674 | I915_READ(EDP_PSR_CTL(dev)) & EDP_PSR_ENABLE) { | ||
1675 | seq_puts(m, "PSR enabled\n"); | ||
1676 | } else { | ||
1677 | seq_puts(m, "PSR disabled: "); | ||
1678 | switch (dev_priv->no_psr_reason) { | ||
1679 | case PSR_NO_SOURCE: | ||
1680 | seq_puts(m, "not supported on this platform"); | ||
1681 | break; | ||
1682 | case PSR_NO_SINK: | ||
1683 | seq_puts(m, "not supported by panel"); | ||
1684 | break; | ||
1685 | case PSR_MODULE_PARAM: | ||
1686 | seq_puts(m, "disabled by flag"); | ||
1687 | break; | ||
1688 | case PSR_CRTC_NOT_ACTIVE: | ||
1689 | seq_puts(m, "crtc not active"); | ||
1690 | break; | ||
1691 | case PSR_PWR_WELL_ENABLED: | ||
1692 | seq_puts(m, "power well enabled"); | ||
1693 | break; | ||
1694 | case PSR_NOT_TILED: | ||
1695 | seq_puts(m, "not tiled"); | ||
1696 | break; | ||
1697 | case PSR_SPRITE_ENABLED: | ||
1698 | seq_puts(m, "sprite enabled"); | ||
1699 | break; | ||
1700 | case PSR_S3D_ENABLED: | ||
1701 | seq_puts(m, "stereo 3d enabled"); | ||
1702 | break; | ||
1703 | case PSR_INTERLACED_ENABLED: | ||
1704 | seq_puts(m, "interlaced enabled"); | ||
1705 | break; | ||
1706 | case PSR_HSW_NOT_DDIA: | ||
1707 | seq_puts(m, "HSW ties PSR to DDI A (eDP)"); | ||
1708 | break; | ||
1709 | default: | ||
1710 | seq_puts(m, "unknown reason"); | ||
1711 | } | ||
1712 | seq_puts(m, "\n"); | ||
1713 | return 0; | ||
1714 | } | ||
1715 | |||
1716 | psrstat = I915_READ(EDP_PSR_STATUS_CTL(dev)); | ||
1717 | |||
1718 | seq_puts(m, "PSR Current State: "); | ||
1719 | switch (psrstat & EDP_PSR_STATUS_STATE_MASK) { | ||
1720 | case EDP_PSR_STATUS_STATE_IDLE: | ||
1721 | seq_puts(m, "Reset state\n"); | ||
1722 | break; | ||
1723 | case EDP_PSR_STATUS_STATE_SRDONACK: | ||
1724 | seq_puts(m, "Wait for TG/Stream to send on frame of data after SRD conditions are met\n"); | ||
1725 | break; | ||
1726 | case EDP_PSR_STATUS_STATE_SRDENT: | ||
1727 | seq_puts(m, "SRD entry\n"); | ||
1728 | break; | ||
1729 | case EDP_PSR_STATUS_STATE_BUFOFF: | ||
1730 | seq_puts(m, "Wait for buffer turn off\n"); | ||
1731 | break; | ||
1732 | case EDP_PSR_STATUS_STATE_BUFON: | ||
1733 | seq_puts(m, "Wait for buffer turn on\n"); | ||
1734 | break; | ||
1735 | case EDP_PSR_STATUS_STATE_AUXACK: | ||
1736 | seq_puts(m, "Wait for AUX to acknowledge on SRD exit\n"); | ||
1737 | break; | ||
1738 | case EDP_PSR_STATUS_STATE_SRDOFFACK: | ||
1739 | seq_puts(m, "Wait for TG/Stream to acknowledge the SRD VDM exit\n"); | ||
1740 | break; | ||
1741 | default: | ||
1742 | seq_puts(m, "Unknown\n"); | ||
1743 | break; | ||
1744 | } | ||
1745 | |||
1746 | seq_puts(m, "Link Status: "); | ||
1747 | switch (psrstat & EDP_PSR_STATUS_LINK_MASK) { | ||
1748 | case EDP_PSR_STATUS_LINK_FULL_OFF: | ||
1749 | seq_puts(m, "Link is fully off\n"); | ||
1750 | break; | ||
1751 | case EDP_PSR_STATUS_LINK_FULL_ON: | ||
1752 | seq_puts(m, "Link is fully on\n"); | ||
1753 | break; | ||
1754 | case EDP_PSR_STATUS_LINK_STANDBY: | ||
1755 | seq_puts(m, "Link is in standby\n"); | ||
1756 | break; | ||
1757 | default: | ||
1758 | seq_puts(m, "Unknown\n"); | ||
1759 | break; | ||
1760 | } | ||
1761 | |||
1762 | seq_printf(m, "PSR Entry Count: %u\n", | ||
1763 | psrstat >> EDP_PSR_STATUS_COUNT_SHIFT & | ||
1764 | EDP_PSR_STATUS_COUNT_MASK); | ||
1765 | |||
1766 | seq_printf(m, "Max Sleep Timer Counter: %u\n", | ||
1767 | psrstat >> EDP_PSR_STATUS_MAX_SLEEP_TIMER_SHIFT & | ||
1768 | EDP_PSR_STATUS_MAX_SLEEP_TIMER_MASK); | ||
1769 | |||
1770 | seq_printf(m, "Had AUX error: %s\n", | ||
1771 | yesno(psrstat & EDP_PSR_STATUS_AUX_ERROR)); | ||
1772 | |||
1773 | seq_printf(m, "Sending AUX: %s\n", | ||
1774 | yesno(psrstat & EDP_PSR_STATUS_AUX_SENDING)); | ||
1775 | |||
1776 | seq_printf(m, "Sending Idle: %s\n", | ||
1777 | yesno(psrstat & EDP_PSR_STATUS_SENDING_IDLE)); | ||
1778 | |||
1779 | seq_printf(m, "Sending TP2 TP3: %s\n", | ||
1780 | yesno(psrstat & EDP_PSR_STATUS_SENDING_TP2_TP3)); | ||
1781 | |||
1782 | seq_printf(m, "Sending TP1: %s\n", | ||
1783 | yesno(psrstat & EDP_PSR_STATUS_SENDING_TP1)); | ||
1784 | 1674 | ||
1785 | seq_printf(m, "Idle Count: %u\n", | 1675 | enabled = HAS_PSR(dev) && |
1786 | psrstat & EDP_PSR_STATUS_IDLE_MASK); | 1676 | I915_READ(EDP_PSR_CTL(dev)) & EDP_PSR_ENABLE; |
1677 | seq_printf(m, "Enabled: %s\n", yesno(enabled)); | ||
1787 | 1678 | ||
1788 | psrperf = (I915_READ(EDP_PSR_PERF_CNT(dev))) & EDP_PSR_PERF_CNT_MASK; | 1679 | if (HAS_PSR(dev)) |
1789 | seq_printf(m, "Performance Counter: %u\n", psrperf); | 1680 | psrperf = I915_READ(EDP_PSR_PERF_CNT(dev)) & |
1681 | EDP_PSR_PERF_CNT_MASK; | ||
1682 | seq_printf(m, "Performance_Counter: %u\n", psrperf); | ||
1790 | 1683 | ||
1791 | return 0; | 1684 | return 0; |
1792 | } | 1685 | } |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 5118ac300c42..ed8653fd97ad 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -644,17 +644,9 @@ struct i915_fbc { | |||
644 | } no_fbc_reason; | 644 | } no_fbc_reason; |
645 | }; | 645 | }; |
646 | 646 | ||
647 | enum no_psr_reason { | 647 | struct i915_psr { |
648 | PSR_NO_SOURCE, /* Not supported on platform */ | 648 | bool sink_support; |
649 | PSR_NO_SINK, /* Not supported by panel */ | 649 | bool source_ok; |
650 | PSR_MODULE_PARAM, | ||
651 | PSR_CRTC_NOT_ACTIVE, | ||
652 | PSR_PWR_WELL_ENABLED, | ||
653 | PSR_NOT_TILED, | ||
654 | PSR_SPRITE_ENABLED, | ||
655 | PSR_S3D_ENABLED, | ||
656 | PSR_INTERLACED_ENABLED, | ||
657 | PSR_HSW_NOT_DDIA, | ||
658 | }; | 650 | }; |
659 | 651 | ||
660 | enum intel_pch { | 652 | enum intel_pch { |
@@ -1356,7 +1348,7 @@ typedef struct drm_i915_private { | |||
1356 | /* Haswell power well */ | 1348 | /* Haswell power well */ |
1357 | struct i915_power_well power_well; | 1349 | struct i915_power_well power_well; |
1358 | 1350 | ||
1359 | enum no_psr_reason no_psr_reason; | 1351 | struct i915_psr psr; |
1360 | 1352 | ||
1361 | struct i915_gpu_error gpu_error; | 1353 | struct i915_gpu_error gpu_error; |
1362 | 1354 | ||
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 5614365465c9..0f77b8ce64d1 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -1494,10 +1494,11 @@ static void intel_dp_get_config(struct intel_encoder *encoder, | |||
1494 | pipe_config->adjusted_mode.crtc_clock = dotclock; | 1494 | pipe_config->adjusted_mode.crtc_clock = dotclock; |
1495 | } | 1495 | } |
1496 | 1496 | ||
1497 | static bool is_edp_psr(struct intel_dp *intel_dp) | 1497 | static bool is_edp_psr(struct drm_device *dev) |
1498 | { | 1498 | { |
1499 | return is_edp(intel_dp) && | 1499 | struct drm_i915_private *dev_priv = dev->dev_private; |
1500 | intel_dp->psr_dpcd[0] & DP_PSR_IS_SUPPORTED; | 1500 | |
1501 | return dev_priv->psr.sink_support; | ||
1501 | } | 1502 | } |
1502 | 1503 | ||
1503 | static bool intel_edp_is_psr_enabled(struct drm_device *dev) | 1504 | static bool intel_edp_is_psr_enabled(struct drm_device *dev) |
@@ -1624,42 +1625,33 @@ static bool intel_edp_psr_match_conditions(struct intel_dp *intel_dp) | |||
1624 | struct drm_i915_gem_object *obj = to_intel_framebuffer(crtc->fb)->obj; | 1625 | struct drm_i915_gem_object *obj = to_intel_framebuffer(crtc->fb)->obj; |
1625 | struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base; | 1626 | struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base; |
1626 | 1627 | ||
1628 | dev_priv->psr.source_ok = false; | ||
1629 | |||
1627 | if (!HAS_PSR(dev)) { | 1630 | if (!HAS_PSR(dev)) { |
1628 | DRM_DEBUG_KMS("PSR not supported on this platform\n"); | 1631 | DRM_DEBUG_KMS("PSR not supported on this platform\n"); |
1629 | dev_priv->no_psr_reason = PSR_NO_SOURCE; | ||
1630 | return false; | 1632 | return false; |
1631 | } | 1633 | } |
1632 | 1634 | ||
1633 | if ((intel_encoder->type != INTEL_OUTPUT_EDP) || | 1635 | if ((intel_encoder->type != INTEL_OUTPUT_EDP) || |
1634 | (dig_port->port != PORT_A)) { | 1636 | (dig_port->port != PORT_A)) { |
1635 | DRM_DEBUG_KMS("HSW ties PSR to DDI A (eDP)\n"); | 1637 | DRM_DEBUG_KMS("HSW ties PSR to DDI A (eDP)\n"); |
1636 | dev_priv->no_psr_reason = PSR_HSW_NOT_DDIA; | ||
1637 | return false; | ||
1638 | } | ||
1639 | |||
1640 | if (!is_edp_psr(intel_dp)) { | ||
1641 | DRM_DEBUG_KMS("PSR not supported by this panel\n"); | ||
1642 | dev_priv->no_psr_reason = PSR_NO_SINK; | ||
1643 | return false; | 1638 | return false; |
1644 | } | 1639 | } |
1645 | 1640 | ||
1646 | if (!i915_enable_psr) { | 1641 | if (!i915_enable_psr) { |
1647 | DRM_DEBUG_KMS("PSR disable by flag\n"); | 1642 | DRM_DEBUG_KMS("PSR disable by flag\n"); |
1648 | dev_priv->no_psr_reason = PSR_MODULE_PARAM; | ||
1649 | return false; | 1643 | return false; |
1650 | } | 1644 | } |
1651 | 1645 | ||
1652 | crtc = dig_port->base.base.crtc; | 1646 | crtc = dig_port->base.base.crtc; |
1653 | if (crtc == NULL) { | 1647 | if (crtc == NULL) { |
1654 | DRM_DEBUG_KMS("crtc not active for PSR\n"); | 1648 | DRM_DEBUG_KMS("crtc not active for PSR\n"); |
1655 | dev_priv->no_psr_reason = PSR_CRTC_NOT_ACTIVE; | ||
1656 | return false; | 1649 | return false; |
1657 | } | 1650 | } |
1658 | 1651 | ||
1659 | intel_crtc = to_intel_crtc(crtc); | 1652 | intel_crtc = to_intel_crtc(crtc); |
1660 | if (!intel_crtc_active(crtc)) { | 1653 | if (!intel_crtc_active(crtc)) { |
1661 | DRM_DEBUG_KMS("crtc not active for PSR\n"); | 1654 | DRM_DEBUG_KMS("crtc not active for PSR\n"); |
1662 | dev_priv->no_psr_reason = PSR_CRTC_NOT_ACTIVE; | ||
1663 | return false; | 1655 | return false; |
1664 | } | 1656 | } |
1665 | 1657 | ||
@@ -1667,29 +1659,26 @@ static bool intel_edp_psr_match_conditions(struct intel_dp *intel_dp) | |||
1667 | if (obj->tiling_mode != I915_TILING_X || | 1659 | if (obj->tiling_mode != I915_TILING_X || |
1668 | obj->fence_reg == I915_FENCE_REG_NONE) { | 1660 | obj->fence_reg == I915_FENCE_REG_NONE) { |
1669 | DRM_DEBUG_KMS("PSR condition failed: fb not tiled or fenced\n"); | 1661 | DRM_DEBUG_KMS("PSR condition failed: fb not tiled or fenced\n"); |
1670 | dev_priv->no_psr_reason = PSR_NOT_TILED; | ||
1671 | return false; | 1662 | return false; |
1672 | } | 1663 | } |
1673 | 1664 | ||
1674 | if (I915_READ(SPRCTL(intel_crtc->pipe)) & SPRITE_ENABLE) { | 1665 | if (I915_READ(SPRCTL(intel_crtc->pipe)) & SPRITE_ENABLE) { |
1675 | DRM_DEBUG_KMS("PSR condition failed: Sprite is Enabled\n"); | 1666 | DRM_DEBUG_KMS("PSR condition failed: Sprite is Enabled\n"); |
1676 | dev_priv->no_psr_reason = PSR_SPRITE_ENABLED; | ||
1677 | return false; | 1667 | return false; |
1678 | } | 1668 | } |
1679 | 1669 | ||
1680 | if (I915_READ(HSW_STEREO_3D_CTL(intel_crtc->config.cpu_transcoder)) & | 1670 | if (I915_READ(HSW_STEREO_3D_CTL(intel_crtc->config.cpu_transcoder)) & |
1681 | S3D_ENABLE) { | 1671 | S3D_ENABLE) { |
1682 | DRM_DEBUG_KMS("PSR condition failed: Stereo 3D is Enabled\n"); | 1672 | DRM_DEBUG_KMS("PSR condition failed: Stereo 3D is Enabled\n"); |
1683 | dev_priv->no_psr_reason = PSR_S3D_ENABLED; | ||
1684 | return false; | 1673 | return false; |
1685 | } | 1674 | } |
1686 | 1675 | ||
1687 | if (intel_crtc->config.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) { | 1676 | if (intel_crtc->config.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) { |
1688 | DRM_DEBUG_KMS("PSR condition failed: Interlaced is Enabled\n"); | 1677 | DRM_DEBUG_KMS("PSR condition failed: Interlaced is Enabled\n"); |
1689 | dev_priv->no_psr_reason = PSR_INTERLACED_ENABLED; | ||
1690 | return false; | 1678 | return false; |
1691 | } | 1679 | } |
1692 | 1680 | ||
1681 | dev_priv->psr.source_ok = true; | ||
1693 | return true; | 1682 | return true; |
1694 | } | 1683 | } |
1695 | 1684 | ||
@@ -1746,7 +1735,7 @@ void intel_edp_psr_update(struct drm_device *dev) | |||
1746 | if (encoder->type == INTEL_OUTPUT_EDP) { | 1735 | if (encoder->type == INTEL_OUTPUT_EDP) { |
1747 | intel_dp = enc_to_intel_dp(&encoder->base); | 1736 | intel_dp = enc_to_intel_dp(&encoder->base); |
1748 | 1737 | ||
1749 | if (!is_edp_psr(intel_dp)) | 1738 | if (!is_edp_psr(dev)) |
1750 | return; | 1739 | return; |
1751 | 1740 | ||
1752 | if (!intel_edp_psr_match_conditions(intel_dp)) | 1741 | if (!intel_edp_psr_match_conditions(intel_dp)) |
@@ -2725,6 +2714,10 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
2725 | static bool | 2714 | static bool |
2726 | intel_dp_get_dpcd(struct intel_dp *intel_dp) | 2715 | intel_dp_get_dpcd(struct intel_dp *intel_dp) |
2727 | { | 2716 | { |
2717 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | ||
2718 | struct drm_device *dev = dig_port->base.base.dev; | ||
2719 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2720 | |||
2728 | char dpcd_hex_dump[sizeof(intel_dp->dpcd) * 3]; | 2721 | char dpcd_hex_dump[sizeof(intel_dp->dpcd) * 3]; |
2729 | 2722 | ||
2730 | if (intel_dp_aux_native_read_retry(intel_dp, 0x000, intel_dp->dpcd, | 2723 | if (intel_dp_aux_native_read_retry(intel_dp, 0x000, intel_dp->dpcd, |
@@ -2744,8 +2737,10 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp) | |||
2744 | intel_dp_aux_native_read_retry(intel_dp, DP_PSR_SUPPORT, | 2737 | intel_dp_aux_native_read_retry(intel_dp, DP_PSR_SUPPORT, |
2745 | intel_dp->psr_dpcd, | 2738 | intel_dp->psr_dpcd, |
2746 | sizeof(intel_dp->psr_dpcd)); | 2739 | sizeof(intel_dp->psr_dpcd)); |
2747 | if (is_edp_psr(intel_dp)) | 2740 | if (intel_dp->psr_dpcd[0] & DP_PSR_IS_SUPPORTED) { |
2741 | dev_priv->psr.sink_support = true; | ||
2748 | DRM_DEBUG_KMS("Detected EDP PSR Panel.\n"); | 2742 | DRM_DEBUG_KMS("Detected EDP PSR Panel.\n"); |
2743 | } | ||
2749 | } | 2744 | } |
2750 | 2745 | ||
2751 | if (!(intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & | 2746 | if (!(intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & |