Lines Matching defs:data
225 struct arm_v7s_io_pgtable *data)
227 return phys_to_virt(iopte_to_paddr(pte, lvl, &data->iop.cfg));
231 struct arm_v7s_io_pgtable *data)
233 struct io_pgtable_cfg *cfg = &data->iop.cfg;
244 table = kmem_cache_zalloc(data->l2_tables, gfp);
278 kmem_cache_free(data->l2_tables, table);
283 struct arm_v7s_io_pgtable *data)
285 struct io_pgtable_cfg *cfg = &data->iop.cfg;
295 kmem_cache_free(data->l2_tables, table);
414 static int arm_v7s_init_pte(struct arm_v7s_io_pgtable *data,
418 struct io_pgtable_cfg *cfg = &data->iop.cfg;
432 if (WARN_ON(__arm_v7s_unmap(data, NULL, iova + i * sz,
475 static int __arm_v7s_map(struct arm_v7s_io_pgtable *data, unsigned long iova,
479 struct io_pgtable_cfg *cfg = &data->iop.cfg;
488 return arm_v7s_init_pte(data, iova, paddr, prot,
498 cptep = __arm_v7s_alloc_table(lvl + 1, gfp, data);
504 __arm_v7s_free_table(cptep, lvl + 1, data);
511 cptep = iopte_deref(pte, lvl, data);
519 return __arm_v7s_map(data, iova, paddr, size, prot, lvl + 1, cptep, gfp);
525 struct arm_v7s_io_pgtable *data = io_pgtable_ops_to_data(ops);
526 struct io_pgtable *iop = &data->iop;
533 if (WARN_ON(iova >= (1ULL << data->iop.cfg.ias) ||
534 paddr >= (1ULL << data->iop.cfg.oas)))
537 ret = __arm_v7s_map(data, iova, paddr, size, prot, 1, data->pgd, gfp);
554 struct arm_v7s_io_pgtable *data = io_pgtable_to_data(iop);
558 arm_v7s_iopte pte = data->pgd[i];
561 __arm_v7s_free_table(iopte_deref(pte, 1, data),
562 2, data);
564 __arm_v7s_free_table(data->pgd, 1, data);
565 kmem_cache_destroy(data->l2_tables);
566 kfree(data);
569 static arm_v7s_iopte arm_v7s_split_cont(struct arm_v7s_io_pgtable *data,
573 struct io_pgtable *iop = &data->iop;
595 static size_t arm_v7s_split_blk_unmap(struct arm_v7s_io_pgtable *data,
601 struct io_pgtable_cfg *cfg = &data->iop.cfg;
605 tablep = __arm_v7s_alloc_table(2, GFP_ATOMIC, data);
627 __arm_v7s_free_table(tablep, 2, data);
632 tablep = iopte_deref(pte, 1, data);
633 return __arm_v7s_unmap(data, gather, iova, size, 2, tablep);
636 io_pgtable_tlb_add_page(&data->iop, gather, iova, size);
640 static size_t __arm_v7s_unmap(struct arm_v7s_io_pgtable *data,
646 struct io_pgtable *iop = &data->iop;
674 spin_lock_irqsave(&data->split_lock, flags);
675 pte[0] = arm_v7s_split_cont(data, iova, idx, lvl, ptep);
676 spin_unlock_irqrestore(&data->split_lock, flags);
690 ptep = iopte_deref(pte[i], lvl, data);
691 __arm_v7s_free_table(ptep, lvl + 1, data);
710 return arm_v7s_split_blk_unmap(data, gather, iova, size, pte[0],
715 ptep = iopte_deref(pte[0], lvl, data);
716 return __arm_v7s_unmap(data, gather, iova, size, lvl + 1, ptep);
722 struct arm_v7s_io_pgtable *data = io_pgtable_ops_to_data(ops);
727 return __arm_v7s_unmap(data, gather, iova, size, 1, data->pgd);
733 struct arm_v7s_io_pgtable *data = io_pgtable_ops_to_data(ops);
734 arm_v7s_iopte *ptep = data->pgd, pte;
741 ptep = iopte_deref(pte, lvl, data);
750 return iopte_to_paddr(pte, lvl, &data->iop.cfg) | (iova & ~mask);
756 struct arm_v7s_io_pgtable *data;
776 data = kmalloc(sizeof(*data), GFP_KERNEL);
777 if (!data)
780 spin_lock_init(&data->split_lock);
781 data->l2_tables = kmem_cache_create("io-pgtable_armv7s_l2",
785 if (!data->l2_tables)
788 data->iop.ops = (struct io_pgtable_ops) {
795 data->iop.cfg = *cfg;
820 data->pgd = __arm_v7s_alloc_table(1, GFP_KERNEL, data);
821 if (!data->pgd)
828 cfg->arm_v7s_cfg.ttbr = virt_to_phys(data->pgd) | ARM_V7S_TTBR_S |
834 return &data->iop;
837 kmem_cache_destroy(data->l2_tables);
838 kfree(data);