linux/arch/mips/mm/dma-default.c
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Copyright (C) 2000  Ani Joshi <ajoshi@unixbox.com>
   7 * Copyright (C) 2000, 2001, 06  Ralf Baechle <ralf@linux-mips.org>
   8 * swiped from i386, and cloned for MIPS by Geert, polished by Ralf.
   9 */
  10
  11#include <linux/types.h>
  12#include <linux/dma-mapping.h>
  13#include <linux/mm.h>
  14#include <linux/module.h>
  15#include <linux/scatterlist.h>
  16#include <linux/string.h>
  17#include <linux/gfp.h>
  18#include <linux/highmem.h>
  19
  20#include <asm/cache.h>
  21#include <asm/io.h>
  22
  23#include <dma-coherence.h>
  24
  25int coherentio = 0;     /* User defined DMA coherency from command line. */
  26EXPORT_SYMBOL_GPL(coherentio);
  27int hw_coherentio = 0;  /* Actual hardware supported DMA coherency setting. */
  28
  29static int __init setcoherentio(char *str)
  30{
  31        coherentio = 1;
  32        pr_info("Hardware DMA cache coherency (command line)\n");
  33        return 0;
  34}
  35early_param("coherentio", setcoherentio);
  36
  37static int __init setnocoherentio(char *str)
  38{
  39        coherentio = 0;
  40        pr_info("Software DMA cache coherency (command line)\n");
  41        return 0;
  42}
  43early_param("nocoherentio", setnocoherentio);
  44
  45static inline struct page *dma_addr_to_page(struct device *dev,
  46        dma_addr_t dma_addr)
  47{
  48        return pfn_to_page(
  49                plat_dma_addr_to_phys(dev, dma_addr) >> PAGE_SHIFT);
  50}
  51
  52/*
  53 * Warning on the terminology - Linux calls an uncached area coherent;
  54 * MIPS terminology calls memory areas with hardware maintained coherency
  55 * coherent.
  56 */
  57
  58static inline int cpu_is_noncoherent_r10000(struct device *dev)
  59{
  60        return !plat_device_is_coherent(dev) &&
  61               (current_cpu_type() == CPU_R10000 ||
  62               current_cpu_type() == CPU_R12000);
  63}
  64
  65static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
  66{
  67        gfp_t dma_flag;
  68
  69        /* ignore region specifiers */
  70        gfp &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM);
  71
  72#ifdef CONFIG_ISA
  73        if (dev == NULL)
  74                dma_flag = __GFP_DMA;
  75        else
  76#endif
  77#if defined(CONFIG_ZONE_DMA32) && defined(CONFIG_ZONE_DMA)
  78             if (dev->coherent_dma_mask < DMA_BIT_MASK(32))
  79                        dma_flag = __GFP_DMA;
  80        else if (dev->coherent_dma_mask < DMA_BIT_MASK(64))
  81                        dma_flag = __GFP_DMA32;
  82        else
  83#endif
  84#if defined(CONFIG_ZONE_DMA32) && !defined(CONFIG_ZONE_DMA)
  85             if (dev->coherent_dma_mask < DMA_BIT_MASK(64))
  86                dma_flag = __GFP_DMA32;
  87        else
  88#endif
  89#if defined(CONFIG_ZONE_DMA) && !defined(CONFIG_ZONE_DMA32)
  90             if (dev->coherent_dma_mask < DMA_BIT_MASK(64))
  91                dma_flag = __GFP_DMA;
  92        else
  93#endif
  94                dma_flag = 0;
  95
  96        /* Don't invoke OOM killer */
  97        gfp |= __GFP_NORETRY;
  98
  99        return gfp | dma_flag;
 100}
 101
 102void *dma_alloc_noncoherent(struct device *dev, size_t size,
 103        dma_addr_t * dma_handle, gfp_t gfp)
 104{
 105        void *ret;
 106
 107        gfp = massage_gfp_flags(dev, gfp);
 108
 109        ret = (void *) __get_free_pages(gfp, get_order(size));
 110
 111        if (ret != NULL) {
 112                memset(ret, 0, size);
 113                *dma_handle = plat_map_dma_mem(dev, ret, size);
 114        }
 115
 116        return ret;
 117}
 118EXPORT_SYMBOL(dma_alloc_noncoherent);
 119
 120static void *mips_dma_alloc_coherent(struct device *dev, size_t size,
 121        dma_addr_t * dma_handle, gfp_t gfp, struct dma_attrs *attrs)
 122{
 123        void *ret;
 124
 125        if (dma_alloc_from_coherent(dev, size, dma_handle, &ret))
 126                return ret;
 127
 128        gfp = massage_gfp_flags(dev, gfp);
 129
 130        ret = (void *) __get_free_pages(gfp, get_order(size));
 131
 132        if (ret) {
 133                memset(ret, 0, size);
 134                *dma_handle = plat_map_dma_mem(dev, ret, size);
 135
 136                if (!plat_device_is_coherent(dev)) {
 137                        dma_cache_wback_inv((unsigned long) ret, size);
 138                        if (!hw_coherentio)
 139                                ret = UNCAC_ADDR(ret);
 140                }
 141        }
 142
 143        return ret;
 144}
 145
 146
 147void dma_free_noncoherent(struct device *dev, size_t size, void *vaddr,
 148        dma_addr_t dma_handle)
 149{
 150        plat_unmap_dma_mem(dev, dma_handle, size, DMA_BIDIRECTIONAL);
 151        free_pages((unsigned long) vaddr, get_order(size));
 152}
 153EXPORT_SYMBOL(dma_free_noncoherent);
 154
 155static void mips_dma_free_coherent(struct device *dev, size_t size, void *vaddr,
 156        dma_addr_t dma_handle, struct dma_attrs *attrs)
 157{
 158        unsigned long addr = (unsigned long) vaddr;
 159        int order = get_order(size);
 160
 161        if (dma_release_from_coherent(dev, order, vaddr))
 162                return;
 163
 164        plat_unmap_dma_mem(dev, dma_handle, size, DMA_BIDIRECTIONAL);
 165
 166        if (!plat_device_is_coherent(dev) && !hw_coherentio)
 167                addr = CAC_ADDR(addr);
 168
 169        free_pages(addr, get_order(size));
 170}
 171
 172static inline void __dma_sync_virtual(void *addr, size_t size,
 173        enum dma_data_direction direction)
 174{
 175        switch (direction) {
 176        case DMA_TO_DEVICE:
 177                dma_cache_wback((unsigned long)addr, size);
 178                break;
 179
 180        case DMA_FROM_DEVICE:
 181                dma_cache_inv((unsigned long)addr, size);
 182                break;
 183
 184        case DMA_BIDIRECTIONAL:
 185                dma_cache_wback_inv((unsigned long)addr, size);
 186                break;
 187
 188        default:
 189                BUG();
 190        }
 191}
 192
 193/*
 194 * A single sg entry may refer to multiple physically contiguous
 195 * pages. But we still need to process highmem pages individually.
 196 * If highmem is not configured then the bulk of this loop gets
 197 * optimized out.
 198 */
 199static inline void __dma_sync(struct page *page,
 200        unsigned long offset, size_t size, enum dma_data_direction direction)
 201{
 202        size_t left = size;
 203
 204        do {
 205                size_t len = left;
 206
 207                if (PageHighMem(page)) {
 208                        void *addr;
 209
 210                        if (offset + len > PAGE_SIZE) {
 211                                if (offset >= PAGE_SIZE) {
 212                                        page += offset >> PAGE_SHIFT;
 213                                        offset &= ~PAGE_MASK;
 214                                }
 215                                len = PAGE_SIZE - offset;
 216                        }
 217
 218                        addr = kmap_atomic(page);
 219                        __dma_sync_virtual(addr + offset, len, direction);
 220                        kunmap_atomic(addr);
 221                } else
 222                        __dma_sync_virtual(page_address(page) + offset,
 223                                           size, direction);
 224                offset = 0;
 225                page++;
 226                left -= len;
 227        } while (left);
 228}
 229
 230static void mips_dma_unmap_page(struct device *dev, dma_addr_t dma_addr,
 231        size_t size, enum dma_data_direction direction, struct dma_attrs *attrs)
 232{
 233        if (cpu_is_noncoherent_r10000(dev))
 234                __dma_sync(dma_addr_to_page(dev, dma_addr),
 235                           dma_addr & ~PAGE_MASK, size, direction);
 236
 237        plat_unmap_dma_mem(dev, dma_addr, size, direction);
 238}
 239
 240static int mips_dma_map_sg(struct device *dev, struct scatterlist *sg,
 241        int nents, enum dma_data_direction direction, struct dma_attrs *attrs)
 242{
 243        int i;
 244
 245        for (i = 0; i < nents; i++, sg++) {
 246                if (!plat_device_is_coherent(dev))
 247                        __dma_sync(sg_page(sg), sg->offset, sg->length,
 248                                   direction);
 249                sg->dma_address = plat_map_dma_mem_page(dev, sg_page(sg)) +
 250                                  sg->offset;
 251        }
 252
 253        return nents;
 254}
 255
 256static dma_addr_t mips_dma_map_page(struct device *dev, struct page *page,
 257        unsigned long offset, size_t size, enum dma_data_direction direction,
 258        struct dma_attrs *attrs)
 259{
 260        if (!plat_device_is_coherent(dev))
 261                __dma_sync(page, offset, size, direction);
 262
 263        return plat_map_dma_mem_page(dev, page) + offset;
 264}
 265
 266static void mips_dma_unmap_sg(struct device *dev, struct scatterlist *sg,
 267        int nhwentries, enum dma_data_direction direction,
 268        struct dma_attrs *attrs)
 269{
 270        int i;
 271
 272        for (i = 0; i < nhwentries; i++, sg++) {
 273                if (!plat_device_is_coherent(dev) &&
 274                    direction != DMA_TO_DEVICE)
 275                        __dma_sync(sg_page(sg), sg->offset, sg->length,
 276                                   direction);
 277                plat_unmap_dma_mem(dev, sg->dma_address, sg->length, direction);
 278        }
 279}
 280
 281static void mips_dma_sync_single_for_cpu(struct device *dev,
 282        dma_addr_t dma_handle, size_t size, enum dma_data_direction direction)
 283{
 284        if (cpu_is_noncoherent_r10000(dev))
 285                __dma_sync(dma_addr_to_page(dev, dma_handle),
 286                           dma_handle & ~PAGE_MASK, size, direction);
 287}
 288
 289static void mips_dma_sync_single_for_device(struct device *dev,
 290        dma_addr_t dma_handle, size_t size, enum dma_data_direction direction)
 291{
 292        plat_extra_sync_for_device(dev);
 293        if (!plat_device_is_coherent(dev))
 294                __dma_sync(dma_addr_to_page(dev, dma_handle),
 295                           dma_handle & ~PAGE_MASK, size, direction);
 296}
 297
 298static void mips_dma_sync_sg_for_cpu(struct device *dev,
 299        struct scatterlist *sg, int nelems, enum dma_data_direction direction)
 300{
 301        int i;
 302
 303        /* Make sure that gcc doesn't leave the empty loop body.  */
 304        for (i = 0; i < nelems; i++, sg++) {
 305                if (cpu_is_noncoherent_r10000(dev))
 306                        __dma_sync(sg_page(sg), sg->offset, sg->length,
 307                                   direction);
 308        }
 309}
 310
 311static void mips_dma_sync_sg_for_device(struct device *dev,
 312        struct scatterlist *sg, int nelems, enum dma_data_direction direction)
 313{
 314        int i;
 315
 316        /* Make sure that gcc doesn't leave the empty loop body.  */
 317        for (i = 0; i < nelems; i++, sg++) {
 318                if (!plat_device_is_coherent(dev))
 319                        __dma_sync(sg_page(sg), sg->offset, sg->length,
 320                                   direction);
 321        }
 322}
 323
 324int mips_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
 325{
 326        return plat_dma_mapping_error(dev, dma_addr);
 327}
 328
 329int mips_dma_supported(struct device *dev, u64 mask)
 330{
 331        return plat_dma_supported(dev, mask);
 332}
 333
 334void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
 335                         enum dma_data_direction direction)
 336{
 337        BUG_ON(direction == DMA_NONE);
 338
 339        plat_extra_sync_for_device(dev);
 340        if (!plat_device_is_coherent(dev))
 341                __dma_sync_virtual(vaddr, size, direction);
 342}
 343
 344EXPORT_SYMBOL(dma_cache_sync);
 345
 346static struct dma_map_ops mips_default_dma_map_ops = {
 347        .alloc = mips_dma_alloc_coherent,
 348        .free = mips_dma_free_coherent,
 349        .map_page = mips_dma_map_page,
 350        .unmap_page = mips_dma_unmap_page,
 351        .map_sg = mips_dma_map_sg,
 352        .unmap_sg = mips_dma_unmap_sg,
 353        .sync_single_for_cpu = mips_dma_sync_single_for_cpu,
 354        .sync_single_for_device = mips_dma_sync_single_for_device,
 355        .sync_sg_for_cpu = mips_dma_sync_sg_for_cpu,
 356        .sync_sg_for_device = mips_dma_sync_sg_for_device,
 357        .mapping_error = mips_dma_mapping_error,
 358        .dma_supported = mips_dma_supported
 359};
 360
 361struct dma_map_ops *mips_dma_map_ops = &mips_default_dma_map_ops;
 362EXPORT_SYMBOL(mips_dma_map_ops);
 363
 364#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
 365
 366static int __init mips_dma_init(void)
 367{
 368        dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
 369
 370        return 0;
 371}
 372fs_initcall(mips_dma_init);
 373