@ -55,30 +55,34 @@ static pgprot_t dvma_prot; /* Consistent mapping pte flags */
# define IOPERM (IOPTE_CACHE | IOPTE_WRITE | IOPTE_VALID)
# define MKIOPTE(pfn, perm) (((((pfn)<<8) & IOPTE_PAGE) | (perm)) & ~IOPTE_WAZ)
void __init
iommu_init ( int iommund , struct sbus_bus * sbus )
void __init iommu_init ( struct device_node * parent , struct sbus_bus * sbus )
{
unsigned int impl , vers ;
unsigned long tmp ;
struct of_device * parent_op , * op ;
struct iommu_struct * iommu ;
struct linux_prom_registers iommu_promregs [ PROMREG_MAX ] ;
struct resource r ;
unsigned int impl , vers ;
unsigned long * bitmap ;
unsigned long tmp ;
parent_op = of_find_device_by_node ( parent ) ;
if ( ! parent_op ) {
prom_printf ( " Unable to find IOMMU of_device \n " ) ;
prom_halt ( ) ;
}
op = of_find_device_by_node ( sbus - > ofdev . node ) ;
if ( ! op ) {
prom_printf ( " Unable to find SBUS of_device \n " ) ;
prom_halt ( ) ;
}
iommu = kmalloc ( sizeof ( struct iommu_struct ) , GFP_ATOMIC ) ;
if ( ! iommu ) {
prom_printf ( " Unable to allocate iommu structure \n " ) ;
prom_halt ( ) ;
}
iommu - > regs = NULL ;
if ( prom_getproperty ( iommund , " reg " , ( void * ) iommu_promregs ,
sizeof ( iommu_promregs ) ) ! = - 1 ) {
memset ( & r , 0 , sizeof ( r ) ) ;
r . flags = iommu_promregs [ 0 ] . which_io ;
r . start = iommu_promregs [ 0 ] . phys_addr ;
iommu - > regs = ( struct iommu_regs * )
sbus_ioremap ( & r , 0 , PAGE_SIZE * 3 , " iommu_regs " ) ;
}
iommu - > regs = of_ioremap ( & parent_op - > resource [ 0 ] , 0 , PAGE_SIZE * 3 ,
" iommu_regs " ) ;
if ( ! iommu - > regs ) {
prom_printf ( " Cannot map IOMMU registers \n " ) ;
prom_halt ( ) ;
@ -133,6 +137,7 @@ iommu_init(int iommund, struct sbus_bus *sbus)
( int ) ( IOMMU_NPTES * sizeof ( iopte_t ) ) , ( int ) IOMMU_NPTES ) ;
sbus - > ofdev . dev . archdata . iommu = iommu ;
op - > dev . archdata . iommu = iommu ;
}
/* This begs to be btfixup-ed by srmmu. */