Fixes OOB VBIOS accesses on some boards.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
        u32 boost = 0;
 
        if (!bit_entry(bios, 'P', &bit_P)) {
-               if (bit_P.version == 2)
+               if (bit_P.version == 2 && bit_P.length >= 0x34)
                        boost = nvbios_rd32(bios, bit_P.offset + 0x30);
 
                if (boost) {
 
        u32 cstep = 0;
 
        if (!bit_entry(bios, 'P', &bit_P)) {
-               if (bit_P.version == 2)
+               if (bit_P.version == 2 && bit_P.length >= 0x38)
                        cstep = nvbios_rd32(bios, bit_P.offset + 0x34);
 
                if (cstep) {
 
        u32 fan = 0;
 
        if (!bit_entry(bios, 'P', &bit_P)) {
-               if (bit_P.version == 2 && bit_P.length >= 0x5a)
+               if (bit_P.version == 2 && bit_P.length >= 0x5c)
                        fan = nvbios_rd32(bios, bit_P.offset + 0x58);
 
                if (fan) {
 
        u32 power_budget;
 
        if (bit_entry(bios, 'P', &bit_P) || bit_P.version != 2 ||
-           bit_P.length < 0x2c)
+           bit_P.length < 0x30)
                return 0;
 
        power_budget = nvbios_rd32(bios, bit_P.offset + 0x2c);
 
        struct bit_entry bit_P;
 
        if (!bit_entry(b, 'P', &bit_P)) {
-               if (bit_P.version == 2)
+               if (bit_P.version == 2 && bit_P.length >= 0x3c)
                        return nvbios_rd32(b, bit_P.offset + 0x38);
        }