2012-03-05 15:49:30 +04:00
/*
* SWIOTLB - based DMA API implementation
*
* Copyright ( C ) 2012 ARM Ltd .
* Author : Catalin Marinas < catalin . marinas @ arm . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include <linux/gfp.h>
# include <linux/export.h>
# include <linux/slab.h>
# include <linux/dma-mapping.h>
# include <linux/vmalloc.h>
# include <linux/swiotlb.h>
# include <asm/cacheflush.h>
struct dma_map_ops * dma_ops ;
EXPORT_SYMBOL ( dma_ops ) ;
static void * arm64_swiotlb_alloc_coherent ( struct device * dev , size_t size ,
dma_addr_t * dma_handle , gfp_t flags ,
struct dma_attrs * attrs )
{
if ( IS_ENABLED ( CONFIG_ZONE_DMA32 ) & &
dev - > coherent_dma_mask < = DMA_BIT_MASK ( 32 ) )
flags | = GFP_DMA32 ;
return swiotlb_alloc_coherent ( dev , size , dma_handle , flags ) ;
}
static void arm64_swiotlb_free_coherent ( struct device * dev , size_t size ,
void * vaddr , dma_addr_t dma_handle ,
struct dma_attrs * attrs )
{
swiotlb_free_coherent ( dev , size , vaddr , dma_handle ) ;
}
static struct dma_map_ops arm64_swiotlb_dma_ops = {
. alloc = arm64_swiotlb_alloc_coherent ,
. free = arm64_swiotlb_free_coherent ,
. map_page = swiotlb_map_page ,
. unmap_page = swiotlb_unmap_page ,
. map_sg = swiotlb_map_sg_attrs ,
. unmap_sg = swiotlb_unmap_sg_attrs ,
. sync_single_for_cpu = swiotlb_sync_single_for_cpu ,
. sync_single_for_device = swiotlb_sync_single_for_device ,
. sync_sg_for_cpu = swiotlb_sync_sg_for_cpu ,
. sync_sg_for_device = swiotlb_sync_sg_for_device ,
. dma_supported = swiotlb_dma_supported ,
. mapping_error = swiotlb_dma_mapping_error ,
} ;
2012-10-03 17:35:18 +04:00
void __init arm64_swiotlb_init ( void )
2012-03-05 15:49:30 +04:00
{
dma_ops = & arm64_swiotlb_dma_ops ;
2012-10-03 17:35:18 +04:00
swiotlb_init ( 1 ) ;
2012-03-05 15:49:30 +04:00
}
# define PREALLOC_DMA_DEBUG_ENTRIES 4096
static int __init dma_debug_do_init ( void )
{
dma_debug_init ( PREALLOC_DMA_DEBUG_ENTRIES ) ;
return 0 ;
}
fs_initcall ( dma_debug_do_init ) ;