diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2015-11-27 11:55:26 -0500 |
---|---|---|
committer | Jani Nikula <jani.nikula@intel.com> | 2015-12-02 09:42:46 -0500 |
commit | ac9b8236551d1177fd07b56aef9b565d1864420d (patch) | |
tree | 01ad12841f0dd5991af82fd0c7dc2b3b4705ce88 | |
parent | a781ce79d51fc4952870c998937980a042927e84 (diff) |
drm/i915: Introduce a gmbus power domain
Currently the gmbus code uses intel_aux_display_runtime_get/put in an
effort to make sure the hardware is powered up sufficiently for gmbus.
That function only takes the runtime PM reference which on VLV/CHV/BXT
is not enough. We need the disp2d/pipe-a well on VLV/CHV and power well
2 on BXT. So add a new power domnain for gmbus and kill off the now
unused intel_aux_display_runtime_get/put. And change
intel_hdmi_set_edid() to use the gmbus power domain too since that's all
we need there.
Also toss in a BUILD_BUG_ON() to catch problems if we run out of
bits for power domains. We're already really close to the limit...
[Patrik: Add gmbus string to debugfs output]
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Patrik Jakobsson <patrik.jakobsson@linux.intel.com>
[Cherry-picked from drm-intel-next-queued f0ab43e6 (Imre)]
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1448643329-18675-3-git-send-email-imre.deak@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
-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/intel_drv.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_i2c.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 34 |
6 files changed, 13 insertions, 40 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/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 449c28a85c9f..f2a1142bff34 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -1379,8 +1379,6 @@ void intel_display_power_get(struct drm_i915_private *dev_priv, | |||
1379 | enum intel_display_power_domain domain); | 1379 | enum intel_display_power_domain domain); |
1380 | void intel_display_power_put(struct drm_i915_private *dev_priv, | 1380 | void intel_display_power_put(struct drm_i915_private *dev_priv, |
1381 | enum intel_display_power_domain domain); | 1381 | enum intel_display_power_domain domain); |
1382 | void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv); | ||
1383 | void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv); | ||
1384 | void intel_runtime_pm_get(struct drm_i915_private *dev_priv); | 1382 | void intel_runtime_pm_get(struct drm_i915_private *dev_priv); |
1385 | 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); |
1386 | 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..0e5ce70aba76 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) { |
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 | * |