2005-10-06 12:06:20 +10:00
/*
* Copyright ( C ) 2001 Mike Corrigan & Dave Engebretsen , IBM Corporation
* Rewrite , cleanup :
2005-11-21 02:12:32 -06:00
* Copyright ( C ) 2004 Olof Johansson < olof @ lixom . net > , IBM Corporation
2005-10-06 12:06:20 +10: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-16 22:43:46 +01:00
# ifdef __KERNEL__
2005-10-06 12:06:20 +10:00
# include <asm/types.h>
# include <linux/spinlock.h>
# include <linux/device.h>
# include <linux/dma-mapping.h>
/*
* 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
*/
# define IOMAP_MAX_ORDER 13
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 ;
# ifdef CONFIG_PPC_MULTIPLATFORM
/* Walks all buses and creates iommu tables */
extern void iommu_setup_pSeries ( void ) ;
2005-12-14 13:10:10 +11:00
extern void iommu_setup_dart ( void ) ;
2005-10-06 12:06:20 +10:00
/* Frees table for an individual device node */
extern void iommu_free_table ( struct device_node * dn ) ;
# endif /* CONFIG_PPC_MULTIPLATFORM */
/* Initializes an iommu_table based in values set in the passed-in
* structure
*/
2006-06-10 20:58:08 +10:00
extern struct iommu_table * iommu_init_table ( struct iommu_table * tbl ,
int nid ) ;
2005-10-06 12:06:20 +10:00
extern int iommu_map_sg ( struct device * dev , struct iommu_table * tbl ,
2006-04-12 21:05:59 -05:00
struct scatterlist * sglist , int nelems , unsigned long mask ,
2005-10-06 12:06:20 +10:00
enum dma_data_direction direction ) ;
extern void iommu_unmap_sg ( struct iommu_table * tbl , struct scatterlist * sglist ,
int nelems , enum dma_data_direction direction ) ;
extern void * iommu_alloc_coherent ( struct iommu_table * tbl , size_t size ,
2006-06-06 16:11:35 +02:00
dma_addr_t * dma_handle , unsigned long mask ,
gfp_t flag , int node ) ;
2005-10-06 12:06:20 +10:00
extern void iommu_free_coherent ( struct iommu_table * tbl , size_t size ,
void * vaddr , dma_addr_t dma_handle ) ;
extern dma_addr_t iommu_map_single ( struct iommu_table * tbl , void * vaddr ,
2006-04-12 21:05:59 -05:00
size_t size , unsigned long mask ,
enum dma_data_direction direction ) ;
2005-10-06 12:06:20 +10:00
extern void iommu_unmap_single ( struct iommu_table * tbl , dma_addr_t dma_handle ,
size_t size , enum dma_data_direction direction ) ;
extern void iommu_init_early_pSeries ( void ) ;
extern void iommu_init_early_iSeries ( void ) ;
2005-12-14 13:10:10 +11:00
extern void iommu_init_early_dart ( void ) ;
2005-10-06 12:06:20 +10: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 13:10:10 +11:00
extern void alloc_dart_table ( void ) ;
2005-10-06 12:06:20 +10:00
2005-12-16 22:43:46 +01:00
# endif /* __KERNEL__ */
2005-10-06 12:06:20 +10:00
# endif /* _ASM_IOMMU_H */