diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-09-19 16:27:23 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-09-19 16:27:23 -0400 |
| commit | 671df189537883f36cf9c7d4f9495bfac0f86627 (patch) | |
| tree | 22e5f598ed1f5d9b2218d85d4426140f804d61e6 /include/linux | |
| parent | c9fe5630dae1df2328d82042602e2c4d1add8d57 (diff) | |
| parent | c7d9eccb3c1e802c5cbb2a764eb0eb9807d9f12e (diff) | |
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
...
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/blkdev.h | 2 | ||||
| -rw-r--r-- | include/linux/dma-mapping.h | 34 | ||||
| -rw-r--r-- | include/linux/dma-noncoherent.h | 13 | ||||
| -rw-r--r-- | include/linux/mmc/host.h | 2 | ||||
| -rw-r--r-- | include/linux/vmalloc.h | 2 |
5 files changed, 31 insertions, 22 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 3094f2d513b2..d9db32fb75ee 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -1110,6 +1110,8 @@ extern void blk_queue_rq_timeout(struct request_queue *, unsigned int); | |||
| 1110 | extern void blk_queue_write_cache(struct request_queue *q, bool enabled, bool fua); | 1110 | extern void blk_queue_write_cache(struct request_queue *q, bool enabled, bool fua); |
| 1111 | extern void blk_queue_required_elevator_features(struct request_queue *q, | 1111 | extern void blk_queue_required_elevator_features(struct request_queue *q, |
| 1112 | unsigned int features); | 1112 | unsigned int features); |
| 1113 | extern bool blk_queue_can_use_dma_map_merging(struct request_queue *q, | ||
| 1114 | struct device *dev); | ||
| 1113 | 1115 | ||
| 1114 | /* | 1116 | /* |
| 1115 | * Number of physical segments as sent to the device. | 1117 | * Number of physical segments as sent to the device. |
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index 14702e2d6fa8..4a1c4fca475a 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h | |||
| @@ -131,6 +131,7 @@ struct dma_map_ops { | |||
| 131 | int (*dma_supported)(struct device *dev, u64 mask); | 131 | int (*dma_supported)(struct device *dev, u64 mask); |
| 132 | u64 (*get_required_mask)(struct device *dev); | 132 | u64 (*get_required_mask)(struct device *dev); |
| 133 | size_t (*max_mapping_size)(struct device *dev); | 133 | size_t (*max_mapping_size)(struct device *dev); |
| 134 | unsigned long (*get_merge_boundary)(struct device *dev); | ||
| 134 | }; | 135 | }; |
| 135 | 136 | ||
| 136 | #define DMA_MAPPING_ERROR (~(dma_addr_t)0) | 137 | #define DMA_MAPPING_ERROR (~(dma_addr_t)0) |
| @@ -457,11 +458,13 @@ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, | |||
| 457 | int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, | 458 | int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, |
| 458 | void *cpu_addr, dma_addr_t dma_addr, size_t size, | 459 | void *cpu_addr, dma_addr_t dma_addr, size_t size, |
| 459 | unsigned long attrs); | 460 | unsigned long attrs); |
| 461 | bool dma_can_mmap(struct device *dev); | ||
| 460 | int dma_supported(struct device *dev, u64 mask); | 462 | int dma_supported(struct device *dev, u64 mask); |
| 461 | int dma_set_mask(struct device *dev, u64 mask); | 463 | int dma_set_mask(struct device *dev, u64 mask); |
| 462 | int dma_set_coherent_mask(struct device *dev, u64 mask); | 464 | int dma_set_coherent_mask(struct device *dev, u64 mask); |
| 463 | u64 dma_get_required_mask(struct device *dev); | 465 | u64 dma_get_required_mask(struct device *dev); |
| 464 | size_t dma_max_mapping_size(struct device *dev); | 466 | size_t dma_max_mapping_size(struct device *dev); |
| 467 | unsigned long dma_get_merge_boundary(struct device *dev); | ||
| 465 | #else /* CONFIG_HAS_DMA */ | 468 | #else /* CONFIG_HAS_DMA */ |
| 466 | static inline dma_addr_t dma_map_page_attrs(struct device *dev, | 469 | static inline dma_addr_t dma_map_page_attrs(struct device *dev, |
| 467 | struct page *page, size_t offset, size_t size, | 470 | struct page *page, size_t offset, size_t size, |
| @@ -547,6 +550,10 @@ static inline int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, | |||
| 547 | { | 550 | { |
| 548 | return -ENXIO; | 551 | return -ENXIO; |
| 549 | } | 552 | } |
| 553 | static inline bool dma_can_mmap(struct device *dev) | ||
| 554 | { | ||
| 555 | return false; | ||
| 556 | } | ||
| 550 | static inline int dma_supported(struct device *dev, u64 mask) | 557 | static inline int dma_supported(struct device *dev, u64 mask) |
| 551 | { | 558 | { |
| 552 | return 0; | 559 | return 0; |
| @@ -567,6 +574,10 @@ static inline size_t dma_max_mapping_size(struct device *dev) | |||
| 567 | { | 574 | { |
| 568 | return 0; | 575 | return 0; |
| 569 | } | 576 | } |
| 577 | static inline unsigned long dma_get_merge_boundary(struct device *dev) | ||
| 578 | { | ||
| 579 | return 0; | ||
| 580 | } | ||
| 570 | #endif /* CONFIG_HAS_DMA */ | 581 | #endif /* CONFIG_HAS_DMA */ |
| 571 | 582 | ||
| 572 | static inline dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr, | 583 | static inline dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr, |
| @@ -610,16 +621,14 @@ extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, | |||
| 610 | void *cpu_addr, dma_addr_t dma_addr, size_t size, | 621 | void *cpu_addr, dma_addr_t dma_addr, size_t size, |
| 611 | unsigned long attrs); | 622 | unsigned long attrs); |
| 612 | 623 | ||
| 624 | struct page **dma_common_find_pages(void *cpu_addr); | ||
| 613 | void *dma_common_contiguous_remap(struct page *page, size_t size, | 625 | void *dma_common_contiguous_remap(struct page *page, size_t size, |
| 614 | unsigned long vm_flags, | ||
| 615 | pgprot_t prot, const void *caller); | 626 | pgprot_t prot, const void *caller); |
| 616 | 627 | ||
| 617 | void *dma_common_pages_remap(struct page **pages, size_t size, | 628 | void *dma_common_pages_remap(struct page **pages, size_t size, |
| 618 | unsigned long vm_flags, pgprot_t prot, | 629 | pgprot_t prot, const void *caller); |
| 619 | const void *caller); | 630 | void dma_common_free_remap(void *cpu_addr, size_t size); |
| 620 | void dma_common_free_remap(void *cpu_addr, size_t size, unsigned long vm_flags); | ||
| 621 | 631 | ||
| 622 | int __init dma_atomic_pool_init(gfp_t gfp, pgprot_t prot); | ||
| 623 | bool dma_in_atomic_pool(void *start, size_t size); | 632 | bool dma_in_atomic_pool(void *start, size_t size); |
| 624 | void *dma_alloc_from_pool(size_t size, struct page **ret_page, gfp_t flags); | 633 | void *dma_alloc_from_pool(size_t size, struct page **ret_page, gfp_t flags); |
| 625 | bool dma_free_from_pool(void *start, size_t size); | 634 | bool dma_free_from_pool(void *start, size_t size); |
| @@ -749,7 +758,6 @@ static inline int dma_get_cache_alignment(void) | |||
| 749 | #ifdef CONFIG_DMA_DECLARE_COHERENT | 758 | #ifdef CONFIG_DMA_DECLARE_COHERENT |
| 750 | int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr, | 759 | int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr, |
| 751 | dma_addr_t device_addr, size_t size); | 760 | dma_addr_t device_addr, size_t size); |
| 752 | void dma_release_declared_memory(struct device *dev); | ||
| 753 | #else | 761 | #else |
| 754 | static inline int | 762 | static inline int |
| 755 | dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr, | 763 | dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr, |
| @@ -757,11 +765,6 @@ dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr, | |||
| 757 | { | 765 | { |
| 758 | return -ENOSYS; | 766 | return -ENOSYS; |
| 759 | } | 767 | } |
| 760 | |||
| 761 | static inline void | ||
| 762 | dma_release_declared_memory(struct device *dev) | ||
| 763 | { | ||
| 764 | } | ||
| 765 | #endif /* CONFIG_DMA_DECLARE_COHERENT */ | 768 | #endif /* CONFIG_DMA_DECLARE_COHERENT */ |
| 766 | 769 | ||
| 767 | static inline void *dmam_alloc_coherent(struct device *dev, size_t size, | 770 | static inline void *dmam_alloc_coherent(struct device *dev, size_t size, |
| @@ -781,9 +784,6 @@ static inline void *dma_alloc_wc(struct device *dev, size_t size, | |||
| 781 | 784 | ||
| 782 | return dma_alloc_attrs(dev, size, dma_addr, gfp, attrs); | 785 | return dma_alloc_attrs(dev, size, dma_addr, gfp, attrs); |
| 783 | } | 786 | } |
| 784 | #ifndef dma_alloc_writecombine | ||
| 785 | #define dma_alloc_writecombine dma_alloc_wc | ||
| 786 | #endif | ||
| 787 | 787 | ||
| 788 | static inline void dma_free_wc(struct device *dev, size_t size, | 788 | static inline void dma_free_wc(struct device *dev, size_t size, |
| 789 | void *cpu_addr, dma_addr_t dma_addr) | 789 | void *cpu_addr, dma_addr_t dma_addr) |
| @@ -791,9 +791,6 @@ static inline void dma_free_wc(struct device *dev, size_t size, | |||
| 791 | return dma_free_attrs(dev, size, cpu_addr, dma_addr, | 791 | return dma_free_attrs(dev, size, cpu_addr, dma_addr, |
| 792 | DMA_ATTR_WRITE_COMBINE); | 792 | DMA_ATTR_WRITE_COMBINE); |
| 793 | } | 793 | } |
| 794 | #ifndef dma_free_writecombine | ||
| 795 | #define dma_free_writecombine dma_free_wc | ||
| 796 | #endif | ||
| 797 | 794 | ||
| 798 | static inline int dma_mmap_wc(struct device *dev, | 795 | static inline int dma_mmap_wc(struct device *dev, |
| 799 | struct vm_area_struct *vma, | 796 | struct vm_area_struct *vma, |
| @@ -803,9 +800,6 @@ static inline int dma_mmap_wc(struct device *dev, | |||
| 803 | return dma_mmap_attrs(dev, vma, cpu_addr, dma_addr, size, | 800 | return dma_mmap_attrs(dev, vma, cpu_addr, dma_addr, size, |
| 804 | DMA_ATTR_WRITE_COMBINE); | 801 | DMA_ATTR_WRITE_COMBINE); |
| 805 | } | 802 | } |
| 806 | #ifndef dma_mmap_writecombine | ||
| 807 | #define dma_mmap_writecombine dma_mmap_wc | ||
| 808 | #endif | ||
| 809 | 803 | ||
| 810 | #ifdef CONFIG_NEED_DMA_MAP_STATE | 804 | #ifdef CONFIG_NEED_DMA_MAP_STATE |
| 811 | #define DEFINE_DMA_UNMAP_ADDR(ADDR_NAME) dma_addr_t ADDR_NAME | 805 | #define DEFINE_DMA_UNMAP_ADDR(ADDR_NAME) dma_addr_t ADDR_NAME |
diff --git a/include/linux/dma-noncoherent.h b/include/linux/dma-noncoherent.h index 0bff3d7fac92..dd3de6d88fc0 100644 --- a/include/linux/dma-noncoherent.h +++ b/include/linux/dma-noncoherent.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | #define _LINUX_DMA_NONCOHERENT_H 1 | 3 | #define _LINUX_DMA_NONCOHERENT_H 1 |
| 4 | 4 | ||
| 5 | #include <linux/dma-mapping.h> | 5 | #include <linux/dma-mapping.h> |
| 6 | #include <asm/pgtable.h> | ||
| 6 | 7 | ||
| 7 | #ifdef CONFIG_ARCH_HAS_DMA_COHERENCE_H | 8 | #ifdef CONFIG_ARCH_HAS_DMA_COHERENCE_H |
| 8 | #include <asm/dma-coherence.h> | 9 | #include <asm/dma-coherence.h> |
| @@ -42,10 +43,18 @@ void arch_dma_free(struct device *dev, size_t size, void *cpu_addr, | |||
| 42 | dma_addr_t dma_addr, unsigned long attrs); | 43 | dma_addr_t dma_addr, unsigned long attrs); |
| 43 | long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr, | 44 | long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr, |
| 44 | dma_addr_t dma_addr); | 45 | dma_addr_t dma_addr); |
| 45 | pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot, | ||
| 46 | unsigned long attrs); | ||
| 47 | 46 | ||
| 48 | #ifdef CONFIG_MMU | 47 | #ifdef CONFIG_MMU |
| 48 | /* | ||
| 49 | * Page protection so that devices that can't snoop CPU caches can use the | ||
| 50 | * memory coherently. We default to pgprot_noncached which is usually used | ||
| 51 | * for ioremap as a safe bet, but architectures can override this with less | ||
| 52 | * strict semantics if possible. | ||
| 53 | */ | ||
| 54 | #ifndef pgprot_dmacoherent | ||
| 55 | #define pgprot_dmacoherent(prot) pgprot_noncached(prot) | ||
| 56 | #endif | ||
| 57 | |||
| 49 | pgprot_t dma_pgprot(struct device *dev, pgprot_t prot, unsigned long attrs); | 58 | pgprot_t dma_pgprot(struct device *dev, pgprot_t prot, unsigned long attrs); |
| 50 | #else | 59 | #else |
| 51 | static inline pgprot_t dma_pgprot(struct device *dev, pgprot_t prot, | 60 | static inline pgprot_t dma_pgprot(struct device *dev, pgprot_t prot, |
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 4704b77259ee..ba703384bea0 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
| @@ -368,6 +368,7 @@ struct mmc_host { | |||
| 368 | #define MMC_CAP2_CQE (1 << 23) /* Has eMMC command queue engine */ | 368 | #define MMC_CAP2_CQE (1 << 23) /* Has eMMC command queue engine */ |
| 369 | #define MMC_CAP2_CQE_DCMD (1 << 24) /* CQE can issue a direct command */ | 369 | #define MMC_CAP2_CQE_DCMD (1 << 24) /* CQE can issue a direct command */ |
| 370 | #define MMC_CAP2_AVOID_3_3V (1 << 25) /* Host must negotiate down from 3.3V */ | 370 | #define MMC_CAP2_AVOID_3_3V (1 << 25) /* Host must negotiate down from 3.3V */ |
| 371 | #define MMC_CAP2_MERGE_CAPABLE (1 << 26) /* Host can merge a segment over the segment size */ | ||
| 371 | 372 | ||
| 372 | int fixed_drv_type; /* fixed driver type for non-removable media */ | 373 | int fixed_drv_type; /* fixed driver type for non-removable media */ |
| 373 | 374 | ||
| @@ -397,6 +398,7 @@ struct mmc_host { | |||
| 397 | unsigned int retune_paused:1; /* re-tuning is temporarily disabled */ | 398 | unsigned int retune_paused:1; /* re-tuning is temporarily disabled */ |
| 398 | unsigned int use_blk_mq:1; /* use blk-mq */ | 399 | unsigned int use_blk_mq:1; /* use blk-mq */ |
| 399 | unsigned int retune_crc_disable:1; /* don't trigger retune upon crc */ | 400 | unsigned int retune_crc_disable:1; /* don't trigger retune upon crc */ |
| 401 | unsigned int can_dma_map_merge:1; /* merging can be used */ | ||
| 400 | 402 | ||
| 401 | int rescan_disable; /* disable card detection */ | 403 | int rescan_disable; /* disable card detection */ |
| 402 | int rescan_entered; /* used with nonremovable devices */ | 404 | int rescan_entered; /* used with nonremovable devices */ |
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 9b21d0047710..dfa718ffdd4f 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h | |||
| @@ -18,6 +18,7 @@ struct notifier_block; /* in notifier.h */ | |||
| 18 | #define VM_ALLOC 0x00000002 /* vmalloc() */ | 18 | #define VM_ALLOC 0x00000002 /* vmalloc() */ |
| 19 | #define VM_MAP 0x00000004 /* vmap()ed pages */ | 19 | #define VM_MAP 0x00000004 /* vmap()ed pages */ |
| 20 | #define VM_USERMAP 0x00000008 /* suitable for remap_vmalloc_range */ | 20 | #define VM_USERMAP 0x00000008 /* suitable for remap_vmalloc_range */ |
| 21 | #define VM_DMA_COHERENT 0x00000010 /* dma_alloc_coherent */ | ||
| 21 | #define VM_UNINITIALIZED 0x00000020 /* vm_struct is not fully initialized */ | 22 | #define VM_UNINITIALIZED 0x00000020 /* vm_struct is not fully initialized */ |
| 22 | #define VM_NO_GUARD 0x00000040 /* don't add guard page */ | 23 | #define VM_NO_GUARD 0x00000040 /* don't add guard page */ |
| 23 | #define VM_KASAN 0x00000080 /* has allocated kasan shadow memory */ | 24 | #define VM_KASAN 0x00000080 /* has allocated kasan shadow memory */ |
| @@ -26,6 +27,7 @@ struct notifier_block; /* in notifier.h */ | |||
| 26 | * vfree_atomic(). | 27 | * vfree_atomic(). |
| 27 | */ | 28 | */ |
| 28 | #define VM_FLUSH_RESET_PERMS 0x00000100 /* Reset direct map and flush TLB on unmap */ | 29 | #define VM_FLUSH_RESET_PERMS 0x00000100 /* Reset direct map and flush TLB on unmap */ |
| 30 | |||
| 29 | /* bits [20..32] reserved for arch specific ioremap internals */ | 31 | /* bits [20..32] reserved for arch specific ioremap internals */ |
| 30 | 32 | ||
| 31 | /* | 33 | /* |
