drm/nv50: ignore vbios table's claim to the contrary if EDID says >8bpc
authorBen Skeggs <bskeggs@redhat.com>
Mon, 21 Dec 2009 02:16:52 +0000 (12:16 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 11 Jan 2010 04:41:07 +0000 (14:41 +1000)
Should fix dim panel issues reported on Dell M6400/M6500.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nv50_display.c

index a9263d92a231bf0c2c24855be13c79720fcb4f7e..90f0bf59fbcd191dabcb5803f50537938a481405 100644 (file)
@@ -690,9 +690,21 @@ nv50_display_script_select(struct drm_device *dev, struct dcb_entry *dcbent,
                           int pxclk)
 {
        struct drm_nouveau_private *dev_priv = dev->dev_private;
+       struct nouveau_connector *nv_connector = NULL;
+       struct drm_encoder *encoder;
        struct nvbios *bios = &dev_priv->VBIOS;
        uint32_t mc, script = 0, or;
 
+       list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
+               struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
+
+               if (nv_encoder->dcb != dcbent)
+                       continue;
+
+               nv_connector = nouveau_encoder_connector_get(nv_encoder);
+               break;
+       }
+
        or = ffs(dcbent->or) - 1;
        mc = nv50_display_mode_ctrl(dev, dcbent->type != OUTPUT_ANALOG, or);
        switch (dcbent->type) {
@@ -711,6 +723,11 @@ nv50_display_script_select(struct drm_device *dev, struct dcb_entry *dcbent,
                        } else
                        if (bios->fp.strapless_is_24bit & 1)
                                script |= 0x0200;
+
+                       if (nv_connector && nv_connector->edid &&
+                           (nv_connector->edid->revision >= 4) &&
+                           (nv_connector->edid->input & 0x70) >= 0x20)
+                               script |= 0x0200;
                }
 
                if (nouveau_uscript_lvds >= 0) {