From dd46996bc2dbf70d04715841d0cf776594b04a65 Mon Sep 17 00:00:00 2001 From: Emil Velikov Date: Sun, 6 Oct 2013 19:04:35 +0100 Subject: [PATCH] XXXnouveau: try a few times to retrieve the vbios from ACPI Signed-off-by: Emil Velikov --- drivers/gpu/drm/nouveau/core/subdev/bios/base.c | 46 +++++++++++++++---------- drivers/gpu/drm/nouveau/nouveau_acpi.c | 1 + 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/nouveau/core/subdev/bios/base.c b/drivers/gpu/drm/nouveau/core/subdev/bios/base.c index aa0fbbe..1d80dfe 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/bios/base.c +++ b/drivers/gpu/drm/nouveau/core/subdev/bios/base.c @@ -187,6 +187,7 @@ nouveau_acpi_rom_supported(struct pci_dev *pdev) { static inline int nouveau_acpi_get_bios_chunk(uint8_t *bios, int offset, int len) { + nv_error(bios, "!ACPI\n"); return -EINVAL; } #endif @@ -196,6 +197,7 @@ nouveau_bios_shadow_acpi(struct nouveau_bios *bios) { struct pci_dev *pdev = nv_device(bios)->pdev; int ret, cnt, i; + int rep = 16; if (!nouveau_acpi_rom_supported(pdev)) { bios->data = NULL; @@ -204,30 +206,38 @@ nouveau_bios_shadow_acpi(struct nouveau_bios *bios) bios->size = 0; bios->data = kmalloc(4096, GFP_KERNEL); - if (bios->data) { - if (nouveau_acpi_get_bios_chunk(bios->data, 0, 4096) == 4096) + if (!bios->data) { + nv_error(bios, "kmalloc() failed x)\n"); + return; + } + + do { + if (nouveau_acpi_get_bios_chunk(bios->data, 0, 4096) == 4096) { bios->size = bios->data[2] * 512; + nv_error(bios, "%x%x%x\n", bios->data[0], bios->data[1], + bios->data[2]); + } kfree(bios->data); - } - if (!bios->size) - return; + if (!bios->size) + continue; - 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; + 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; + } } } - } + } while (rep--); } static void diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c index d97f200..714b3a3 100644 --- a/drivers/gpu/drm/nouveau/nouveau_acpi.c +++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c @@ -364,6 +364,7 @@ static int nouveau_rom_call(acpi_handle rom_handle, uint8_t *bios, obj = (union acpi_object *)buffer.pointer; memcpy(bios+offset, obj->buffer.pointer, len); kfree(buffer.pointer); + printk(KERN_INFO "%s len %d\n", __func__, len); return len; } -- 1.8.4