2005-10-06 06:06:20 +04:00
/*
* Copyright ( C ) 2001 Mike Corrigan & Dave Engebretsen , IBM Corporation
* Rewrite , cleanup :
2005-11-21 11:12:32 +03:00
* Copyright ( C ) 2004 Olof Johansson < olof @ lixom . net > , IBM Corporation
2005-10-06 06:06:20 +04:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* 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 , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# ifndef _ASM_IOMMU_H
# define _ASM_IOMMU_H
2005-12-17 00:43:46 +03:00
# ifdef __KERNEL__
2005-10-06 06:06:20 +04:00
2006-10-30 08:15:59 +03:00
# include <linux/compiler.h>
2005-10-06 06:06:20 +04:00
# include <linux/spinlock.h>
# include <linux/device.h>
# include <linux/dma-mapping.h>
2006-10-30 08:15:59 +03:00
# include <asm/types.h>
# include <asm/bitops.h>
# define IOMMU_PAGE_SHIFT 12
# define IOMMU_PAGE_SIZE (ASM_CONST(1) << IOMMU_PAGE_SHIFT)
# define IOMMU_PAGE_MASK (~((1 << IOMMU_PAGE_SHIFT) - 1))
# define IOMMU_PAGE_ALIGN(addr) _ALIGN_UP(addr, IOMMU_PAGE_SIZE)
2006-11-11 09:25:18 +03:00
/* Boot time flags */
extern int iommu_is_off ;
extern int iommu_force_on ;
2006-10-30 08:15:59 +03:00
/* Pure 2^n version of get_order */
static __inline__ __attribute_const__ int get_iommu_order ( unsigned long size )
{
return __ilog2 ( ( size - 1 ) > > IOMMU_PAGE_SHIFT ) + 1 ;
}
2005-10-06 06:06:20 +04:00
/*
* IOMAP_MAX_ORDER defines the largest contiguous block
* of dma space we can get . IOMAP_MAX_ORDER = 13
* allows up to 2 * * 12 pages ( 4096 * 4096 ) = 16 MB
*/
2006-10-30 08:15:59 +03:00
# define IOMAP_MAX_ORDER 13
2005-10-06 06:06:20 +04:00
struct iommu_table {
unsigned long it_busno ; /* Bus number this table belongs to */
unsigned long it_size ; /* Size of iommu table in entries */
unsigned long it_offset ; /* Offset into global table */
unsigned long it_base ; /* mapped address of tce table */
unsigned long it_index ; /* which iommu table this is */
unsigned long it_type ; /* type: PCI or Virtual Bus */
unsigned long it_blocksize ; /* Entries in each block (cacheline) */
unsigned long it_hint ; /* Hint for next alloc */
unsigned long it_largehint ; /* Hint for large allocs */
unsigned long it_halfpoint ; /* Breaking point for small/large allocs */
spinlock_t it_lock ; /* Protects it_map */
unsigned long * it_map ; /* A simple allocation bitmap for now */
} ;
struct scatterlist ;
struct device_node ;
/* Frees table for an individual device node */
extern void iommu_free_table ( struct device_node * dn ) ;
/* Initializes an iommu_table based in values set in the passed-in
* structure
*/
2006-06-10 14:58:08 +04:00
extern struct iommu_table * iommu_init_table ( struct iommu_table * tbl ,
int nid ) ;
2005-10-06 06:06:20 +04:00
2006-11-11 09:25:02 +03:00
extern int iommu_map_sg ( struct iommu_table * tbl , struct scatterlist * sglist ,
int nelems , unsigned long mask ,
enum dma_data_direction direction ) ;
2005-10-06 06:06:20 +04:00
extern void iommu_unmap_sg ( struct iommu_table * tbl , struct scatterlist * sglist ,
2006-11-11 09:25:02 +03:00
int nelems , enum dma_data_direction direction ) ;
2005-10-06 06:06:20 +04:00
extern void * iommu_alloc_coherent ( struct iommu_table * tbl , size_t size ,
2006-11-11 09:25:02 +03:00
dma_addr_t * dma_handle , unsigned long mask ,
gfp_t flag , int node ) ;
2005-10-06 06:06:20 +04:00
extern void iommu_free_coherent ( struct iommu_table * tbl , size_t size ,
2006-11-11 09:25:02 +03:00
void * vaddr , dma_addr_t dma_handle ) ;
2005-10-06 06:06:20 +04:00
extern dma_addr_t iommu_map_single ( struct iommu_table * tbl , void * vaddr ,
2006-11-11 09:25:02 +03:00
size_t size , unsigned long mask ,
enum dma_data_direction direction ) ;
2005-10-06 06:06:20 +04:00
extern void iommu_unmap_single ( struct iommu_table * tbl , dma_addr_t dma_handle ,
2006-11-11 09:25:02 +03:00
size_t size , enum dma_data_direction direction ) ;
2005-10-06 06:06:20 +04:00
extern void iommu_init_early_pSeries ( void ) ;
extern void iommu_init_early_iSeries ( void ) ;
2005-12-14 05:10:10 +03:00
extern void iommu_init_early_dart ( void ) ;
2005-10-06 06:06:20 +04:00
# ifdef CONFIG_PCI
extern void pci_iommu_init ( void ) ;
extern void pci_direct_iommu_init ( void ) ;
# else
static inline void pci_iommu_init ( void ) { }
# endif
2005-12-14 05:10:10 +03:00
extern void alloc_dart_table ( void ) ;
2005-10-06 06:06:20 +04:00
2005-12-17 00:43:46 +03:00
# endif /* __KERNEL__ */
2005-10-06 06:06:20 +04:00
# endif /* _ASM_IOMMU_H */