int nouveau_bios_score(struct nouveau_device *device, const bool writeable) { if (device->bios.size < 3 || !device->bios.data || device->bios.data[0] != 0x55 || device->bios.data[1] != 0xAA) { nv_debug(device, "VBIOS signature not found\n"); return 0; } if (nvbios_checksum((u8*)device->bios.data, min_t(u32, device->bios.data[2] * 512, device->bios.size))) { nv_debug(device, "VBIOS checksum invalid\n"); /* if a ro image is somewhat bad, it's probably all rubbish */ return writeable ? 2 : 1; } nv_debug(device, "VBIOS appears to be valid\n"); return 3; }
static int nouveau_bios_score(struct nouveau_bios *bios, const bool writeable) { if (bios->size < 3 || !bios->data || bios->data[0] != 0x55 || bios->data[1] != 0xAA) { nv_info(bios, "... signature not found\n"); return 0; } if (nvbios_checksum(bios->data, min_t(u32, bios->data[2] * 512, bios->size))) { nv_info(bios, "... checksum invalid\n"); /* if a ro image is somewhat bad, it's probably all rubbish */ return writeable ? 2 : 1; } nv_info(bios, "... appears to be valid\n"); return 3; }
static void nouveau_bios_shadow_acpi(struct nouveau_bios *bios) { struct pci_dev *pdev = nv_device(bios)->pdev; int ret, cnt, i; if (!nouveau_acpi_rom_supported(pdev)) { bios->data = NULL; return; } bios->size = 0; bios->data = kmalloc(4096, GFP_KERNEL); if (bios->data) { if (nouveau_acpi_get_bios_chunk(bios->data, 0, 4096) == 4096) bios->size = bios->data[2] * 512; kfree(bios->data); } if (!bios->size) return; bios->data = kmalloc(bios->size, GFP_KERNEL); if (bios->data) { /* disobey the acpi spec - much faster on at least w530 ... */ ret = nouveau_acpi_get_bios_chunk(bios->data, 0, bios->size); if (ret != bios->size || nvbios_checksum(bios->data, bios->size)) { /* ... that didn't work, ok, i'll be good now */ for (i = 0; i < bios->size; i += cnt) { cnt = min((bios->size - i), (u32)4096); ret = nouveau_acpi_get_bios_chunk(bios->data, i, cnt); if (ret != cnt) break; } } } }