drm/nouveau/bios/pll: check BIT table version before trying to parse it
authorBen Skeggs <bskeggs@redhat.com>
Tue, 19 Apr 2016 00:28:44 +0000 (10:28 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 20 May 2016 04:43:04 +0000 (14:43 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/subdev/bios/pll.c

index 4cd3d6502e20db8c49ae0bc7a260cf58c4cfa749..91a7dc56e406980ccf225fb76f232a9ab1a983fd 100644 (file)
@@ -81,9 +81,11 @@ static u16
 pll_limits_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
 {
        struct bit_entry bit_C;
+       u16 data = 0x0000;
 
-       if (!bit_entry(bios, 'C', &bit_C) && bit_C.length >= 10) {
-               u16 data = nvbios_rd16(bios, bit_C.offset + 8);
+       if (!bit_entry(bios, 'C', &bit_C)) {
+               if (bit_C.version == 1 && bit_C.length >= 10)
+                       data = nvbios_rd16(bios, bit_C.offset + 8);
                if (data) {
                        *ver = nvbios_rd08(bios, data + 0);
                        *hdr = nvbios_rd08(bios, data + 1);
@@ -94,7 +96,7 @@ pll_limits_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
        }
 
        if (bmp_version(bios) >= 0x0524) {
-               u16 data = nvbios_rd16(bios, bios->bmp_offset + 142);
+               data = nvbios_rd16(bios, bios->bmp_offset + 142);
                if (data) {
                        *ver = nvbios_rd08(bios, data + 0);
                        *hdr = 1;
@@ -105,7 +107,7 @@ pll_limits_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
        }
 
        *ver = 0x00;
-       return 0x0000;
+       return data;
 }
 
 static struct pll_mapping *