diff options
author | Dave Airlie <airlied@redhat.com> | 2015-12-03 21:23:13 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2015-12-03 21:23:13 -0500 |
commit | 00b83070b3ba287bf0100b9a8180e06b5b5bbde1 (patch) | |
tree | 81d24c39b57a0c1713e8285957a3691ef168000a /drivers/gpu/drm | |
parent | c936a69981435b994a1ffe1e2a9ccf70aeb09a54 (diff) | |
parent | 0f5a9be15797f78c9a34e432f26c796165b6e49a (diff) |
Merge tag 'drm-intel-fixes-2015-12-03' of git://anongit.freedesktop.org/drm-intel into drm-fixes
Another batch of drm/i915 fixes for v4.4, on top of the ones from
earlier this week. One timeout handling regression fix from Chris, and
backport of five patches from our -next to fix a power management
related HDMI hotplug regression.
* tag 'drm-intel-fixes-2015-12-03' of git://anongit.freedesktop.org/drm-intel:
drm/i915: take a power domain reference while checking the HDMI live status
drm/i915: add MISSING_CASE to a few port/aux power domain helpers
drm/i915/ddi: fix intel_display_port_aux_power_domain() after HDMI detect
drm/i915: Introduce a gmbus power domain
drm/i915: Clean up AUX power domain handling
drm/i915: Check the timeout passed to i915_wait_request
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 52 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 48 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_i2c.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 34 |
9 files changed, 94 insertions, 77 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index a3b22bdacd44..8aab974b0564 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -2734,6 +2734,8 @@ static const char *power_domain_str(enum intel_display_power_domain domain) | |||
2734 | return "AUX_C"; | 2734 | return "AUX_C"; |
2735 | case POWER_DOMAIN_AUX_D: | 2735 | case POWER_DOMAIN_AUX_D: |
2736 | return "AUX_D"; | 2736 | return "AUX_D"; |
2737 | case POWER_DOMAIN_GMBUS: | ||
2738 | return "GMBUS"; | ||
2737 | case POWER_DOMAIN_INIT: | 2739 | case POWER_DOMAIN_INIT: |
2738 | return "INIT"; | 2740 | return "INIT"; |
2739 | default: | 2741 | default: |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 95bb27de774f..a01e51581c4c 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -199,6 +199,7 @@ enum intel_display_power_domain { | |||
199 | POWER_DOMAIN_AUX_B, | 199 | POWER_DOMAIN_AUX_B, |
200 | POWER_DOMAIN_AUX_C, | 200 | POWER_DOMAIN_AUX_C, |
201 | POWER_DOMAIN_AUX_D, | 201 | POWER_DOMAIN_AUX_D, |
202 | POWER_DOMAIN_GMBUS, | ||
202 | POWER_DOMAIN_INIT, | 203 | POWER_DOMAIN_INIT, |
203 | 204 | ||
204 | POWER_DOMAIN_NUM, | 205 | POWER_DOMAIN_NUM, |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 91bb1fc27420..32e6aade6223 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -1210,8 +1210,16 @@ int __i915_wait_request(struct drm_i915_gem_request *req, | |||
1210 | if (i915_gem_request_completed(req, true)) | 1210 | if (i915_gem_request_completed(req, true)) |
1211 | return 0; | 1211 | return 0; |
1212 | 1212 | ||
1213 | timeout_expire = timeout ? | 1213 | timeout_expire = 0; |
1214 | jiffies + nsecs_to_jiffies_timeout((u64)*timeout) : 0; | 1214 | if (timeout) { |
1215 | if (WARN_ON(*timeout < 0)) | ||
1216 | return -EINVAL; | ||
1217 | |||
1218 | if (*timeout == 0) | ||
1219 | return -ETIME; | ||
1220 | |||
1221 | timeout_expire = jiffies + nsecs_to_jiffies_timeout(*timeout); | ||
1222 | } | ||
1215 | 1223 | ||
1216 | if (INTEL_INFO(dev_priv)->gen >= 6) | 1224 | if (INTEL_INFO(dev_priv)->gen >= 6) |
1217 | gen6_rps_boost(dev_priv, rps, req->emitted_jiffies); | 1225 | gen6_rps_boost(dev_priv, rps, req->emitted_jiffies); |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 12a2e9d1f633..22e86d2e408d 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -5194,11 +5194,31 @@ static enum intel_display_power_domain port_to_power_domain(enum port port) | |||
5194 | case PORT_E: | 5194 | case PORT_E: |
5195 | return POWER_DOMAIN_PORT_DDI_E_2_LANES; | 5195 | return POWER_DOMAIN_PORT_DDI_E_2_LANES; |
5196 | default: | 5196 | default: |
5197 | WARN_ON_ONCE(1); | 5197 | MISSING_CASE(port); |
5198 | return POWER_DOMAIN_PORT_OTHER; | 5198 | return POWER_DOMAIN_PORT_OTHER; |
5199 | } | 5199 | } |
5200 | } | 5200 | } |
5201 | 5201 | ||
5202 | static enum intel_display_power_domain port_to_aux_power_domain(enum port port) | ||
5203 | { | ||
5204 | switch (port) { | ||
5205 | case PORT_A: | ||
5206 | return POWER_DOMAIN_AUX_A; | ||
5207 | case PORT_B: | ||
5208 | return POWER_DOMAIN_AUX_B; | ||
5209 | case PORT_C: | ||
5210 | return POWER_DOMAIN_AUX_C; | ||
5211 | case PORT_D: | ||
5212 | return POWER_DOMAIN_AUX_D; | ||
5213 | case PORT_E: | ||
5214 | /* FIXME: Check VBT for actual wiring of PORT E */ | ||
5215 | return POWER_DOMAIN_AUX_D; | ||
5216 | default: | ||
5217 | MISSING_CASE(port); | ||
5218 | return POWER_DOMAIN_AUX_A; | ||
5219 | } | ||
5220 | } | ||
5221 | |||
5202 | #define for_each_power_domain(domain, mask) \ | 5222 | #define for_each_power_domain(domain, mask) \ |
5203 | for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++) \ | 5223 | for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++) \ |
5204 | if ((1 << (domain)) & (mask)) | 5224 | if ((1 << (domain)) & (mask)) |
@@ -5230,6 +5250,36 @@ intel_display_port_power_domain(struct intel_encoder *intel_encoder) | |||
5230 | } | 5250 | } |
5231 | } | 5251 | } |
5232 | 5252 | ||
5253 | enum intel_display_power_domain | ||
5254 | intel_display_port_aux_power_domain(struct intel_encoder *intel_encoder) | ||
5255 | { | ||
5256 | struct drm_device *dev = intel_encoder->base.dev; | ||
5257 | struct intel_digital_port *intel_dig_port; | ||
5258 | |||
5259 | switch (intel_encoder->type) { | ||
5260 | case INTEL_OUTPUT_UNKNOWN: | ||
5261 | case INTEL_OUTPUT_HDMI: | ||
5262 | /* | ||
5263 | * Only DDI platforms should ever use these output types. | ||
5264 | * We can get here after the HDMI detect code has already set | ||
5265 | * the type of the shared encoder. Since we can't be sure | ||
5266 | * what's the status of the given connectors, play safe and | ||
5267 | * run the DP detection too. | ||
5268 | */ | ||
5269 | WARN_ON_ONCE(!HAS_DDI(dev)); | ||
5270 | case INTEL_OUTPUT_DISPLAYPORT: | ||
5271 | case INTEL_OUTPUT_EDP: | ||
5272 | intel_dig_port = enc_to_dig_port(&intel_encoder->base); | ||
5273 | return port_to_aux_power_domain(intel_dig_port->port); | ||
5274 | case INTEL_OUTPUT_DP_MST: | ||
5275 | intel_dig_port = enc_to_mst(&intel_encoder->base)->primary; | ||
5276 | return port_to_aux_power_domain(intel_dig_port->port); | ||
5277 | default: | ||
5278 | MISSING_CASE(intel_encoder->type); | ||
5279 | return POWER_DOMAIN_AUX_A; | ||
5280 | } | ||
5281 | } | ||
5282 | |||
5233 | static unsigned long get_crtc_power_domains(struct drm_crtc *crtc) | 5283 | static unsigned long get_crtc_power_domains(struct drm_crtc *crtc) |
5234 | { | 5284 | { |
5235 | struct drm_device *dev = crtc->dev; | 5285 | struct drm_device *dev = crtc->dev; |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index d34e64300d66..78b8ec84d576 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -277,7 +277,7 @@ static void pps_lock(struct intel_dp *intel_dp) | |||
277 | * See vlv_power_sequencer_reset() why we need | 277 | * See vlv_power_sequencer_reset() why we need |
278 | * a power domain reference here. | 278 | * a power domain reference here. |
279 | */ | 279 | */ |
280 | power_domain = intel_display_port_power_domain(encoder); | 280 | power_domain = intel_display_port_aux_power_domain(encoder); |
281 | intel_display_power_get(dev_priv, power_domain); | 281 | intel_display_power_get(dev_priv, power_domain); |
282 | 282 | ||
283 | mutex_lock(&dev_priv->pps_mutex); | 283 | mutex_lock(&dev_priv->pps_mutex); |
@@ -293,7 +293,7 @@ static void pps_unlock(struct intel_dp *intel_dp) | |||
293 | 293 | ||
294 | mutex_unlock(&dev_priv->pps_mutex); | 294 | mutex_unlock(&dev_priv->pps_mutex); |
295 | 295 | ||
296 | power_domain = intel_display_port_power_domain(encoder); | 296 | power_domain = intel_display_port_aux_power_domain(encoder); |
297 | intel_display_power_put(dev_priv, power_domain); | 297 | intel_display_power_put(dev_priv, power_domain); |
298 | } | 298 | } |
299 | 299 | ||
@@ -816,8 +816,6 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, | |||
816 | 816 | ||
817 | intel_dp_check_edp(intel_dp); | 817 | intel_dp_check_edp(intel_dp); |
818 | 818 | ||
819 | intel_aux_display_runtime_get(dev_priv); | ||
820 | |||
821 | /* Try to wait for any previous AUX channel activity */ | 819 | /* Try to wait for any previous AUX channel activity */ |
822 | for (try = 0; try < 3; try++) { | 820 | for (try = 0; try < 3; try++) { |
823 | status = I915_READ_NOTRACE(ch_ctl); | 821 | status = I915_READ_NOTRACE(ch_ctl); |
@@ -926,7 +924,6 @@ done: | |||
926 | ret = recv_bytes; | 924 | ret = recv_bytes; |
927 | out: | 925 | out: |
928 | pm_qos_update_request(&dev_priv->pm_qos, PM_QOS_DEFAULT_VALUE); | 926 | pm_qos_update_request(&dev_priv->pm_qos, PM_QOS_DEFAULT_VALUE); |
929 | intel_aux_display_runtime_put(dev_priv); | ||
930 | 927 | ||
931 | if (vdd) | 928 | if (vdd) |
932 | edp_panel_vdd_off(intel_dp, false); | 929 | edp_panel_vdd_off(intel_dp, false); |
@@ -1784,7 +1781,7 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp) | |||
1784 | if (edp_have_panel_vdd(intel_dp)) | 1781 | if (edp_have_panel_vdd(intel_dp)) |
1785 | return need_to_disable; | 1782 | return need_to_disable; |
1786 | 1783 | ||
1787 | power_domain = intel_display_port_power_domain(intel_encoder); | 1784 | power_domain = intel_display_port_aux_power_domain(intel_encoder); |
1788 | intel_display_power_get(dev_priv, power_domain); | 1785 | intel_display_power_get(dev_priv, power_domain); |
1789 | 1786 | ||
1790 | DRM_DEBUG_KMS("Turning eDP port %c VDD on\n", | 1787 | DRM_DEBUG_KMS("Turning eDP port %c VDD on\n", |
@@ -1874,7 +1871,7 @@ static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp) | |||
1874 | if ((pp & POWER_TARGET_ON) == 0) | 1871 | if ((pp & POWER_TARGET_ON) == 0) |
1875 | intel_dp->last_power_cycle = jiffies; | 1872 | intel_dp->last_power_cycle = jiffies; |
1876 | 1873 | ||
1877 | power_domain = intel_display_port_power_domain(intel_encoder); | 1874 | power_domain = intel_display_port_aux_power_domain(intel_encoder); |
1878 | intel_display_power_put(dev_priv, power_domain); | 1875 | intel_display_power_put(dev_priv, power_domain); |
1879 | } | 1876 | } |
1880 | 1877 | ||
@@ -2025,7 +2022,7 @@ static void edp_panel_off(struct intel_dp *intel_dp) | |||
2025 | wait_panel_off(intel_dp); | 2022 | wait_panel_off(intel_dp); |
2026 | 2023 | ||
2027 | /* We got a reference when we enabled the VDD. */ | 2024 | /* We got a reference when we enabled the VDD. */ |
2028 | power_domain = intel_display_port_power_domain(intel_encoder); | 2025 | power_domain = intel_display_port_aux_power_domain(intel_encoder); |
2029 | intel_display_power_put(dev_priv, power_domain); | 2026 | intel_display_power_put(dev_priv, power_domain); |
2030 | } | 2027 | } |
2031 | 2028 | ||
@@ -4765,26 +4762,6 @@ intel_dp_unset_edid(struct intel_dp *intel_dp) | |||
4765 | intel_dp->has_audio = false; | 4762 | intel_dp->has_audio = false; |
4766 | } | 4763 | } |
4767 | 4764 | ||
4768 | static enum intel_display_power_domain | ||
4769 | intel_dp_power_get(struct intel_dp *dp) | ||
4770 | { | ||
4771 | struct intel_encoder *encoder = &dp_to_dig_port(dp)->base; | ||
4772 | enum intel_display_power_domain power_domain; | ||
4773 | |||
4774 | power_domain = intel_display_port_power_domain(encoder); | ||
4775 | intel_display_power_get(to_i915(encoder->base.dev), power_domain); | ||
4776 | |||
4777 | return power_domain; | ||
4778 | } | ||
4779 | |||
4780 | static void | ||
4781 | intel_dp_power_put(struct intel_dp *dp, | ||
4782 | enum intel_display_power_domain power_domain) | ||
4783 | { | ||
4784 | struct intel_encoder *encoder = &dp_to_dig_port(dp)->base; | ||
4785 | intel_display_power_put(to_i915(encoder->base.dev), power_domain); | ||
4786 | } | ||
4787 | |||
4788 | static enum drm_connector_status | 4765 | static enum drm_connector_status |
4789 | intel_dp_detect(struct drm_connector *connector, bool force) | 4766 | intel_dp_detect(struct drm_connector *connector, bool force) |
4790 | { | 4767 | { |
@@ -4808,7 +4785,8 @@ intel_dp_detect(struct drm_connector *connector, bool force) | |||
4808 | return connector_status_disconnected; | 4785 | return connector_status_disconnected; |
4809 | } | 4786 | } |
4810 | 4787 | ||
4811 | power_domain = intel_dp_power_get(intel_dp); | 4788 | power_domain = intel_display_port_aux_power_domain(intel_encoder); |
4789 | intel_display_power_get(to_i915(dev), power_domain); | ||
4812 | 4790 | ||
4813 | /* Can't disconnect eDP, but you can close the lid... */ | 4791 | /* Can't disconnect eDP, but you can close the lid... */ |
4814 | if (is_edp(intel_dp)) | 4792 | if (is_edp(intel_dp)) |
@@ -4853,7 +4831,7 @@ intel_dp_detect(struct drm_connector *connector, bool force) | |||
4853 | } | 4831 | } |
4854 | 4832 | ||
4855 | out: | 4833 | out: |
4856 | intel_dp_power_put(intel_dp, power_domain); | 4834 | intel_display_power_put(to_i915(dev), power_domain); |
4857 | return status; | 4835 | return status; |
4858 | } | 4836 | } |
4859 | 4837 | ||
@@ -4862,6 +4840,7 @@ intel_dp_force(struct drm_connector *connector) | |||
4862 | { | 4840 | { |
4863 | struct intel_dp *intel_dp = intel_attached_dp(connector); | 4841 | struct intel_dp *intel_dp = intel_attached_dp(connector); |
4864 | struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base; | 4842 | struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base; |
4843 | struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev); | ||
4865 | enum intel_display_power_domain power_domain; | 4844 | enum intel_display_power_domain power_domain; |
4866 | 4845 | ||
4867 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", | 4846 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", |
@@ -4871,11 +4850,12 @@ intel_dp_force(struct drm_connector *connector) | |||
4871 | if (connector->status != connector_status_connected) | 4850 | if (connector->status != connector_status_connected) |
4872 | return; | 4851 | return; |
4873 | 4852 | ||
4874 | power_domain = intel_dp_power_get(intel_dp); | 4853 | power_domain = intel_display_port_aux_power_domain(intel_encoder); |
4854 | intel_display_power_get(dev_priv, power_domain); | ||
4875 | 4855 | ||
4876 | intel_dp_set_edid(intel_dp); | 4856 | intel_dp_set_edid(intel_dp); |
4877 | 4857 | ||
4878 | intel_dp_power_put(intel_dp, power_domain); | 4858 | intel_display_power_put(dev_priv, power_domain); |
4879 | 4859 | ||
4880 | if (intel_encoder->type != INTEL_OUTPUT_EDP) | 4860 | if (intel_encoder->type != INTEL_OUTPUT_EDP) |
4881 | intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT; | 4861 | intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT; |
@@ -5091,7 +5071,7 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp) | |||
5091 | * indefinitely. | 5071 | * indefinitely. |
5092 | */ | 5072 | */ |
5093 | DRM_DEBUG_KMS("VDD left on by BIOS, adjusting state tracking\n"); | 5073 | DRM_DEBUG_KMS("VDD left on by BIOS, adjusting state tracking\n"); |
5094 | power_domain = intel_display_port_power_domain(&intel_dig_port->base); | 5074 | power_domain = intel_display_port_aux_power_domain(&intel_dig_port->base); |
5095 | intel_display_power_get(dev_priv, power_domain); | 5075 | intel_display_power_get(dev_priv, power_domain); |
5096 | 5076 | ||
5097 | edp_panel_vdd_schedule_off(intel_dp); | 5077 | edp_panel_vdd_schedule_off(intel_dp); |
@@ -5173,7 +5153,7 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd) | |||
5173 | port_name(intel_dig_port->port), | 5153 | port_name(intel_dig_port->port), |
5174 | long_hpd ? "long" : "short"); | 5154 | long_hpd ? "long" : "short"); |
5175 | 5155 | ||
5176 | power_domain = intel_display_port_power_domain(intel_encoder); | 5156 | power_domain = intel_display_port_aux_power_domain(intel_encoder); |
5177 | intel_display_power_get(dev_priv, power_domain); | 5157 | intel_display_power_get(dev_priv, power_domain); |
5178 | 5158 | ||
5179 | if (long_hpd) { | 5159 | if (long_hpd) { |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 0598932ce623..f2a1142bff34 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -1169,6 +1169,8 @@ void hsw_enable_ips(struct intel_crtc *crtc); | |||
1169 | void hsw_disable_ips(struct intel_crtc *crtc); | 1169 | void hsw_disable_ips(struct intel_crtc *crtc); |
1170 | enum intel_display_power_domain | 1170 | enum intel_display_power_domain |
1171 | intel_display_port_power_domain(struct intel_encoder *intel_encoder); | 1171 | intel_display_port_power_domain(struct intel_encoder *intel_encoder); |
1172 | enum intel_display_power_domain | ||
1173 | intel_display_port_aux_power_domain(struct intel_encoder *intel_encoder); | ||
1172 | void intel_mode_from_pipe_config(struct drm_display_mode *mode, | 1174 | void intel_mode_from_pipe_config(struct drm_display_mode *mode, |
1173 | struct intel_crtc_state *pipe_config); | 1175 | struct intel_crtc_state *pipe_config); |
1174 | void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc); | 1176 | void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc); |
@@ -1377,8 +1379,6 @@ void intel_display_power_get(struct drm_i915_private *dev_priv, | |||
1377 | enum intel_display_power_domain domain); | 1379 | enum intel_display_power_domain domain); |
1378 | void intel_display_power_put(struct drm_i915_private *dev_priv, | 1380 | void intel_display_power_put(struct drm_i915_private *dev_priv, |
1379 | enum intel_display_power_domain domain); | 1381 | enum intel_display_power_domain domain); |
1380 | void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv); | ||
1381 | void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv); | ||
1382 | void intel_runtime_pm_get(struct drm_i915_private *dev_priv); | 1382 | void intel_runtime_pm_get(struct drm_i915_private *dev_priv); |
1383 | void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv); | 1383 | void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv); |
1384 | void intel_runtime_pm_put(struct drm_i915_private *dev_priv); | 1384 | void intel_runtime_pm_put(struct drm_i915_private *dev_priv); |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 9eafa191cee2..81cdd9ff3892 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -1335,21 +1335,17 @@ intel_hdmi_set_edid(struct drm_connector *connector, bool force) | |||
1335 | { | 1335 | { |
1336 | struct drm_i915_private *dev_priv = to_i915(connector->dev); | 1336 | struct drm_i915_private *dev_priv = to_i915(connector->dev); |
1337 | struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); | 1337 | struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); |
1338 | struct intel_encoder *intel_encoder = | ||
1339 | &hdmi_to_dig_port(intel_hdmi)->base; | ||
1340 | enum intel_display_power_domain power_domain; | ||
1341 | struct edid *edid = NULL; | 1338 | struct edid *edid = NULL; |
1342 | bool connected = false; | 1339 | bool connected = false; |
1343 | 1340 | ||
1344 | power_domain = intel_display_port_power_domain(intel_encoder); | 1341 | intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); |
1345 | intel_display_power_get(dev_priv, power_domain); | ||
1346 | 1342 | ||
1347 | if (force) | 1343 | if (force) |
1348 | edid = drm_get_edid(connector, | 1344 | edid = drm_get_edid(connector, |
1349 | intel_gmbus_get_adapter(dev_priv, | 1345 | intel_gmbus_get_adapter(dev_priv, |
1350 | intel_hdmi->ddc_bus)); | 1346 | intel_hdmi->ddc_bus)); |
1351 | 1347 | ||
1352 | intel_display_power_put(dev_priv, power_domain); | 1348 | intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); |
1353 | 1349 | ||
1354 | to_intel_connector(connector)->detect_edid = edid; | 1350 | to_intel_connector(connector)->detect_edid = edid; |
1355 | if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) { | 1351 | if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) { |
@@ -1383,6 +1379,8 @@ intel_hdmi_detect(struct drm_connector *connector, bool force) | |||
1383 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", | 1379 | DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", |
1384 | connector->base.id, connector->name); | 1380 | connector->base.id, connector->name); |
1385 | 1381 | ||
1382 | intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); | ||
1383 | |||
1386 | while (!live_status && --retry) { | 1384 | while (!live_status && --retry) { |
1387 | live_status = intel_digital_port_connected(dev_priv, | 1385 | live_status = intel_digital_port_connected(dev_priv, |
1388 | hdmi_to_dig_port(intel_hdmi)); | 1386 | hdmi_to_dig_port(intel_hdmi)); |
@@ -1402,6 +1400,8 @@ intel_hdmi_detect(struct drm_connector *connector, bool force) | |||
1402 | } else | 1400 | } else |
1403 | status = connector_status_disconnected; | 1401 | status = connector_status_disconnected; |
1404 | 1402 | ||
1403 | intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); | ||
1404 | |||
1405 | return status; | 1405 | return status; |
1406 | } | 1406 | } |
1407 | 1407 | ||
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c index 1369fc41d039..8324654037b6 100644 --- a/drivers/gpu/drm/i915/intel_i2c.c +++ b/drivers/gpu/drm/i915/intel_i2c.c | |||
@@ -483,7 +483,7 @@ gmbus_xfer(struct i2c_adapter *adapter, | |||
483 | int i = 0, inc, try = 0; | 483 | int i = 0, inc, try = 0; |
484 | int ret = 0; | 484 | int ret = 0; |
485 | 485 | ||
486 | intel_aux_display_runtime_get(dev_priv); | 486 | intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); |
487 | mutex_lock(&dev_priv->gmbus_mutex); | 487 | mutex_lock(&dev_priv->gmbus_mutex); |
488 | 488 | ||
489 | if (bus->force_bit) { | 489 | if (bus->force_bit) { |
@@ -595,7 +595,9 @@ timeout: | |||
595 | 595 | ||
596 | out: | 596 | out: |
597 | mutex_unlock(&dev_priv->gmbus_mutex); | 597 | mutex_unlock(&dev_priv->gmbus_mutex); |
598 | intel_aux_display_runtime_put(dev_priv); | 598 | |
599 | intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); | ||
600 | |||
599 | return ret; | 601 | return ret; |
600 | } | 602 | } |
601 | 603 | ||
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index d89c1d0aa1b7..7e23d65c9b24 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c | |||
@@ -362,6 +362,7 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv, | |||
362 | BIT(POWER_DOMAIN_AUX_C) | \ | 362 | BIT(POWER_DOMAIN_AUX_C) | \ |
363 | BIT(POWER_DOMAIN_AUDIO) | \ | 363 | BIT(POWER_DOMAIN_AUDIO) | \ |
364 | BIT(POWER_DOMAIN_VGA) | \ | 364 | BIT(POWER_DOMAIN_VGA) | \ |
365 | BIT(POWER_DOMAIN_GMBUS) | \ | ||
365 | BIT(POWER_DOMAIN_INIT)) | 366 | BIT(POWER_DOMAIN_INIT)) |
366 | #define BXT_DISPLAY_POWERWELL_1_POWER_DOMAINS ( \ | 367 | #define BXT_DISPLAY_POWERWELL_1_POWER_DOMAINS ( \ |
367 | BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ | 368 | BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ |
@@ -1483,6 +1484,7 @@ void intel_display_power_put(struct drm_i915_private *dev_priv, | |||
1483 | BIT(POWER_DOMAIN_AUX_B) | \ | 1484 | BIT(POWER_DOMAIN_AUX_B) | \ |
1484 | BIT(POWER_DOMAIN_AUX_C) | \ | 1485 | BIT(POWER_DOMAIN_AUX_C) | \ |
1485 | BIT(POWER_DOMAIN_AUX_D) | \ | 1486 | BIT(POWER_DOMAIN_AUX_D) | \ |
1487 | BIT(POWER_DOMAIN_GMBUS) | \ | ||
1486 | BIT(POWER_DOMAIN_INIT)) | 1488 | BIT(POWER_DOMAIN_INIT)) |
1487 | #define HSW_DISPLAY_POWER_DOMAINS ( \ | 1489 | #define HSW_DISPLAY_POWER_DOMAINS ( \ |
1488 | (POWER_DOMAIN_MASK & ~HSW_ALWAYS_ON_POWER_DOMAINS) | \ | 1490 | (POWER_DOMAIN_MASK & ~HSW_ALWAYS_ON_POWER_DOMAINS) | \ |
@@ -1845,6 +1847,8 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv) | |||
1845 | i915.disable_power_well = sanitize_disable_power_well_option(dev_priv, | 1847 | i915.disable_power_well = sanitize_disable_power_well_option(dev_priv, |
1846 | i915.disable_power_well); | 1848 | i915.disable_power_well); |
1847 | 1849 | ||
1850 | BUILD_BUG_ON(POWER_DOMAIN_NUM > 31); | ||
1851 | |||
1848 | mutex_init(&power_domains->lock); | 1852 | mutex_init(&power_domains->lock); |
1849 | 1853 | ||
1850 | /* | 1854 | /* |
@@ -2064,36 +2068,6 @@ void intel_power_domains_init_hw(struct drm_i915_private *dev_priv) | |||
2064 | } | 2068 | } |
2065 | 2069 | ||
2066 | /** | 2070 | /** |
2067 | * intel_aux_display_runtime_get - grab an auxiliary power domain reference | ||
2068 | * @dev_priv: i915 device instance | ||
2069 | * | ||
2070 | * This function grabs a power domain reference for the auxiliary power domain | ||
2071 | * (for access to the GMBUS and DP AUX blocks) and ensures that it and all its | ||
2072 | * parents are powered up. Therefore users should only grab a reference to the | ||
2073 | * innermost power domain they need. | ||
2074 | * | ||
2075 | * Any power domain reference obtained by this function must have a symmetric | ||
2076 | * call to intel_aux_display_runtime_put() to release the reference again. | ||
2077 | */ | ||
2078 | void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv) | ||
2079 | { | ||
2080 | intel_runtime_pm_get(dev_priv); | ||
2081 | } | ||
2082 | |||
2083 | /** | ||
2084 | * intel_aux_display_runtime_put - release an auxiliary power domain reference | ||
2085 | * @dev_priv: i915 device instance | ||
2086 | * | ||
2087 | * This function drops the auxiliary power domain reference obtained by | ||
2088 | * intel_aux_display_runtime_get() and might power down the corresponding | ||
2089 | * hardware block right away if this is the last reference. | ||
2090 | */ | ||
2091 | void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv) | ||
2092 | { | ||
2093 | intel_runtime_pm_put(dev_priv); | ||
2094 | } | ||
2095 | |||
2096 | /** | ||
2097 | * intel_runtime_pm_get - grab a runtime pm reference | 2071 | * intel_runtime_pm_get - grab a runtime pm reference |
2098 | * @dev_priv: i915 device instance | 2072 | * @dev_priv: i915 device instance |
2099 | * | 2073 | * |