@@ -187,7 +187,9 @@ nvkm_firmware_dtor(struct nvkm_firmware *fw)
187187 break ;
188188 case NVKM_FIRMWARE_IMG_DMA :
189189 nvkm_memory_unref (& memory );
190- dma_free_coherent (fw -> device -> dev , sg_dma_len (& fw -> mem .sgl ), fw -> img , fw -> phys );
190+ dma_unmap_single (fw -> device -> dev , fw -> phys , sg_dma_len (& fw -> mem .sgl ),
191+ DMA_TO_DEVICE );
192+ kfree (fw -> img );
191193 break ;
192194 default :
193195 WARN_ON (1 );
@@ -211,14 +213,17 @@ nvkm_firmware_ctor(const struct nvkm_firmware_func *func, const char *name,
211213 fw -> img = kmemdup (src , fw -> len , GFP_KERNEL );
212214 break ;
213215 case NVKM_FIRMWARE_IMG_DMA : {
214- dma_addr_t addr ;
215-
216216 len = ALIGN (fw -> len , PAGE_SIZE );
217217
218- fw -> img = dma_alloc_coherent (fw -> device -> dev , len , & addr , GFP_KERNEL );
219- if (fw -> img ) {
220- memcpy (fw -> img , src , fw -> len );
221- fw -> phys = addr ;
218+ fw -> img = kmalloc (len , GFP_KERNEL );
219+ if (!fw -> img )
220+ return - ENOMEM ;
221+
222+ memcpy (fw -> img , src , fw -> len );
223+ fw -> phys = dma_map_single (fw -> device -> dev , fw -> img , len , DMA_TO_DEVICE );
224+ if (dma_mapping_error (fw -> device -> dev , fw -> phys )) {
225+ kfree (fw -> img );
226+ return - EFAULT ;
222227 }
223228
224229 sg_init_one (& fw -> mem .sgl , fw -> img , len );
0 commit comments