@@ -205,7 +205,9 @@ nvkm_firmware_dtor(struct nvkm_firmware *fw)
205205 break ;
206206 case NVKM_FIRMWARE_IMG_DMA :
207207 nvkm_memory_unref (& memory );
208- dma_free_coherent (fw -> device -> dev , sg_dma_len (& fw -> mem .sgl ), fw -> img , fw -> phys );
208+ dma_unmap_single (fw -> device -> dev , fw -> phys , sg_dma_len (& fw -> mem .sgl ),
209+ DMA_TO_DEVICE );
210+ kfree (fw -> img );
209211 break ;
210212 case NVKM_FIRMWARE_IMG_SGT :
211213 nvkm_memory_unref (& memory );
@@ -235,14 +237,17 @@ nvkm_firmware_ctor(const struct nvkm_firmware_func *func, const char *name,
235237 fw -> img = kmemdup (src , fw -> len , GFP_KERNEL );
236238 break ;
237239 case NVKM_FIRMWARE_IMG_DMA : {
238- dma_addr_t addr ;
239-
240240 len = ALIGN (fw -> len , PAGE_SIZE );
241241
242- fw -> img = dma_alloc_coherent (fw -> device -> dev , len , & addr , GFP_KERNEL );
243- if (fw -> img ) {
244- memcpy (fw -> img , src , fw -> len );
245- fw -> phys = addr ;
242+ fw -> img = kmalloc (len , GFP_KERNEL );
243+ if (!fw -> img )
244+ return - ENOMEM ;
245+
246+ memcpy (fw -> img , src , fw -> len );
247+ fw -> phys = dma_map_single (fw -> device -> dev , fw -> img , len , DMA_TO_DEVICE );
248+ if (dma_mapping_error (fw -> device -> dev , fw -> phys )) {
249+ kfree (fw -> img );
250+ return - EFAULT ;
246251 }
247252
248253 sg_init_one (& fw -> mem .sgl , fw -> img , len );
0 commit comments