break;
        case NVKM_FIRMWARE_IMG_DMA:
                nvkm_memory_unref(&memory);
-               dma_free_coherent(fw->device->dev, sg_dma_len(&fw->mem.sgl), fw->img, fw->phys);
+               dma_free_noncoherent(fw->device->dev, sg_dma_len(&fw->mem.sgl),
+                                    fw->img, fw->phys, DMA_TO_DEVICE);
                break;
        case NVKM_FIRMWARE_IMG_SGT:
                nvkm_memory_unref(&memory);
                break;
        case NVKM_FIRMWARE_IMG_DMA: {
                dma_addr_t addr;
-
                len = ALIGN(fw->len, PAGE_SIZE);
 
-               fw->img = dma_alloc_coherent(fw->device->dev, len, &addr, GFP_KERNEL);
+               fw->img = dma_alloc_noncoherent(fw->device->dev,
+                                               len, &addr,
+                                               DMA_TO_DEVICE,
+                                               GFP_KERNEL);
                if (fw->img) {
                        memcpy(fw->img, src, fw->len);
                        fw->phys = addr;
 
                nvkm_falcon_fw_dtor_sigs(fw);
        }
 
+       /* after last write to the img, sync dma mappings */
+       dma_sync_single_for_device(fw->fw.device->dev,
+                                  fw->fw.phys,
+                                  sg_dma_len(&fw->fw.mem.sgl),
+                                  DMA_TO_DEVICE);
+
        FLCNFW_DBG(fw, "resetting");
        fw->func->reset(fw);