Lines Matching refs:group
72 ssize_t (*show)(struct iommu_group *group, char *buf);
73 ssize_t (*store)(struct iommu_group *group,
90 static int iommu_alloc_default_domain(struct iommu_group *group,
97 struct iommu_group *group);
98 static int __iommu_group_set_domain(struct iommu_group *group,
100 static int iommu_create_device_direct_mappings(struct iommu_group *group,
103 static ssize_t iommu_group_store_type(struct iommu_group *group,
309 struct iommu_group *group; in __iommu_probe_device() local
342 group = iommu_group_get_for_dev(dev); in __iommu_probe_device()
343 if (IS_ERR(group)) { in __iommu_probe_device()
344 ret = PTR_ERR(group); in __iommu_probe_device()
348 mutex_lock(&group->mutex); in __iommu_probe_device()
349 if (group_list && !group->default_domain && list_empty(&group->entry)) in __iommu_probe_device()
350 list_add_tail(&group->entry, group_list); in __iommu_probe_device()
351 mutex_unlock(&group->mutex); in __iommu_probe_device()
352 iommu_group_put(group); in __iommu_probe_device()
402 struct iommu_group *group; in iommu_probe_device() local
409 group = iommu_group_get(dev); in iommu_probe_device()
410 if (!group) { in iommu_probe_device()
421 mutex_lock(&group->mutex); in iommu_probe_device()
422 iommu_alloc_default_domain(group, dev); in iommu_probe_device()
428 if (group->default_domain && !group->owner) { in iommu_probe_device()
429 ret = iommu_group_do_dma_first_attach(dev, group->default_domain); in iommu_probe_device()
431 mutex_unlock(&group->mutex); in iommu_probe_device()
432 iommu_group_put(group); in iommu_probe_device()
437 iommu_create_device_direct_mappings(group, dev); in iommu_probe_device()
439 mutex_unlock(&group->mutex); in iommu_probe_device()
440 iommu_group_put(group); in iommu_probe_device()
513 struct iommu_group *group = to_iommu_group(kobj); in iommu_group_attr_show() local
517 ret = attr->show(group, buf); in iommu_group_attr_show()
526 struct iommu_group *group = to_iommu_group(kobj); in iommu_group_attr_store() local
530 ret = attr->store(group, buf, count); in iommu_group_attr_store()
539 static int iommu_group_create_file(struct iommu_group *group, in iommu_group_create_file() argument
542 return sysfs_create_file(&group->kobj, &attr->attr); in iommu_group_create_file()
545 static void iommu_group_remove_file(struct iommu_group *group, in iommu_group_remove_file() argument
548 sysfs_remove_file(&group->kobj, &attr->attr); in iommu_group_remove_file()
551 static ssize_t iommu_group_show_name(struct iommu_group *group, char *buf) in iommu_group_show_name() argument
553 return sprintf(buf, "%s\n", group->name); in iommu_group_show_name()
632 int iommu_get_group_resv_regions(struct iommu_group *group, in iommu_get_group_resv_regions() argument
638 mutex_lock(&group->mutex); in iommu_get_group_resv_regions()
639 list_for_each_entry(device, &group->devices, list) { in iommu_get_group_resv_regions()
656 mutex_unlock(&group->mutex); in iommu_get_group_resv_regions()
661 static ssize_t iommu_group_show_resv_regions(struct iommu_group *group, in iommu_group_show_resv_regions() argument
669 iommu_get_group_resv_regions(group, &group_resv_regions); in iommu_group_show_resv_regions()
683 static ssize_t iommu_group_show_type(struct iommu_group *group, in iommu_group_show_type() argument
688 mutex_lock(&group->mutex); in iommu_group_show_type()
689 if (group->default_domain) { in iommu_group_show_type()
690 switch (group->default_domain->type) { in iommu_group_show_type()
708 mutex_unlock(&group->mutex); in iommu_group_show_type()
724 struct iommu_group *group = to_iommu_group(kobj); in iommu_group_release() local
726 pr_debug("Releasing group %d\n", group->id); in iommu_group_release()
728 if (group->iommu_data_release) in iommu_group_release()
729 group->iommu_data_release(group->iommu_data); in iommu_group_release()
731 ida_free(&iommu_group_ida, group->id); in iommu_group_release()
733 if (group->default_domain) in iommu_group_release()
734 iommu_domain_free(group->default_domain); in iommu_group_release()
735 if (group->blocking_domain) in iommu_group_release()
736 iommu_domain_free(group->blocking_domain); in iommu_group_release()
738 kfree(group->name); in iommu_group_release()
739 kfree(group); in iommu_group_release()
760 struct iommu_group *group; in iommu_group_alloc() local
763 group = kzalloc(sizeof(*group), GFP_KERNEL); in iommu_group_alloc()
764 if (!group) in iommu_group_alloc()
767 group->kobj.kset = iommu_group_kset; in iommu_group_alloc()
768 mutex_init(&group->mutex); in iommu_group_alloc()
769 INIT_LIST_HEAD(&group->devices); in iommu_group_alloc()
770 INIT_LIST_HEAD(&group->entry); in iommu_group_alloc()
771 xa_init(&group->pasid_array); in iommu_group_alloc()
775 kfree(group); in iommu_group_alloc()
778 group->id = ret; in iommu_group_alloc()
780 ret = kobject_init_and_add(&group->kobj, &iommu_group_ktype, in iommu_group_alloc()
781 NULL, "%d", group->id); in iommu_group_alloc()
783 kobject_put(&group->kobj); in iommu_group_alloc()
787 group->devices_kobj = kobject_create_and_add("devices", &group->kobj); in iommu_group_alloc()
788 if (!group->devices_kobj) { in iommu_group_alloc()
789 kobject_put(&group->kobj); /* triggers .release & free */ in iommu_group_alloc()
798 kobject_put(&group->kobj); in iommu_group_alloc()
800 ret = iommu_group_create_file(group, in iommu_group_alloc()
803 kobject_put(group->devices_kobj); in iommu_group_alloc()
807 ret = iommu_group_create_file(group, &iommu_group_attr_type); in iommu_group_alloc()
809 kobject_put(group->devices_kobj); in iommu_group_alloc()
813 pr_debug("Allocated group %d\n", group->id); in iommu_group_alloc()
815 return group; in iommu_group_alloc()
822 struct iommu_group *group; in iommu_group_get_by_id() local
838 group = container_of(group_kobj, struct iommu_group, kobj); in iommu_group_get_by_id()
839 BUG_ON(group->id != id); in iommu_group_get_by_id()
841 kobject_get(group->devices_kobj); in iommu_group_get_by_id()
842 kobject_put(&group->kobj); in iommu_group_get_by_id()
844 return group; in iommu_group_get_by_id()
856 void *iommu_group_get_iommudata(struct iommu_group *group) in iommu_group_get_iommudata() argument
858 return group->iommu_data; in iommu_group_get_iommudata()
872 void iommu_group_set_iommudata(struct iommu_group *group, void *iommu_data, in iommu_group_set_iommudata() argument
875 group->iommu_data = iommu_data; in iommu_group_set_iommudata()
876 group->iommu_data_release = release; in iommu_group_set_iommudata()
888 int iommu_group_set_name(struct iommu_group *group, const char *name) in iommu_group_set_name() argument
892 if (group->name) { in iommu_group_set_name()
893 iommu_group_remove_file(group, &iommu_group_attr_name); in iommu_group_set_name()
894 kfree(group->name); in iommu_group_set_name()
895 group->name = NULL; in iommu_group_set_name()
900 group->name = kstrdup(name, GFP_KERNEL); in iommu_group_set_name()
901 if (!group->name) in iommu_group_set_name()
904 ret = iommu_group_create_file(group, &iommu_group_attr_name); in iommu_group_set_name()
906 kfree(group->name); in iommu_group_set_name()
907 group->name = NULL; in iommu_group_set_name()
915 static int iommu_create_device_direct_mappings(struct iommu_group *group, in iommu_create_device_direct_mappings() argument
918 struct iommu_domain *domain = group->default_domain; in iommu_create_device_direct_mappings()
987 int iommu_group_add_device(struct iommu_group *group, struct device *dev) in iommu_group_add_device() argument
998 ret = sysfs_create_link(&dev->kobj, &group->kobj, "iommu_group"); in iommu_group_add_device()
1009 ret = sysfs_create_link_nowarn(group->devices_kobj, in iommu_group_add_device()
1025 kobject_get(group->devices_kobj); in iommu_group_add_device()
1027 dev->iommu_group = group; in iommu_group_add_device()
1029 mutex_lock(&group->mutex); in iommu_group_add_device()
1030 list_add_tail(&device->list, &group->devices); in iommu_group_add_device()
1031 if (group->domain) in iommu_group_add_device()
1032 ret = iommu_group_do_dma_first_attach(dev, group->domain); in iommu_group_add_device()
1033 mutex_unlock(&group->mutex); in iommu_group_add_device()
1037 trace_add_device_to_group(group->id, dev); in iommu_group_add_device()
1039 dev_info(dev, "Adding to iommu group %d\n", group->id); in iommu_group_add_device()
1044 mutex_lock(&group->mutex); in iommu_group_add_device()
1046 mutex_unlock(&group->mutex); in iommu_group_add_device()
1048 kobject_put(group->devices_kobj); in iommu_group_add_device()
1049 sysfs_remove_link(group->devices_kobj, device->name); in iommu_group_add_device()
1056 dev_err(dev, "Failed to add to iommu group %d: %d\n", group->id, ret); in iommu_group_add_device()
1070 struct iommu_group *group = dev->iommu_group; in iommu_group_remove_device() local
1073 if (!group) in iommu_group_remove_device()
1076 dev_info(dev, "Removing from iommu group %d\n", group->id); in iommu_group_remove_device()
1078 mutex_lock(&group->mutex); in iommu_group_remove_device()
1079 list_for_each_entry(tmp_device, &group->devices, list) { in iommu_group_remove_device()
1086 mutex_unlock(&group->mutex); in iommu_group_remove_device()
1091 sysfs_remove_link(group->devices_kobj, device->name); in iommu_group_remove_device()
1094 trace_remove_device_from_group(group->id, dev); in iommu_group_remove_device()
1099 kobject_put(group->devices_kobj); in iommu_group_remove_device()
1103 static int iommu_group_device_count(struct iommu_group *group) in iommu_group_device_count() argument
1108 list_for_each_entry(entry, &group->devices, list) in iommu_group_device_count()
1114 static int __iommu_group_for_each_dev(struct iommu_group *group, void *data, in __iommu_group_for_each_dev() argument
1120 list_for_each_entry(device, &group->devices, list) { in __iommu_group_for_each_dev()
1139 int iommu_group_for_each_dev(struct iommu_group *group, void *data, in iommu_group_for_each_dev() argument
1144 mutex_lock(&group->mutex); in iommu_group_for_each_dev()
1145 ret = __iommu_group_for_each_dev(group, data, fn); in iommu_group_for_each_dev()
1146 mutex_unlock(&group->mutex); in iommu_group_for_each_dev()
1162 struct iommu_group *group = dev->iommu_group; in iommu_group_get() local
1164 if (group) in iommu_group_get()
1165 kobject_get(group->devices_kobj); in iommu_group_get()
1167 return group; in iommu_group_get()
1178 struct iommu_group *iommu_group_ref_get(struct iommu_group *group) in iommu_group_ref_get() argument
1180 kobject_get(group->devices_kobj); in iommu_group_ref_get()
1181 return group; in iommu_group_ref_get()
1192 void iommu_group_put(struct iommu_group *group) in iommu_group_put() argument
1194 if (group) in iommu_group_put()
1195 kobject_put(group->devices_kobj); in iommu_group_put()
1416 int iommu_group_id(struct iommu_group *group) in iommu_group_id() argument
1418 return group->id; in iommu_group_id()
1445 struct iommu_group *group; in get_pci_function_alias_group() local
1456 group = get_pci_alias_group(tmp, devfns); in get_pci_function_alias_group()
1457 if (group) { in get_pci_function_alias_group()
1459 return group; in get_pci_function_alias_group()
1479 struct iommu_group *group; in get_pci_alias_group() local
1484 group = iommu_group_get(&pdev->dev); in get_pci_alias_group()
1485 if (group) in get_pci_alias_group()
1486 return group; in get_pci_alias_group()
1494 group = get_pci_alias_group(tmp, devfns); in get_pci_alias_group()
1495 if (group) { in get_pci_alias_group()
1497 return group; in get_pci_alias_group()
1500 group = get_pci_function_alias_group(tmp, devfns); in get_pci_alias_group()
1501 if (group) { in get_pci_alias_group()
1503 return group; in get_pci_alias_group()
1513 struct iommu_group *group; member
1525 data->group = iommu_group_get(&pdev->dev); in get_pci_alias_or_group()
1527 return data->group != NULL; in get_pci_alias_or_group()
1549 struct iommu_group *group = NULL; in pci_device_group() local
1562 return data.group; in pci_device_group()
1581 group = iommu_group_get(&pdev->dev); in pci_device_group()
1582 if (group) in pci_device_group()
1583 return group; in pci_device_group()
1590 group = get_pci_alias_group(pdev, (unsigned long *)devfns); in pci_device_group()
1591 if (group) in pci_device_group()
1592 return group; in pci_device_group()
1599 group = get_pci_function_alias_group(pdev, (unsigned long *)devfns); in pci_device_group()
1600 if (group) in pci_device_group()
1601 return group; in pci_device_group()
1612 struct iommu_group *group; in fsl_mc_device_group() local
1614 group = iommu_group_get(cont_dev); in fsl_mc_device_group()
1615 if (!group) in fsl_mc_device_group()
1616 group = iommu_group_alloc(); in fsl_mc_device_group()
1617 return group; in fsl_mc_device_group()
1635 struct iommu_group *group, in iommu_group_alloc_default_domain() argument
1645 type, group->name); in iommu_group_alloc_default_domain()
1651 group->default_domain = dom; in iommu_group_alloc_default_domain()
1652 if (!group->domain) in iommu_group_alloc_default_domain()
1653 group->domain = dom; in iommu_group_alloc_default_domain()
1657 static int iommu_alloc_default_domain(struct iommu_group *group, in iommu_alloc_default_domain() argument
1662 if (group->default_domain) in iommu_alloc_default_domain()
1667 return iommu_group_alloc_default_domain(dev->bus, group, type); in iommu_alloc_default_domain()
1683 struct iommu_group *group; in iommu_group_get_for_dev() local
1686 group = iommu_group_get(dev); in iommu_group_get_for_dev()
1687 if (group) in iommu_group_get_for_dev()
1688 return group; in iommu_group_get_for_dev()
1690 group = ops->device_group(dev); in iommu_group_get_for_dev()
1691 if (WARN_ON_ONCE(group == NULL)) in iommu_group_get_for_dev()
1694 if (IS_ERR(group)) in iommu_group_get_for_dev()
1695 return group; in iommu_group_get_for_dev()
1697 ret = iommu_group_add_device(group, dev); in iommu_group_get_for_dev()
1701 return group; in iommu_group_get_for_dev()
1704 iommu_group_put(group); in iommu_group_get_for_dev()
1709 struct iommu_domain *iommu_group_default_domain(struct iommu_group *group) in iommu_group_default_domain() argument
1711 return group->default_domain; in iommu_group_default_domain()
1717 struct iommu_group *group; in probe_iommu_group() local
1721 group = iommu_group_get(dev); in probe_iommu_group()
1722 if (group) { in probe_iommu_group()
1723 iommu_group_put(group); in probe_iommu_group()
1781 struct iommu_group *group) in probe_alloc_default_domain() argument
1788 __iommu_group_for_each_dev(group, >ype, in probe_alloc_default_domain()
1794 iommu_group_alloc_default_domain(bus, group, gtype.type); in probe_alloc_default_domain()
1798 static int __iommu_group_dma_first_attach(struct iommu_group *group) in __iommu_group_dma_first_attach() argument
1800 return __iommu_group_for_each_dev(group, group->default_domain, in __iommu_group_dma_first_attach()
1814 static void __iommu_group_dma_finalize(struct iommu_group *group) in __iommu_group_dma_finalize() argument
1816 __iommu_group_for_each_dev(group, group->default_domain, in __iommu_group_dma_finalize()
1822 struct iommu_group *group = data; in iommu_do_create_direct_mappings() local
1824 iommu_create_device_direct_mappings(group, dev); in iommu_do_create_direct_mappings()
1829 static int iommu_group_create_direct_mappings(struct iommu_group *group) in iommu_group_create_direct_mappings() argument
1831 return __iommu_group_for_each_dev(group, group, in iommu_group_create_direct_mappings()
1837 struct iommu_group *group, *next; in bus_iommu_probe() local
1850 list_for_each_entry_safe(group, next, &group_list, entry) { in bus_iommu_probe()
1851 mutex_lock(&group->mutex); in bus_iommu_probe()
1854 list_del_init(&group->entry); in bus_iommu_probe()
1857 probe_alloc_default_domain(bus, group); in bus_iommu_probe()
1859 if (!group->default_domain) { in bus_iommu_probe()
1860 mutex_unlock(&group->mutex); in bus_iommu_probe()
1864 iommu_group_create_direct_mappings(group); in bus_iommu_probe()
1866 ret = __iommu_group_dma_first_attach(group); in bus_iommu_probe()
1868 mutex_unlock(&group->mutex); in bus_iommu_probe()
1873 __iommu_group_dma_finalize(group); in bus_iommu_probe()
1918 bool iommu_group_has_isolated_msi(struct iommu_group *group) in iommu_group_has_isolated_msi() argument
1923 mutex_lock(&group->mutex); in iommu_group_has_isolated_msi()
1924 list_for_each_entry(group_dev, &group->devices, list) in iommu_group_has_isolated_msi()
1926 mutex_unlock(&group->mutex); in iommu_group_has_isolated_msi()
1998 static void __iommu_group_set_core_domain(struct iommu_group *group) in __iommu_group_set_core_domain() argument
2003 if (group->owner) in __iommu_group_set_core_domain()
2004 new_domain = group->blocking_domain; in __iommu_group_set_core_domain()
2006 new_domain = group->default_domain; in __iommu_group_set_core_domain()
2008 ret = __iommu_group_set_domain(group, new_domain); in __iommu_group_set_core_domain()
2042 struct iommu_group *group; in iommu_attach_device() local
2045 group = iommu_group_get(dev); in iommu_attach_device()
2046 if (!group) in iommu_attach_device()
2053 mutex_lock(&group->mutex); in iommu_attach_device()
2055 if (iommu_group_device_count(group) != 1) in iommu_attach_device()
2058 ret = __iommu_attach_group(domain, group); in iommu_attach_device()
2061 mutex_unlock(&group->mutex); in iommu_attach_device()
2062 iommu_group_put(group); in iommu_attach_device()
2078 struct iommu_group *group; in iommu_detach_device() local
2080 group = iommu_group_get(dev); in iommu_detach_device()
2081 if (!group) in iommu_detach_device()
2084 mutex_lock(&group->mutex); in iommu_detach_device()
2085 if (WARN_ON(domain != group->domain) || in iommu_detach_device()
2086 WARN_ON(iommu_group_device_count(group) != 1)) in iommu_detach_device()
2088 __iommu_group_set_core_domain(group); in iommu_detach_device()
2091 mutex_unlock(&group->mutex); in iommu_detach_device()
2092 iommu_group_put(group); in iommu_detach_device()
2099 struct iommu_group *group; in iommu_get_domain_for_dev() local
2101 group = iommu_group_get(dev); in iommu_get_domain_for_dev()
2102 if (!group) in iommu_get_domain_for_dev()
2105 domain = group->domain; in iommu_get_domain_for_dev()
2107 iommu_group_put(group); in iommu_get_domain_for_dev()
2140 struct iommu_group *group) in __iommu_attach_group() argument
2144 if (group->domain && group->domain != group->default_domain && in __iommu_attach_group()
2145 group->domain != group->blocking_domain) in __iommu_attach_group()
2148 ret = __iommu_group_for_each_dev(group, domain, in __iommu_attach_group()
2151 group->domain = domain; in __iommu_attach_group()
2160 struct iommu_domain *old_domain = group->domain; in __iommu_attach_group()
2162 group->domain = NULL; in __iommu_attach_group()
2163 WARN(__iommu_group_set_domain(group, old_domain), in __iommu_attach_group()
2182 int iommu_attach_group(struct iommu_domain *domain, struct iommu_group *group) in iommu_attach_group() argument
2186 mutex_lock(&group->mutex); in iommu_attach_group()
2187 ret = __iommu_attach_group(domain, group); in iommu_attach_group()
2188 mutex_unlock(&group->mutex); in iommu_attach_group()
2204 static int __iommu_group_set_domain(struct iommu_group *group, in __iommu_group_set_domain() argument
2209 if (group->domain == new_domain) in __iommu_group_set_domain()
2218 __iommu_group_for_each_dev(group, NULL, in __iommu_group_set_domain()
2220 group->domain = NULL; in __iommu_group_set_domain()
2233 ret = __iommu_group_for_each_dev(group, new_domain, in __iommu_group_set_domain()
2237 group->domain = new_domain; in __iommu_group_set_domain()
2241 void iommu_detach_group(struct iommu_domain *domain, struct iommu_group *group) in iommu_detach_group() argument
2243 mutex_lock(&group->mutex); in iommu_detach_group()
2244 __iommu_group_set_core_domain(group); in iommu_detach_group()
2245 mutex_unlock(&group->mutex); in iommu_detach_group()
2834 static int iommu_change_dev_def_domain(struct iommu_group *group, in iommu_change_dev_def_domain() argument
2842 mutex_lock(&group->mutex); in iommu_change_dev_def_domain()
2844 if (group->default_domain != group->domain) { in iommu_change_dev_def_domain()
2863 if (iommu_group_device_count(group) != 1) { in iommu_change_dev_def_domain()
2870 grp_dev = list_first_entry(&group->devices, struct group_device, list); in iommu_change_dev_def_domain()
2879 prev_dom = group->default_domain; in iommu_change_dev_def_domain()
2918 ret = iommu_group_alloc_default_domain(dev->bus, group, type); in iommu_change_dev_def_domain()
2922 ret = iommu_create_device_direct_mappings(group, dev); in iommu_change_dev_def_domain()
2926 ret = __iommu_attach_device(group->default_domain, dev); in iommu_change_dev_def_domain()
2930 group->domain = group->default_domain; in iommu_change_dev_def_domain()
2938 mutex_unlock(&group->mutex); in iommu_change_dev_def_domain()
2941 iommu_group_do_probe_finalize(dev, group->default_domain); in iommu_change_dev_def_domain()
2946 iommu_domain_free(group->default_domain); in iommu_change_dev_def_domain()
2947 group->default_domain = prev_dom; in iommu_change_dev_def_domain()
2948 group->domain = prev_dom; in iommu_change_dev_def_domain()
2951 mutex_unlock(&group->mutex); in iommu_change_dev_def_domain()
2965 static ssize_t iommu_group_store_type(struct iommu_group *group, in iommu_group_store_type() argument
2975 if (WARN_ON(!group) || !group->default_domain) in iommu_group_store_type()
2995 mutex_lock(&group->mutex); in iommu_group_store_type()
2996 if (iommu_group_device_count(group) != 1) { in iommu_group_store_type()
2997 mutex_unlock(&group->mutex); in iommu_group_store_type()
3003 grp_dev = list_first_entry(&group->devices, struct group_device, list); in iommu_group_store_type()
3031 mutex_unlock(&group->mutex); in iommu_group_store_type()
3036 group->default_domain->type == IOMMU_DOMAIN_DMA)) { in iommu_group_store_type()
3042 ret = iommu_change_dev_def_domain(group, dev, req_type); in iommu_group_store_type()
3052 static bool iommu_is_default_domain(struct iommu_group *group) in iommu_is_default_domain() argument
3054 if (group->domain == group->default_domain) in iommu_is_default_domain()
3063 if (group->default_domain && in iommu_is_default_domain()
3064 group->default_domain->type == IOMMU_DOMAIN_IDENTITY && in iommu_is_default_domain()
3065 group->domain && group->domain->type == IOMMU_DOMAIN_IDENTITY) in iommu_is_default_domain()
3080 struct iommu_group *group = iommu_group_get(dev); in iommu_device_use_default_domain() local
3083 if (!group) in iommu_device_use_default_domain()
3086 mutex_lock(&group->mutex); in iommu_device_use_default_domain()
3087 if (group->owner_cnt) { in iommu_device_use_default_domain()
3088 if (group->owner || !iommu_is_default_domain(group) || in iommu_device_use_default_domain()
3089 !xa_empty(&group->pasid_array)) { in iommu_device_use_default_domain()
3095 group->owner_cnt++; in iommu_device_use_default_domain()
3098 mutex_unlock(&group->mutex); in iommu_device_use_default_domain()
3099 iommu_group_put(group); in iommu_device_use_default_domain()
3114 struct iommu_group *group = iommu_group_get(dev); in iommu_device_unuse_default_domain() local
3116 if (!group) in iommu_device_unuse_default_domain()
3119 mutex_lock(&group->mutex); in iommu_device_unuse_default_domain()
3120 if (!WARN_ON(!group->owner_cnt || !xa_empty(&group->pasid_array))) in iommu_device_unuse_default_domain()
3121 group->owner_cnt--; in iommu_device_unuse_default_domain()
3123 mutex_unlock(&group->mutex); in iommu_device_unuse_default_domain()
3124 iommu_group_put(group); in iommu_device_unuse_default_domain()
3127 static int __iommu_group_alloc_blocking_domain(struct iommu_group *group) in __iommu_group_alloc_blocking_domain() argument
3130 list_first_entry(&group->devices, struct group_device, list); in __iommu_group_alloc_blocking_domain()
3132 if (group->blocking_domain) in __iommu_group_alloc_blocking_domain()
3135 group->blocking_domain = in __iommu_group_alloc_blocking_domain()
3137 if (!group->blocking_domain) { in __iommu_group_alloc_blocking_domain()
3142 group->blocking_domain = __iommu_domain_alloc( in __iommu_group_alloc_blocking_domain()
3144 if (!group->blocking_domain) in __iommu_group_alloc_blocking_domain()
3150 static int __iommu_take_dma_ownership(struct iommu_group *group, void *owner) in __iommu_take_dma_ownership() argument
3154 if ((group->domain && group->domain != group->default_domain) || in __iommu_take_dma_ownership()
3155 !xa_empty(&group->pasid_array)) in __iommu_take_dma_ownership()
3158 ret = __iommu_group_alloc_blocking_domain(group); in __iommu_take_dma_ownership()
3161 ret = __iommu_group_set_domain(group, group->blocking_domain); in __iommu_take_dma_ownership()
3165 group->owner = owner; in __iommu_take_dma_ownership()
3166 group->owner_cnt++; in __iommu_take_dma_ownership()
3179 int iommu_group_claim_dma_owner(struct iommu_group *group, void *owner) in iommu_group_claim_dma_owner() argument
3186 mutex_lock(&group->mutex); in iommu_group_claim_dma_owner()
3187 if (group->owner_cnt) { in iommu_group_claim_dma_owner()
3192 ret = __iommu_take_dma_ownership(group, owner); in iommu_group_claim_dma_owner()
3194 mutex_unlock(&group->mutex); in iommu_group_claim_dma_owner()
3211 struct iommu_group *group; in iommu_device_claim_dma_owner() local
3217 group = iommu_group_get(dev); in iommu_device_claim_dma_owner()
3218 if (!group) in iommu_device_claim_dma_owner()
3221 mutex_lock(&group->mutex); in iommu_device_claim_dma_owner()
3222 if (group->owner_cnt) { in iommu_device_claim_dma_owner()
3223 if (group->owner != owner) { in iommu_device_claim_dma_owner()
3227 group->owner_cnt++; in iommu_device_claim_dma_owner()
3231 ret = __iommu_take_dma_ownership(group, owner); in iommu_device_claim_dma_owner()
3233 mutex_unlock(&group->mutex); in iommu_device_claim_dma_owner()
3234 iommu_group_put(group); in iommu_device_claim_dma_owner()
3240 static void __iommu_release_dma_ownership(struct iommu_group *group) in __iommu_release_dma_ownership() argument
3244 if (WARN_ON(!group->owner_cnt || !group->owner || in __iommu_release_dma_ownership()
3245 !xa_empty(&group->pasid_array))) in __iommu_release_dma_ownership()
3248 group->owner_cnt = 0; in __iommu_release_dma_ownership()
3249 group->owner = NULL; in __iommu_release_dma_ownership()
3250 ret = __iommu_group_set_domain(group, group->default_domain); in __iommu_release_dma_ownership()
3260 void iommu_group_release_dma_owner(struct iommu_group *group) in iommu_group_release_dma_owner() argument
3262 mutex_lock(&group->mutex); in iommu_group_release_dma_owner()
3263 __iommu_release_dma_ownership(group); in iommu_group_release_dma_owner()
3264 mutex_unlock(&group->mutex); in iommu_group_release_dma_owner()
3276 struct iommu_group *group = iommu_group_get(dev); in iommu_device_release_dma_owner() local
3278 mutex_lock(&group->mutex); in iommu_device_release_dma_owner()
3279 if (group->owner_cnt > 1) in iommu_device_release_dma_owner()
3280 group->owner_cnt--; in iommu_device_release_dma_owner()
3282 __iommu_release_dma_ownership(group); in iommu_device_release_dma_owner()
3283 mutex_unlock(&group->mutex); in iommu_device_release_dma_owner()
3284 iommu_group_put(group); in iommu_device_release_dma_owner()
3295 bool iommu_group_dma_owner_claimed(struct iommu_group *group) in iommu_group_dma_owner_claimed() argument
3299 mutex_lock(&group->mutex); in iommu_group_dma_owner_claimed()
3300 user = group->owner_cnt; in iommu_group_dma_owner_claimed()
3301 mutex_unlock(&group->mutex); in iommu_group_dma_owner_claimed()
3308 struct iommu_group *group, ioasid_t pasid) in __iommu_set_group_pasid() argument
3313 list_for_each_entry(device, &group->devices, list) { in __iommu_set_group_pasid()
3322 static void __iommu_remove_group_pasid(struct iommu_group *group, in __iommu_remove_group_pasid() argument
3328 list_for_each_entry(device, &group->devices, list) { in __iommu_remove_group_pasid()
3345 struct iommu_group *group; in iommu_attach_device_pasid() local
3352 group = iommu_group_get(dev); in iommu_attach_device_pasid()
3353 if (!group) in iommu_attach_device_pasid()
3356 mutex_lock(&group->mutex); in iommu_attach_device_pasid()
3357 curr = xa_cmpxchg(&group->pasid_array, pasid, NULL, domain, GFP_KERNEL); in iommu_attach_device_pasid()
3363 ret = __iommu_set_group_pasid(domain, group, pasid); in iommu_attach_device_pasid()
3365 __iommu_remove_group_pasid(group, pasid); in iommu_attach_device_pasid()
3366 xa_erase(&group->pasid_array, pasid); in iommu_attach_device_pasid()
3369 mutex_unlock(&group->mutex); in iommu_attach_device_pasid()
3370 iommu_group_put(group); in iommu_attach_device_pasid()
3388 struct iommu_group *group = iommu_group_get(dev); in iommu_detach_device_pasid() local
3390 mutex_lock(&group->mutex); in iommu_detach_device_pasid()
3391 __iommu_remove_group_pasid(group, pasid); in iommu_detach_device_pasid()
3392 WARN_ON(xa_erase(&group->pasid_array, pasid) != domain); in iommu_detach_device_pasid()
3393 mutex_unlock(&group->mutex); in iommu_detach_device_pasid()
3395 iommu_group_put(group); in iommu_detach_device_pasid()
3418 struct iommu_group *group; in iommu_get_domain_for_dev_pasid() local
3420 group = iommu_group_get(dev); in iommu_get_domain_for_dev_pasid()
3421 if (!group) in iommu_get_domain_for_dev_pasid()
3424 xa_lock(&group->pasid_array); in iommu_get_domain_for_dev_pasid()
3425 domain = xa_load(&group->pasid_array, pasid); in iommu_get_domain_for_dev_pasid()
3428 xa_unlock(&group->pasid_array); in iommu_get_domain_for_dev_pasid()
3429 iommu_group_put(group); in iommu_get_domain_for_dev_pasid()