linux/arch/arm64/mm/dma-mapping.c
<<
>>
Prefs
   1/*
   2 * SWIOTLB-based DMA API implementation
   3 *
   4 * Copyright (C) 2012 ARM Ltd.
   5 * Author: Catalin Marinas <catalin.marinas@arm.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18 */
  19
  20#include <linux/gfp.h>
  21#include <linux/export.h>
  22#include <linux/slab.h>
  23#include <linux/dma-mapping.h>
  24#include <linux/vmalloc.h>
  25#include <linux/swiotlb.h>
  26
  27#include <asm/cacheflush.h>
  28
  29struct dma_map_ops *dma_ops;
  30EXPORT_SYMBOL(dma_ops);
  31
  32static void *arm64_swiotlb_alloc_coherent(struct device *dev, size_t size,
  33                                          dma_addr_t *dma_handle, gfp_t flags,
  34                                          struct dma_attrs *attrs)
  35{
  36        if (IS_ENABLED(CONFIG_ZONE_DMA32) &&
  37            dev->coherent_dma_mask <= DMA_BIT_MASK(32))
  38                flags |= GFP_DMA32;
  39        return swiotlb_alloc_coherent(dev, size, dma_handle, flags);
  40}
  41
  42static void arm64_swiotlb_free_coherent(struct device *dev, size_t size,
  43                                        void *vaddr, dma_addr_t dma_handle,
  44                                        struct dma_attrs *attrs)
  45{
  46        swiotlb_free_coherent(dev, size, vaddr, dma_handle);
  47}
  48
  49static struct dma_map_ops arm64_swiotlb_dma_ops = {
  50        .alloc = arm64_swiotlb_alloc_coherent,
  51        .free = arm64_swiotlb_free_coherent,
  52        .map_page = swiotlb_map_page,
  53        .unmap_page = swiotlb_unmap_page,
  54        .map_sg = swiotlb_map_sg_attrs,
  55        .unmap_sg = swiotlb_unmap_sg_attrs,
  56        .sync_single_for_cpu = swiotlb_sync_single_for_cpu,
  57        .sync_single_for_device = swiotlb_sync_single_for_device,
  58        .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu,
  59        .sync_sg_for_device = swiotlb_sync_sg_for_device,
  60        .dma_supported = swiotlb_dma_supported,
  61        .mapping_error = swiotlb_dma_mapping_error,
  62};
  63
  64void __init arm64_swiotlb_init(void)
  65{
  66        dma_ops = &arm64_swiotlb_dma_ops;
  67        swiotlb_init(1);
  68}
  69
  70#define PREALLOC_DMA_DEBUG_ENTRIES      4096
  71
  72static int __init dma_debug_do_init(void)
  73{
  74        dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
  75        return 0;
  76}
  77fs_initcall(dma_debug_do_init);
  78