Lines Matching refs:group

61 	ssize_t (*show)(struct iommu_group *group, char *buf);
62 ssize_t (*store)(struct iommu_group *group,
77 static int iommu_alloc_default_domain(struct iommu_group *group,
84 struct iommu_group *group);
86 struct iommu_group *group);
87 static int iommu_create_device_direct_mappings(struct iommu_group *group,
90 static ssize_t iommu_group_store_type(struct iommu_group *group,
219 struct iommu_group *group; in __iommu_probe_device() local
241 group = iommu_group_get_for_dev(dev); in __iommu_probe_device()
242 if (IS_ERR(group)) { in __iommu_probe_device()
243 ret = PTR_ERR(group); in __iommu_probe_device()
246 iommu_group_put(group); in __iommu_probe_device()
248 if (group_list && !group->default_domain && list_empty(&group->entry)) in __iommu_probe_device()
249 list_add_tail(&group->entry, group_list); in __iommu_probe_device()
270 struct iommu_group *group; in iommu_probe_device() local
277 group = iommu_group_get(dev); in iommu_probe_device()
278 if (!group) { in iommu_probe_device()
289 mutex_lock(&group->mutex); in iommu_probe_device()
290 iommu_alloc_default_domain(group, dev); in iommu_probe_device()
291 mutex_unlock(&group->mutex); in iommu_probe_device()
293 if (group->default_domain) { in iommu_probe_device()
294 ret = __iommu_attach_device(group->default_domain, dev); in iommu_probe_device()
296 iommu_group_put(group); in iommu_probe_device()
301 iommu_create_device_direct_mappings(group, dev); in iommu_probe_device()
303 iommu_group_put(group); in iommu_probe_device()
373 struct iommu_group *group = to_iommu_group(kobj); in iommu_group_attr_show() local
377 ret = attr->show(group, buf); in iommu_group_attr_show()
386 struct iommu_group *group = to_iommu_group(kobj); in iommu_group_attr_store() local
390 ret = attr->store(group, buf, count); in iommu_group_attr_store()
399 static int iommu_group_create_file(struct iommu_group *group, in iommu_group_create_file() argument
402 return sysfs_create_file(&group->kobj, &attr->attr); in iommu_group_create_file()
405 static void iommu_group_remove_file(struct iommu_group *group, in iommu_group_remove_file() argument
408 sysfs_remove_file(&group->kobj, &attr->attr); in iommu_group_remove_file()
411 static ssize_t iommu_group_show_name(struct iommu_group *group, char *buf) in iommu_group_show_name() argument
413 return sprintf(buf, "%s\n", group->name); in iommu_group_show_name()
492 int iommu_get_group_resv_regions(struct iommu_group *group, in iommu_get_group_resv_regions() argument
498 mutex_lock(&group->mutex); in iommu_get_group_resv_regions()
499 list_for_each_entry(device, &group->devices, list) { in iommu_get_group_resv_regions()
509 mutex_unlock(&group->mutex); in iommu_get_group_resv_regions()
514 static ssize_t iommu_group_show_resv_regions(struct iommu_group *group, in iommu_group_show_resv_regions() argument
522 iommu_get_group_resv_regions(group, &group_resv_regions); in iommu_group_show_resv_regions()
536 static ssize_t iommu_group_show_type(struct iommu_group *group, in iommu_group_show_type() argument
541 mutex_lock(&group->mutex); in iommu_group_show_type()
542 if (group->default_domain) { in iommu_group_show_type()
543 switch (group->default_domain->type) { in iommu_group_show_type()
561 mutex_unlock(&group->mutex); in iommu_group_show_type()
577 struct iommu_group *group = to_iommu_group(kobj); in iommu_group_release() local
579 pr_debug("Releasing group %d\n", group->id); in iommu_group_release()
581 if (group->iommu_data_release) in iommu_group_release()
582 group->iommu_data_release(group->iommu_data); in iommu_group_release()
584 ida_simple_remove(&iommu_group_ida, group->id); in iommu_group_release()
586 if (group->default_domain) in iommu_group_release()
587 iommu_domain_free(group->default_domain); in iommu_group_release()
589 kfree(group->name); in iommu_group_release()
590 kfree(group); in iommu_group_release()
611 struct iommu_group *group; in iommu_group_alloc() local
614 group = kzalloc(sizeof(*group), GFP_KERNEL); in iommu_group_alloc()
615 if (!group) in iommu_group_alloc()
618 group->kobj.kset = iommu_group_kset; in iommu_group_alloc()
619 mutex_init(&group->mutex); in iommu_group_alloc()
620 INIT_LIST_HEAD(&group->devices); in iommu_group_alloc()
621 INIT_LIST_HEAD(&group->entry); in iommu_group_alloc()
622 BLOCKING_INIT_NOTIFIER_HEAD(&group->notifier); in iommu_group_alloc()
626 kfree(group); in iommu_group_alloc()
629 group->id = ret; in iommu_group_alloc()
631 ret = kobject_init_and_add(&group->kobj, &iommu_group_ktype, in iommu_group_alloc()
632 NULL, "%d", group->id); in iommu_group_alloc()
634 ida_simple_remove(&iommu_group_ida, group->id); in iommu_group_alloc()
635 kobject_put(&group->kobj); in iommu_group_alloc()
639 group->devices_kobj = kobject_create_and_add("devices", &group->kobj); in iommu_group_alloc()
640 if (!group->devices_kobj) { in iommu_group_alloc()
641 kobject_put(&group->kobj); /* triggers .release & free */ in iommu_group_alloc()
650 kobject_put(&group->kobj); in iommu_group_alloc()
652 ret = iommu_group_create_file(group, in iommu_group_alloc()
657 ret = iommu_group_create_file(group, &iommu_group_attr_type); in iommu_group_alloc()
661 pr_debug("Allocated group %d\n", group->id); in iommu_group_alloc()
663 return group; in iommu_group_alloc()
670 struct iommu_group *group; in iommu_group_get_by_id() local
686 group = container_of(group_kobj, struct iommu_group, kobj); in iommu_group_get_by_id()
687 BUG_ON(group->id != id); in iommu_group_get_by_id()
689 kobject_get(group->devices_kobj); in iommu_group_get_by_id()
690 kobject_put(&group->kobj); in iommu_group_get_by_id()
692 return group; in iommu_group_get_by_id()
704 void *iommu_group_get_iommudata(struct iommu_group *group) in iommu_group_get_iommudata() argument
706 return group->iommu_data; in iommu_group_get_iommudata()
720 void iommu_group_set_iommudata(struct iommu_group *group, void *iommu_data, in iommu_group_set_iommudata() argument
723 group->iommu_data = iommu_data; in iommu_group_set_iommudata()
724 group->iommu_data_release = release; in iommu_group_set_iommudata()
736 int iommu_group_set_name(struct iommu_group *group, const char *name) in iommu_group_set_name() argument
740 if (group->name) { in iommu_group_set_name()
741 iommu_group_remove_file(group, &iommu_group_attr_name); in iommu_group_set_name()
742 kfree(group->name); in iommu_group_set_name()
743 group->name = NULL; in iommu_group_set_name()
748 group->name = kstrdup(name, GFP_KERNEL); in iommu_group_set_name()
749 if (!group->name) in iommu_group_set_name()
752 ret = iommu_group_create_file(group, &iommu_group_attr_name); in iommu_group_set_name()
754 kfree(group->name); in iommu_group_set_name()
755 group->name = NULL; in iommu_group_set_name()
763 static int iommu_create_device_direct_mappings(struct iommu_group *group, in iommu_create_device_direct_mappings() argument
766 struct iommu_domain *domain = group->default_domain; in iommu_create_device_direct_mappings()
847 int iommu_group_add_device(struct iommu_group *group, struct device *dev) in iommu_group_add_device() argument
858 ret = sysfs_create_link(&dev->kobj, &group->kobj, "iommu_group"); in iommu_group_add_device()
869 ret = sysfs_create_link_nowarn(group->devices_kobj, in iommu_group_add_device()
885 kobject_get(group->devices_kobj); in iommu_group_add_device()
887 dev->iommu_group = group; in iommu_group_add_device()
889 mutex_lock(&group->mutex); in iommu_group_add_device()
890 list_add_tail(&device->list, &group->devices); in iommu_group_add_device()
891 if (group->domain && !iommu_is_attach_deferred(group->domain, dev)) in iommu_group_add_device()
892 ret = __iommu_attach_device(group->domain, dev); in iommu_group_add_device()
893 mutex_unlock(&group->mutex); in iommu_group_add_device()
898 blocking_notifier_call_chain(&group->notifier, in iommu_group_add_device()
901 trace_add_device_to_group(group->id, dev); in iommu_group_add_device()
903 dev_info(dev, "Adding to iommu group %d\n", group->id); in iommu_group_add_device()
908 mutex_lock(&group->mutex); in iommu_group_add_device()
910 mutex_unlock(&group->mutex); in iommu_group_add_device()
912 kobject_put(group->devices_kobj); in iommu_group_add_device()
913 sysfs_remove_link(group->devices_kobj, device->name); in iommu_group_add_device()
920 dev_err(dev, "Failed to add to iommu group %d: %d\n", group->id, ret); in iommu_group_add_device()
934 struct iommu_group *group = dev->iommu_group; in iommu_group_remove_device() local
937 if (!group) in iommu_group_remove_device()
940 dev_info(dev, "Removing from iommu group %d\n", group->id); in iommu_group_remove_device()
943 blocking_notifier_call_chain(&group->notifier, in iommu_group_remove_device()
946 mutex_lock(&group->mutex); in iommu_group_remove_device()
947 list_for_each_entry(tmp_device, &group->devices, list) { in iommu_group_remove_device()
954 mutex_unlock(&group->mutex); in iommu_group_remove_device()
959 sysfs_remove_link(group->devices_kobj, device->name); in iommu_group_remove_device()
962 trace_remove_device_from_group(group->id, dev); in iommu_group_remove_device()
967 kobject_put(group->devices_kobj); in iommu_group_remove_device()
971 static int iommu_group_device_count(struct iommu_group *group) in iommu_group_device_count() argument
976 list_for_each_entry(entry, &group->devices, list) in iommu_group_device_count()
993 static int __iommu_group_for_each_dev(struct iommu_group *group, void *data, in __iommu_group_for_each_dev() argument
999 list_for_each_entry(device, &group->devices, list) { in __iommu_group_for_each_dev()
1008 int iommu_group_for_each_dev(struct iommu_group *group, void *data, in iommu_group_for_each_dev() argument
1013 mutex_lock(&group->mutex); in iommu_group_for_each_dev()
1014 ret = __iommu_group_for_each_dev(group, data, fn); in iommu_group_for_each_dev()
1015 mutex_unlock(&group->mutex); in iommu_group_for_each_dev()
1031 struct iommu_group *group = dev->iommu_group; in iommu_group_get() local
1033 if (group) in iommu_group_get()
1034 kobject_get(group->devices_kobj); in iommu_group_get()
1036 return group; in iommu_group_get()
1047 struct iommu_group *iommu_group_ref_get(struct iommu_group *group) in iommu_group_ref_get() argument
1049 kobject_get(group->devices_kobj); in iommu_group_ref_get()
1050 return group; in iommu_group_ref_get()
1061 void iommu_group_put(struct iommu_group *group) in iommu_group_put() argument
1063 if (group) in iommu_group_put()
1064 kobject_put(group->devices_kobj); in iommu_group_put()
1077 int iommu_group_register_notifier(struct iommu_group *group, in iommu_group_register_notifier() argument
1080 return blocking_notifier_chain_register(&group->notifier, nb); in iommu_group_register_notifier()
1091 int iommu_group_unregister_notifier(struct iommu_group *group, in iommu_group_unregister_notifier() argument
1094 return blocking_notifier_chain_unregister(&group->notifier, nb); in iommu_group_unregister_notifier()
1315 int iommu_group_id(struct iommu_group *group) in iommu_group_id() argument
1317 return group->id; in iommu_group_id()
1344 struct iommu_group *group; in get_pci_function_alias_group() local
1355 group = get_pci_alias_group(tmp, devfns); in get_pci_function_alias_group()
1356 if (group) { in get_pci_function_alias_group()
1358 return group; in get_pci_function_alias_group()
1378 struct iommu_group *group; in get_pci_alias_group() local
1383 group = iommu_group_get(&pdev->dev); in get_pci_alias_group()
1384 if (group) in get_pci_alias_group()
1385 return group; in get_pci_alias_group()
1393 group = get_pci_alias_group(tmp, devfns); in get_pci_alias_group()
1394 if (group) { in get_pci_alias_group()
1396 return group; in get_pci_alias_group()
1399 group = get_pci_function_alias_group(tmp, devfns); in get_pci_alias_group()
1400 if (group) { in get_pci_alias_group()
1402 return group; in get_pci_alias_group()
1412 struct iommu_group *group; member
1424 data->group = iommu_group_get(&pdev->dev); in get_pci_alias_or_group()
1426 return data->group != NULL; in get_pci_alias_or_group()
1448 struct iommu_group *group = NULL; in pci_device_group() local
1461 return data.group; in pci_device_group()
1480 group = iommu_group_get(&pdev->dev); in pci_device_group()
1481 if (group) in pci_device_group()
1482 return group; in pci_device_group()
1489 group = get_pci_alias_group(pdev, (unsigned long *)devfns); in pci_device_group()
1490 if (group) in pci_device_group()
1491 return group; in pci_device_group()
1498 group = get_pci_function_alias_group(pdev, (unsigned long *)devfns); in pci_device_group()
1499 if (group) in pci_device_group()
1500 return group; in pci_device_group()
1511 struct iommu_group *group; in fsl_mc_device_group() local
1513 group = iommu_group_get(cont_dev); in fsl_mc_device_group()
1514 if (!group) in fsl_mc_device_group()
1515 group = iommu_group_alloc(); in fsl_mc_device_group()
1516 return group; in fsl_mc_device_group()
1534 struct iommu_group *group, in iommu_group_alloc_default_domain() argument
1544 type, group->name); in iommu_group_alloc_default_domain()
1550 group->default_domain = dom; in iommu_group_alloc_default_domain()
1551 if (!group->domain) in iommu_group_alloc_default_domain()
1552 group->domain = dom; in iommu_group_alloc_default_domain()
1556 static int iommu_alloc_default_domain(struct iommu_group *group, in iommu_alloc_default_domain() argument
1561 if (group->default_domain) in iommu_alloc_default_domain()
1566 return iommu_group_alloc_default_domain(dev->bus, group, type); in iommu_alloc_default_domain()
1582 struct iommu_group *group; in iommu_group_get_for_dev() local
1585 group = iommu_group_get(dev); in iommu_group_get_for_dev()
1586 if (group) in iommu_group_get_for_dev()
1587 return group; in iommu_group_get_for_dev()
1592 group = ops->device_group(dev); in iommu_group_get_for_dev()
1593 if (WARN_ON_ONCE(group == NULL)) in iommu_group_get_for_dev()
1596 if (IS_ERR(group)) in iommu_group_get_for_dev()
1597 return group; in iommu_group_get_for_dev()
1599 ret = iommu_group_add_device(group, dev); in iommu_group_get_for_dev()
1603 return group; in iommu_group_get_for_dev()
1606 iommu_group_put(group); in iommu_group_get_for_dev()
1611 struct iommu_domain *iommu_group_default_domain(struct iommu_group *group) in iommu_group_default_domain() argument
1613 return group->default_domain; in iommu_group_default_domain()
1619 struct iommu_group *group; in probe_iommu_group() local
1623 group = iommu_group_get(dev); in probe_iommu_group()
1624 if (group) { in probe_iommu_group()
1625 iommu_group_put(group); in probe_iommu_group()
1648 struct iommu_group *group; in iommu_bus_notifier() local
1668 group = iommu_group_get(dev); in iommu_bus_notifier()
1669 if (!group) in iommu_bus_notifier()
1688 blocking_notifier_call_chain(&group->notifier, in iommu_bus_notifier()
1691 iommu_group_put(group); in iommu_bus_notifier()
1724 struct iommu_group *group) in probe_alloc_default_domain() argument
1731 __iommu_group_for_each_dev(group, &gtype, in probe_alloc_default_domain()
1737 iommu_group_alloc_default_domain(bus, group, gtype.type); in probe_alloc_default_domain()
1752 static int __iommu_group_dma_attach(struct iommu_group *group) in __iommu_group_dma_attach() argument
1754 return __iommu_group_for_each_dev(group, group->default_domain, in __iommu_group_dma_attach()
1768 static void __iommu_group_dma_finalize(struct iommu_group *group) in __iommu_group_dma_finalize() argument
1770 __iommu_group_for_each_dev(group, group->default_domain, in __iommu_group_dma_finalize()
1776 struct iommu_group *group = data; in iommu_do_create_direct_mappings() local
1778 iommu_create_device_direct_mappings(group, dev); in iommu_do_create_direct_mappings()
1783 static int iommu_group_create_direct_mappings(struct iommu_group *group) in iommu_group_create_direct_mappings() argument
1785 return __iommu_group_for_each_dev(group, group, in iommu_group_create_direct_mappings()
1791 struct iommu_group *group, *next; in bus_iommu_probe() local
1804 list_for_each_entry_safe(group, next, &group_list, entry) { in bus_iommu_probe()
1806 list_del_init(&group->entry); in bus_iommu_probe()
1808 mutex_lock(&group->mutex); in bus_iommu_probe()
1811 probe_alloc_default_domain(bus, group); in bus_iommu_probe()
1813 if (!group->default_domain) { in bus_iommu_probe()
1814 mutex_unlock(&group->mutex); in bus_iommu_probe()
1818 iommu_group_create_direct_mappings(group); in bus_iommu_probe()
1820 ret = __iommu_group_dma_attach(group); in bus_iommu_probe()
1822 mutex_unlock(&group->mutex); in bus_iommu_probe()
1827 __iommu_group_dma_finalize(group); in bus_iommu_probe()
1993 struct iommu_group *group; in iommu_attach_device() local
1996 group = iommu_group_get(dev); in iommu_attach_device()
1997 if (!group) in iommu_attach_device()
2004 mutex_lock(&group->mutex); in iommu_attach_device()
2006 if (iommu_group_device_count(group) != 1) in iommu_attach_device()
2009 ret = __iommu_attach_group(domain, group); in iommu_attach_device()
2012 mutex_unlock(&group->mutex); in iommu_attach_device()
2013 iommu_group_put(group); in iommu_attach_device()
2254 struct iommu_group *group; in iommu_detach_device() local
2256 group = iommu_group_get(dev); in iommu_detach_device()
2257 if (!group) in iommu_detach_device()
2260 mutex_lock(&group->mutex); in iommu_detach_device()
2261 if (iommu_group_device_count(group) != 1) { in iommu_detach_device()
2266 __iommu_detach_group(domain, group); in iommu_detach_device()
2269 mutex_unlock(&group->mutex); in iommu_detach_device()
2270 iommu_group_put(group); in iommu_detach_device()
2277 struct iommu_group *group; in iommu_get_domain_for_dev() local
2279 group = iommu_group_get(dev); in iommu_get_domain_for_dev()
2280 if (!group) in iommu_get_domain_for_dev()
2283 domain = group->domain; in iommu_get_domain_for_dev()
2285 iommu_group_put(group); in iommu_get_domain_for_dev()
2318 struct iommu_group *group) in __iommu_attach_group() argument
2322 if (group->default_domain && group->domain != group->default_domain) in __iommu_attach_group()
2325 ret = __iommu_group_for_each_dev(group, domain, in __iommu_attach_group()
2328 group->domain = domain; in __iommu_attach_group()
2333 int iommu_attach_group(struct iommu_domain *domain, struct iommu_group *group) in iommu_attach_group() argument
2337 mutex_lock(&group->mutex); in iommu_attach_group()
2338 ret = __iommu_attach_group(domain, group); in iommu_attach_group()
2339 mutex_unlock(&group->mutex); in iommu_attach_group()
2355 struct iommu_group *group) in __iommu_detach_group() argument
2359 if (!group->default_domain) { in __iommu_detach_group()
2360 __iommu_group_for_each_dev(group, domain, in __iommu_detach_group()
2362 group->domain = NULL; in __iommu_detach_group()
2366 if (group->domain == group->default_domain) in __iommu_detach_group()
2370 ret = __iommu_group_for_each_dev(group, group->default_domain, in __iommu_detach_group()
2375 group->domain = group->default_domain; in __iommu_detach_group()
2378 void iommu_detach_group(struct iommu_domain *domain, struct iommu_group *group) in iommu_detach_group() argument
2380 mutex_lock(&group->mutex); in iommu_detach_group()
2381 __iommu_detach_group(domain, group); in iommu_detach_group()
2382 mutex_unlock(&group->mutex); in iommu_detach_group()
3048 struct iommu_group *group; in iommu_sva_bind_device() local
3055 group = iommu_group_get(dev); in iommu_sva_bind_device()
3056 if (!group) in iommu_sva_bind_device()
3060 mutex_lock(&group->mutex); in iommu_sva_bind_device()
3068 if (iommu_group_device_count(group) != 1) in iommu_sva_bind_device()
3074 mutex_unlock(&group->mutex); in iommu_sva_bind_device()
3075 iommu_group_put(group); in iommu_sva_bind_device()
3091 struct iommu_group *group; in iommu_sva_unbind_device() local
3098 group = iommu_group_get(dev); in iommu_sva_unbind_device()
3099 if (!group) in iommu_sva_unbind_device()
3102 mutex_lock(&group->mutex); in iommu_sva_unbind_device()
3104 mutex_unlock(&group->mutex); in iommu_sva_unbind_device()
3106 iommu_group_put(group); in iommu_sva_unbind_device()
3136 static int iommu_change_dev_def_domain(struct iommu_group *group, in iommu_change_dev_def_domain() argument
3144 mutex_lock(&group->mutex); in iommu_change_dev_def_domain()
3146 if (group->default_domain != group->domain) { in iommu_change_dev_def_domain()
3165 if (iommu_group_device_count(group) != 1) { in iommu_change_dev_def_domain()
3172 grp_dev = list_first_entry(&group->devices, struct group_device, list); in iommu_change_dev_def_domain()
3181 prev_dom = group->default_domain; in iommu_change_dev_def_domain()
3220 ret = iommu_group_alloc_default_domain(dev->bus, group, type); in iommu_change_dev_def_domain()
3224 ret = iommu_create_device_direct_mappings(group, dev); in iommu_change_dev_def_domain()
3228 ret = __iommu_attach_device(group->default_domain, dev); in iommu_change_dev_def_domain()
3232 group->domain = group->default_domain; in iommu_change_dev_def_domain()
3240 mutex_unlock(&group->mutex); in iommu_change_dev_def_domain()
3243 iommu_group_do_probe_finalize(dev, group->default_domain); in iommu_change_dev_def_domain()
3248 iommu_domain_free(group->default_domain); in iommu_change_dev_def_domain()
3249 group->default_domain = prev_dom; in iommu_change_dev_def_domain()
3250 group->domain = prev_dom; in iommu_change_dev_def_domain()
3253 mutex_unlock(&group->mutex); in iommu_change_dev_def_domain()
3267 static ssize_t iommu_group_store_type(struct iommu_group *group, in iommu_group_store_type() argument
3277 if (WARN_ON(!group)) in iommu_group_store_type()
3297 mutex_lock(&group->mutex); in iommu_group_store_type()
3298 if (iommu_group_device_count(group) != 1) { in iommu_group_store_type()
3299 mutex_unlock(&group->mutex); in iommu_group_store_type()
3305 grp_dev = list_first_entry(&group->devices, struct group_device, list); in iommu_group_store_type()
3333 mutex_unlock(&group->mutex); in iommu_group_store_type()
3338 group->default_domain->type == IOMMU_DOMAIN_DMA)) { in iommu_group_store_type()
3344 ret = iommu_change_dev_def_domain(group, dev, req_type); in iommu_group_store_type()