OSDN Git Service

drm/nouveau: fix thinko in volt 0x1x parsing
authorBen Skeggs <bskeggs@redhat.com>
Mon, 20 Sep 2010 00:38:30 +0000 (10:38 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 24 Sep 2010 06:27:58 +0000 (16:27 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_volt.c

index 6ce8576..04fdc00 100644 (file)
@@ -110,7 +110,7 @@ nouveau_volt_init(struct drm_device *dev)
        struct nvbios *bios = &dev_priv->vbios;
        struct bit_entry P;
        u8 *volt = NULL, *entry;
-       int i, recordlen, entries, vidmask, vidshift;
+       int i, headerlen, recordlen, entries, vidmask, vidshift;
 
        if (bios->type == NVBIOS_BIT) {
                if (bit_table(dev, 'P', &P))
@@ -142,18 +142,21 @@ nouveau_volt_init(struct drm_device *dev)
        case 0x10:
        case 0x11:
        case 0x12:
-               recordlen = 5;
+               headerlen = 5;
+               recordlen = volt[1];
                entries   = volt[2];
                vidshift  = 0;
                vidmask   = volt[4];
                break;
        case 0x20:
+               headerlen = volt[1];
                recordlen = volt[3];
                entries   = volt[2];
                vidshift  = 0; /* could be vidshift like 0x30? */
                vidmask   = volt[5];
                break;
        case 0x30:
+               headerlen = volt[1];
                recordlen = volt[2];
                entries   = volt[3];
                vidshift  = hweight8(volt[5]);
@@ -190,7 +193,7 @@ nouveau_volt_init(struct drm_device *dev)
        if (!voltage->level)
                return;
 
-       entry = volt + volt[1];
+       entry = volt + headerlen;
        for (i = 0; i < entries; i++, entry += recordlen) {
                voltage->level[i].voltage = entry[0];
                voltage->level[i].vid     = entry[1] >> vidshift;