2008-10-17 12:14:13 -07:00
/* Glue code to lib/swiotlb.c */
# include <linux/pci.h>
# include <linux/cache.h>
# include <linux/module.h>
# include <linux/dma-mapping.h>
# include <asm/swiotlb.h>
# include <asm/dma.h>
# include <asm/iommu.h>
# include <asm/machvec.h>
int swiotlb __read_mostly ;
EXPORT_SYMBOL ( swiotlb ) ;
2009-01-28 21:53:16 +09:00
static void * ia64_swiotlb_alloc_coherent ( struct device * dev , size_t size ,
dma_addr_t * dma_handle , gfp_t gfp )
{
if ( dev - > coherent_dma_mask ! = DMA_64BIT_MASK )
gfp | = GFP_DMA ;
return swiotlb_alloc_coherent ( dev , size , dma_handle , gfp ) ;
}
2009-01-05 23:59:02 +09:00
struct dma_map_ops swiotlb_dma_ops = {
2009-01-28 21:53:16 +09:00
. alloc_coherent = ia64_swiotlb_alloc_coherent ,
2008-10-17 12:14:13 -07:00
. free_coherent = swiotlb_free_coherent ,
2009-01-05 23:59:02 +09:00
. map_page = swiotlb_map_page ,
. unmap_page = swiotlb_unmap_page ,
. map_sg = swiotlb_map_sg_attrs ,
. unmap_sg = swiotlb_unmap_sg_attrs ,
2008-10-17 12:14:13 -07:00
. sync_single_for_cpu = swiotlb_sync_single_for_cpu ,
. sync_single_for_device = swiotlb_sync_single_for_device ,
. sync_single_range_for_cpu = swiotlb_sync_single_range_for_cpu ,
. sync_single_range_for_device = swiotlb_sync_single_range_for_device ,
. sync_sg_for_cpu = swiotlb_sync_sg_for_cpu ,
. sync_sg_for_device = swiotlb_sync_sg_for_device ,
2009-01-05 23:59:02 +09:00
. dma_supported = swiotlb_dma_supported ,
2009-01-05 23:36:11 +09:00
. mapping_error = swiotlb_dma_mapping_error ,
2008-10-17 12:14:13 -07:00
} ;
2009-01-06 10:25:25 -08:00
void __init swiotlb_dma_init ( void )
2009-01-05 23:36:12 +09:00
{
dma_ops = & swiotlb_dma_ops ;
swiotlb_init ( ) ;
}
2008-10-17 12:14:13 -07:00
void __init pci_swiotlb_init ( void )
{
if ( ! iommu_detected ) {
# ifdef CONFIG_IA64_GENERIC
swiotlb = 1 ;
printk ( KERN_INFO " PCI-DMA: Re-initialize machine vector. \n " ) ;
machvec_init ( " dig " ) ;
swiotlb_init ( ) ;
dma_ops = & swiotlb_dma_ops ;
# else
panic ( " Unable to find Intel IOMMU " ) ;
# endif
}
}