Lines Matching refs:pgtable

105 static bool increase_address_space(struct amd_io_pgtable *pgtable,  in increase_address_space()  argument
110 struct io_pgtable_cfg *cfg = &pgtable->pgtbl.cfg; in increase_address_space()
112 container_of(pgtable, struct protection_domain, iop); in increase_address_space()
123 if (address <= PM_LEVEL_SIZE(pgtable->mode) && in increase_address_space()
124 pgtable->mode - 1 >= page_size_level) in increase_address_space()
128 if (WARN_ON_ONCE(pgtable->mode == amd_iommu_hpt_level)) in increase_address_space()
131 *pte = PM_LEVEL_PDE(pgtable->mode, iommu_virt_to_phys(pgtable->root)); in increase_address_space()
133 pgtable->root = pte; in increase_address_space()
134 pgtable->mode += 1; in increase_address_space()
147 static u64 *alloc_pte(struct amd_io_pgtable *pgtable, in alloc_pte() argument
155 struct io_pgtable_cfg *cfg = &pgtable->pgtbl.cfg; in alloc_pte()
161 while (last_addr > PM_LEVEL_SIZE(pgtable->mode) || in alloc_pte()
162 pgtable->mode - 1 < PAGE_SIZE_LEVEL(page_size)) { in alloc_pte()
167 if (!increase_address_space(pgtable, last_addr, in alloc_pte()
173 level = pgtable->mode - 1; in alloc_pte()
174 pte = &pgtable->root[PM_LEVEL_INDEX(level, address)]; in alloc_pte()
247 static u64 *fetch_pte(struct amd_io_pgtable *pgtable, in fetch_pte() argument
256 if (address > PM_LEVEL_SIZE(pgtable->mode)) in fetch_pte()
259 level = pgtable->mode - 1; in fetch_pte()
260 pte = &pgtable->root[PM_LEVEL_INDEX(level, address)]; in fetch_pte()
325 struct amd_io_pgtable *pgtable = io_pgtable_ops_to_data(ops); in iommu_v1_map_pages() local
342 pte = alloc_pte(pgtable, iova, pgsize, NULL, gfp, &updated); in iommu_v1_map_pages()
403 struct amd_io_pgtable *pgtable = io_pgtable_ops_to_data(ops); in iommu_v1_unmap_pages() local
414 pte = fetch_pte(pgtable, iova, &unmap_size); in iommu_v1_unmap_pages()
434 struct amd_io_pgtable *pgtable = io_pgtable_ops_to_data(ops); in iommu_v1_iova_to_phys() local
438 pte = fetch_pte(pgtable, iova, &pte_pgsize); in iommu_v1_iova_to_phys()
488 struct amd_io_pgtable *pgtable = io_pgtable_ops_to_data(ops); in iommu_v1_read_and_clear_dirty() local
495 ptep = fetch_pte(pgtable, iova, &pgsize); in iommu_v1_read_and_clear_dirty()
521 struct amd_io_pgtable *pgtable = container_of(iop, struct amd_io_pgtable, pgtbl); in v1_free_pgtable() local
524 if (pgtable->mode == PAGE_MODE_NONE) in v1_free_pgtable()
528 BUG_ON(pgtable->mode < PAGE_MODE_NONE || in v1_free_pgtable()
529 pgtable->mode > amd_iommu_hpt_level); in v1_free_pgtable()
531 free_sub_pt(pgtable->root, pgtable->mode, &freelist); in v1_free_pgtable()
537 struct amd_io_pgtable *pgtable = io_pgtable_cfg_to_data(cfg); in v1_alloc_pgtable() local
539 pgtable->root = in v1_alloc_pgtable()
541 if (!pgtable->root) in v1_alloc_pgtable()
543 pgtable->mode = PAGE_MODE_3_LEVEL; in v1_alloc_pgtable()
549 pgtable->pgtbl.ops.map_pages = iommu_v1_map_pages; in v1_alloc_pgtable()
550 pgtable->pgtbl.ops.unmap_pages = iommu_v1_unmap_pages; in v1_alloc_pgtable()
551 pgtable->pgtbl.ops.iova_to_phys = iommu_v1_iova_to_phys; in v1_alloc_pgtable()
552 pgtable->pgtbl.ops.read_and_clear_dirty = iommu_v1_read_and_clear_dirty; in v1_alloc_pgtable()
554 return &pgtable->pgtbl; in v1_alloc_pgtable()