drm/nouveau/bios: some older boards have shorter displayport tables
authorBen Skeggs <bskeggs@redhat.com>
Mon, 4 Nov 2013 03:40:03 +0000 (13:40 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 8 Nov 2013 05:39:56 +0000 (15:39 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/subdev/bios/dp.c

index 663853b..7628fe7 100644 (file)
@@ -89,6 +89,7 @@ nvbios_dpout_parse(struct nouveau_bios *bios, u8 idx,
                   struct nvbios_dpout *info)
 {
        u16 data = nvbios_dpout_entry(bios, idx, ver, hdr, cnt, len);
+       memset(info, 0x00, sizeof(*info));
        if (data && *ver) {
                info->type = nv_ro16(bios, data + 0x00);
                info->mask = nv_ro16(bios, data + 0x02);
@@ -99,9 +100,12 @@ nvbios_dpout_parse(struct nouveau_bios *bios, u8 idx,
                        info->script[0] = nv_ro16(bios, data + 0x06);
                        info->script[1] = nv_ro16(bios, data + 0x08);
                        info->lnkcmp    = nv_ro16(bios, data + 0x0a);
-                       info->script[2] = nv_ro16(bios, data + 0x0c);
-                       info->script[3] = nv_ro16(bios, data + 0x0e);
-                       info->script[4] = nv_ro16(bios, data + 0x10);
+                       if (*len >= 0x0f) {
+                               info->script[2] = nv_ro16(bios, data + 0x0c);
+                               info->script[3] = nv_ro16(bios, data + 0x0e);
+                       }
+                       if (*len >= 0x11)
+                               info->script[4] = nv_ro16(bios, data + 0x10);
                        break;
                case 0x40:
                        info->flags     = nv_ro08(bios, data + 0x04);