@@ -205,7 +205,9 @@ nvkm_firmware_dtor(struct nvkm_firmware *fw)
205
205
break ;
206
206
case NVKM_FIRMWARE_IMG_DMA :
207
207
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 );
209
211
break ;
210
212
case NVKM_FIRMWARE_IMG_SGT :
211
213
nvkm_memory_unref (& memory );
@@ -235,14 +237,17 @@ nvkm_firmware_ctor(const struct nvkm_firmware_func *func, const char *name,
235
237
fw -> img = kmemdup (src , fw -> len , GFP_KERNEL );
236
238
break ;
237
239
case NVKM_FIRMWARE_IMG_DMA : {
238
- dma_addr_t addr ;
239
-
240
240
len = ALIGN (fw -> len , PAGE_SIZE );
241
241
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 ;
246
251
}
247
252
248
253
sg_init_one (& fw -> mem .sgl , fw -> img , len );
0 commit comments