Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

dma-mapping: prepare dma_map_ops to conversion to physical address

Add new .map_phys() and .unmap_phys() callbacks to dma_map_ops as a
preparation to replace .map_page() and .unmap_page() respectively.

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Link: https://lore.kernel.org/r/20251015-remove-map-page-v5-1-3bbfe3a25cdf@kernel.org

authored by

Leon Romanovsky and committed by
Marek Szyprowski
ed7fc3cb f74ee329

+21 -2
+7
include/linux/dma-map-ops.h
··· 37 37 void (*unmap_page)(struct device *dev, dma_addr_t dma_handle, 38 38 size_t size, enum dma_data_direction dir, 39 39 unsigned long attrs); 40 + 41 + dma_addr_t (*map_phys)(struct device *dev, phys_addr_t phys, 42 + size_t size, enum dma_data_direction dir, 43 + unsigned long attrs); 44 + void (*unmap_phys)(struct device *dev, dma_addr_t dma_handle, 45 + size_t size, enum dma_data_direction dir, 46 + unsigned long attrs); 40 47 /* 41 48 * map_sg should return a negative error code on error. See 42 49 * dma_map_sgtable() for a list of appropriate error codes
+4
kernel/dma/mapping.c
··· 169 169 addr = dma_direct_map_phys(dev, phys, size, dir, attrs); 170 170 else if (use_dma_iommu(dev)) 171 171 addr = iommu_dma_map_phys(dev, phys, size, dir, attrs); 172 + else if (ops->map_phys) 173 + addr = ops->map_phys(dev, phys, size, dir, attrs); 172 174 else if (is_mmio) { 173 175 if (!ops->map_resource) 174 176 return DMA_MAPPING_ERROR; ··· 225 223 dma_direct_unmap_phys(dev, addr, size, dir, attrs); 226 224 else if (use_dma_iommu(dev)) 227 225 iommu_dma_unmap_phys(dev, addr, size, dir, attrs); 226 + else if (ops->unmap_phys) 227 + ops->unmap_phys(dev, addr, size, dir, attrs); 228 228 else if (is_mmio) { 229 229 if (ops->unmap_resource) 230 230 ops->unmap_resource(dev, addr, size, dir, attrs);
+10 -2
kernel/dma/ops_helpers.c
··· 64 64 { 65 65 const struct dma_map_ops *ops = get_dma_ops(dev); 66 66 struct page *page; 67 + phys_addr_t phys; 67 68 68 69 page = dma_alloc_contiguous(dev, size, gfp); 69 70 if (!page) ··· 72 71 if (!page) 73 72 return NULL; 74 73 74 + phys = page_to_phys(page); 75 75 if (use_dma_iommu(dev)) 76 - *dma_handle = iommu_dma_map_phys(dev, page_to_phys(page), size, 77 - dir, DMA_ATTR_SKIP_CPU_SYNC); 76 + *dma_handle = iommu_dma_map_phys(dev, phys, size, dir, 77 + DMA_ATTR_SKIP_CPU_SYNC); 78 + else if (ops->map_phys) 79 + *dma_handle = ops->map_phys(dev, phys, size, dir, 80 + DMA_ATTR_SKIP_CPU_SYNC); 78 81 else 79 82 *dma_handle = ops->map_page(dev, page, 0, size, dir, 80 83 DMA_ATTR_SKIP_CPU_SYNC); ··· 99 94 if (use_dma_iommu(dev)) 100 95 iommu_dma_unmap_phys(dev, dma_handle, size, dir, 101 96 DMA_ATTR_SKIP_CPU_SYNC); 97 + else if (ops->unmap_phys) 98 + ops->unmap_phys(dev, dma_handle, size, dir, 99 + DMA_ATTR_SKIP_CPU_SYNC); 102 100 else if (ops->unmap_page) 103 101 ops->unmap_page(dev, dma_handle, size, dir, 104 102 DMA_ATTR_SKIP_CPU_SYNC);