Skip to content

Commit 00b8307

Browse files
committed
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
2 parents c936a69 + 0f5a9be commit 00b8307

File tree

9 files changed

+94
-77
lines changed

9 files changed

+94
-77
lines changed

drivers/gpu/drm/i915/i915_debugfs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2734,6 +2734,8 @@ static const char *power_domain_str(enum intel_display_power_domain domain)
27342734
return "AUX_C";
27352735
case POWER_DOMAIN_AUX_D:
27362736
return "AUX_D";
2737+
case POWER_DOMAIN_GMBUS:
2738+
return "GMBUS";
27372739
case POWER_DOMAIN_INIT:
27382740
return "INIT";
27392741
default:

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ enum intel_display_power_domain {
199199
POWER_DOMAIN_AUX_B,
200200
POWER_DOMAIN_AUX_C,
201201
POWER_DOMAIN_AUX_D,
202+
POWER_DOMAIN_GMBUS,
202203
POWER_DOMAIN_INIT,
203204

204205
POWER_DOMAIN_NUM,

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,8 +1210,16 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
12101210
if (i915_gem_request_completed(req, true))
12111211
return 0;
12121212

1213-
timeout_expire = timeout ?
1214-
jiffies + nsecs_to_jiffies_timeout((u64)*timeout) : 0;
1213+
timeout_expire = 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+
}
12151223

12161224
if (INTEL_INFO(dev_priv)->gen >= 6)
12171225
gen6_rps_boost(dev_priv, rps, req->emitted_jiffies);

drivers/gpu/drm/i915/intel_display.c

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5194,11 +5194,31 @@ static enum intel_display_power_domain port_to_power_domain(enum port port)
51945194
case PORT_E:
51955195
return POWER_DOMAIN_PORT_DDI_E_2_LANES;
51965196
default:
5197-
WARN_ON_ONCE(1);
5197+
MISSING_CASE(port);
51985198
return POWER_DOMAIN_PORT_OTHER;
51995199
}
52005200
}
52015201

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+
52025222
#define for_each_power_domain(domain, mask) \
52035223
for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++) \
52045224
if ((1 << (domain)) & (mask))
@@ -5230,6 +5250,36 @@ intel_display_port_power_domain(struct intel_encoder *intel_encoder)
52305250
}
52315251
}
52325252

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+
52335283
static unsigned long get_crtc_power_domains(struct drm_crtc *crtc)
52345284
{
52355285
struct drm_device *dev = crtc->dev;

drivers/gpu/drm/i915/intel_dp.c

Lines changed: 14 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ static void pps_lock(struct intel_dp *intel_dp)
277277
* See vlv_power_sequencer_reset() why we need
278278
* a power domain reference here.
279279
*/
280-
power_domain = intel_display_port_power_domain(encoder);
280+
power_domain = intel_display_port_aux_power_domain(encoder);
281281
intel_display_power_get(dev_priv, power_domain);
282282

283283
mutex_lock(&dev_priv->pps_mutex);
@@ -293,7 +293,7 @@ static void pps_unlock(struct intel_dp *intel_dp)
293293

294294
mutex_unlock(&dev_priv->pps_mutex);
295295

296-
power_domain = intel_display_port_power_domain(encoder);
296+
power_domain = intel_display_port_aux_power_domain(encoder);
297297
intel_display_power_put(dev_priv, power_domain);
298298
}
299299

@@ -816,8 +816,6 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
816816

817817
intel_dp_check_edp(intel_dp);
818818

