forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'dma-mapping-5.4' of git://git.infradead.org/users/hch/dma-…
…mapping Pull dma-mapping updates from Christoph Hellwig: - add dma-mapping and block layer helpers to take care of IOMMU merging for mmc plus subsequent fixups (Yoshihiro Shimoda) - rework handling of the pgprot bits for remapping (me) - take care of the dma direct infrastructure for swiotlb-xen (me) - improve the dma noncoherent remapping infrastructure (me) - better defaults for ->mmap, ->get_sgtable and ->get_required_mask (me) - cleanup mmaping of coherent DMA allocations (me) - various misc cleanups (Andy Shevchenko, me) * tag 'dma-mapping-5.4' of git://git.infradead.org/users/hch/dma-mapping: (41 commits) mmc: renesas_sdhi_internal_dmac: Add MMC_CAP2_MERGE_CAPABLE mmc: queue: Fix bigger segments usage arm64: use asm-generic/dma-mapping.h swiotlb-xen: merge xen_unmap_single into xen_swiotlb_unmap_page swiotlb-xen: simplify cache maintainance swiotlb-xen: use the same foreign page check everywhere swiotlb-xen: remove xen_swiotlb_dma_mmap and xen_swiotlb_dma_get_sgtable xen: remove the exports for xen_{create,destroy}_contiguous_region xen/arm: remove xen_dma_ops xen/arm: simplify dma_cache_maint xen/arm: use dev_is_dma_coherent xen/arm: consolidate page-coherent.h xen/arm: use dma-noncoherent.h calls for xen-swiotlb cache maintainance arm: remove wrappers for the generic dma remap helpers dma-mapping: introduce a dma_common_find_pages helper dma-mapping: always use VM_DMA_COHERENT for generic DMA remap vmalloc: lift the arm flag for coherent mappings to common code dma-mapping: provide a better default ->get_required_mask dma-mapping: remove the dma_declare_coherent_memory export remoteproc: don't allow modular build ...
- Loading branch information
Showing
73 changed files
with
397 additions
and
674 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,95 +1,2 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
#ifndef _ASM_ARM_XEN_PAGE_COHERENT_H | ||
#define _ASM_ARM_XEN_PAGE_COHERENT_H | ||
|
||
#include <linux/dma-mapping.h> | ||
#include <asm/page.h> | ||
#include <xen/arm/page-coherent.h> | ||
|
||
static inline const struct dma_map_ops *xen_get_dma_ops(struct device *dev) | ||
{ | ||
if (dev && dev->archdata.dev_dma_ops) | ||
return dev->archdata.dev_dma_ops; | ||
return get_arch_dma_ops(NULL); | ||
} | ||
|
||
static inline void *xen_alloc_coherent_pages(struct device *hwdev, size_t size, | ||
dma_addr_t *dma_handle, gfp_t flags, unsigned long attrs) | ||
{ | ||
return xen_get_dma_ops(hwdev)->alloc(hwdev, size, dma_handle, flags, attrs); | ||
} | ||
|
||
static inline void xen_free_coherent_pages(struct device *hwdev, size_t size, | ||
void *cpu_addr, dma_addr_t dma_handle, unsigned long attrs) | ||
{ | ||
xen_get_dma_ops(hwdev)->free(hwdev, size, cpu_addr, dma_handle, attrs); | ||
} | ||
|
||
static inline void xen_dma_map_page(struct device *hwdev, struct page *page, | ||
dma_addr_t dev_addr, unsigned long offset, size_t size, | ||
enum dma_data_direction dir, unsigned long attrs) | ||
{ | ||
unsigned long page_pfn = page_to_xen_pfn(page); | ||
unsigned long dev_pfn = XEN_PFN_DOWN(dev_addr); | ||
unsigned long compound_pages = | ||
(1<<compound_order(page)) * XEN_PFN_PER_PAGE; | ||
bool local = (page_pfn <= dev_pfn) && | ||
(dev_pfn - page_pfn < compound_pages); | ||
|
||
/* | ||
* Dom0 is mapped 1:1, while the Linux page can span across | ||
* multiple Xen pages, it's not possible for it to contain a | ||
* mix of local and foreign Xen pages. So if the first xen_pfn | ||
* == mfn the page is local otherwise it's a foreign page | ||
* grant-mapped in dom0. If the page is local we can safely | ||
* call the native dma_ops function, otherwise we call the xen | ||
* specific function. | ||
*/ | ||
if (local) | ||
xen_get_dma_ops(hwdev)->map_page(hwdev, page, offset, size, dir, attrs); | ||
else | ||
__xen_dma_map_page(hwdev, page, dev_addr, offset, size, dir, attrs); | ||
} | ||
|
||
static inline void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle, | ||
size_t size, enum dma_data_direction dir, unsigned long attrs) | ||
{ | ||
unsigned long pfn = PFN_DOWN(handle); | ||
/* | ||
* Dom0 is mapped 1:1, while the Linux page can be spanned accross | ||
* multiple Xen page, it's not possible to have a mix of local and | ||
* foreign Xen page. Dom0 is mapped 1:1, so calling pfn_valid on a | ||
* foreign mfn will always return false. If the page is local we can | ||
* safely call the native dma_ops function, otherwise we call the xen | ||
* specific function. | ||
*/ | ||
if (pfn_valid(pfn)) { | ||
if (xen_get_dma_ops(hwdev)->unmap_page) | ||
xen_get_dma_ops(hwdev)->unmap_page(hwdev, handle, size, dir, attrs); | ||
} else | ||
__xen_dma_unmap_page(hwdev, handle, size, dir, attrs); | ||
} | ||
|
||
static inline void xen_dma_sync_single_for_cpu(struct device *hwdev, | ||
dma_addr_t handle, size_t size, enum dma_data_direction dir) | ||
{ | ||
unsigned long pfn = PFN_DOWN(handle); | ||
if (pfn_valid(pfn)) { | ||
if (xen_get_dma_ops(hwdev)->sync_single_for_cpu) | ||
xen_get_dma_ops(hwdev)->sync_single_for_cpu(hwdev, handle, size, dir); | ||
} else | ||
__xen_dma_sync_single_for_cpu(hwdev, handle, size, dir); | ||
} | ||
|
||
static inline void xen_dma_sync_single_for_device(struct device *hwdev, | ||
dma_addr_t handle, size_t size, enum dma_data_direction dir) | ||
{ | ||
unsigned long pfn = PFN_DOWN(handle); | ||
if (pfn_valid(pfn)) { | ||
if (xen_get_dma_ops(hwdev)->sync_single_for_device) | ||
xen_get_dma_ops(hwdev)->sync_single_for_device(hwdev, handle, size, dir); | ||
} else | ||
__xen_dma_sync_single_for_device(hwdev, handle, size, dir); | ||
} | ||
|
||
#endif /* _ASM_ARM_XEN_PAGE_COHERENT_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.