diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_hdmi.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 83 |
1 files changed, 50 insertions, 33 deletions
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 4148cc85bf7f..03f9ca70530c 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -713,6 +713,7 @@ static void intel_hdmi_get_config(struct intel_encoder *encoder, | |||
713 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base); | 713 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base); |
714 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 714 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; |
715 | u32 tmp, flags = 0; | 715 | u32 tmp, flags = 0; |
716 | int dotclock; | ||
716 | 717 | ||
717 | tmp = I915_READ(intel_hdmi->hdmi_reg); | 718 | tmp = I915_READ(intel_hdmi->hdmi_reg); |
718 | 719 | ||
@@ -727,6 +728,16 @@ static void intel_hdmi_get_config(struct intel_encoder *encoder, | |||
727 | flags |= DRM_MODE_FLAG_NVSYNC; | 728 | flags |= DRM_MODE_FLAG_NVSYNC; |
728 | 729 | ||
729 | pipe_config->adjusted_mode.flags |= flags; | 730 | pipe_config->adjusted_mode.flags |= flags; |
731 | |||
732 | if ((tmp & SDVO_COLOR_FORMAT_MASK) == HDMI_COLOR_FORMAT_12bpc) | ||
733 | dotclock = pipe_config->port_clock * 2 / 3; | ||
734 | else | ||
735 | dotclock = pipe_config->port_clock; | ||
736 | |||
737 | if (HAS_PCH_SPLIT(dev_priv->dev)) | ||
738 | ironlake_check_encoder_dotclock(pipe_config, dotclock); | ||
739 | |||
740 | pipe_config->adjusted_mode.crtc_clock = dotclock; | ||
730 | } | 741 | } |
731 | 742 | ||
732 | static void intel_enable_hdmi(struct intel_encoder *encoder) | 743 | static void intel_enable_hdmi(struct intel_encoder *encoder) |
@@ -836,7 +847,7 @@ static int hdmi_portclock_limit(struct intel_hdmi *hdmi) | |||
836 | 847 | ||
837 | if (IS_G4X(dev)) | 848 | if (IS_G4X(dev)) |
838 | return 165000; | 849 | return 165000; |
839 | else if (IS_HASWELL(dev)) | 850 | else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8) |
840 | return 300000; | 851 | return 300000; |
841 | else | 852 | else |
842 | return 225000; | 853 | return 225000; |
@@ -862,7 +873,7 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder, | |||
862 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base); | 873 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base); |
863 | struct drm_device *dev = encoder->base.dev; | 874 | struct drm_device *dev = encoder->base.dev; |
864 | struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode; | 875 | struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode; |
865 | int clock_12bpc = pipe_config->requested_mode.clock * 3 / 2; | 876 | int clock_12bpc = pipe_config->adjusted_mode.crtc_clock * 3 / 2; |
866 | int portclock_limit = hdmi_portclock_limit(intel_hdmi); | 877 | int portclock_limit = hdmi_portclock_limit(intel_hdmi); |
867 | int desired_bpp; | 878 | int desired_bpp; |
868 | 879 | ||
@@ -904,7 +915,7 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder, | |||
904 | pipe_config->pipe_bpp = desired_bpp; | 915 | pipe_config->pipe_bpp = desired_bpp; |
905 | } | 916 | } |
906 | 917 | ||
907 | if (adjusted_mode->clock > portclock_limit) { | 918 | if (adjusted_mode->crtc_clock > portclock_limit) { |
908 | DRM_DEBUG_KMS("too high HDMI clock, rejecting mode\n"); | 919 | DRM_DEBUG_KMS("too high HDMI clock, rejecting mode\n"); |
909 | return false; | 920 | return false; |
910 | } | 921 | } |
@@ -1063,7 +1074,7 @@ done: | |||
1063 | return 0; | 1074 | return 0; |
1064 | } | 1075 | } |
1065 | 1076 | ||
1066 | static void intel_hdmi_pre_enable(struct intel_encoder *encoder) | 1077 | static void vlv_hdmi_pre_enable(struct intel_encoder *encoder) |
1067 | { | 1078 | { |
1068 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); | 1079 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); |
1069 | struct drm_device *dev = encoder->base.dev; | 1080 | struct drm_device *dev = encoder->base.dev; |
@@ -1079,35 +1090,35 @@ static void intel_hdmi_pre_enable(struct intel_encoder *encoder) | |||
1079 | 1090 | ||
1080 | /* Enable clock channels for this port */ | 1091 | /* Enable clock channels for this port */ |
1081 | mutex_lock(&dev_priv->dpio_lock); | 1092 | mutex_lock(&dev_priv->dpio_lock); |
1082 | val = vlv_dpio_read(dev_priv, DPIO_DATA_LANE_A(port)); | 1093 | val = vlv_dpio_read(dev_priv, pipe, DPIO_DATA_LANE_A(port)); |
1083 | val = 0; | 1094 | val = 0; |
1084 | if (pipe) | 1095 | if (pipe) |
1085 | val |= (1<<21); | 1096 | val |= (1<<21); |
1086 | else | 1097 | else |
1087 | val &= ~(1<<21); | 1098 | val &= ~(1<<21); |
1088 | val |= 0x001000c4; | 1099 | val |= 0x001000c4; |
1089 | vlv_dpio_write(dev_priv, DPIO_DATA_CHANNEL(port), val); | 1100 | vlv_dpio_write(dev_priv, pipe, DPIO_DATA_CHANNEL(port), val); |
1090 | 1101 | ||
1091 | /* HDMI 1.0V-2dB */ | 1102 | /* HDMI 1.0V-2dB */ |
1092 | vlv_dpio_write(dev_priv, DPIO_TX_OCALINIT(port), 0); | 1103 | vlv_dpio_write(dev_priv, pipe, DPIO_TX_OCALINIT(port), 0); |
1093 | vlv_dpio_write(dev_priv, DPIO_TX_SWING_CTL4(port), | 1104 | vlv_dpio_write(dev_priv, pipe, DPIO_TX_SWING_CTL4(port), |
1094 | 0x2b245f5f); | 1105 | 0x2b245f5f); |
1095 | vlv_dpio_write(dev_priv, DPIO_TX_SWING_CTL2(port), | 1106 | vlv_dpio_write(dev_priv, pipe, DPIO_TX_SWING_CTL2(port), |
1096 | 0x5578b83a); | 1107 | 0x5578b83a); |
1097 | vlv_dpio_write(dev_priv, DPIO_TX_SWING_CTL3(port), | 1108 | vlv_dpio_write(dev_priv, pipe, DPIO_TX_SWING_CTL3(port), |
1098 | 0x0c782040); | 1109 | 0x0c782040); |
1099 | vlv_dpio_write(dev_priv, DPIO_TX3_SWING_CTL4(port), | 1110 | vlv_dpio_write(dev_priv, pipe, DPIO_TX3_SWING_CTL4(port), |
1100 | 0x2b247878); | 1111 | 0x2b247878); |
1101 | vlv_dpio_write(dev_priv, DPIO_PCS_STAGGER0(port), 0x00030000); | 1112 | vlv_dpio_write(dev_priv, pipe, DPIO_PCS_STAGGER0(port), 0x00030000); |
1102 | vlv_dpio_write(dev_priv, DPIO_PCS_CTL_OVER1(port), | 1113 | vlv_dpio_write(dev_priv, pipe, DPIO_PCS_CTL_OVER1(port), |
1103 | 0x00002000); | 1114 | 0x00002000); |
1104 | vlv_dpio_write(dev_priv, DPIO_TX_OCALINIT(port), | 1115 | vlv_dpio_write(dev_priv, pipe, DPIO_TX_OCALINIT(port), |
1105 | DPIO_TX_OCALINIT_EN); | 1116 | DPIO_TX_OCALINIT_EN); |
1106 | 1117 | ||
1107 | /* Program lane clock */ | 1118 | /* Program lane clock */ |
1108 | vlv_dpio_write(dev_priv, DPIO_PCS_CLOCKBUF0(port), | 1119 | vlv_dpio_write(dev_priv, pipe, DPIO_PCS_CLOCKBUF0(port), |
1109 | 0x00760018); | 1120 | 0x00760018); |
1110 | vlv_dpio_write(dev_priv, DPIO_PCS_CLOCKBUF8(port), | 1121 | vlv_dpio_write(dev_priv, pipe, DPIO_PCS_CLOCKBUF8(port), |
1111 | 0x00400888); | 1122 | 0x00400888); |
1112 | mutex_unlock(&dev_priv->dpio_lock); | 1123 | mutex_unlock(&dev_priv->dpio_lock); |
1113 | 1124 | ||
@@ -1116,55 +1127,60 @@ static void intel_hdmi_pre_enable(struct intel_encoder *encoder) | |||
1116 | vlv_wait_port_ready(dev_priv, port); | 1127 | vlv_wait_port_ready(dev_priv, port); |
1117 | } | 1128 | } |
1118 | 1129 | ||
1119 | static void intel_hdmi_pre_pll_enable(struct intel_encoder *encoder) | 1130 | static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder) |
1120 | { | 1131 | { |
1121 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); | 1132 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); |
1122 | struct drm_device *dev = encoder->base.dev; | 1133 | struct drm_device *dev = encoder->base.dev; |
1123 | struct drm_i915_private *dev_priv = dev->dev_private; | 1134 | struct drm_i915_private *dev_priv = dev->dev_private; |
1135 | struct intel_crtc *intel_crtc = | ||
1136 | to_intel_crtc(encoder->base.crtc); | ||
1124 | int port = vlv_dport_to_channel(dport); | 1137 | int port = vlv_dport_to_channel(dport); |
1138 | int pipe = intel_crtc->pipe; | ||
1125 | 1139 | ||
1126 | if (!IS_VALLEYVIEW(dev)) | 1140 | if (!IS_VALLEYVIEW(dev)) |
1127 | return; | 1141 | return; |
1128 | 1142 | ||
1129 | /* Program Tx lane resets to default */ | 1143 | /* Program Tx lane resets to default */ |
1130 | mutex_lock(&dev_priv->dpio_lock); | 1144 | mutex_lock(&dev_priv->dpio_lock); |
1131 | vlv_dpio_write(dev_priv, DPIO_PCS_TX(port), | 1145 | vlv_dpio_write(dev_priv, pipe, DPIO_PCS_TX(port), |
1132 | DPIO_PCS_TX_LANE2_RESET | | 1146 | DPIO_PCS_TX_LANE2_RESET | |
1133 | DPIO_PCS_TX_LANE1_RESET); | 1147 | DPIO_PCS_TX_LANE1_RESET); |
1134 | vlv_dpio_write(dev_priv, DPIO_PCS_CLK(port), | 1148 | vlv_dpio_write(dev_priv, pipe, DPIO_PCS_CLK(port), |
1135 | DPIO_PCS_CLK_CRI_RXEB_EIOS_EN | | 1149 | DPIO_PCS_CLK_CRI_RXEB_EIOS_EN | |
1136 | DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN | | 1150 | DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN | |
1137 | (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT) | | 1151 | (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT) | |
1138 | DPIO_PCS_CLK_SOFT_RESET); | 1152 | DPIO_PCS_CLK_SOFT_RESET); |
1139 | 1153 | ||
1140 | /* Fix up inter-pair skew failure */ | 1154 | /* Fix up inter-pair skew failure */ |
1141 | vlv_dpio_write(dev_priv, DPIO_PCS_STAGGER1(port), 0x00750f00); | 1155 | vlv_dpio_write(dev_priv, pipe, DPIO_PCS_STAGGER1(port), 0x00750f00); |
1142 | vlv_dpio_write(dev_priv, DPIO_TX_CTL(port), 0x00001500); | 1156 | vlv_dpio_write(dev_priv, pipe, DPIO_TX_CTL(port), 0x00001500); |
1143 | vlv_dpio_write(dev_priv, DPIO_TX_LANE(port), 0x40400000); | 1157 | vlv_dpio_write(dev_priv, pipe, DPIO_TX_LANE(port), 0x40400000); |
1144 | 1158 | ||
1145 | vlv_dpio_write(dev_priv, DPIO_PCS_CTL_OVER1(port), | 1159 | vlv_dpio_write(dev_priv, pipe, DPIO_PCS_CTL_OVER1(port), |
1146 | 0x00002000); | 1160 | 0x00002000); |
1147 | vlv_dpio_write(dev_priv, DPIO_TX_OCALINIT(port), | 1161 | vlv_dpio_write(dev_priv, pipe, DPIO_TX_OCALINIT(port), |
1148 | DPIO_TX_OCALINIT_EN); | 1162 | DPIO_TX_OCALINIT_EN); |
1149 | mutex_unlock(&dev_priv->dpio_lock); | 1163 | mutex_unlock(&dev_priv->dpio_lock); |
1150 | } | 1164 | } |
1151 | 1165 | ||
1152 | static void intel_hdmi_post_disable(struct intel_encoder *encoder) | 1166 | static void vlv_hdmi_post_disable(struct intel_encoder *encoder) |
1153 | { | 1167 | { |
1154 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); | 1168 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); |
1155 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 1169 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; |
1170 | struct intel_crtc *intel_crtc = | ||
1171 | to_intel_crtc(encoder->base.crtc); | ||
1156 | int port = vlv_dport_to_channel(dport); | 1172 | int port = vlv_dport_to_channel(dport); |
1173 | int pipe = intel_crtc->pipe; | ||
1157 | 1174 | ||
1158 | /* Reset lanes to avoid HDMI flicker (VLV w/a) */ | 1175 | /* Reset lanes to avoid HDMI flicker (VLV w/a) */ |
1159 | mutex_lock(&dev_priv->dpio_lock); | 1176 | mutex_lock(&dev_priv->dpio_lock); |
1160 | vlv_dpio_write(dev_priv, DPIO_PCS_TX(port), 0x00000000); | 1177 | vlv_dpio_write(dev_priv, pipe, DPIO_PCS_TX(port), 0x00000000); |
1161 | vlv_dpio_write(dev_priv, DPIO_PCS_CLK(port), 0x00e00060); | 1178 | vlv_dpio_write(dev_priv, pipe, DPIO_PCS_CLK(port), 0x00e00060); |
1162 | mutex_unlock(&dev_priv->dpio_lock); | 1179 | mutex_unlock(&dev_priv->dpio_lock); |
1163 | } | 1180 | } |
1164 | 1181 | ||
1165 | static void intel_hdmi_destroy(struct drm_connector *connector) | 1182 | static void intel_hdmi_destroy(struct drm_connector *connector) |
1166 | { | 1183 | { |
1167 | drm_sysfs_connector_remove(connector); | ||
1168 | drm_connector_cleanup(connector); | 1184 | drm_connector_cleanup(connector); |
1169 | kfree(connector); | 1185 | kfree(connector); |
1170 | } | 1186 | } |
@@ -1211,6 +1227,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, | |||
1211 | 1227 | ||
1212 | connector->interlace_allowed = 1; | 1228 | connector->interlace_allowed = 1; |
1213 | connector->doublescan_allowed = 0; | 1229 | connector->doublescan_allowed = 0; |
1230 | connector->stereo_allowed = 1; | ||
1214 | 1231 | ||
1215 | switch (port) { | 1232 | switch (port) { |
1216 | case PORT_B: | 1233 | case PORT_B: |
@@ -1275,11 +1292,11 @@ void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port) | |||
1275 | struct intel_encoder *intel_encoder; | 1292 | struct intel_encoder *intel_encoder; |
1276 | struct intel_connector *intel_connector; | 1293 | struct intel_connector *intel_connector; |
1277 | 1294 | ||
1278 | intel_dig_port = kzalloc(sizeof(struct intel_digital_port), GFP_KERNEL); | 1295 | intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL); |
1279 | if (!intel_dig_port) | 1296 | if (!intel_dig_port) |
1280 | return; | 1297 | return; |
1281 | 1298 | ||
1282 | intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL); | 1299 | intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL); |
1283 | if (!intel_connector) { | 1300 | if (!intel_connector) { |
1284 | kfree(intel_dig_port); | 1301 | kfree(intel_dig_port); |
1285 | return; | 1302 | return; |
@@ -1296,10 +1313,10 @@ void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port) | |||
1296 | intel_encoder->get_hw_state = intel_hdmi_get_hw_state; | 1313 | intel_encoder->get_hw_state = intel_hdmi_get_hw_state; |
1297 | intel_encoder->get_config = intel_hdmi_get_config; | 1314 | intel_encoder->get_config = intel_hdmi_get_config; |
1298 | if (IS_VALLEYVIEW(dev)) { | 1315 | if (IS_VALLEYVIEW(dev)) { |
1299 | intel_encoder->pre_pll_enable = intel_hdmi_pre_pll_enable; | 1316 | intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable; |
1300 | intel_encoder->pre_enable = intel_hdmi_pre_enable; | 1317 | intel_encoder->pre_enable = vlv_hdmi_pre_enable; |
1301 | intel_encoder->enable = vlv_enable_hdmi; | 1318 | intel_encoder->enable = vlv_enable_hdmi; |
1302 | intel_encoder->post_disable = intel_hdmi_post_disable; | 1319 | intel_encoder->post_disable = vlv_hdmi_post_disable; |
1303 | } else { | 1320 | } else { |
1304 | intel_encoder->enable = intel_enable_hdmi; | 1321 | intel_encoder->enable = intel_enable_hdmi; |
1305 | } | 1322 | } |