return ret;
                }
 
-               pgraph->ctxprog = kmalloc(fw->size, GFP_KERNEL);
+               pgraph->ctxprog = kmemdup(fw->data, fw->size, GFP_KERNEL);
                if (!pgraph->ctxprog) {
                        NV_ERROR(dev, "OOM copying ctxprog\n");
                        release_firmware(fw);
                        return -ENOMEM;
                }
-               memcpy(pgraph->ctxprog, fw->data, fw->size);
 
                cp = pgraph->ctxprog;
                if (le32_to_cpu(cp->signature) != 0x5043564e ||
                        return ret;
                }
 
-               pgraph->ctxvals = kmalloc(fw->size, GFP_KERNEL);
+               pgraph->ctxvals = kmemdup(fw->data, fw->size, GFP_KERNEL);
                if (!pgraph->ctxvals) {
                        NV_ERROR(dev, "OOM copying ctxvals\n");
                        release_firmware(fw);
                        nouveau_grctx_fini(dev);
                        return -ENOMEM;
                }
-               memcpy(pgraph->ctxvals, fw->data, fw->size);
 
                cv = (void *)pgraph->ctxvals;
                if (le32_to_cpu(cv->signature) != 0x5643564e ||
 
                pci_unmap_rom(rdev->pdev, bios);
                return false;
        }
-       rdev->bios = kmalloc(size, GFP_KERNEL);
+       rdev->bios = kmemdup(bios, size, GFP_KERNEL);
        if (rdev->bios == NULL) {
                pci_unmap_rom(rdev->pdev, bios);
                return false;
        }
-       memcpy(rdev->bios, bios, size);
        pci_unmap_rom(rdev->pdev, bios);
        return true;
 }