819-
intel_aux_display_runtime_get(dev_priv);
820-
821819
/* Try to wait for any previous AUX channel activity */
822820
for (try = 0; try < 3; try++) {
823821
status = I915_READ_NOTRACE(ch_ctl);
@@ -926,7 +924,6 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
926924
ret = recv_bytes;
927925
out:
928926
pm_qos_update_request(&dev_priv->pm_qos, PM_QOS_DEFAULT_VALUE);
929-
intel_aux_display_runtime_put(dev_priv);
930927

931928
if (vdd)
932929
edp_panel_vdd_off(intel_dp, false);
@@ -1784,7 +1781,7 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
17841781
if (edp_have_panel_vdd(intel_dp))
17851782
return need_to_disable;
17861783

1787-
power_domain = intel_display_port_power_domain(intel_encoder);
1784+
power_domain = intel_display_port_aux_power_domain(intel_encoder);
17881785
intel_display_power_get(dev_priv, power_domain);
17891786

17901787
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)
18741871
if ((pp & POWER_TARGET_ON) == 0)
18751872
intel_dp->last_power_cycle = jiffies;
18761873

1877-
power_domain = intel_display_port_power_domain(intel_encoder);
1874+
power_domain = intel_display_port_aux_power_domain(intel_encoder);
18781875
intel_display_power_put(dev_priv, power_domain);
18791876
}
18801877

@@ -2025,7 +2022,7 @@ static void edp_panel_off(struct intel_dp *intel_dp)
20252022
wait_panel_off(intel_dp);
20262023

20272024
/* 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);
20292026
intel_display_power_put(dev_priv, power_domain);
20302027
}
20312028

@@ -4765,26 +4762,6 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
47654762
intel_dp->has_audio = false;
47664763
}
47674764

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-
47884765
static enum drm_connector_status
47894766
intel_dp_detect(struct drm_connector *connector, bool force)
47904767
{
@@ -4808,7 +4785,8 @@ intel_dp_detect(struct drm_connector *connector, bool force)
48084785
return connector_status_disconnected;
48094786
}
48104787

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);
48124790

48134791
/* Can't disconnect eDP, but you can close the lid... */
48144792
if (is_edp(intel_dp))
@@ -4853,7 +4831,7 @@ intel_dp_detect(struct drm_connector *connector, bool force)
48534831
}
48544832

48554833
out:
4856-
intel_dp_power_put(intel_dp, power_domain);
4834+
intel_display_power_put(to_i915(dev), power_domain);
48574835
return status;
48584836
}
48594837

@@ -4862,6 +4840,7 @@ intel_dp_force(struct drm_connector *connector)
48624840
{
48634841
struct intel_dp *intel_dp = intel_attached_dp(connector);
48644842
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);
48654844
enum intel_display_power_domain power_domain;
48664845

48674846
DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
@@ -4871,11 +4850,12 @@ intel_dp_force(struct drm_connector *connector)
48714850
if (connector->status != connector_status_connected)
48724851
return;
48734852

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);
48754855

48764856
intel_dp_set_edid(intel_dp);
48774857

4878-
intel_dp_power_put(intel_dp, power_domain);
4858+
intel_display_power_put(dev_priv, power_domain);
48794859

48804860
if (intel_encoder->type != INTEL_OUTPUT_EDP)
48814861
intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
@@ -5091,7 +5071,7 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
50915071
* indefinitely.
50925072
*/
50935073
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);
50955075
intel_display_power_get(dev_priv, power_domain);
50965076

50975077
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)
51735153
port_name(intel_dig_port->port),
51745154
long_hpd ? "long" : "short");
51755155

5176-
power_domain = intel_display_port_power_domain(intel_encoder);
5156+
power_domain = intel_display_port_aux_power_domain(intel_encoder);
51775157
intel_display_power_get(dev_priv, power_domain);
51785158

51795159
if (long_hpd) {

drivers/gpu/drm/i915/intel_drv.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,6 +1169,8 @@ void hsw_enable_ips(struct intel_crtc *crtc);
11691169
void hsw_disable_ips(struct intel_crtc *crtc);
11701170
enum intel_display_power_domain
11711171
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);
11721174
void intel_mode_from_pipe_config(struct drm_display_mode *mode,
11731175
struct intel_crtc_state *pipe_config);
11741176
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,
13771379
enum intel_display_power_domain domain);
13781380
void intel_display_power_put(struct drm_i915_private *dev_priv,
13791381
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);
13821382
void intel_runtime_pm_get(struct drm_i915_private *dev_priv);
13831383
void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv);
13841384
void intel_runtime_pm_put(struct drm_i915_private *dev_priv);

