From: Ben Skeggs Date: Fri, 12 Oct 2012 02:45:15 +0000 (-0400) Subject: drm/nouveau/bios: attempt to fetch entire acpi rom image in one shot X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=de2b8b8bbb2f5ad713c7eecd88f78666a54dc438;p=linux-beck.git drm/nouveau/bios: attempt to fetch entire acpi rom image in one shot v2: fdo#55948 - the _ROM method silently truncates size to 4KiB, perform a checksum test and fall back to slow _ROM access on failure. Signed-off-by: Ben Skeggs --- diff --git a/drivers/gpu/drm/nouveau/core/subdev/bios/base.c b/drivers/gpu/drm/nouveau/core/subdev/bios/base.c index 70ca7d5a1aa1..1cf818d6d48e 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/bios/base.c +++ b/drivers/gpu/drm/nouveau/core/subdev/bios/base.c @@ -210,11 +210,19 @@ nouveau_bios_shadow_acpi(struct nouveau_bios *bios) return; bios->data = kmalloc(bios->size, GFP_KERNEL); - for (i = 0; bios->data && 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; + 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; + } + } } }