Lines Matching refs:container

50  * A container needs to remember which preregistered region  it has
59 * The container descriptor supports only a single group per container.
60 * Required by the API as the container is not supplied with the IOMMU group
75 static long tce_iommu_mm_set(struct tce_container *container)
77 if (container->mm) {
78 if (container->mm == current->mm)
83 container->mm = current->mm;
84 mmgrab(container->mm);
89 static long tce_iommu_prereg_free(struct tce_container *container,
94 ret = mm_iommu_put(container->mm, tcemem->mem);
104 static long tce_iommu_unregister_pages(struct tce_container *container,
115 mem = mm_iommu_get(container->mm, vaddr, size >> PAGE_SHIFT);
119 list_for_each_entry(tcemem, &container->prereg_list, next) {
129 ret = tce_iommu_prereg_free(container, tcemem);
131 mm_iommu_put(container->mm, mem);
136 static long tce_iommu_register_pages(struct tce_container *container,
148 mem = mm_iommu_get(container->mm, vaddr, entries);
150 list_for_each_entry(tcemem, &container->prereg_list, next) {
157 ret = mm_iommu_new(container->mm, vaddr, entries, &mem);
169 list_add(&tcemem->next, &container->prereg_list);
171 container->enabled = true;
176 mm_iommu_put(container->mm, mem);
198 static inline bool tce_groups_attached(struct tce_container *container)
200 return !list_empty(&container->group_list);
203 static long tce_iommu_find_table(struct tce_container *container,
209 struct iommu_table *tbl = container->tables[i];
226 static int tce_iommu_find_free_table(struct tce_container *container)
231 if (!container->tables[i])
238 static int tce_iommu_enable(struct tce_container *container)
245 if (container->enabled)
273 * So we do not allow enabling a container without a group attached
277 if (!tce_groups_attached(container))
280 tcegrp = list_first_entry(&container->group_list,
289 ret = tce_iommu_mm_set(container);
294 ret = account_locked_vm(container->mm, locked, true);
298 container->locked_pages = locked;
300 container->enabled = true;
305 static void tce_iommu_disable(struct tce_container *container)
307 if (!container->enabled)
310 container->enabled = false;
312 BUG_ON(!container->mm);
313 account_locked_vm(container->mm, container->locked_pages, false);
318 struct tce_container *container;
325 container = kzalloc(sizeof(*container), GFP_KERNEL);
326 if (!container)
329 mutex_init(&container->lock);
330 INIT_LIST_HEAD_RCU(&container->group_list);
331 INIT_LIST_HEAD_RCU(&container->prereg_list);
333 container->v2 = arg == VFIO_SPAPR_TCE_v2_IOMMU;
335 return container;
338 static int tce_iommu_clear(struct tce_container *container,
341 static void tce_iommu_free_table(struct tce_container *container,
346 struct tce_container *container = iommu_data;
351 while (tce_groups_attached(container)) {
352 tcegrp = list_first_entry(&container->group_list,
362 struct iommu_table *tbl = container->tables[i];
367 tce_iommu_clear(container, tbl, tbl->it_offset, tbl->it_size);
368 tce_iommu_free_table(container, tbl);
371 list_for_each_entry_safe(tcemem, tmtmp, &container->prereg_list, next)
372 WARN_ON(tce_iommu_prereg_free(container, tcemem));
374 tce_iommu_disable(container);
375 if (container->mm)
376 mmdrop(container->mm);
377 mutex_destroy(&container->lock);
379 kfree(container);
390 static int tce_iommu_prereg_ua_to_hpa(struct tce_container *container,
397 mem = mm_iommu_lookup(container->mm, tce, 1ULL << shift);
410 static void tce_iommu_unuse_page_v2(struct tce_container *container,
421 ret = tce_iommu_prereg_ua_to_hpa(container, be64_to_cpu(*pua),
432 static int tce_iommu_clear(struct tce_container *container,
464 ret = iommu_tce_xchg_no_kill(container->mm, tbl, entry, &oldhpa,
472 if (container->v2) {
473 tce_iommu_unuse_page_v2(container, tbl, entry);
500 static long tce_iommu_build(struct tce_container *container,
516 if (!tce_page_is_contained(container->mm, hpa,
524 ret = iommu_tce_xchg_no_kill(container->mm, tbl, entry + i,
541 tce_iommu_clear(container, tbl, entry, i);
548 static long tce_iommu_build_v2(struct tce_container *container,
561 ret = tce_iommu_prereg_ua_to_hpa(container,
566 if (!tce_page_is_contained(container->mm, hpa,
580 ret = iommu_tce_xchg_no_kill(container->mm, tbl, entry + i,
584 tce_iommu_unuse_page_v2(container, tbl, entry + i);
592 tce_iommu_unuse_page_v2(container, tbl, entry + i);
600 tce_iommu_clear(container, tbl, entry, i);
607 static long tce_iommu_create_table(struct tce_container *container,
622 ret = account_locked_vm(container->mm, table_size >> PAGE_SHIFT, true);
635 static void tce_iommu_free_table(struct tce_container *container,
641 account_locked_vm(container->mm, pages, false);
644 static long tce_iommu_create_window(struct tce_container *container,
653 num = tce_iommu_find_free_table(container);
658 tcegrp = list_first_entry(&container->group_list,
673 ret = tce_iommu_create_table(container, table_group, num,
684 list_for_each_entry(tcegrp, &container->group_list, next) {
692 container->tables[num] = tbl;
700 list_for_each_entry(tcegrp, &container->group_list, next) {
704 tce_iommu_free_table(container, tbl);
709 static long tce_iommu_remove_window(struct tce_container *container,
717 num = tce_iommu_find_table(container, start_addr, &tbl);
724 list_for_each_entry(tcegrp, &container->group_list, next) {
741 tce_iommu_clear(container, tbl, tbl->it_offset, tbl->it_size);
742 tce_iommu_free_table(container, tbl);
743 container->tables[num] = NULL;
748 static long tce_iommu_create_default_window(struct tce_container *container)
755 if (!container->def_window_pending)
758 if (!tce_groups_attached(container))
761 tcegrp = list_first_entry(&container->group_list,
767 ret = tce_iommu_create_window(container, IOMMU_PAGE_SHIFT_4K,
772 container->def_window_pending = false;
831 struct tce_container *container = iommu_data;
852 BUG_ON(!container);
853 if (container->mm && container->mm != current->mm)
862 if (!tce_groups_attached(container))
865 tcegrp = list_first_entry(&container->group_list,
887 container->v2) {
911 if (!container->enabled)
926 ret = tce_iommu_create_default_window(container);
930 num = tce_iommu_find_table(container, param.iova, &tbl);
955 if (container->v2)
956 ret = tce_iommu_build_v2(container, tbl,
962 ret = tce_iommu_build(container, tbl,
977 if (!container->enabled)
993 ret = tce_iommu_create_default_window(container);
997 num = tce_iommu_find_table(container, param.iova, &tbl);
1009 ret = tce_iommu_clear(container, tbl,
1019 if (!container->v2)
1025 ret = tce_iommu_mm_set(container);
1039 mutex_lock(&container->lock);
1040 ret = tce_iommu_register_pages(container, param.vaddr,
1042 mutex_unlock(&container->lock);
1049 if (!container->v2)
1052 if (!container->mm)
1068 mutex_lock(&container->lock);
1069 ret = tce_iommu_unregister_pages(container, param.vaddr,
1071 mutex_unlock(&container->lock);
1076 if (container->v2)
1079 mutex_lock(&container->lock);
1080 ret = tce_iommu_enable(container);
1081 mutex_unlock(&container->lock);
1086 if (container->v2)
1089 mutex_lock(&container->lock);
1090 tce_iommu_disable(container);
1091 mutex_unlock(&container->lock);
1098 list_for_each_entry(tcegrp, &container->group_list, next) {
1109 if (!container->v2)
1112 ret = tce_iommu_mm_set(container);
1116 if (!tce_groups_attached(container))
1131 mutex_lock(&container->lock);
1133 ret = tce_iommu_create_default_window(container);
1135 ret = tce_iommu_create_window(container,
1140 mutex_unlock(&container->lock);
1150 if (!container->v2)
1153 ret = tce_iommu_mm_set(container);
1157 if (!tce_groups_attached(container))
1172 if (container->def_window_pending && !remove.start_addr) {
1173 container->def_window_pending = false;
1177 mutex_lock(&container->lock);
1179 ret = tce_iommu_remove_window(container, remove.start_addr);
1181 mutex_unlock(&container->lock);
1190 static void tce_iommu_release_ownership(struct tce_container *container,
1201 if (container->tables[i])
1205 static long tce_iommu_take_ownership(struct tce_container *container,
1212 struct iommu_table *tbl = container->tables[i];
1235 struct tce_container *container = iommu_data;
1242 mutex_lock(&container->lock);
1253 if (container->v2 && table_group->max_dynamic_windows_supported == 0) {
1259 if (!container->v2 && tce_groups_attached(container)) {
1268 list_for_each_entry(tcegrp, &container->group_list, next) {
1294 ret = tce_iommu_take_ownership(container, table_group);
1295 if (!tce_groups_attached(container) && !container->tables[0])
1296 container->def_window_pending = true;
1300 list_add(&tcegrp->next, &container->group_list);
1307 mutex_unlock(&container->lock);
1315 struct tce_container *container = iommu_data;
1320 mutex_lock(&container->lock);
1322 list_for_each_entry(tcegrp, &container->group_list, next) {
1341 tce_iommu_release_ownership(container, table_group);
1344 mutex_unlock(&container->lock);