linux/arch/arm64/include/asm/dma-mapping.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2012 ARM Ltd.
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License version 2 as
   6 * published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope that it will be useful,
   9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11 * GNU General Public License for more details.
  12 *
  13 * You should have received a copy of the GNU General Public License
  14 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  15 */
  16#ifndef __ASM_DMA_MAPPING_H
  17#define __ASM_DMA_MAPPING_H
  18
  19#ifdef __KERNEL__
  20
  21#include <linux/acpi.h>
  22#include <linux/types.h>
  23#include <linux/vmalloc.h>
  24
  25#include <xen/xen.h>
  26#include <asm/xen/hypervisor.h>
  27
  28#define DMA_ERROR_CODE  (~(dma_addr_t)0)
  29extern struct dma_map_ops *dma_ops;
  30extern struct dma_map_ops dummy_dma_ops;
  31
  32static inline struct dma_map_ops *__generic_dma_ops(struct device *dev)
  33{
  34        if (unlikely(!dev))
  35                return dma_ops;
  36        else if (dev->archdata.dma_ops)
  37                return dev->archdata.dma_ops;
  38        else if (acpi_disabled)
  39                return dma_ops;
  40
  41        /*
  42         * When ACPI is enabled, if arch_set_dma_ops is not called,
  43         * we will disable device DMA capability by setting it
  44         * to dummy_dma_ops.
  45         */
  46        return &dummy_dma_ops;
  47}
  48
  49static inline struct dma_map_ops *get_dma_ops(struct device *dev)
  50{
  51        if (xen_initial_domain())
  52                return xen_dma_ops;
  53        else
  54                return __generic_dma_ops(dev);
  55}
  56
  57void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
  58                        struct iommu_ops *iommu, bool coherent);
  59#define arch_setup_dma_ops      arch_setup_dma_ops
  60
  61#ifdef CONFIG_IOMMU_DMA
  62void arch_teardown_dma_ops(struct device *dev);
  63#define arch_teardown_dma_ops   arch_teardown_dma_ops
  64#endif
  65
  66/* do not use this function in a driver */
  67static inline bool is_device_dma_coherent(struct device *dev)
  68{
  69        if (!dev)
  70                return false;
  71        return dev->archdata.dma_coherent;
  72}
  73
  74static inline dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr)
  75{
  76        return (dma_addr_t)paddr;
  77}
  78
  79static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t dev_addr)
  80{
  81        return (phys_addr_t)dev_addr;
  82}
  83
  84static inline bool dma_capable(struct device *dev, dma_addr_t addr, size_t size)
  85{
  86        if (!dev->dma_mask)
  87                return false;
  88
  89        return addr + size - 1 <= *dev->dma_mask;
  90}
  91
  92static inline void dma_mark_clean(void *addr, size_t size)
  93{
  94}
  95
  96#endif  /* __KERNEL__ */
  97#endif  /* __ASM_DMA_MAPPING_H */
  98