aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_hdmi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_hdmi.c')
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c83
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
732static void intel_enable_hdmi(struct intel_encoder *encoder) 743static 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
1066static void intel_hdmi_pre_enable(struct intel_encoder *encoder) 1077static 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
1119static void intel_hdmi_pre_pll_enable(struct intel_encoder *encoder) 1130static 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
1152static void intel_hdmi_post_disable(struct intel_encoder *encoder) 1166static 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
1165static void intel_hdmi_destroy(struct drm_connector *connector) 1182static 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 }