Lines Matching refs:area
197 static unsigned long iopt_area_index_to_iova(struct iopt_area *area, in iopt_area_index_to_iova() argument
201 WARN_ON(index < iopt_area_index(area) || in iopt_area_index_to_iova()
202 index > iopt_area_last_index(area)); in iopt_area_index_to_iova()
203 index -= iopt_area_index(area); in iopt_area_index_to_iova()
205 return iopt_area_iova(area); in iopt_area_index_to_iova()
206 return iopt_area_iova(area) - area->page_offset + index * PAGE_SIZE; in iopt_area_index_to_iova()
209 static unsigned long iopt_area_index_to_iova_last(struct iopt_area *area, in iopt_area_index_to_iova_last() argument
213 WARN_ON(index < iopt_area_index(area) || in iopt_area_index_to_iova_last()
214 index > iopt_area_last_index(area)); in iopt_area_index_to_iova_last()
215 if (index == iopt_area_last_index(area)) in iopt_area_index_to_iova_last()
216 return iopt_area_last_iova(area); in iopt_area_index_to_iova_last()
217 return iopt_area_iova(area) - area->page_offset + in iopt_area_index_to_iova_last()
218 (index - iopt_area_index(area) + 1) * PAGE_SIZE - 1; in iopt_area_index_to_iova_last()
237 static void iopt_area_unmap_domain_range(struct iopt_area *area, in iopt_area_unmap_domain_range() argument
242 unsigned long start_iova = iopt_area_index_to_iova(area, start_index); in iopt_area_unmap_domain_range()
245 iopt_area_index_to_iova_last(area, last_index) - in iopt_area_unmap_domain_range()
377 struct iopt_area *area, unsigned long start_index, in batch_from_domain() argument
384 iova = iopt_area_index_to_iova(area, start_index); in batch_from_domain()
385 if (start_index == iopt_area_index(area)) in batch_from_domain()
386 page_offset = area->page_offset; in batch_from_domain()
403 struct iopt_area *area, in raw_pages_from_domain() argument
412 iova = iopt_area_index_to_iova(area, start_index); in raw_pages_from_domain()
413 if (start_index == iopt_area_index(area)) in raw_pages_from_domain()
414 page_offset = area->page_offset; in raw_pages_from_domain()
428 struct iopt_area *area, in batch_from_domain_continue() argument
435 batch_from_domain(batch, domain, area, start_index, last_index); in batch_from_domain_continue()
476 struct iopt_area *area, unsigned long start_index) in batch_to_domain() argument
478 bool disable_large_pages = area->iopt->disable_large_pages; in batch_to_domain()
479 unsigned long last_iova = iopt_area_last_iova(area); in batch_to_domain()
488 if (start_index == iopt_area_index(area)) in batch_to_domain()
489 page_offset = area->page_offset; in batch_to_domain()
491 iopt_area_index_to_iova(area, start_index); in batch_to_domain()
500 next_iova - iova, area->iommu_prot); in batch_to_domain()
504 next_iova - iova, area->iommu_prot, in batch_to_domain()
981 struct iopt_area *area; in pfn_reader_fill_span() local
1000 area = iopt_pages_find_domain_area(pfns->pages, start_index); in pfn_reader_fill_span()
1001 if (WARN_ON(!area)) in pfn_reader_fill_span()
1006 &pfns->batch, area->storage_domain, area, start_index, in pfn_reader_fill_span()
1007 min(iopt_area_last_index(area), span->last_used)); in pfn_reader_fill_span()
1198 iopt_area_unpin_domain(struct pfn_batch *batch, struct iopt_area *area, in iopt_area_unpin_domain() argument
1216 batch_from_domain(batch, domain, area, start, in iopt_area_unpin_domain()
1237 batch_from_domain_continue(batch, domain, area, in iopt_area_unpin_domain()
1243 area, domain, *unmapped_end_index, in iopt_area_unpin_domain()
1258 static void __iopt_area_unfill_domain(struct iopt_area *area, in __iopt_area_unfill_domain() argument
1264 unsigned long start_index = iopt_area_index(area); in __iopt_area_unfill_domain()
1294 iopt_area_unpin_domain(&batch, area, pages, domain, in __iopt_area_unfill_domain()
1303 iopt_area_unmap_domain_range(area, domain, unmapped_end_index, in __iopt_area_unfill_domain()
1310 static void iopt_area_unfill_partial_domain(struct iopt_area *area, in iopt_area_unfill_partial_domain() argument
1315 if (end_index != iopt_area_index(area)) in iopt_area_unfill_partial_domain()
1316 __iopt_area_unfill_domain(area, pages, domain, end_index - 1); in iopt_area_unfill_partial_domain()
1327 void iopt_area_unmap_domain(struct iopt_area *area, struct iommu_domain *domain) in iopt_area_unmap_domain() argument
1329 iommu_unmap_nofail(domain, iopt_area_iova(area), in iopt_area_unmap_domain()
1330 iopt_area_length(area)); in iopt_area_unmap_domain()
1343 void iopt_area_unfill_domain(struct iopt_area *area, struct iopt_pages *pages, in iopt_area_unfill_domain() argument
1346 __iopt_area_unfill_domain(area, pages, domain, in iopt_area_unfill_domain()
1347 iopt_area_last_index(area)); in iopt_area_unfill_domain()
1358 int iopt_area_fill_domain(struct iopt_area *area, struct iommu_domain *domain) in iopt_area_fill_domain() argument
1364 lockdep_assert_held(&area->pages->mutex); in iopt_area_fill_domain()
1366 rc = pfn_reader_first(&pfns, area->pages, iopt_area_index(area), in iopt_area_fill_domain()
1367 iopt_area_last_index(area)); in iopt_area_fill_domain()
1373 rc = batch_to_domain(&pfns.batch, domain, area, in iopt_area_fill_domain()
1391 iopt_area_unfill_partial_domain(area, area->pages, domain, in iopt_area_fill_domain()
1409 int iopt_area_fill_domains(struct iopt_area *area, struct iopt_pages *pages) in iopt_area_fill_domains() argument
1419 lockdep_assert_held(&area->iopt->domains_rwsem); in iopt_area_fill_domains()
1421 if (xa_empty(&area->iopt->domains)) in iopt_area_fill_domains()
1425 rc = pfn_reader_first(&pfns, pages, iopt_area_index(area), in iopt_area_fill_domains()
1426 iopt_area_last_index(area)); in iopt_area_fill_domains()
1433 xa_for_each(&area->iopt->domains, index, domain) { in iopt_area_fill_domains()
1434 rc = batch_to_domain(&pfns.batch, domain, area, in iopt_area_fill_domains()
1449 area->storage_domain = xa_load(&area->iopt->domains, 0); in iopt_area_fill_domains()
1450 interval_tree_insert(&area->pages_node, &pages->domains_itree); in iopt_area_fill_domains()
1455 xa_for_each(&area->iopt->domains, unmap_index, domain) { in iopt_area_fill_domains()
1468 if (unmap_index != area->iopt->next_domain_id - 1) { in iopt_area_fill_domains()
1469 if (end_index != iopt_area_index(area)) in iopt_area_fill_domains()
1471 area, domain, iopt_area_index(area), in iopt_area_fill_domains()
1474 iopt_area_unfill_partial_domain(area, pages, domain, in iopt_area_fill_domains()
1493 void iopt_area_unfill_domains(struct iopt_area *area, struct iopt_pages *pages) in iopt_area_unfill_domains() argument
1495 struct io_pagetable *iopt = area->iopt; in iopt_area_unfill_domains()
1502 if (!area->storage_domain) in iopt_area_unfill_domains()
1506 if (domain != area->storage_domain) in iopt_area_unfill_domains()
1508 area, domain, iopt_area_index(area), in iopt_area_unfill_domains()
1509 iopt_area_last_index(area)); in iopt_area_unfill_domains()
1512 WARN_ON(RB_EMPTY_NODE(&area->pages_node.rb)); in iopt_area_unfill_domains()
1513 interval_tree_remove(&area->pages_node, &pages->domains_itree); in iopt_area_unfill_domains()
1514 iopt_area_unfill_domain(area, pages, area->storage_domain); in iopt_area_unfill_domains()
1515 area->storage_domain = NULL; in iopt_area_unfill_domains()
1618 struct iopt_area *area; in iopt_pages_fill_from_domain() local
1620 area = iopt_pages_find_domain_area(pages, start_index); in iopt_pages_fill_from_domain()
1621 if (WARN_ON(!area)) in iopt_pages_fill_from_domain()
1624 domain_last = min(iopt_area_last_index(area), last_index); in iopt_pages_fill_from_domain()
1625 out_pages = raw_pages_from_domain(area->storage_domain, area, in iopt_pages_fill_from_domain()
1916 int iopt_area_add_access(struct iopt_area *area, unsigned long start_index, in iopt_area_add_access() argument
1920 struct iopt_pages *pages = area->pages; in iopt_area_add_access()
1930 area->num_accesses++; in iopt_area_add_access()
1951 area->num_accesses++; in iopt_area_add_access()
1972 void iopt_area_remove_access(struct iopt_area *area, unsigned long start_index, in iopt_area_remove_access() argument
1975 struct iopt_pages *pages = area->pages; in iopt_area_remove_access()
1983 WARN_ON(area->num_accesses == 0 || access->users == 0); in iopt_area_remove_access()
1984 area->num_accesses--; in iopt_area_remove_access()