aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Weinehall <david.weinehall@linux.intel.com>2016-08-17 08:47:48 -0400
committerJani Nikula <jani.nikula@intel.com>2016-09-07 07:53:31 -0400
commit23f889bdf6ee5cfff012d8b09f6bec920c691696 (patch)
tree3831bd4d8cadebe9d74d59dc84d79238cc3d66a4
parentccebc23b57c313229526dc76383ce82f5e0b9001 (diff)
Revert "drm/i915: Check live status before reading edid"
This reverts commit 237ed86c693d8a8e4db476976aeb30df4deac74b. Our current implementation of live status check (repeat 9 times with 10ms delays between each attempt as a workaround for buggy displays) imposes a rather serious penalty, time wise, on intel_hdmi_detect(). Since we we already skip live status checks on platforms before gen 7, and since we seem to have coped quite well before the live status check was introduced for newer platforms too, the previous behaviour is probably preferable, at least unless someone can point to a use-case that the live status check improves (apart from "Bspec says so".) Signed-off-by: David Weinehall <david.weinehall@linux.intel.com> Fixes: 237ed86c693d ("drm/i915: Check live status before reading edid") Fixes: f8d03ea0053b ("drm/i915: increase the tries for HDMI hotplug live status checking") Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97139 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94014 Acked-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: stable@vger.kernel.org # v4.4+ Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20160817124748.31208-1-david.weinehall@linux.intel.com
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c2
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c43
3 files changed, 11 insertions, 36 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index e4a25668ccf6..4b14565afb3d 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -4197,7 +4197,7 @@ static bool bxt_digital_port_connected(struct drm_i915_private *dev_priv,
4197 * 4197 *
4198 * Return %true if @port is connected, %false otherwise. 4198 * Return %true if @port is connected, %false otherwise.
4199 */ 4199 */
4200bool intel_digital_port_connected(struct drm_i915_private *dev_priv, 4200static bool intel_digital_port_connected(struct drm_i915_private *dev_priv,
4201 struct intel_digital_port *port) 4201 struct intel_digital_port *port)
4202{ 4202{
4203 if (HAS_PCH_IBX(dev_priv)) 4203 if (HAS_PCH_IBX(dev_priv))
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index debbc1b5b0f9..e1cdbb2e7b8e 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1419,8 +1419,6 @@ void intel_edp_drrs_invalidate(struct drm_i915_private *dev_priv,
1419 unsigned int frontbuffer_bits); 1419 unsigned int frontbuffer_bits);
1420void intel_edp_drrs_flush(struct drm_i915_private *dev_priv, 1420void intel_edp_drrs_flush(struct drm_i915_private *dev_priv,
1421 unsigned int frontbuffer_bits); 1421 unsigned int frontbuffer_bits);
1422bool intel_digital_port_connected(struct drm_i915_private *dev_priv,
1423 struct intel_digital_port *port);
1424 1422
1425void 1423void
1426intel_dp_program_link_training_pattern(struct intel_dp *intel_dp, 1424intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 1a116a6a1817..c51073f78730 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1439,24 +1439,22 @@ intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
1439} 1439}
1440 1440
1441static bool 1441static bool
1442intel_hdmi_set_edid(struct drm_connector *connector, bool force) 1442intel_hdmi_set_edid(struct drm_connector *connector)
1443{ 1443{
1444 struct drm_i915_private *dev_priv = to_i915(connector->dev); 1444 struct drm_i915_private *dev_priv = to_i915(connector->dev);
1445 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); 1445 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1446 struct edid *edid = NULL; 1446 struct edid *edid;
1447 bool connected = false; 1447 bool connected = false;
1448 1448
1449 if (force) { 1449 intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
1450 intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
1451 1450
1452 edid = drm_get_edid(connector, 1451 edid = drm_get_edid(connector,
1453 intel_gmbus_get_adapter(dev_priv, 1452 intel_gmbus_get_adapter(dev_priv,
1454 intel_hdmi->ddc_bus)); 1453 intel_hdmi->ddc_bus));
1455 1454
1456 intel_hdmi_dp_dual_mode_detect(connector, edid != NULL); 1455 intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
1457 1456
1458 intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); 1457 intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
1459 }
1460 1458
1461 to_intel_connector(connector)->detect_edid = edid; 1459 to_intel_connector(connector)->detect_edid = edid;
1462 if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) { 1460 if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
@@ -1482,37 +1480,16 @@ static enum drm_connector_status
1482intel_hdmi_detect(struct drm_connector *connector, bool force) 1480intel_hdmi_detect(struct drm_connector *connector, bool force)
1483{ 1481{
1484 enum drm_connector_status status; 1482 enum drm_connector_status status;
1485 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1486 struct drm_i915_private *dev_priv = to_i915(connector->dev); 1483 struct drm_i915_private *dev_priv = to_i915(connector->dev);
1487 bool live_status = false;
1488 unsigned int try;
1489 1484
1490 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", 1485 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
1491 connector->base.id, connector->name); 1486 connector->base.id, connector->name);
1492 1487
1493 intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); 1488 intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
1494 1489
1495 for (try = 0; !live_status && try < 9; try++) {
1496 if (try)
1497 msleep(10);
1498 live_status = intel_digital_port_connected(dev_priv,
1499 hdmi_to_dig_port(intel_hdmi));
1500 }
1501
1502 if (!live_status) {
1503 DRM_DEBUG_KMS("HDMI live status down\n");
1504 /*
1505 * Live status register is not reliable on all intel platforms.
1506 * So consider live_status only for certain platforms, for
1507 * others, read EDID to determine presence of sink.
1508 */
1509 if (INTEL_INFO(dev_priv)->gen < 7 || IS_IVYBRIDGE(dev_priv))
1510 live_status = true;
1511 }
1512
1513 intel_hdmi_unset_edid(connector); 1490 intel_hdmi_unset_edid(connector);
1514 1491
1515 if (intel_hdmi_set_edid(connector, live_status)) { 1492 if (intel_hdmi_set_edid(connector)) {
1516 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); 1493 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1517 1494
1518 hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI; 1495 hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
@@ -1538,7 +1515,7 @@ intel_hdmi_force(struct drm_connector *connector)
1538 if (connector->status != connector_status_connected) 1515 if (connector->status != connector_status_connected)
1539 return; 1516 return;
1540 1517
1541 intel_hdmi_set_edid(connector, true); 1518 intel_hdmi_set_edid(connector);
1542 hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI; 1519 hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
1543} 1520}
1544 1521