13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
23d0407baSopenharmony_ci/*
33d0407baSopenharmony_ci * This header is for implementations of dma_map_ops and related code.
43d0407baSopenharmony_ci * It should not be included in drivers just using the DMA API.
53d0407baSopenharmony_ci */
63d0407baSopenharmony_ci#ifndef _LINUX_DMA_MAP_OPS_H
73d0407baSopenharmony_ci#define _LINUX_DMA_MAP_OPS_H
83d0407baSopenharmony_ci
93d0407baSopenharmony_ci#include <linux/dma-mapping.h>
103d0407baSopenharmony_ci#include <linux/pgtable.h>
113d0407baSopenharmony_ci#include <linux/android_kabi.h>
123d0407baSopenharmony_ci
133d0407baSopenharmony_cistruct cma;
143d0407baSopenharmony_ci
153d0407baSopenharmony_cistruct dma_map_ops {
163d0407baSopenharmony_ci    void *(*alloc)(struct device *dev, size_t size, dma_addr_t *dma_handle,
173d0407baSopenharmony_ci                   gfp_t gfp, unsigned long attrs);
183d0407baSopenharmony_ci    void (*free)(struct device *dev, size_t size, void *vaddr,
193d0407baSopenharmony_ci                 dma_addr_t dma_handle, unsigned long attrs);
203d0407baSopenharmony_ci    struct page *(*alloc_pages)(struct device *dev, size_t size,
213d0407baSopenharmony_ci                                dma_addr_t *dma_handle,
223d0407baSopenharmony_ci                                enum dma_data_direction dir, gfp_t gfp);
233d0407baSopenharmony_ci    void (*free_pages)(struct device *dev, size_t size, struct page *vaddr,
243d0407baSopenharmony_ci                       dma_addr_t dma_handle, enum dma_data_direction dir);
253d0407baSopenharmony_ci    void *(*alloc_noncoherent)(struct device *dev, size_t size,
263d0407baSopenharmony_ci                               dma_addr_t *dma_handle,
273d0407baSopenharmony_ci                               enum dma_data_direction dir, gfp_t gfp);
283d0407baSopenharmony_ci    void (*free_noncoherent)(struct device *dev, size_t size, void *vaddr,
293d0407baSopenharmony_ci                             dma_addr_t dma_handle,
303d0407baSopenharmony_ci                             enum dma_data_direction dir);
313d0407baSopenharmony_ci    int (*mmap)(struct device *, struct vm_area_struct *, void *, dma_addr_t,
323d0407baSopenharmony_ci                size_t, unsigned long attrs);
333d0407baSopenharmony_ci
343d0407baSopenharmony_ci    int (*get_sgtable)(struct device *dev, struct sg_table *sgt, void *cpu_addr,
353d0407baSopenharmony_ci                       dma_addr_t dma_addr, size_t size, unsigned long attrs);
363d0407baSopenharmony_ci
373d0407baSopenharmony_ci    dma_addr_t (*map_page)(struct device *dev, struct page *page,
383d0407baSopenharmony_ci                           unsigned long offset, size_t size,
393d0407baSopenharmony_ci                           enum dma_data_direction dir, unsigned long attrs);
403d0407baSopenharmony_ci    void (*unmap_page)(struct device *dev, dma_addr_t dma_handle, size_t size,
413d0407baSopenharmony_ci                       enum dma_data_direction dir, unsigned long attrs);
423d0407baSopenharmony_ci    /*
433d0407baSopenharmony_ci     * map_sg returns 0 on error and a value > 0 on success.
443d0407baSopenharmony_ci     * It should never return a value < 0.
453d0407baSopenharmony_ci     */
463d0407baSopenharmony_ci    int (*map_sg)(struct device *dev, struct scatterlist *sg, int nents,
473d0407baSopenharmony_ci                  enum dma_data_direction dir, unsigned long attrs);
483d0407baSopenharmony_ci    void (*unmap_sg)(struct device *dev, struct scatterlist *sg, int nents,
493d0407baSopenharmony_ci                     enum dma_data_direction dir, unsigned long attrs);
503d0407baSopenharmony_ci    dma_addr_t (*map_resource)(struct device *dev, phys_addr_t phys_addr,
513d0407baSopenharmony_ci                               size_t size, enum dma_data_direction dir,
523d0407baSopenharmony_ci                               unsigned long attrs);
533d0407baSopenharmony_ci    void (*unmap_resource)(struct device *dev, dma_addr_t dma_handle,
543d0407baSopenharmony_ci                           size_t size, enum dma_data_direction dir,
553d0407baSopenharmony_ci                           unsigned long attrs);
563d0407baSopenharmony_ci    void (*sync_single_for_cpu)(struct device *dev, dma_addr_t dma_handle,
573d0407baSopenharmony_ci                                size_t size, enum dma_data_direction dir);
583d0407baSopenharmony_ci    void (*sync_single_for_device)(struct device *dev, dma_addr_t dma_handle,
593d0407baSopenharmony_ci                                   size_t size, enum dma_data_direction dir);
603d0407baSopenharmony_ci    void (*sync_sg_for_cpu)(struct device *dev, struct scatterlist *sg,
613d0407baSopenharmony_ci                            int nents, enum dma_data_direction dir);
623d0407baSopenharmony_ci    void (*sync_sg_for_device)(struct device *dev, struct scatterlist *sg,
633d0407baSopenharmony_ci                               int nents, enum dma_data_direction dir);
643d0407baSopenharmony_ci    void (*cache_sync)(struct device *dev, void *vaddr, size_t size,
653d0407baSopenharmony_ci                       enum dma_data_direction direction);
663d0407baSopenharmony_ci    int (*dma_supported)(struct device *dev, u64 mask);
673d0407baSopenharmony_ci    u64 (*get_required_mask)(struct device *dev);
683d0407baSopenharmony_ci    size_t (*max_mapping_size)(struct device *dev);
693d0407baSopenharmony_ci    unsigned long (*get_merge_boundary)(struct device *dev);
703d0407baSopenharmony_ci
713d0407baSopenharmony_ci    ANDROID_KABI_RESERVE(1);
723d0407baSopenharmony_ci    ANDROID_KABI_RESERVE(2);
733d0407baSopenharmony_ci    ANDROID_KABI_RESERVE(3);
743d0407baSopenharmony_ci    ANDROID_KABI_RESERVE(4);
753d0407baSopenharmony_ci};
763d0407baSopenharmony_ci
773d0407baSopenharmony_ci#ifdef CONFIG_DMA_OPS
783d0407baSopenharmony_ci#include <asm/dma-mapping.h>
793d0407baSopenharmony_ci
803d0407baSopenharmony_cistatic inline const struct dma_map_ops *get_dma_ops(struct device *dev)
813d0407baSopenharmony_ci{
823d0407baSopenharmony_ci    if (dev->dma_ops) {
833d0407baSopenharmony_ci        return dev->dma_ops;
843d0407baSopenharmony_ci    }
853d0407baSopenharmony_ci    return get_arch_dma_ops(dev->bus);
863d0407baSopenharmony_ci}
873d0407baSopenharmony_ci
883d0407baSopenharmony_cistatic inline void set_dma_ops(struct device *dev,
893d0407baSopenharmony_ci                               const struct dma_map_ops *dma_ops)
903d0407baSopenharmony_ci{
913d0407baSopenharmony_ci    dev->dma_ops = dma_ops;
923d0407baSopenharmony_ci}
933d0407baSopenharmony_ci#else  /* CONFIG_DMA_OPS */
943d0407baSopenharmony_cistatic inline const struct dma_map_ops *get_dma_ops(struct device *dev)
953d0407baSopenharmony_ci{
963d0407baSopenharmony_ci    return NULL;
973d0407baSopenharmony_ci}
983d0407baSopenharmony_cistatic inline void set_dma_ops(struct device *dev,
993d0407baSopenharmony_ci                               const struct dma_map_ops *dma_ops)
1003d0407baSopenharmony_ci{
1013d0407baSopenharmony_ci}
1023d0407baSopenharmony_ci#endif /* CONFIG_DMA_OPS */
1033d0407baSopenharmony_ci
1043d0407baSopenharmony_ci#ifdef CONFIG_DMA_CMA
1053d0407baSopenharmony_ciextern struct cma *dma_contiguous_default_area;
1063d0407baSopenharmony_ci
1073d0407baSopenharmony_cistatic inline struct cma *dev_get_cma_area(struct device *dev)
1083d0407baSopenharmony_ci{
1093d0407baSopenharmony_ci    if (dev && dev->cma_area) {
1103d0407baSopenharmony_ci        return dev->cma_area;
1113d0407baSopenharmony_ci    }
1123d0407baSopenharmony_ci    return dma_contiguous_default_area;
1133d0407baSopenharmony_ci}
1143d0407baSopenharmony_ci
1153d0407baSopenharmony_civoid dma_contiguous_reserve(phys_addr_t addr_limit);
1163d0407baSopenharmony_ciint __init dma_contiguous_reserve_area(phys_addr_t size, phys_addr_t base,
1173d0407baSopenharmony_ci                                       phys_addr_t limit, struct cma **res_cma,
1183d0407baSopenharmony_ci                                       bool fixed);
1193d0407baSopenharmony_ci
1203d0407baSopenharmony_cistruct page *dma_alloc_from_contiguous(struct device *dev, size_t count,
1213d0407baSopenharmony_ci                                       unsigned int order, bool no_warn);
1223d0407baSopenharmony_cibool dma_release_from_contiguous(struct device *dev, struct page *pages,
1233d0407baSopenharmony_ci                                 int count);
1243d0407baSopenharmony_cistruct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp);
1253d0407baSopenharmony_civoid dma_free_contiguous(struct device *dev, struct page *page, size_t size);
1263d0407baSopenharmony_ci
1273d0407baSopenharmony_civoid dma_contiguous_early_fixup(phys_addr_t base, unsigned long size);
1283d0407baSopenharmony_ci#else  /* CONFIG_DMA_CMA */
1293d0407baSopenharmony_cistatic inline struct cma *dev_get_cma_area(struct device *dev)
1303d0407baSopenharmony_ci{
1313d0407baSopenharmony_ci    return NULL;
1323d0407baSopenharmony_ci}
1333d0407baSopenharmony_cistatic inline void dma_contiguous_reserve(phys_addr_t limit)
1343d0407baSopenharmony_ci{
1353d0407baSopenharmony_ci}
1363d0407baSopenharmony_cistatic inline int dma_contiguous_reserve_area(phys_addr_t size,
1373d0407baSopenharmony_ci                                              phys_addr_t base,
1383d0407baSopenharmony_ci                                              phys_addr_t limit,
1393d0407baSopenharmony_ci                                              struct cma **res_cma, bool fixed)
1403d0407baSopenharmony_ci{
1413d0407baSopenharmony_ci    return -ENOSYS;
1423d0407baSopenharmony_ci}
1433d0407baSopenharmony_cistatic inline struct page *dma_alloc_from_contiguous(struct device *dev,
1443d0407baSopenharmony_ci                                                     size_t count,
1453d0407baSopenharmony_ci                                                     unsigned int order,
1463d0407baSopenharmony_ci                                                     bool no_warn)
1473d0407baSopenharmony_ci{
1483d0407baSopenharmony_ci    return NULL;
1493d0407baSopenharmony_ci}
1503d0407baSopenharmony_cistatic inline bool dma_release_from_contiguous(struct device *dev,
1513d0407baSopenharmony_ci                                               struct page *pages, int count)
1523d0407baSopenharmony_ci{
1533d0407baSopenharmony_ci    return false;
1543d0407baSopenharmony_ci}
1553d0407baSopenharmony_ci/* Use fallback alloc() and free() when CONFIG_DMA_CMA=n */
1563d0407baSopenharmony_cistatic inline struct page *dma_alloc_contiguous(struct device *dev, size_t size,
1573d0407baSopenharmony_ci                                                gfp_t gfp)
1583d0407baSopenharmony_ci{
1593d0407baSopenharmony_ci    return NULL;
1603d0407baSopenharmony_ci}
1613d0407baSopenharmony_cistatic inline void dma_free_contiguous(struct device *dev, struct page *page,
1623d0407baSopenharmony_ci                                       size_t size)
1633d0407baSopenharmony_ci{
1643d0407baSopenharmony_ci    __free_pages(page, get_order(size));
1653d0407baSopenharmony_ci}
1663d0407baSopenharmony_ci#endif /* CONFIG_DMA_CMA */
1673d0407baSopenharmony_ci
1683d0407baSopenharmony_ci#ifdef CONFIG_DMA_PERNUMA_CMA
1693d0407baSopenharmony_civoid dma_pernuma_cma_reserve(void);
1703d0407baSopenharmony_ci#else
1713d0407baSopenharmony_cistatic inline void dma_pernuma_cma_reserve(void)
1723d0407baSopenharmony_ci{
1733d0407baSopenharmony_ci}
1743d0407baSopenharmony_ci#endif /* CONFIG_DMA_PERNUMA_CMA */
1753d0407baSopenharmony_ci
1763d0407baSopenharmony_ci#ifdef CONFIG_DMA_DECLARE_COHERENT
1773d0407baSopenharmony_ciint dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
1783d0407baSopenharmony_ci                                dma_addr_t device_addr, size_t size);
1793d0407baSopenharmony_ciint dma_alloc_from_dev_coherent(struct device *dev, ssize_t size,
1803d0407baSopenharmony_ci                                dma_addr_t *dma_handle, void **ret);
1813d0407baSopenharmony_ciint dma_release_from_dev_coherent(struct device *dev, int order, void *vaddr);
1823d0407baSopenharmony_ciint dma_mmap_from_dev_coherent(struct device *dev, struct vm_area_struct *vma,
1833d0407baSopenharmony_ci                               void *cpu_addr, size_t size, int *ret);
1843d0407baSopenharmony_ci
1853d0407baSopenharmony_civoid *dma_alloc_from_global_coherent(struct device *dev, ssize_t size,
1863d0407baSopenharmony_ci                                     dma_addr_t *dma_handle);
1873d0407baSopenharmony_ciint dma_release_from_global_coherent(int order, void *vaddr);
1883d0407baSopenharmony_ciint dma_mmap_from_global_coherent(struct vm_area_struct *vma, void *cpu_addr,
1893d0407baSopenharmony_ci                                  size_t size, int *ret);
1903d0407baSopenharmony_ci
1913d0407baSopenharmony_ci#else
1923d0407baSopenharmony_cistatic inline int dma_declare_coherent_memory(struct device *dev,
1933d0407baSopenharmony_ci                                              phys_addr_t phys_addr,
1943d0407baSopenharmony_ci                                              dma_addr_t device_addr,
1953d0407baSopenharmony_ci                                              size_t size)
1963d0407baSopenharmony_ci{
1973d0407baSopenharmony_ci    return -ENOSYS;
1983d0407baSopenharmony_ci}
1993d0407baSopenharmony_ci#define dma_alloc_from_dev_coherent(dev, size, handle, ret) (0)
2003d0407baSopenharmony_ci#define dma_release_from_dev_coherent(dev, order, vaddr) (0)
2013d0407baSopenharmony_ci#define dma_mmap_from_dev_coherent(dev, vma, vaddr, order, ret) (0)
2023d0407baSopenharmony_ci
2033d0407baSopenharmony_cistatic inline void *dma_alloc_from_global_coherent(struct device *dev,
2043d0407baSopenharmony_ci                                                   ssize_t size,
2053d0407baSopenharmony_ci                                                   dma_addr_t *dma_handle)
2063d0407baSopenharmony_ci{
2073d0407baSopenharmony_ci    return NULL;
2083d0407baSopenharmony_ci}
2093d0407baSopenharmony_cistatic inline int dma_release_from_global_coherent(int order, void *vaddr)
2103d0407baSopenharmony_ci{
2113d0407baSopenharmony_ci    return 0;
2123d0407baSopenharmony_ci}
2133d0407baSopenharmony_cistatic inline int dma_mmap_from_global_coherent(struct vm_area_struct *vma,
2143d0407baSopenharmony_ci                                                void *cpu_addr, size_t size,
2153d0407baSopenharmony_ci                                                int *ret)
2163d0407baSopenharmony_ci{
2173d0407baSopenharmony_ci    return 0;
2183d0407baSopenharmony_ci}
2193d0407baSopenharmony_ci#endif /* CONFIG_DMA_DECLARE_COHERENT */
2203d0407baSopenharmony_ci
2213d0407baSopenharmony_ciint dma_common_get_sgtable(struct device *dev, struct sg_table *sgt,
2223d0407baSopenharmony_ci                           void *cpu_addr, dma_addr_t dma_addr, size_t size,
2233d0407baSopenharmony_ci                           unsigned long attrs);
2243d0407baSopenharmony_ciint dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
2253d0407baSopenharmony_ci                    void *cpu_addr, dma_addr_t dma_addr, size_t size,
2263d0407baSopenharmony_ci                    unsigned long attrs);
2273d0407baSopenharmony_cistruct page *dma_common_alloc_pages(struct device *dev, size_t size,
2283d0407baSopenharmony_ci                                    dma_addr_t *dma_handle,
2293d0407baSopenharmony_ci                                    enum dma_data_direction dir, gfp_t gfp);
2303d0407baSopenharmony_civoid dma_common_free_pages(struct device *dev, size_t size, struct page *vaddr,
2313d0407baSopenharmony_ci                           dma_addr_t dma_handle, enum dma_data_direction dir);
2323d0407baSopenharmony_ci
2333d0407baSopenharmony_cistruct page **dma_common_find_pages(void *cpu_addr);
2343d0407baSopenharmony_civoid *dma_common_contiguous_remap(struct page *page, size_t size, pgprot_t prot,
2353d0407baSopenharmony_ci                                  const void *caller);
2363d0407baSopenharmony_civoid *dma_common_pages_remap(struct page **pages, size_t size, pgprot_t prot,
2373d0407baSopenharmony_ci                             const void *caller);
2383d0407baSopenharmony_civoid dma_common_free_remap(void *cpu_addr, size_t size);
2393d0407baSopenharmony_ci
2403d0407baSopenharmony_cistruct page *dma_alloc_from_pool(struct device *dev, size_t size,
2413d0407baSopenharmony_ci                                 void **cpu_addr, gfp_t flags,
2423d0407baSopenharmony_ci                                 bool (*phys_addr_ok)(struct device *,
2433d0407baSopenharmony_ci                                                      phys_addr_t, size_t));
2443d0407baSopenharmony_cibool dma_free_from_pool(struct device *dev, void *start, size_t size);
2453d0407baSopenharmony_ci
2463d0407baSopenharmony_ci#ifdef CONFIG_ARCH_HAS_DMA_COHERENCE_H
2473d0407baSopenharmony_ci#include <asm/dma-coherence.h>
2483d0407baSopenharmony_ci#elif defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE) ||                          \
2493d0407baSopenharmony_ci    defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU) ||                               \
2503d0407baSopenharmony_ci    defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL)
2513d0407baSopenharmony_cistatic inline bool dev_is_dma_coherent(struct device *dev)
2523d0407baSopenharmony_ci{
2533d0407baSopenharmony_ci    return dev->dma_coherent;
2543d0407baSopenharmony_ci}
2553d0407baSopenharmony_ci#else
2563d0407baSopenharmony_cistatic inline bool dev_is_dma_coherent(struct device *dev)
2573d0407baSopenharmony_ci{
2583d0407baSopenharmony_ci    return true;
2593d0407baSopenharmony_ci}
2603d0407baSopenharmony_ci#endif /* CONFIG_ARCH_HAS_DMA_COHERENCE_H */
2613d0407baSopenharmony_ci
2623d0407baSopenharmony_civoid *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
2633d0407baSopenharmony_ci                     gfp_t gfp, unsigned long attrs);
2643d0407baSopenharmony_civoid arch_dma_free(struct device *dev, size_t size, void *cpu_addr,
2653d0407baSopenharmony_ci                   dma_addr_t dma_addr, unsigned long attrs);
2663d0407baSopenharmony_ci
2673d0407baSopenharmony_ci#ifdef CONFIG_MMU
2683d0407baSopenharmony_ci/*
2693d0407baSopenharmony_ci * Page protection so that devices that can't snoop CPU caches can use the
2703d0407baSopenharmony_ci * memory coherently.  We default to pgprot_noncached which is usually used
2713d0407baSopenharmony_ci * for ioremap as a safe bet, but architectures can override this with less
2723d0407baSopenharmony_ci * strict semantics if possible.
2733d0407baSopenharmony_ci */
2743d0407baSopenharmony_ci#ifndef pgprot_dmacoherent
2753d0407baSopenharmony_ci#define pgprot_dmacoherent(prot) pgprot_noncached(prot)
2763d0407baSopenharmony_ci#endif
2773d0407baSopenharmony_ci
2783d0407baSopenharmony_ci/*
2793d0407baSopenharmony_ci * If there is no system cache pgprot, then fallback to dmacoherent
2803d0407baSopenharmony_ci * pgprot, as the expectation is that the device is not coherent.
2813d0407baSopenharmony_ci */
2823d0407baSopenharmony_ci#ifndef pgprot_syscached
2833d0407baSopenharmony_ci#define pgprot_syscached(prot) pgprot_dmacoherent(prot)
2843d0407baSopenharmony_ci#endif
2853d0407baSopenharmony_ci
2863d0407baSopenharmony_cipgprot_t dma_pgprot(struct device *dev, pgprot_t prot, unsigned long attrs);
2873d0407baSopenharmony_ci#else
2883d0407baSopenharmony_cistatic inline pgprot_t dma_pgprot(struct device *dev, pgprot_t prot,
2893d0407baSopenharmony_ci                                  unsigned long attrs)
2903d0407baSopenharmony_ci{
2913d0407baSopenharmony_ci    return prot; /* no protection bits supported without page tables */
2923d0407baSopenharmony_ci}
2933d0407baSopenharmony_ci#endif /* CONFIG_MMU */
2943d0407baSopenharmony_ci
2953d0407baSopenharmony_ci#ifdef CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE
2963d0407baSopenharmony_civoid arch_sync_dma_for_device(phys_addr_t paddr, size_t size,
2973d0407baSopenharmony_ci                              enum dma_data_direction dir);
2983d0407baSopenharmony_ci#else
2993d0407baSopenharmony_cistatic inline void arch_sync_dma_for_device(phys_addr_t paddr, size_t size,
3003d0407baSopenharmony_ci                                            enum dma_data_direction dir)
3013d0407baSopenharmony_ci{
3023d0407baSopenharmony_ci}
3033d0407baSopenharmony_ci#endif /* ARCH_HAS_SYNC_DMA_FOR_DEVICE */
3043d0407baSopenharmony_ci
3053d0407baSopenharmony_ci#ifdef CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU
3063d0407baSopenharmony_civoid arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
3073d0407baSopenharmony_ci                           enum dma_data_direction dir);
3083d0407baSopenharmony_ci#else
3093d0407baSopenharmony_cistatic inline void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
3103d0407baSopenharmony_ci                                         enum dma_data_direction dir)
3113d0407baSopenharmony_ci{
3123d0407baSopenharmony_ci}
3133d0407baSopenharmony_ci#endif /* ARCH_HAS_SYNC_DMA_FOR_CPU */
3143d0407baSopenharmony_ci
3153d0407baSopenharmony_ci#ifdef CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL
3163d0407baSopenharmony_civoid arch_sync_dma_for_cpu_all(void);
3173d0407baSopenharmony_ci#else
3183d0407baSopenharmony_cistatic inline void arch_sync_dma_for_cpu_all(void)
3193d0407baSopenharmony_ci{
3203d0407baSopenharmony_ci}
3213d0407baSopenharmony_ci#endif /* CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL */
3223d0407baSopenharmony_ci
3233d0407baSopenharmony_ci#ifdef CONFIG_ARCH_HAS_DMA_PREP_COHERENT
3243d0407baSopenharmony_civoid arch_dma_prep_coherent(struct page *page, size_t size);
3253d0407baSopenharmony_ci#else
3263d0407baSopenharmony_cistatic inline void arch_dma_prep_coherent(struct page *page, size_t size)
3273d0407baSopenharmony_ci{
3283d0407baSopenharmony_ci}
3293d0407baSopenharmony_ci#endif /* CONFIG_ARCH_HAS_DMA_PREP_COHERENT */
3303d0407baSopenharmony_ci
3313d0407baSopenharmony_ci#ifdef CONFIG_ARCH_HAS_DMA_MARK_CLEAN
3323d0407baSopenharmony_civoid arch_dma_mark_clean(phys_addr_t paddr, size_t size);
3333d0407baSopenharmony_ci#else
3343d0407baSopenharmony_cistatic inline void arch_dma_mark_clean(phys_addr_t paddr, size_t size)
3353d0407baSopenharmony_ci{
3363d0407baSopenharmony_ci}
3373d0407baSopenharmony_ci#endif /* ARCH_HAS_DMA_MARK_CLEAN */
3383d0407baSopenharmony_ci
3393d0407baSopenharmony_civoid *arch_dma_set_uncached(void *addr, size_t size);
3403d0407baSopenharmony_civoid arch_dma_clear_uncached(void *addr, size_t size);
3413d0407baSopenharmony_ci
3423d0407baSopenharmony_ci#ifdef CONFIG_ARCH_HAS_SETUP_DMA_OPS
3433d0407baSopenharmony_civoid arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
3443d0407baSopenharmony_ci                        const struct iommu_ops *iommu, bool coherent);
3453d0407baSopenharmony_ci#else
3463d0407baSopenharmony_cistatic inline void arch_setup_dma_ops(struct device *dev, u64 dma_base,
3473d0407baSopenharmony_ci                                      u64 size, const struct iommu_ops *iommu,
3483d0407baSopenharmony_ci                                      bool coherent)
3493d0407baSopenharmony_ci{
3503d0407baSopenharmony_ci}
3513d0407baSopenharmony_ci#endif /* CONFIG_ARCH_HAS_SETUP_DMA_OPS */
3523d0407baSopenharmony_ci
3533d0407baSopenharmony_ci#ifdef CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS
3543d0407baSopenharmony_civoid arch_teardown_dma_ops(struct device *dev);
3553d0407baSopenharmony_ci#else
3563d0407baSopenharmony_cistatic inline void arch_teardown_dma_ops(struct device *dev)
3573d0407baSopenharmony_ci{
3583d0407baSopenharmony_ci}
3593d0407baSopenharmony_ci#endif /* CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS */
3603d0407baSopenharmony_ci
3613d0407baSopenharmony_ci#ifdef CONFIG_DMA_API_DEBUG
3623d0407baSopenharmony_civoid dma_debug_add_bus(struct bus_type *bus);
3633d0407baSopenharmony_civoid debug_dma_dump_mappings(struct device *dev);
3643d0407baSopenharmony_ci#else
3653d0407baSopenharmony_cistatic inline void dma_debug_add_bus(struct bus_type *bus)
3663d0407baSopenharmony_ci{
3673d0407baSopenharmony_ci}
3683d0407baSopenharmony_cistatic inline void debug_dma_dump_mappings(struct device *dev)
3693d0407baSopenharmony_ci{
3703d0407baSopenharmony_ci}
3713d0407baSopenharmony_ci#endif /* CONFIG_DMA_API_DEBUG */
3723d0407baSopenharmony_ci
3733d0407baSopenharmony_ciextern const struct dma_map_ops dma_dummy_ops;
3743d0407baSopenharmony_ci
3753d0407baSopenharmony_ci#endif /* _LINUX_DMA_MAP_OPS_H */
376