diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 511 |
1 files changed, 77 insertions, 434 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index f192f58708c2..ffa43eca14d3 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -131,11 +131,6 @@ static void vlv_steal_power_sequencer(struct drm_device *dev, | |||
| 131 | enum pipe pipe); | 131 | enum pipe pipe); |
| 132 | static void intel_dp_unset_edid(struct intel_dp *intel_dp); | 132 | static void intel_dp_unset_edid(struct intel_dp *intel_dp); |
| 133 | 133 | ||
| 134 | static unsigned int intel_dp_unused_lane_mask(int lane_count) | ||
| 135 | { | ||
| 136 | return ~((1 << lane_count) - 1) & 0xf; | ||
| 137 | } | ||
| 138 | |||
| 139 | static int | 134 | static int |
| 140 | intel_dp_max_link_bw(struct intel_dp *intel_dp) | 135 | intel_dp_max_link_bw(struct intel_dp *intel_dp) |
| 141 | { | 136 | { |
| @@ -775,6 +770,7 @@ static uint32_t skl_get_aux_send_ctl(struct intel_dp *intel_dp, | |||
| 775 | DP_AUX_CH_CTL_TIME_OUT_1600us | | 770 | DP_AUX_CH_CTL_TIME_OUT_1600us | |
| 776 | DP_AUX_CH_CTL_RECEIVE_ERROR | | 771 | DP_AUX_CH_CTL_RECEIVE_ERROR | |
| 777 | (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) | | 772 | (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) | |
| 773 | DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL(32) | | ||
| 778 | DP_AUX_CH_CTL_SYNC_PULSE_SKL(32); | 774 | DP_AUX_CH_CTL_SYNC_PULSE_SKL(32); |
| 779 | } | 775 | } |
| 780 | 776 | ||
| @@ -1181,7 +1177,6 @@ static void intel_aux_reg_init(struct intel_dp *intel_dp) | |||
| 1181 | static void | 1177 | static void |
| 1182 | intel_dp_aux_fini(struct intel_dp *intel_dp) | 1178 | intel_dp_aux_fini(struct intel_dp *intel_dp) |
| 1183 | { | 1179 | { |
| 1184 | drm_dp_aux_unregister(&intel_dp->aux); | ||
| 1185 | kfree(intel_dp->aux.name); | 1180 | kfree(intel_dp->aux.name); |
| 1186 | } | 1181 | } |
| 1187 | 1182 | ||
| @@ -1216,15 +1211,6 @@ intel_dp_aux_init(struct intel_dp *intel_dp, struct intel_connector *connector) | |||
| 1216 | return 0; | 1211 | return 0; |
| 1217 | } | 1212 | } |
| 1218 | 1213 | ||
| 1219 | static void | ||
| 1220 | intel_dp_connector_unregister(struct intel_connector *intel_connector) | ||
| 1221 | { | ||
| 1222 | struct intel_dp *intel_dp = intel_attached_dp(&intel_connector->base); | ||
| 1223 | |||
| 1224 | intel_dp_aux_fini(intel_dp); | ||
| 1225 | intel_connector_unregister(intel_connector); | ||
| 1226 | } | ||
| 1227 | |||
| 1228 | static int | 1214 | static int |
| 1229 | intel_dp_sink_rates(struct intel_dp *intel_dp, const int **sink_rates) | 1215 | intel_dp_sink_rates(struct intel_dp *intel_dp, const int **sink_rates) |
| 1230 | { | 1216 | { |
| @@ -1582,6 +1568,27 @@ found: | |||
| 1582 | &pipe_config->dp_m2_n2); | 1568 | &pipe_config->dp_m2_n2); |
| 1583 | } | 1569 | } |
| 1584 | 1570 | ||
| 1571 | /* | ||
| 1572 | * DPLL0 VCO may need to be adjusted to get the correct | ||
| 1573 | * clock for eDP. This will affect cdclk as well. | ||
| 1574 | */ | ||
| 1575 | if (is_edp(intel_dp) && | ||
| 1576 | (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))) { | ||
| 1577 | int vco; | ||
| 1578 | |||
| 1579 | switch (pipe_config->port_clock / 2) { | ||
| 1580 | case 108000: | ||
| 1581 | case 216000: | ||
| 1582 | vco = 8640000; | ||
| 1583 | break; | ||
| 1584 | default: | ||
| 1585 | vco = 8100000; | ||
| 1586 | break; | ||
| 1587 | } | ||
| 1588 | |||
| 1589 | to_intel_atomic_state(pipe_config->base.state)->cdclk_pll_vco = vco; | ||
| 1590 | } | ||
| 1591 | |||
| 1585 | if (!HAS_DDI(dev)) | 1592 | if (!HAS_DDI(dev)) |
| 1586 | intel_dp_set_clock(encoder, pipe_config); | 1593 | intel_dp_set_clock(encoder, pipe_config); |
| 1587 | 1594 | ||
| @@ -2460,50 +2467,6 @@ static void vlv_post_disable_dp(struct intel_encoder *encoder) | |||
| 2460 | intel_dp_link_down(intel_dp); | 2467 | intel_dp_link_down(intel_dp); |
| 2461 | } | 2468 | } |
| 2462 | 2469 | ||
| 2463 | static void chv_data_lane_soft_reset(struct intel_encoder *encoder, | ||
| 2464 | bool reset) | ||
| 2465 | { | ||
| 2466 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); | ||
| 2467 | enum dpio_channel ch = vlv_dport_to_channel(enc_to_dig_port(&encoder->base)); | ||
| 2468 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); | ||
| 2469 | enum pipe pipe = crtc->pipe; | ||
| 2470 | uint32_t val; | ||
| 2471 | |||
| 2472 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW0(ch)); | ||
| 2473 | if (reset) | ||
| 2474 | val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET); | ||
| 2475 | else | ||
| 2476 | val |= DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET; | ||
| 2477 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val); | ||
| 2478 | |||
| 2479 | if (crtc->config->lane_count > 2) { | ||
| 2480 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch)); | ||
| 2481 | if (reset) | ||
| 2482 | val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET); | ||
| 2483 | else | ||
| 2484 | val |= DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET; | ||
| 2485 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val); | ||
| 2486 | } | ||
| 2487 | |||
| 2488 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch)); | ||
| 2489 | val |= CHV_PCS_REQ_SOFTRESET_EN; | ||
| 2490 | if (reset) | ||
| 2491 | val &= ~DPIO_PCS_CLK_SOFT_RESET; | ||
| 2492 | else | ||
| 2493 | val |= DPIO_PCS_CLK_SOFT_RESET; | ||
| 2494 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val); | ||
| 2495 | |||
| 2496 | if (crtc->config->lane_count > 2) { | ||
| 2497 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW1(ch)); | ||
| 2498 | val |= CHV_PCS_REQ_SOFTRESET_EN; | ||
| 2499 | if (reset) | ||
| 2500 | val &= ~DPIO_PCS_CLK_SOFT_RESET; | ||
| 2501 | else | ||
| 2502 | val |= DPIO_PCS_CLK_SOFT_RESET; | ||
| 2503 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW1(ch), val); | ||
| 2504 | } | ||
| 2505 | } | ||
| 2506 | |||
| 2507 | static void chv_post_disable_dp(struct intel_encoder *encoder) | 2470 | static void chv_post_disable_dp(struct intel_encoder *encoder) |
| 2508 | { | 2471 | { |
| 2509 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); | 2472 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); |
| @@ -2811,266 +2774,38 @@ static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp) | |||
| 2811 | 2774 | ||
| 2812 | static void vlv_pre_enable_dp(struct intel_encoder *encoder) | 2775 | static void vlv_pre_enable_dp(struct intel_encoder *encoder) |
| 2813 | { | 2776 | { |
| 2814 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); | 2777 | vlv_phy_pre_encoder_enable(encoder); |
| 2815 | struct intel_digital_port *dport = dp_to_dig_port(intel_dp); | ||
| 2816 | struct drm_device *dev = encoder->base.dev; | ||
| 2817 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 2818 | struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc); | ||
| 2819 | enum dpio_channel port = vlv_dport_to_channel(dport); | ||
| 2820 | int pipe = intel_crtc->pipe; | ||
| 2821 | u32 val; | ||
| 2822 | |||
| 2823 | mutex_lock(&dev_priv->sb_lock); | ||
| 2824 | |||
| 2825 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(port)); | ||
| 2826 | val = 0; | ||
| 2827 | if (pipe) | ||
| 2828 | val |= (1<<21); | ||
| 2829 | else | ||
| 2830 | val &= ~(1<<21); | ||
| 2831 | val |= 0x001000c4; | ||
| 2832 | vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW8(port), val); | ||
| 2833 | vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW14(port), 0x00760018); | ||
| 2834 | vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW23(port), 0x00400888); | ||
| 2835 | |||
| 2836 | mutex_unlock(&dev_priv->sb_lock); | ||
| 2837 | 2778 | ||
| 2838 | intel_enable_dp(encoder); | 2779 | intel_enable_dp(encoder); |
| 2839 | } | 2780 | } |
| 2840 | 2781 | ||
| 2841 | static void vlv_dp_pre_pll_enable(struct intel_encoder *encoder) | 2782 | static void vlv_dp_pre_pll_enable(struct intel_encoder *encoder) |
| 2842 | { | 2783 | { |
| 2843 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); | ||
| 2844 | struct drm_device *dev = encoder->base.dev; | ||
| 2845 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 2846 | struct intel_crtc *intel_crtc = | ||
| 2847 | to_intel_crtc(encoder->base.crtc); | ||
| 2848 | enum dpio_channel port = vlv_dport_to_channel(dport); | ||
| 2849 | int pipe = intel_crtc->pipe; | ||
| 2850 | |||
| 2851 | intel_dp_prepare(encoder); | 2784 | intel_dp_prepare(encoder); |
| 2852 | 2785 | ||
| 2853 | /* Program Tx lane resets to default */ | 2786 | vlv_phy_pre_pll_enable(encoder); |
| 2854 | mutex_lock(&dev_priv->sb_lock); | ||
| 2855 | vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port), | ||
| 2856 | DPIO_PCS_TX_LANE2_RESET | | ||
| 2857 | DPIO_PCS_TX_LANE1_RESET); | ||
| 2858 | vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port), | ||
| 2859 | DPIO_PCS_CLK_CRI_RXEB_EIOS_EN | | ||
| 2860 | DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN | | ||
| 2861 | (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT) | | ||
| 2862 | DPIO_PCS_CLK_SOFT_RESET); | ||
| 2863 | |||
| 2864 | /* Fix up inter-pair skew failure */ | ||
| 2865 | vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW12(port), 0x00750f00); | ||
| 2866 | vlv_dpio_write(dev_priv, pipe, VLV_TX_DW11(port), 0x00001500); | ||
| 2867 | vlv_dpio_write(dev_priv, pipe, VLV_TX_DW14(port), 0x40400000); | ||
| 2868 | mutex_unlock(&dev_priv->sb_lock); | ||
| 2869 | } | 2787 | } |
| 2870 | 2788 | ||
| 2871 | static void chv_pre_enable_dp(struct intel_encoder *encoder) | 2789 | static void chv_pre_enable_dp(struct intel_encoder *encoder) |
| 2872 | { | 2790 | { |
| 2873 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); | 2791 | chv_phy_pre_encoder_enable(encoder); |
| 2874 | struct intel_digital_port *dport = dp_to_dig_port(intel_dp); | ||
| 2875 | struct drm_device *dev = encoder->base.dev; | ||
| 2876 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 2877 | struct intel_crtc *intel_crtc = | ||
| 2878 | to_intel_crtc(encoder->base.crtc); | ||
| 2879 | enum dpio_channel ch = vlv_dport_to_channel(dport); | ||
| 2880 | int pipe = intel_crtc->pipe; | ||
| 2881 | int data, i, stagger; | ||
| 2882 | u32 val; | ||
| 2883 | |||
| 2884 | mutex_lock(&dev_priv->sb_lock); | ||
| 2885 | |||
| 2886 | /* allow hardware to manage TX FIFO reset source */ | ||
| 2887 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch)); | ||
| 2888 | val &= ~DPIO_LANEDESKEW_STRAP_OVRD; | ||
| 2889 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val); | ||
| 2890 | |||
| 2891 | if (intel_crtc->config->lane_count > 2) { | ||
| 2892 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch)); | ||
| 2893 | val &= ~DPIO_LANEDESKEW_STRAP_OVRD; | ||
| 2894 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val); | ||
| 2895 | } | ||
| 2896 | |||
| 2897 | /* Program Tx lane latency optimal setting*/ | ||
| 2898 | for (i = 0; i < intel_crtc->config->lane_count; i++) { | ||
| 2899 | /* Set the upar bit */ | ||
| 2900 | if (intel_crtc->config->lane_count == 1) | ||
| 2901 | data = 0x0; | ||
| 2902 | else | ||
| 2903 | data = (i == 1) ? 0x0 : 0x1; | ||
| 2904 | vlv_dpio_write(dev_priv, pipe, CHV_TX_DW14(ch, i), | ||
| 2905 | data << DPIO_UPAR_SHIFT); | ||
| 2906 | } | ||
| 2907 | |||
| 2908 | /* Data lane stagger programming */ | ||
| 2909 | if (intel_crtc->config->port_clock > 270000) | ||
| 2910 | stagger = 0x18; | ||
| 2911 | else if (intel_crtc->config->port_clock > 135000) | ||
| 2912 | stagger = 0xd; | ||
| 2913 | else if (intel_crtc->config->port_clock > 67500) | ||
| 2914 | stagger = 0x7; | ||
| 2915 | else if (intel_crtc->config->port_clock > 33750) | ||
| 2916 | stagger = 0x4; | ||
| 2917 | else | ||
| 2918 | stagger = 0x2; | ||
| 2919 | |||
| 2920 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch)); | ||
| 2921 | val |= DPIO_TX2_STAGGER_MASK(0x1f); | ||
| 2922 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val); | ||
| 2923 | |||
| 2924 | if (intel_crtc->config->lane_count > 2) { | ||
| 2925 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch)); | ||
| 2926 | val |= DPIO_TX2_STAGGER_MASK(0x1f); | ||
| 2927 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val); | ||
| 2928 | } | ||
| 2929 | |||
| 2930 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW12(ch), | ||
| 2931 | DPIO_LANESTAGGER_STRAP(stagger) | | ||
| 2932 | DPIO_LANESTAGGER_STRAP_OVRD | | ||
| 2933 | DPIO_TX1_STAGGER_MASK(0x1f) | | ||
| 2934 | DPIO_TX1_STAGGER_MULT(6) | | ||
| 2935 | DPIO_TX2_STAGGER_MULT(0)); | ||
| 2936 | |||
| 2937 | if (intel_crtc->config->lane_count > 2) { | ||
| 2938 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW12(ch), | ||
| 2939 | DPIO_LANESTAGGER_STRAP(stagger) | | ||
| 2940 | DPIO_LANESTAGGER_STRAP_OVRD | | ||
| 2941 | DPIO_TX1_STAGGER_MASK(0x1f) | | ||
| 2942 | DPIO_TX1_STAGGER_MULT(7) | | ||
| 2943 | DPIO_TX2_STAGGER_MULT(5)); | ||
| 2944 | } | ||
| 2945 | |||
| 2946 | /* Deassert data lane reset */ | ||
| 2947 | chv_data_lane_soft_reset(encoder, false); | ||
| 2948 | |||
| 2949 | mutex_unlock(&dev_priv->sb_lock); | ||
| 2950 | 2792 | ||
| 2951 | intel_enable_dp(encoder); | 2793 | intel_enable_dp(encoder); |
| 2952 | 2794 | ||
| 2953 | /* Second common lane will stay alive on its own now */ | 2795 | /* Second common lane will stay alive on its own now */ |
| 2954 | if (dport->release_cl2_override) { | 2796 | chv_phy_release_cl2_override(encoder); |
| 2955 | chv_phy_powergate_ch(dev_priv, DPIO_PHY0, DPIO_CH1, false); | ||
| 2956 | dport->release_cl2_override = false; | ||
| 2957 | } | ||
| 2958 | } | 2797 | } |
| 2959 | 2798 | ||
| 2960 | static void chv_dp_pre_pll_enable(struct intel_encoder *encoder) | 2799 | static void chv_dp_pre_pll_enable(struct intel_encoder *encoder) |
| 2961 | { | 2800 | { |
| 2962 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); | ||
| 2963 | struct drm_device *dev = encoder->base.dev; | ||
| 2964 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 2965 | struct intel_crtc *intel_crtc = | ||
| 2966 | to_intel_crtc(encoder->base.crtc); | ||
| 2967 | enum dpio_channel ch = vlv_dport_to_channel(dport); | ||
| 2968 | enum pipe pipe = intel_crtc->pipe; | ||
| 2969 | unsigned int lane_mask = | ||
| 2970 | intel_dp_unused_lane_mask(intel_crtc->config->lane_count); | ||
| 2971 | u32 val; | ||
| 2972 | |||
| 2973 | intel_dp_prepare(encoder); | 2801 | intel_dp_prepare(encoder); |
| 2974 | 2802 | ||
| 2975 | /* | 2803 | chv_phy_pre_pll_enable(encoder); |
| 2976 | * Must trick the second common lane into life. | ||
| 2977 | * Otherwise we can't even access the PLL. | ||
| 2978 | */ | ||
| 2979 | if (ch == DPIO_CH0 && pipe == PIPE_B) | ||
| 2980 | dport->release_cl2_override = | ||
| 2981 | !chv_phy_powergate_ch(dev_priv, DPIO_PHY0, DPIO_CH1, true); | ||
| 2982 | |||
| 2983 | chv_phy_powergate_lanes(encoder, true, lane_mask); | ||
| 2984 | |||
| 2985 | mutex_lock(&dev_priv->sb_lock); | ||
| 2986 | |||
| 2987 | /* Assert data lane reset */ | ||
| 2988 | chv_data_lane_soft_reset(encoder, true); | ||
| 2989 | |||
| 2990 | /* program left/right clock distribution */ | ||
| 2991 | if (pipe != PIPE_B) { | ||
| 2992 | val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0); | ||
| 2993 | val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK); | ||
| 2994 | if (ch == DPIO_CH0) | ||
| 2995 | val |= CHV_BUFLEFTENA1_FORCE; | ||
| 2996 | if (ch == DPIO_CH1) | ||
| 2997 | val |= CHV_BUFRIGHTENA1_FORCE; | ||
| 2998 | vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val); | ||
| 2999 | } else { | ||
| 3000 | val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1); | ||
| 3001 | val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK); | ||
| 3002 | if (ch == DPIO_CH0) | ||
| 3003 | val |= CHV_BUFLEFTENA2_FORCE; | ||
| 3004 | if (ch == DPIO_CH1) | ||
| 3005 | val |= CHV_BUFRIGHTENA2_FORCE; | ||
| 3006 | vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val); | ||
| 3007 | } | ||
| 3008 | |||
| 3009 | /* program clock channel usage */ | ||
| 3010 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(ch)); | ||
| 3011 | val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE; | ||
| 3012 | if (pipe != PIPE_B) | ||
| 3013 | val &= ~CHV_PCS_USEDCLKCHANNEL; | ||
| 3014 | else | ||
| 3015 | val |= CHV_PCS_USEDCLKCHANNEL; | ||
| 3016 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW8(ch), val); | ||
| 3017 | |||
| 3018 | if (intel_crtc->config->lane_count > 2) { | ||
| 3019 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW8(ch)); | ||
| 3020 | val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE; | ||
| 3021 | if (pipe != PIPE_B) | ||
| 3022 | val &= ~CHV_PCS_USEDCLKCHANNEL; | ||
| 3023 | else | ||
| 3024 | val |= CHV_PCS_USEDCLKCHANNEL; | ||
| 3025 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW8(ch), val); | ||
| 3026 | } | ||
| 3027 | |||
| 3028 | /* | ||
| 3029 | * This a a bit weird since generally CL | ||
| 3030 | * matches the pipe, but here we need to | ||
| 3031 | * pick the CL based on the port. | ||
| 3032 | */ | ||
| 3033 | val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW19(ch)); | ||
| 3034 | if (pipe != PIPE_B) | ||
| 3035 | val &= ~CHV_CMN_USEDCLKCHANNEL; | ||
| 3036 | else | ||
| 3037 | val |= CHV_CMN_USEDCLKCHANNEL; | ||
| 3038 | vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW19(ch), val); | ||
| 3039 | |||
| 3040 | mutex_unlock(&dev_priv->sb_lock); | ||
| 3041 | } | 2804 | } |
| 3042 | 2805 | ||
| 3043 | static void chv_dp_post_pll_disable(struct intel_encoder *encoder) | 2806 | static void chv_dp_post_pll_disable(struct intel_encoder *encoder) |
| 3044 | { | 2807 | { |
| 3045 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); | 2808 | chv_phy_post_pll_disable(encoder); |
| 3046 | enum pipe pipe = to_intel_crtc(encoder->base.crtc)->pipe; | ||
| 3047 | u32 val; | ||
| 3048 | |||
| 3049 | mutex_lock(&dev_priv->sb_lock); | ||
| 3050 | |||
| 3051 | /* disable left/right clock distribution */ | ||
| 3052 | if (pipe != PIPE_B) { | ||
| 3053 | val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0); | ||
| 3054 | val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK); | ||
| 3055 | vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val); | ||
| 3056 | } else { | ||
| 3057 | val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1); | ||
| 3058 | val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK); | ||
| 3059 | vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val); | ||
| 3060 | } | ||
| 3061 | |||
| 3062 | mutex_unlock(&dev_priv->sb_lock); | ||
| 3063 | |||
| 3064 | /* | ||
| 3065 | * Leave the power down bit cleared for at least one | ||
| 3066 | * lane so that chv_powergate_phy_ch() will power | ||
| 3067 | * on something when the channel is otherwise unused. | ||
| 3068 | * When the port is off and the override is removed | ||
| 3069 | * the lanes power down anyway, so otherwise it doesn't | ||
| 3070 | * really matter what the state of power down bits is | ||
| 3071 | * after this. | ||
| 3072 | */ | ||
| 3073 | chv_phy_powergate_lanes(encoder, false, 0x0); | ||
| 3074 | } | 2809 | } |
| 3075 | 2810 | ||
| 3076 | /* | 2811 | /* |
| @@ -3178,16 +2913,10 @@ intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing) | |||
| 3178 | 2913 | ||
| 3179 | static uint32_t vlv_signal_levels(struct intel_dp *intel_dp) | 2914 | static uint32_t vlv_signal_levels(struct intel_dp *intel_dp) |
| 3180 | { | 2915 | { |
| 3181 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 2916 | struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; |
| 3182 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 3183 | struct intel_digital_port *dport = dp_to_dig_port(intel_dp); | ||
| 3184 | struct intel_crtc *intel_crtc = | ||
| 3185 | to_intel_crtc(dport->base.base.crtc); | ||
| 3186 | unsigned long demph_reg_value, preemph_reg_value, | 2917 | unsigned long demph_reg_value, preemph_reg_value, |
| 3187 | uniqtranscale_reg_value; | 2918 | uniqtranscale_reg_value; |
| 3188 | uint8_t train_set = intel_dp->train_set[0]; | 2919 | uint8_t train_set = intel_dp->train_set[0]; |
| 3189 | enum dpio_channel port = vlv_dport_to_channel(dport); | ||
| 3190 | int pipe = intel_crtc->pipe; | ||
| 3191 | 2920 | ||
| 3192 | switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) { | 2921 | switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) { |
| 3193 | case DP_TRAIN_PRE_EMPH_LEVEL_0: | 2922 | case DP_TRAIN_PRE_EMPH_LEVEL_0: |
| @@ -3262,37 +2991,18 @@ static uint32_t vlv_signal_levels(struct intel_dp *intel_dp) | |||
| 3262 | return 0; | 2991 | return 0; |
| 3263 | } | 2992 | } |
| 3264 | 2993 | ||
| 3265 | mutex_lock(&dev_priv->sb_lock); | 2994 | vlv_set_phy_signal_level(encoder, demph_reg_value, preemph_reg_value, |
| 3266 | vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0x00000000); | 2995 | uniqtranscale_reg_value, 0); |
| 3267 | vlv_dpio_write(dev_priv, pipe, VLV_TX_DW4(port), demph_reg_value); | ||
| 3268 | vlv_dpio_write(dev_priv, pipe, VLV_TX_DW2(port), | ||
| 3269 | uniqtranscale_reg_value); | ||
| 3270 | vlv_dpio_write(dev_priv, pipe, VLV_TX_DW3(port), 0x0C782040); | ||
| 3271 | vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW11(port), 0x00030000); | ||
| 3272 | vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW9(port), preemph_reg_value); | ||
| 3273 | vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0x80000000); | ||
| 3274 | mutex_unlock(&dev_priv->sb_lock); | ||
| 3275 | 2996 | ||
| 3276 | return 0; | 2997 | return 0; |
| 3277 | } | 2998 | } |
| 3278 | 2999 | ||
| 3279 | static bool chv_need_uniq_trans_scale(uint8_t train_set) | ||
| 3280 | { | ||
| 3281 | return (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) == DP_TRAIN_PRE_EMPH_LEVEL_0 && | ||
| 3282 | (train_set & DP_TRAIN_VOLTAGE_SWING_MASK) == DP_TRAIN_VOLTAGE_SWING_LEVEL_3; | ||
| 3283 | } | ||
| 3284 | |||
| 3285 | static uint32_t chv_signal_levels(struct intel_dp *intel_dp) | 3000 | static uint32_t chv_signal_levels(struct intel_dp *intel_dp) |
| 3286 | { | 3001 | { |
| 3287 | struct drm_device *dev = intel_dp_to_dev(intel_dp); | 3002 | struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; |
| 3288 | struct drm_i915_private *dev_priv = dev->dev_private; | 3003 | u32 deemph_reg_value, margin_reg_value; |
| 3289 | struct intel_digital_port *dport = dp_to_dig_port(intel_dp); | 3004 | bool uniq_trans_scale = false; |
| 3290 | struct intel_crtc *intel_crtc = to_intel_crtc(dport->base.base.crtc); | ||
| 3291 | u32 deemph_reg_value, margin_reg_value, val; | ||
| 3292 | uint8_t train_set = intel_dp->train_set[0]; | 3005 | uint8_t train_set = intel_dp->train_set[0]; |
| 3293 | enum dpio_channel ch = vlv_dport_to_channel(dport); | ||
| 3294 | enum pipe pipe = intel_crtc->pipe; | ||
| 3295 | int i; | ||
| 3296 | 3006 | ||
| 3297 | switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) { | 3007 | switch (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) { |
| 3298 | case DP_TRAIN_PRE_EMPH_LEVEL_0: | 3008 | case DP_TRAIN_PRE_EMPH_LEVEL_0: |
| @@ -3312,7 +3022,7 @@ static uint32_t chv_signal_levels(struct intel_dp *intel_dp) | |||
| 3312 | case DP_TRAIN_VOLTAGE_SWING_LEVEL_3: | 3022 | case DP_TRAIN_VOLTAGE_SWING_LEVEL_3: |
| 3313 | deemph_reg_value = 128; | 3023 | deemph_reg_value = 128; |
| 3314 | margin_reg_value = 154; | 3024 | margin_reg_value = 154; |
| 3315 | /* FIXME extra to set for 1200 */ | 3025 | uniq_trans_scale = true; |
| 3316 | break; | 3026 | break; |
| 3317 | default: | 3027 | default: |
| 3318 | return 0; | 3028 | return 0; |
| @@ -3364,88 +3074,8 @@ static uint32_t chv_signal_levels(struct intel_dp *intel_dp) | |||
| 3364 | return 0; | 3074 | return 0; |
| 3365 | } | 3075 | } |
| 3366 | 3076 | ||
| 3367 | mutex_lock(&dev_priv->sb_lock); | 3077 | chv_set_phy_signal_level(encoder, deemph_reg_value, |
| 3368 | 3078 | margin_reg_value, uniq_trans_scale); | |
| 3369 | /* Clear calc init */ | ||
| 3370 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch)); | ||
| 3371 | val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3); | ||
| 3372 | val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK); | ||
| 3373 | val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5; | ||
| 3374 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val); | ||
| 3375 | |||
| 3376 | if (intel_crtc->config->lane_count > 2) { | ||
| 3377 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch)); | ||
| 3378 | val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3); | ||
| 3379 | val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK); | ||
| 3380 | val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5; | ||
| 3381 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val); | ||
| 3382 | } | ||
| 3383 | |||
| 3384 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW9(ch)); | ||
| 3385 | val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK); | ||
| 3386 | val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000; | ||
| 3387 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW9(ch), val); | ||
| 3388 | |||
| 3389 | if (intel_crtc->config->lane_count > 2) { | ||
| 3390 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW9(ch)); | ||
| 3391 | val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK); | ||
| 3392 | val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000; | ||
| 3393 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW9(ch), val); | ||
| 3394 | } | ||
| 3395 | |||
| 3396 | /* Program swing deemph */ | ||
| 3397 | for (i = 0; i < intel_crtc->config->lane_count; i++) { | ||
| 3398 | val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW4(ch, i)); | ||
| 3399 | val &= ~DPIO_SWING_DEEMPH9P5_MASK; | ||
| 3400 | val |= deemph_reg_value << DPIO_SWING_DEEMPH9P5_SHIFT; | ||
| 3401 | vlv_dpio_write(dev_priv, pipe, CHV_TX_DW4(ch, i), val); | ||
| 3402 | } | ||
| 3403 | |||
| 3404 | /* Program swing margin */ | ||
| 3405 | for (i = 0; i < intel_crtc->config->lane_count; i++) { | ||
| 3406 | val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i)); | ||
| 3407 | |||
| 3408 | val &= ~DPIO_SWING_MARGIN000_MASK; | ||
| 3409 | val |= margin_reg_value << DPIO_SWING_MARGIN000_SHIFT; | ||
| 3410 | |||
| 3411 | /* | ||
| 3412 | * Supposedly this value shouldn't matter when unique transition | ||
| 3413 | * scale is disabled, but in fact it does matter. Let's just | ||
| 3414 | * always program the same value and hope it's OK. | ||
| 3415 | */ | ||
| 3416 | val &= ~(0xff << DPIO_UNIQ_TRANS_SCALE_SHIFT); | ||
| 3417 | val |= 0x9a << DPIO_UNIQ_TRANS_SCALE_SHIFT; | ||
| 3418 | |||
| 3419 | vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val); | ||
| 3420 | } | ||
| 3421 | |||
| 3422 | /* | ||
| 3423 | * The document said it needs to set bit 27 for ch0 and bit 26 | ||
| 3424 | * for ch1. Might be a typo in the doc. | ||
| 3425 | * For now, for this unique transition scale selection, set bit | ||
| 3426 | * 27 for ch0 and ch1. | ||
| 3427 | */ | ||
| 3428 | for (i = 0; i < intel_crtc->config->lane_count; i++) { | ||
| 3429 | val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW3(ch, i)); | ||
| 3430 | if (chv_need_uniq_trans_scale(train_set)) | ||
| 3431 | val |= DPIO_TX_UNIQ_TRANS_SCALE_EN; | ||
| 3432 | else | ||
| 3433 | val &= ~DPIO_TX_UNIQ_TRANS_SCALE_EN; | ||
| 3434 | vlv_dpio_write(dev_priv, pipe, CHV_TX_DW3(ch, i), val); | ||
| 3435 | } | ||
| 3436 | |||
| 3437 | /* Start swing calculation */ | ||
| 3438 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch)); | ||
| 3439 | val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3; | ||
| 3440 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val); | ||
| 3441 | |||
| 3442 | if (intel_crtc->config->lane_count > 2) { | ||
| 3443 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch)); | ||
| 3444 | val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3; | ||
| 3445 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val); | ||
| 3446 | } | ||
| 3447 | |||
| 3448 | mutex_unlock(&dev_priv->sb_lock); | ||
| 3449 | 3079 | ||
| 3450 | return 0; | 3080 | return 0; |
| 3451 | } | 3081 | } |
| @@ -3714,7 +3344,6 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp) | |||
| 3714 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 3344 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
| 3715 | struct drm_device *dev = dig_port->base.base.dev; | 3345 | struct drm_device *dev = dig_port->base.base.dev; |
| 3716 | struct drm_i915_private *dev_priv = dev->dev_private; | 3346 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 3717 | uint8_t rev; | ||
| 3718 | 3347 | ||
| 3719 | if (drm_dp_dpcd_read(&intel_dp->aux, 0x000, intel_dp->dpcd, | 3348 | if (drm_dp_dpcd_read(&intel_dp->aux, 0x000, intel_dp->dpcd, |
| 3720 | sizeof(intel_dp->dpcd)) < 0) | 3349 | sizeof(intel_dp->dpcd)) < 0) |
| @@ -3771,6 +3400,15 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp) | |||
| 3771 | DRM_DEBUG_KMS("PSR2 %s on sink", | 3400 | DRM_DEBUG_KMS("PSR2 %s on sink", |
| 3772 | dev_priv->psr.psr2_support ? "supported" : "not supported"); | 3401 | dev_priv->psr.psr2_support ? "supported" : "not supported"); |
| 3773 | } | 3402 | } |
| 3403 | |||
| 3404 | /* Read the eDP Display control capabilities registers */ | ||
| 3405 | memset(intel_dp->edp_dpcd, 0, sizeof(intel_dp->edp_dpcd)); | ||
| 3406 | if ((intel_dp->dpcd[DP_EDP_CONFIGURATION_CAP] & DP_DPCD_DISPLAY_CONTROL_CAPABLE) && | ||
| 3407 | (drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_DPCD_REV, | ||
| 3408 | intel_dp->edp_dpcd, sizeof(intel_dp->edp_dpcd)) == | ||
| 3409 | sizeof(intel_dp->edp_dpcd))) | ||
| 3410 | DRM_DEBUG_KMS("EDP DPCD : %*ph\n", (int) sizeof(intel_dp->edp_dpcd), | ||
| 3411 | intel_dp->edp_dpcd); | ||
| 3774 | } | 3412 | } |
| 3775 | 3413 | ||
| 3776 | DRM_DEBUG_KMS("Display Port TPS3 support: source %s, sink %s\n", | 3414 | DRM_DEBUG_KMS("Display Port TPS3 support: source %s, sink %s\n", |
| @@ -3778,10 +3416,7 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp) | |||
| 3778 | yesno(drm_dp_tps3_supported(intel_dp->dpcd))); | 3416 | yesno(drm_dp_tps3_supported(intel_dp->dpcd))); |
| 3779 | 3417 | ||
| 3780 | /* Intermediate frequency support */ | 3418 | /* Intermediate frequency support */ |
| 3781 | if (is_edp(intel_dp) && | 3419 | if (is_edp(intel_dp) && (intel_dp->edp_dpcd[0] >= 0x03)) { /* eDp v1.4 or higher */ |
| 3782 | (intel_dp->dpcd[DP_EDP_CONFIGURATION_CAP] & DP_DPCD_DISPLAY_CONTROL_CAPABLE) && | ||
| 3783 | (drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_DPCD_REV, &rev, 1) == 1) && | ||
| 3784 | (rev >= 0x03)) { /* eDp v1.4 or higher */ | ||
| 3785 | __le16 sink_rates[DP_MAX_SUPPORTED_RATES]; | 3420 | __le16 sink_rates[DP_MAX_SUPPORTED_RATES]; |
| 3786 | int i; | 3421 | int i; |
| 3787 | 3422 | ||
| @@ -4812,6 +4447,13 @@ done: | |||
| 4812 | } | 4447 | } |
| 4813 | 4448 | ||
| 4814 | static void | 4449 | static void |
| 4450 | intel_dp_connector_unregister(struct drm_connector *connector) | ||
| 4451 | { | ||
| 4452 | drm_dp_aux_unregister(&intel_attached_dp(connector)->aux); | ||
| 4453 | intel_connector_unregister(connector); | ||
| 4454 | } | ||
| 4455 | |||
| 4456 | static void | ||
| 4815 | intel_dp_connector_destroy(struct drm_connector *connector) | 4457 | intel_dp_connector_destroy(struct drm_connector *connector) |
| 4816 | { | 4458 | { |
| 4817 | struct intel_connector *intel_connector = to_intel_connector(connector); | 4459 | struct intel_connector *intel_connector = to_intel_connector(connector); |
| @@ -4851,6 +4493,9 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder) | |||
| 4851 | intel_dp->edp_notifier.notifier_call = NULL; | 4493 | intel_dp->edp_notifier.notifier_call = NULL; |
| 4852 | } | 4494 | } |
| 4853 | } | 4495 | } |
| 4496 | |||
| 4497 | intel_dp_aux_fini(intel_dp); | ||
| 4498 | |||
| 4854 | drm_encoder_cleanup(encoder); | 4499 | drm_encoder_cleanup(encoder); |
| 4855 | kfree(intel_dig_port); | 4500 | kfree(intel_dig_port); |
| 4856 | } | 4501 | } |
| @@ -4927,6 +4572,7 @@ static const struct drm_connector_funcs intel_dp_connector_funcs = { | |||
| 4927 | .fill_modes = drm_helper_probe_single_connector_modes, | 4572 | .fill_modes = drm_helper_probe_single_connector_modes, |
| 4928 | .set_property = intel_dp_set_property, | 4573 | .set_property = intel_dp_set_property, |
| 4929 | .atomic_get_property = intel_connector_atomic_get_property, | 4574 | .atomic_get_property = intel_connector_atomic_get_property, |
| 4575 | .early_unregister = intel_dp_connector_unregister, | ||
| 4930 | .destroy = intel_dp_connector_destroy, | 4576 | .destroy = intel_dp_connector_destroy, |
| 4931 | .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, | 4577 | .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, |
| 4932 | .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, | 4578 | .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, |
| @@ -4935,7 +4581,6 @@ static const struct drm_connector_funcs intel_dp_connector_funcs = { | |||
| 4935 | static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs = { | 4581 | static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs = { |
| 4936 | .get_modes = intel_dp_get_modes, | 4582 | .get_modes = intel_dp_get_modes, |
| 4937 | .mode_valid = intel_dp_mode_valid, | 4583 | .mode_valid = intel_dp_mode_valid, |
| 4938 | .best_encoder = intel_best_encoder, | ||
| 4939 | }; | 4584 | }; |
| 4940 | 4585 | ||
| 4941 | static const struct drm_encoder_funcs intel_dp_enc_funcs = { | 4586 | static const struct drm_encoder_funcs intel_dp_enc_funcs = { |
| @@ -4977,9 +4622,6 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd) | |||
| 4977 | intel_display_power_get(dev_priv, power_domain); | 4622 | intel_display_power_get(dev_priv, power_domain); |
| 4978 | 4623 | ||
| 4979 | if (long_hpd) { | 4624 | if (long_hpd) { |
| 4980 | /* indicate that we need to restart link training */ | ||
| 4981 | intel_dp->train_set_valid = false; | ||
| 4982 | |||
| 4983 | intel_dp_long_pulse(intel_dp->attached_connector); | 4625 | intel_dp_long_pulse(intel_dp->attached_connector); |
| 4984 | if (intel_dp->is_mst) | 4626 | if (intel_dp->is_mst) |
| 4985 | ret = IRQ_HANDLED; | 4627 | ret = IRQ_HANDLED; |
| @@ -5590,14 +5232,14 @@ void intel_edp_drrs_flush(struct drm_device *dev, | |||
| 5590 | * | 5232 | * |
| 5591 | * DRRS saves power by switching to low RR based on usage scenarios. | 5233 | * DRRS saves power by switching to low RR based on usage scenarios. |
| 5592 | * | 5234 | * |
| 5593 | * eDP DRRS:- | 5235 | * The implementation is based on frontbuffer tracking implementation. When |
| 5594 | * The implementation is based on frontbuffer tracking implementation. | 5236 | * there is a disturbance on the screen triggered by user activity or a periodic |
| 5595 | * When there is a disturbance on the screen triggered by user activity or a | 5237 | * system activity, DRRS is disabled (RR is changed to high RR). When there is |
| 5596 | * periodic system activity, DRRS is disabled (RR is changed to high RR). | 5238 | * no movement on screen, after a timeout of 1 second, a switch to low RR is |
| 5597 | * When there is no movement on screen, after a timeout of 1 second, a switch | 5239 | * made. |
| 5598 | * to low RR is made. | 5240 | * |
| 5599 | * For integration with frontbuffer tracking code, | 5241 | * For integration with frontbuffer tracking code, intel_edp_drrs_invalidate() |
| 5600 | * intel_edp_drrs_invalidate() and intel_edp_drrs_flush() are called. | 5242 | * and intel_edp_drrs_flush() are called. |
| 5601 | * | 5243 | * |
| 5602 | * DRRS can be further extended to support other internal panels and also | 5244 | * DRRS can be further extended to support other internal panels and also |
| 5603 | * the scenario of video playback wherein RR is set based on the rate | 5245 | * the scenario of video playback wherein RR is set based on the rate |
| @@ -5725,8 +5367,11 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, | |||
| 5725 | if (!fixed_mode && dev_priv->vbt.lfp_lvds_vbt_mode) { | 5367 | if (!fixed_mode && dev_priv->vbt.lfp_lvds_vbt_mode) { |
| 5726 | fixed_mode = drm_mode_duplicate(dev, | 5368 | fixed_mode = drm_mode_duplicate(dev, |
| 5727 | dev_priv->vbt.lfp_lvds_vbt_mode); | 5369 | dev_priv->vbt.lfp_lvds_vbt_mode); |
| 5728 | if (fixed_mode) | 5370 | if (fixed_mode) { |
| 5729 | fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; | 5371 | fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; |
| 5372 | connector->display_info.width_mm = fixed_mode->width_mm; | ||
| 5373 | connector->display_info.height_mm = fixed_mode->height_mm; | ||
| 5374 | } | ||
| 5730 | } | 5375 | } |
| 5731 | mutex_unlock(&dev->mode_config.mutex); | 5376 | mutex_unlock(&dev->mode_config.mutex); |
| 5732 | 5377 | ||
| @@ -5840,7 +5485,6 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port, | |||
| 5840 | intel_connector->get_hw_state = intel_ddi_connector_get_hw_state; | 5485 | intel_connector->get_hw_state = intel_ddi_connector_get_hw_state; |
| 5841 | else | 5486 | else |
| 5842 | intel_connector->get_hw_state = intel_connector_get_hw_state; | 5487 | intel_connector->get_hw_state = intel_connector_get_hw_state; |
| 5843 | intel_connector->unregister = intel_dp_connector_unregister; | ||
| 5844 | 5488 | ||
| 5845 | /* Set up the hotplug pin. */ | 5489 | /* Set up the hotplug pin. */ |
| 5846 | switch (port) { | 5490 | switch (port) { |
| @@ -5923,9 +5567,9 @@ fail: | |||
| 5923 | return false; | 5567 | return false; |
| 5924 | } | 5568 | } |
| 5925 | 5569 | ||
| 5926 | void | 5570 | bool intel_dp_init(struct drm_device *dev, |
| 5927 | intel_dp_init(struct drm_device *dev, | 5571 | i915_reg_t output_reg, |
| 5928 | i915_reg_t output_reg, enum port port) | 5572 | enum port port) |
| 5929 | { | 5573 | { |
| 5930 | struct drm_i915_private *dev_priv = dev->dev_private; | 5574 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 5931 | struct intel_digital_port *intel_dig_port; | 5575 | struct intel_digital_port *intel_dig_port; |
| @@ -5935,7 +5579,7 @@ intel_dp_init(struct drm_device *dev, | |||
| 5935 | 5579 | ||
| 5936 | intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL); | 5580 | intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL); |
| 5937 | if (!intel_dig_port) | 5581 | if (!intel_dig_port) |
| 5938 | return; | 5582 | return false; |
| 5939 | 5583 | ||
| 5940 | intel_connector = intel_connector_alloc(); | 5584 | intel_connector = intel_connector_alloc(); |
| 5941 | if (!intel_connector) | 5585 | if (!intel_connector) |
| @@ -5945,7 +5589,7 @@ intel_dp_init(struct drm_device *dev, | |||
| 5945 | encoder = &intel_encoder->base; | 5589 | encoder = &intel_encoder->base; |
| 5946 | 5590 | ||
| 5947 | if (drm_encoder_init(dev, &intel_encoder->base, &intel_dp_enc_funcs, | 5591 | if (drm_encoder_init(dev, &intel_encoder->base, &intel_dp_enc_funcs, |
| 5948 | DRM_MODE_ENCODER_TMDS, NULL)) | 5592 | DRM_MODE_ENCODER_TMDS, "DP %c", port_name(port))) |
| 5949 | goto err_encoder_init; | 5593 | goto err_encoder_init; |
| 5950 | 5594 | ||
| 5951 | intel_encoder->compute_config = intel_dp_compute_config; | 5595 | intel_encoder->compute_config = intel_dp_compute_config; |
| @@ -5992,7 +5636,7 @@ intel_dp_init(struct drm_device *dev, | |||
| 5992 | if (!intel_dp_init_connector(intel_dig_port, intel_connector)) | 5636 | if (!intel_dp_init_connector(intel_dig_port, intel_connector)) |
| 5993 | goto err_init_connector; | 5637 | goto err_init_connector; |
| 5994 | 5638 | ||
| 5995 | return; | 5639 | return true; |
| 5996 | 5640 | ||
| 5997 | err_init_connector: | 5641 | err_init_connector: |
| 5998 | drm_encoder_cleanup(encoder); | 5642 | drm_encoder_cleanup(encoder); |
| @@ -6000,8 +5644,7 @@ err_encoder_init: | |||
| 6000 | kfree(intel_connector); | 5644 | kfree(intel_connector); |
| 6001 | err_connector_alloc: | 5645 | err_connector_alloc: |
| 6002 | kfree(intel_dig_port); | 5646 | kfree(intel_dig_port); |
| 6003 | 5647 | return false; | |
| 6004 | return; | ||
| 6005 | } | 5648 | } |
| 6006 | 5649 | ||
| 6007 | void intel_dp_mst_suspend(struct drm_device *dev) | 5650 | void intel_dp_mst_suspend(struct drm_device *dev) |
