@@ -187,7 +187,9 @@ nvkm_firmware_dtor(struct nvkm_firmware *fw)
187
187
break ;
188
188
case NVKM_FIRMWARE_IMG_DMA :
189
189
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 );
191
193
break ;
192
194
default :
193
195
WARN_ON (1 );
@@ -211,14 +213,17 @@ nvkm_firmware_ctor(const struct nvkm_firmware_func *func, const char *name,
211
213
fw -> img = kmemdup (src , fw -> len , GFP_KERNEL );
212
214
break ;
213
215
case NVKM_FIRMWARE_IMG_DMA : {
214
- dma_addr_t addr ;
215
-
216
216
len = ALIGN (fw -> len , PAGE_SIZE );
217
217
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 ;
222
227
}
223
228
224
229
sg_init_one (& fw -> mem .sgl , fw -> img , len );
0 commit comments