aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-09-09 18:51:02 -0400
committerDave Airlie <airlied@redhat.com>2010-09-13 06:29:11 -0400
commit7b334fcb45b757ffb093696ca3de1b0c8b4a33f1 (patch)
treefe56259639b9f1c993d742e27468087c46e51f05 /drivers/gpu/drm/nouveau
parent27849044ca6ff9c52f63271b511282acf6d1c251 (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/nouveau')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_connector.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
index a1473fff06ac..67d515cb67e0 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -168,7 +168,8 @@ nouveau_connector_set_encoder(struct drm_connector *connector,
168} 168}
169 169
170static enum drm_connector_status 170static enum drm_connector_status
171nouveau_connector_detect(struct drm_connector *connector) 171nouveau_connector_detect(struct drm_connector *connector,
172 bool nondestructive)
172{ 173{
173 struct drm_device *dev = connector->dev; 174 struct drm_device *dev = connector->dev;
174 struct nouveau_connector *nv_connector = nouveau_connector(connector); 175 struct nouveau_connector *nv_connector = nouveau_connector(connector);
@@ -246,7 +247,8 @@ detect_analog:
246} 247}
247 248
248static enum drm_connector_status 249static enum drm_connector_status
249nouveau_connector_detect_lvds(struct drm_connector *connector) 250nouveau_connector_detect_lvds(struct drm_connector *connector,
251 bool nondestructive)
250{ 252{
251 struct drm_device *dev = connector->dev; 253 struct drm_device *dev = connector->dev;
252 struct drm_nouveau_private *dev_priv = dev->dev_private; 254 struct drm_nouveau_private *dev_priv = dev->dev_private;
@@ -267,7 +269,7 @@ nouveau_connector_detect_lvds(struct drm_connector *connector)
267 269
268 /* Try retrieving EDID via DDC */ 270 /* Try retrieving EDID via DDC */
269 if (!dev_priv->vbios.fp_no_ddc) { 271 if (!dev_priv->vbios.fp_no_ddc) {
270 status = nouveau_connector_detect(connector); 272 status = nouveau_connector_detect(connector, nondestructive);
271 if (status == connector_status_connected) 273 if (status == connector_status_connected)
272 goto out; 274 goto out;
273 } 275 }