drivers/gpu/drm/i915/intel_hdmi.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,21 +1335,17 @@ intel_hdmi_set_edid(struct drm_connector *connector, bool force)
13351335
{
13361336
struct drm_i915_private *dev_priv = to_i915(connector->dev);
13371337
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;
13411338
struct edid *edid = NULL;
13421339
bool connected = false;
13431340

1344-
power_domain = intel_display_port_power_domain(intel_encoder);
1345-
intel_display_power_get(dev_priv, power_domain);
1341+
intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
13461342

13471343
if (force)
13481344
edid = drm_get_edid(connector,
13491345
intel_gmbus_get_adapter(dev_priv,
13501346
intel_hdmi->ddc_bus));
13511347

1352-
intel_display_power_put(dev_priv, power_domain);
1348+
intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
13531349

13541350
to_intel_connector(connector)->detect_edid = edid;
13551351
if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
@@ -1383,6 +1379,8 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
13831379
DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
13841380
connector->base.id, connector->name);
13851381

1382+
intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
1383+
13861384
while (!live_status && --retry) {
13871385
live_status = intel_digital_port_connected(dev_priv,
13881386
hdmi_to_dig_port(intel_hdmi));
@@ -1402,6 +1400,8 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
14021400
} else
14031401
status = connector_status_disconnected;
14041402

1403+
intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
1404+
14051405
return status;
14061406
}
14071407

drivers/gpu/drm/i915/intel_i2c.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ gmbus_xfer(struct i2c_adapter *adapter,
483483
int i = 0, inc, try = 0;
484484
int ret = 0;
485485

486-
intel_aux_display_runtime_get(dev_priv);
486+
intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
487487
mutex_lock(&dev_priv->gmbus_mutex);
488488

489489
if (bus->force_bit) {
@@ -595,7 +595,9 @@ gmbus_xfer(struct i2c_adapter *adapter,
595595

596596
out:
597597
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+
599601
return ret;
600602
}
601603

drivers/gpu/drm/i915/intel_runtime_pm.c

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,7 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv,
362362
BIT(POWER_DOMAIN_AUX_C) | \
363363
BIT(POWER_DOMAIN_AUDIO) | \
364364
BIT(POWER_DOMAIN_VGA) | \
365+
BIT(POWER_DOMAIN_GMBUS) | \
365366
BIT(POWER_DOMAIN_INIT))
366367
#define BXT_DISPLAY_POWERWELL_1_POWER_DOMAINS ( \
367368
BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
@@ -1483,6 +1484,7 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
14831484
BIT(POWER_DOMAIN_AUX_B) | \
14841485
BIT(POWER_DOMAIN_AUX_C) | \
14851486
BIT(POWER_DOMAIN_AUX_D) | \
1487+
BIT(POWER_DOMAIN_GMBUS) | \
14861488
BIT(POWER_DOMAIN_INIT))
14871489
#define HSW_DISPLAY_POWER_DOMAINS ( \
14881490
(POWER_DOMAIN_MASK & ~HSW_ALWAYS_ON_POWER_DOMAINS) | \
@@ -1845,6 +1847,8 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv)
18451847
i915.disable_power_well = sanitize_disable_power_well_option(dev_priv,
18461848
i915.disable_power_well);
18471849

1850+
BUILD_BUG_ON(POWER_DOMAIN_NUM > 31);
1851+
18481852
mutex_init(&power_domains->lock);
18491853

18501854
/*
@@ -2063,36 +2067,6 @@ void intel_power_domains_init_hw(struct drm_i915_private *dev_priv)
20632067
power_domains->initializing = false;
20642068
}
20652069

2066-
/**
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-
20962070
/**
20972071
* intel_runtime_pm_get - grab a runtime pm reference
20982072
* @dev_priv: i915 device instance

0 commit comments

Comments
 (0)