diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-09-09 18:51:02 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-09-13 06:29:11 -0400 |
commit | 7b334fcb45b757ffb093696ca3de1b0c8b4a33f1 (patch) | |
tree | fe56259639b9f1c993d742e27468087c46e51f05 /drivers/gpu/drm/i915/intel_tv.c | |
parent | 27849044ca6ff9c52f63271b511282acf6d1c251 (diff) |
drm: Use a nondestructive mode for output detect when polling
Destructive load-detection is very expensive and due to failings
elsewhere can trigger system wide stalls of up to 600ms. A simple
first step to correcting this is not to invoke such an expensive
and destructive load-detection operation automatically.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=29536
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=16265
Reported-by: Bruno Prémont <bonbons@linux-vserver.org>
Tested-by: Sitsofe Wheeler <sitsofe@yahoo.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: stable@kernel.org
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_tv.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_tv.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index c671f60ce80b..d20b550c0f55 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c | |||
@@ -1341,7 +1341,8 @@ static void intel_tv_find_better_format(struct drm_connector *connector) | |||
1341 | * we have a pipe programmed in order to probe the TV. | 1341 | * we have a pipe programmed in order to probe the TV. |
1342 | */ | 1342 | */ |
1343 | static enum drm_connector_status | 1343 | static enum drm_connector_status |
1344 | intel_tv_detect(struct drm_connector *connector) | 1344 | intel_tv_detect(struct drm_connector *connector, |
1345 | bool nondestructive) | ||
1345 | { | 1346 | { |
1346 | struct drm_display_mode mode; | 1347 | struct drm_display_mode mode; |
1347 | struct drm_encoder *encoder = intel_attached_encoder(connector); | 1348 | struct drm_encoder *encoder = intel_attached_encoder(connector); |
@@ -1353,7 +1354,7 @@ intel_tv_detect(struct drm_connector *connector) | |||
1353 | 1354 | ||
1354 | if (encoder->crtc && encoder->crtc->enabled) { | 1355 | if (encoder->crtc && encoder->crtc->enabled) { |
1355 | type = intel_tv_detect_type(intel_tv); | 1356 | type = intel_tv_detect_type(intel_tv); |
1356 | } else { | 1357 | } else if (nondestructive) { |
1357 | struct drm_crtc *crtc; | 1358 | struct drm_crtc *crtc; |
1358 | int dpms_mode; | 1359 | int dpms_mode; |
1359 | 1360 | ||
@@ -1364,10 +1365,9 @@ intel_tv_detect(struct drm_connector *connector) | |||
1364 | intel_release_load_detect_pipe(&intel_tv->base, connector, | 1365 | intel_release_load_detect_pipe(&intel_tv->base, connector, |
1365 | dpms_mode); | 1366 | dpms_mode); |
1366 | } else | 1367 | } else |
1367 | type = -1; | 1368 | return connector_status_unknown; |
1368 | } | 1369 | } else |
1369 | 1370 | return connector->status; | |
1370 | intel_tv->type = type; | ||
1371 | 1371 | ||
1372 | if (type < 0) | 1372 | if (type < 0) |
1373 | return connector_status_disconnected; | 1373 | return connector_status_disconnected; |