Lines Matching refs:iommu

115 	struct cbe_iommu *iommu;  member
142 static void invalidate_tce_cache(struct cbe_iommu *iommu, unsigned long *pte, in invalidate_tce_cache() argument
149 reg = iommu->xlate_regs + IOC_IOPT_CacheInvd; in invalidate_tce_cache()
206 invalidate_tce_cache(window->iommu, io_pte, npages); in tce_build_cell()
229 __pa(window->iommu->pad_page) | in tce_free_cell()
240 invalidate_tce_cache(window->iommu, io_pte, npages); in tce_free_cell()
246 struct cbe_iommu *iommu = data; in ioc_interrupt() local
248 stat = in_be64(iommu->xlate_regs + IOC_IO_ExcpStat); in ioc_interrupt()
264 out_be64(iommu->xlate_regs + IOC_IO_ExcpStat, stat); in ioc_interrupt()
309 static void cell_iommu_setup_stab(struct cbe_iommu *iommu, in cell_iommu_setup_stab() argument
319 __func__, iommu->nid, segments); in cell_iommu_setup_stab()
323 page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(stab_size)); in cell_iommu_setup_stab()
325 iommu->stab = page_address(page); in cell_iommu_setup_stab()
326 memset(iommu->stab, 0, stab_size); in cell_iommu_setup_stab()
329 static unsigned long *cell_iommu_alloc_ptab(struct cbe_iommu *iommu, in cell_iommu_alloc_ptab() argument
347 iommu->nid, ptab_size, get_order(ptab_size)); in cell_iommu_alloc_ptab()
348 page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(ptab_size)); in cell_iommu_alloc_ptab()
358 __func__, iommu->nid, iommu->stab, ptab, in cell_iommu_alloc_ptab()
381 iommu->stab[i] = reg | (__pa(ptab) + (n_pte_pages << 12) * in cell_iommu_alloc_ptab()
383 pr_debug("\t[%d] 0x%016lx\n", i, iommu->stab[i]); in cell_iommu_alloc_ptab()
389 static void cell_iommu_enable_hardware(struct cbe_iommu *iommu) in cell_iommu_enable_hardware() argument
395 if (cell_iommu_find_ioc(iommu->nid, &xlate_base)) in cell_iommu_enable_hardware()
397 __func__, iommu->nid); in cell_iommu_enable_hardware()
399 iommu->xlate_regs = ioremap(xlate_base, IOC_Reg_Size); in cell_iommu_enable_hardware()
400 iommu->cmd_regs = iommu->xlate_regs + IOC_IOCmd_Offset; in cell_iommu_enable_hardware()
406 reg = in_be64(iommu->xlate_regs + IOC_IO_ExcpStat); in cell_iommu_enable_hardware()
407 out_be64(iommu->xlate_regs + IOC_IO_ExcpStat, in cell_iommu_enable_hardware()
409 out_be64(iommu->xlate_regs + IOC_IO_ExcpMask, in cell_iommu_enable_hardware()
413 IIC_IRQ_IOEX_ATI | (iommu->nid << IIC_IRQ_NODE_SHIFT)); in cell_iommu_enable_hardware()
416 ret = request_irq(virq, ioc_interrupt, 0, iommu->name, iommu); in cell_iommu_enable_hardware()
420 reg = IOC_IOST_Origin_E | __pa(iommu->stab) | IOC_IOST_Origin_HW; in cell_iommu_enable_hardware()
421 out_be64(iommu->xlate_regs + IOC_IOST_Origin, reg); in cell_iommu_enable_hardware()
422 in_be64(iommu->xlate_regs + IOC_IOST_Origin); in cell_iommu_enable_hardware()
425 reg = in_be64(iommu->cmd_regs + IOC_IOCmd_Cfg) | IOC_IOCmd_Cfg_TE; in cell_iommu_enable_hardware()
426 out_be64(iommu->cmd_regs + IOC_IOCmd_Cfg, reg); in cell_iommu_enable_hardware()
429 static void cell_iommu_setup_hardware(struct cbe_iommu *iommu, in cell_iommu_setup_hardware() argument
432 cell_iommu_setup_stab(iommu, base, size, 0, 0); in cell_iommu_setup_hardware()
433 iommu->ptab = cell_iommu_alloc_ptab(iommu, base, size, 0, 0, in cell_iommu_setup_hardware()
435 cell_iommu_enable_hardware(iommu); in cell_iommu_setup_hardware()
439 static struct iommu_window *find_window(struct cbe_iommu *iommu,
446 list_for_each_entry(window, &(iommu->windows), list) {
475 cell_iommu_setup_window(struct cbe_iommu *iommu, struct device_node *np, in cell_iommu_setup_window() argument
485 window = kzalloc_node(sizeof(*window), GFP_KERNEL, iommu->nid); in cell_iommu_setup_window()
491 window->iommu = iommu; in cell_iommu_setup_window()
494 window->table.it_base = (unsigned long)iommu->ptab; in cell_iommu_setup_window()
495 window->table.it_index = iommu->nid; in cell_iommu_setup_window()
502 iommu_init_table(&window->table, iommu->nid); in cell_iommu_setup_window()
510 list_add(&window->list, &iommu->windows); in cell_iommu_setup_window()
522 page = alloc_pages_node(iommu->nid, GFP_KERNEL, 0); in cell_iommu_setup_window()
524 iommu->pad_page = page_address(page); in cell_iommu_setup_window()
525 clear_page(iommu->pad_page); in cell_iommu_setup_window()
529 (unsigned long)iommu->pad_page, DMA_TO_DEVICE, NULL); in cell_iommu_setup_window()
554 struct cbe_iommu *iommu; in cell_get_iommu_table() local
560 iommu = cell_iommu_for_node(dev_to_node(dev)); in cell_get_iommu_table()
561 if (iommu == NULL || list_empty(&iommu->windows)) { in cell_get_iommu_table()
566 window = list_entry(iommu->windows.next, struct iommu_window, list); in cell_get_iommu_table()
727 struct cbe_iommu *iommu; in cell_iommu_alloc() local
756 iommu = &iommus[i]; in cell_iommu_alloc()
757 iommu->stab = NULL; in cell_iommu_alloc()
758 iommu->nid = nid; in cell_iommu_alloc()
759 snprintf(iommu->name, sizeof(iommu->name), "iommu%d", i); in cell_iommu_alloc()
760 INIT_LIST_HEAD(&iommu->windows); in cell_iommu_alloc()
762 return iommu; in cell_iommu_alloc()
768 struct cbe_iommu *iommu; in cell_iommu_init_one() local
771 iommu = cell_iommu_alloc(np); in cell_iommu_init_one()
772 if (!iommu) in cell_iommu_init_one()
782 cell_iommu_setup_hardware(iommu, base, size); in cell_iommu_init_one()
785 cell_iommu_setup_window(iommu, np, base, size, in cell_iommu_init_one()
1006 static void cell_iommu_setup_fixed_ptab(struct cbe_iommu *iommu, in cell_iommu_setup_fixed_ptab() argument
1012 ptab = cell_iommu_alloc_ptab(iommu, fbase, fsize, dbase, dsize, 24); in cell_iommu_setup_fixed_ptab()
1045 struct cbe_iommu *iommu; in cell_iommu_fixed_mapping_init() local
1119 iommu = cell_iommu_alloc(np); in cell_iommu_fixed_mapping_init()
1120 BUG_ON(!iommu); in cell_iommu_fixed_mapping_init()
1130 "fixed window 0x%lx-0x%lx\n", iommu->nid, dbase, in cell_iommu_fixed_mapping_init()
1133 cell_iommu_setup_stab(iommu, dbase, dsize, fbase, fsize); in cell_iommu_fixed_mapping_init()
1134 iommu->ptab = cell_iommu_alloc_ptab(iommu, dbase, dsize, 0, 0, in cell_iommu_fixed_mapping_init()
1136 cell_iommu_setup_fixed_ptab(iommu, np, dbase, dsize, in cell_iommu_fixed_mapping_init()
1138 cell_iommu_enable_hardware(iommu); in cell_iommu_fixed_mapping_init()
1139 cell_iommu_setup_window(iommu, np, dbase, dsize, 0); in cell_iommu_fixed_mapping_init()