@@ -1571,12 +1571,12 @@ nvkm_gsp_sg_free(struct nvkm_device *device, struct sg_table *sgt)
15711571 struct scatterlist * sgl ;
15721572 int i ;
15731573
1574- dma_unmap_sgtable (device -> dev , sgt , DMA_BIDIRECTIONAL , 0 );
1575-
15761574 for_each_sgtable_sg (sgt , sgl , i ) {
1577- struct page * page = sg_page (sgl );
1575+ void * cpu_addr = sg_virt (sgl );
1576+ dma_addr_t dma_addr = sg_dma_address (sgl );
15781577
1579- __free_page (page );
1578+ if (cpu_addr && dma_addr )
1579+ dma_free_coherent (device -> dev , PAGE_SIZE , cpu_addr , dma_addr );
15801580 }
15811581
15821582 sg_free_table (sgt );
@@ -1594,21 +1594,23 @@ nvkm_gsp_sg(struct nvkm_device *device, u64 size, struct sg_table *sgt)
15941594 return ret ;
15951595
15961596 for_each_sgtable_sg (sgt , sgl , i ) {
1597- struct page * page = alloc_page (GFP_KERNEL );
1597+ void * cpu_addr ;
1598+ dma_addr_t dma_addr ;
15981599
1599- if (!page ) {
1600+ cpu_addr = dma_alloc_coherent (device -> dev , PAGE_SIZE ,
1601+ & dma_addr , GFP_KERNEL );
1602+ if (!cpu_addr ) {
16001603 nvkm_gsp_sg_free (device , sgt );
16011604 return - ENOMEM ;
16021605 }
16031606
1604- sg_set_page (sgl , page , PAGE_SIZE , 0 );
1607+ /* XXX: unsafe to use virt_to_page with dma_alloc_coherent */
1608+ sg_set_page (sgl , virt_to_page (cpu_addr ), PAGE_SIZE , 0 );
1609+ sg_dma_address (sgl ) = dma_addr ;
1610+ sg_dma_len (sgl ) = PAGE_SIZE ;
16051611 }
16061612
1607- ret = dma_map_sgtable (device -> dev , sgt , DMA_BIDIRECTIONAL , 0 );
1608- if (ret )
1609- nvkm_gsp_sg_free (device , sgt );
1610-
1611- return ret ;
1613+ return 0 ;
16121614}
16131615
16141616static void
0 commit comments