2008-02-08 13:09:40 +03:00
/* iommu_common.h: UltraSparc SBUS/PCI common iommu declarations.
2005-04-17 02:20:36 +04:00
*
2008-02-08 13:09:40 +03:00
* Copyright ( C ) 1999 , 2008 David S . Miller ( davem @ davemloft . net )
2005-04-17 02:20:36 +04:00
*/
2008-02-08 13:09:40 +03:00
# ifndef _IOMMU_COMMON_H
# define _IOMMU_COMMON_H
2005-04-17 02:20:36 +04:00
# include <linux/kernel.h>
# include <linux/types.h>
# include <linux/sched.h>
# include <linux/mm.h>
2007-10-17 11:22:14 +04:00
# include <linux/scatterlist.h>
2008-02-05 09:28:02 +03:00
# include <linux/device.h>
2008-03-29 01:55:41 +03:00
# include <linux/iommu-helper.h>
2005-04-17 02:20:36 +04:00
# include <asm/iommu.h>
# include <asm/scatterlist.h>
/*
* These give mapping size of each iommu pte / tlb .
*/
# define IO_PAGE_SHIFT 13
# define IO_PAGE_SIZE (1UL << IO_PAGE_SHIFT)
# define IO_PAGE_MASK (~(IO_PAGE_SIZE-1))
2008-07-24 08:28:13 +04:00
# define IO_PAGE_ALIGN(addr) ALIGN(addr, IO_PAGE_SIZE)
2005-04-17 02:20:36 +04:00
# define IO_TSB_ENTRIES (128*1024)
# define IO_TSB_SIZE (IO_TSB_ENTRIES * 8)
/*
* This is the hardwired shift in the iotlb tag / data parts .
*/
# define IOMMU_PAGE_SHIFT 13
2008-02-06 14:50:26 +03:00
# define SG_ENT_PHYS_ADDRESS(SG) (__pa(sg_virt((SG))))
static inline unsigned long iommu_num_pages ( unsigned long vaddr ,
unsigned long slen )
{
unsigned long npages ;
npages = IO_PAGE_ALIGN ( vaddr + slen ) - ( vaddr & IO_PAGE_MASK ) ;
npages > > = IO_PAGE_SHIFT ;
return npages ;
}
2008-03-29 01:55:41 +03:00
static inline int is_span_boundary ( unsigned long entry ,
unsigned long shift ,
unsigned long boundary_size ,
struct scatterlist * outs ,
struct scatterlist * sg )
{
unsigned long paddr = SG_ENT_PHYS_ADDRESS ( outs ) ;
int nr = iommu_num_pages ( paddr , outs - > dma_length + sg - > length ) ;
return iommu_is_span_boundary ( entry , nr , shift , boundary_size ) ;
}
2008-02-09 05:05:46 +03:00
extern unsigned long iommu_range_alloc ( struct device * dev ,
struct iommu * iommu ,
unsigned long npages ,
unsigned long * handle ) ;
extern void iommu_range_free ( struct iommu * iommu ,
dma_addr_t dma_addr ,
unsigned long npages ) ;
2008-02-08 13:09:40 +03:00
# endif /* _IOMMU_COMMON_H */