drm/nouveau/bios: fix fetching from acpi on certain systems
authorJan Vesely <jano.vesely@gmail.com>
Thu, 9 Apr 2015 01:34:36 +0000 (21:34 -0400)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 14 Apr 2015 07:00:59 +0000 (17:00 +1000)
nvbios_extend() returns 1 to indicate "extended the array" and 0 to
indicate the array is already big enough.  This is used by the core
shadowing code to prevent re-fetching chunks of the image that have
already been shadowed.

The ACPI fetching code may possibly need to extend this further due
to requiring fetches to happen in 4KiB chunks.

Under certain circumstances (that happen if the total image size is
a multiple of 4KiB), the memory allocated to store the shadow will
already be big enough, causing the ACPI code's nvbios_extend() call
to return 0, which is misinterpreted as a failure.

The fix is simple, accept >= 0 as a successful condition here.  The
core will have already made sure that we're not re-fetching data we
already have.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89047

v2 (Ben Skeggs):
- dropped hunk which would cause unnecessary re-fetching
- more descriptive explanation

Signed-off-by: Jan Vesely <jano.vesely@gmail.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadowacpi.c

index 1fbd93bbb5610711325e5b5f157b7c6c023ba311..f9d0eb5647fa3224089ba691c7c6c8e16dd35968 100644 (file)
@@ -52,7 +52,7 @@ acpi_read_fast(void *data, u32 offset, u32 length, struct nvkm_bios *bios)
        u32 start = offset & ~0x00000fff;
        u32 fetch = limit - start;
 
-       if (nvbios_extend(bios, limit) > 0) {
+       if (nvbios_extend(bios, limit) >= 0) {
                int ret = nouveau_acpi_get_bios_chunk(bios->data, start, fetch);
                if (ret == fetch)
                        return fetch;
@@ -73,7 +73,7 @@ acpi_read_slow(void *data, u32 offset, u32 length, struct nvkm_bios *bios)
        u32 start = offset & ~0xfff;
        u32 fetch = 0;
 
-       if (nvbios_extend(bios, limit) > 0) {
+       if (nvbios_extend(bios, limit) >= 0) {
                while (start + fetch < limit) {
                        int ret = nouveau_acpi_get_bios_chunk(bios->data,
                                                              start + fetch,