linux/arch/openrisc/include/asm/dma-mapping.h
<<
>>
Prefs
   1/*
   2 * OpenRISC Linux
   3 *
   4 * Linux architectural port borrowing liberally from similar works of
   5 * others.  All original copyrights apply as per the original source
   6 * declaration.
   7 *
   8 * OpenRISC implementation:
   9 * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
  10 *
  11 * This program is free software; you can redistribute it and/or modify
  12 * it under the terms of the GNU General Public License as published by
  13 * the Free Software Foundation; either version 2 of the License, or
  14 * (at your option) any later version.
  15 */
  16
  17#ifndef __ASM_OPENRISC_DMA_MAPPING_H
  18#define __ASM_OPENRISC_DMA_MAPPING_H
  19
  20/*
  21 * See Documentation/DMA-API-HOWTO.txt and
  22 * Documentation/DMA-API.txt for documentation.
  23 */
  24
  25#include <linux/dma-debug.h>
  26#include <asm-generic/dma-coherent.h>
  27#include <linux/kmemcheck.h>
  28#include <linux/dma-mapping.h>
  29
  30#define DMA_ERROR_CODE          (~(dma_addr_t)0x0)
  31
  32extern struct dma_map_ops or1k_dma_map_ops;
  33
  34static inline struct dma_map_ops *get_dma_ops(struct device *dev)
  35{
  36        return &or1k_dma_map_ops;
  37}
  38
  39#include <asm-generic/dma-mapping-common.h>
  40
  41#define dma_alloc_coherent(d,s,h,f) dma_alloc_attrs(d,s,h,f,NULL) 
  42
  43static inline void *dma_alloc_attrs(struct device *dev, size_t size,
  44                                    dma_addr_t *dma_handle, gfp_t gfp,
  45                                    struct dma_attrs *attrs)
  46{
  47        struct dma_map_ops *ops = get_dma_ops(dev);
  48        void *memory;
  49
  50        memory = ops->alloc(dev, size, dma_handle, gfp, attrs);
  51
  52        debug_dma_alloc_coherent(dev, size, *dma_handle, memory);
  53
  54        return memory;
  55}
  56
  57#define dma_free_coherent(d,s,c,h) dma_free_attrs(d,s,c,h,NULL)
  58
  59static inline void dma_free_attrs(struct device *dev, size_t size,
  60                                  void *cpu_addr, dma_addr_t dma_handle,
  61                                  struct dma_attrs *attrs)
  62{
  63        struct dma_map_ops *ops = get_dma_ops(dev);
  64
  65        debug_dma_free_coherent(dev, size, cpu_addr, dma_handle);
  66
  67        ops->free(dev, size, cpu_addr, dma_handle, attrs);
  68}
  69
  70static inline void *dma_alloc_noncoherent(struct device *dev, size_t size,
  71                                          dma_addr_t *dma_handle, gfp_t gfp)
  72{
  73        struct dma_attrs attrs;
  74
  75        dma_set_attr(DMA_ATTR_NON_CONSISTENT, &attrs);
  76
  77        return dma_alloc_attrs(dev, size, dma_handle, gfp, &attrs);
  78}
  79
  80static inline void dma_free_noncoherent(struct device *dev, size_t size,
  81                                         void *cpu_addr, dma_addr_t dma_handle)
  82{
  83        struct dma_attrs attrs;
  84
  85        dma_set_attr(DMA_ATTR_NON_CONSISTENT, &attrs);
  86
  87        dma_free_attrs(dev, size, cpu_addr, dma_handle, &attrs);
  88}
  89
  90static inline int dma_supported(struct device *dev, u64 dma_mask)
  91{
  92        /* Support 32 bit DMA mask exclusively */
  93        return dma_mask == DMA_BIT_MASK(32);
  94}
  95
  96static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
  97{
  98        return 0;
  99}
 100
 101static inline int dma_set_mask(struct device *dev, u64 dma_mask)
 102{
 103        if (!dev->dma_mask || !dma_supported(dev, dma_mask))
 104                return -EIO;
 105
 106        *dev->dma_mask = dma_mask;
 107
 108        return 0;
 109}
 110#endif  /* __ASM_OPENRISC_DMA_MAPPING_H */
 111