Lines Matching refs:dev
59 static void msi_domain_free_locked(struct device *dev, struct msi_ctrl *ctrl);
60 static unsigned int msi_domain_get_hwsize(struct device *dev, unsigned int domid);
61 static inline int msi_sysfs_create_group(struct device *dev);
62 static int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev,
76 static struct msi_desc *msi_alloc_desc(struct device *dev, int nvec, in msi_alloc_desc() argument
84 desc->dev = dev; in msi_alloc_desc()
102 static int msi_insert_desc(struct device *dev, struct msi_desc *desc, in msi_insert_desc() argument
105 struct msi_device_data *md = dev->msi.data; in msi_insert_desc()
110 hwsize = msi_domain_get_hwsize(dev, domid); in msi_insert_desc()
150 int msi_domain_insert_msi_desc(struct device *dev, unsigned int domid, in msi_domain_insert_msi_desc() argument
155 lockdep_assert_held(&dev->msi.data->mutex); in msi_domain_insert_msi_desc()
157 desc = msi_alloc_desc(dev, init_desc->nvec_used, init_desc->affinity); in msi_domain_insert_msi_desc()
164 return msi_insert_desc(dev, desc, domid, init_desc->msi_index); in msi_domain_insert_msi_desc()
181 static bool msi_ctrl_valid(struct device *dev, struct msi_ctrl *ctrl) in msi_ctrl_valid() argument
186 (dev->msi.domain && in msi_ctrl_valid()
187 !dev->msi.data->__domains[ctrl->domid].domain))) in msi_ctrl_valid()
190 hwsize = msi_domain_get_hwsize(dev, ctrl->domid); in msi_ctrl_valid()
198 static void msi_domain_free_descs(struct device *dev, struct msi_ctrl *ctrl) in msi_domain_free_descs() argument
204 lockdep_assert_held(&dev->msi.data->mutex); in msi_domain_free_descs()
206 if (!msi_ctrl_valid(dev, ctrl)) in msi_domain_free_descs()
209 xa = &dev->msi.data->__domains[ctrl->domid].store; in msi_domain_free_descs()
227 void msi_domain_free_msi_descs_range(struct device *dev, unsigned int domid, in msi_domain_free_msi_descs_range() argument
236 msi_domain_free_descs(dev, &ctrl); in msi_domain_free_msi_descs_range()
246 static int msi_domain_add_simple_msi_descs(struct device *dev, struct msi_ctrl *ctrl) in msi_domain_add_simple_msi_descs() argument
252 lockdep_assert_held(&dev->msi.data->mutex); in msi_domain_add_simple_msi_descs()
254 if (!msi_ctrl_valid(dev, ctrl)) in msi_domain_add_simple_msi_descs()
258 desc = msi_alloc_desc(dev, 1, NULL); in msi_domain_add_simple_msi_descs()
261 ret = msi_insert_desc(dev, desc, ctrl->domid, idx); in msi_domain_add_simple_msi_descs()
270 msi_domain_free_descs(dev, ctrl); in msi_domain_add_simple_msi_descs()
287 static void msi_device_data_release(struct device *dev, void *res) in msi_device_data_release() argument
293 msi_remove_device_irq_domain(dev, i); in msi_device_data_release()
297 dev->msi.data = NULL; in msi_device_data_release()
310 int msi_setup_device_data(struct device *dev) in msi_setup_device_data() argument
315 if (dev->msi.data) in msi_setup_device_data()
322 ret = msi_sysfs_create_group(dev); in msi_setup_device_data()
337 if (dev->msi.domain && !irq_domain_is_msi_parent(dev->msi.domain)) in msi_setup_device_data()
338 md->__domains[MSI_DEFAULT_DOMAIN].domain = dev->msi.domain; in msi_setup_device_data()
341 dev->msi.data = md; in msi_setup_device_data()
342 devres_add(dev, md); in msi_setup_device_data()
352 void __msi_lock_descs(struct device *dev) in __msi_lock_descs() argument
354 mutex_lock(&dev->msi.data->mutex); in __msi_lock_descs()
364 void __msi_unlock_descs(struct device *dev) in __msi_unlock_descs() argument
367 dev->msi.data->__iter_idx = MSI_XA_MAX_INDEX; in __msi_unlock_descs()
368 mutex_unlock(&dev->msi.data->mutex); in __msi_unlock_descs()
398 struct msi_desc *msi_domain_first_desc(struct device *dev, unsigned int domid, in msi_domain_first_desc() argument
401 struct msi_device_data *md = dev->msi.data; in msi_domain_first_desc()
427 struct msi_desc *msi_next_desc(struct device *dev, unsigned int domid, in msi_next_desc() argument
430 struct msi_device_data *md = dev->msi.data; in msi_next_desc()
453 unsigned int msi_domain_get_virq(struct device *dev, unsigned int domid, unsigned int index) in msi_domain_get_virq() argument
459 if (!dev->msi.data) in msi_domain_get_virq()
466 if (dev_is_pci(dev) && domid == MSI_DEFAULT_DOMAIN) in msi_domain_get_virq()
467 pcimsi = to_pci_dev(dev)->msi_enabled; in msi_domain_get_virq()
469 guard(msi_descs_lock)(dev); in msi_domain_get_virq()
470 xa = &dev->msi.data->__domains[domid].store; in msi_domain_get_virq()
497 static inline int msi_sysfs_create_group(struct device *dev) in msi_sysfs_create_group() argument
499 return devm_device_add_group(dev, &msi_irqs_group); in msi_sysfs_create_group()
502 static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr, in msi_mode_show() argument
506 bool is_msix = dev_is_pci(dev) ? to_pci_dev(dev)->msix_enabled : false; in msi_mode_show()
511 static void msi_sysfs_remove_desc(struct device *dev, struct msi_desc *desc) in msi_sysfs_remove_desc() argument
522 sysfs_remove_file_from_group(&dev->kobj, &attrs[i].attr, msi_irqs_group.name); in msi_sysfs_remove_desc()
528 static int msi_sysfs_populate_desc(struct device *dev, struct msi_desc *desc) in msi_sysfs_populate_desc() argument
549 ret = sysfs_add_file_to_group(&dev->kobj, &attrs[i].attr, msi_irqs_group.name); in msi_sysfs_populate_desc()
558 msi_sysfs_remove_desc(dev, desc); in msi_sysfs_populate_desc()
567 int msi_device_populate_sysfs(struct device *dev) in msi_device_populate_sysfs() argument
572 msi_for_each_desc(desc, dev, MSI_DESC_ASSOCIATED) { in msi_device_populate_sysfs()
575 ret = msi_sysfs_populate_desc(dev, desc); in msi_device_populate_sysfs()
587 void msi_device_destroy_sysfs(struct device *dev) in msi_device_destroy_sysfs() argument
591 msi_for_each_desc(desc, dev, MSI_DESC_ALL) in msi_device_destroy_sysfs()
592 msi_sysfs_remove_desc(dev, desc); in msi_device_destroy_sysfs()
596 static inline int msi_sysfs_create_group(struct device *dev) { return 0; } in msi_sysfs_create_group() argument
597 static inline int msi_sysfs_populate_desc(struct device *dev, struct msi_desc *desc) { return 0; } in msi_sysfs_populate_desc() argument
598 static inline void msi_sysfs_remove_desc(struct device *dev, struct msi_desc *desc) { } in msi_sysfs_remove_desc() argument
601 static struct irq_domain *msi_get_device_domain(struct device *dev, unsigned int domid) in msi_get_device_domain() argument
605 lockdep_assert_held(&dev->msi.data->mutex); in msi_get_device_domain()
610 domain = dev->msi.data->__domains[domid].domain; in msi_get_device_domain()
620 static unsigned int msi_domain_get_hwsize(struct device *dev, unsigned int domid) in msi_domain_get_hwsize() argument
625 domain = msi_get_device_domain(dev, domid); in msi_domain_get_hwsize()
792 static int msi_domain_ops_prepare(struct irq_domain *domain, struct device *dev, in msi_domain_ops_prepare() argument
892 domain->dev = info->dev; in __msi_create_irq_domain()
968 bool msi_parent_init_dev_msi_info(struct device *dev, struct irq_domain *domain, in msi_parent_init_dev_msi_info() argument
978 return parent->msi_parent_ops->init_dev_msi_info(dev, parent, msi_parent_domain, in msi_parent_init_dev_msi_info()
1029 bool msi_create_device_irq_domain(struct device *dev, unsigned int domid, in msi_create_device_irq_domain() argument
1034 struct irq_domain *domain, *parent = dev->msi.domain; in msi_create_device_irq_domain()
1055 bundle->info.dev = dev; in msi_create_device_irq_domain()
1059 pops->prefix ? : "", bundle->chip.name, dev_name(dev)); in msi_create_device_irq_domain()
1075 fwnode = dev->fwnode; in msi_create_device_irq_domain()
1080 if (msi_setup_device_data(dev)) in msi_create_device_irq_domain()
1083 guard(msi_descs_lock)(dev); in msi_create_device_irq_domain()
1084 if (WARN_ON_ONCE(msi_get_device_domain(dev, domid))) in msi_create_device_irq_domain()
1087 if (!pops->init_dev_msi_info(dev, parent, parent, &bundle->info)) in msi_create_device_irq_domain()
1094 dev->msi.data->__domains[domid].domain = domain; in msi_create_device_irq_domain()
1096 if (msi_domain_prepare_irqs(domain, dev, hwsize, &bundle->alloc_info)) { in msi_create_device_irq_domain()
1097 dev->msi.data->__domains[domid].domain = NULL; in msi_create_device_irq_domain()
1113 void msi_remove_device_irq_domain(struct device *dev, unsigned int domid) in msi_remove_device_irq_domain() argument
1119 guard(msi_descs_lock)(dev); in msi_remove_device_irq_domain()
1120 domain = msi_get_device_domain(dev, domid); in msi_remove_device_irq_domain()
1124 dev->msi.data->__domains[domid].domain = NULL; in msi_remove_device_irq_domain()
1144 bool msi_match_device_irq_domain(struct device *dev, unsigned int domid, in msi_match_device_irq_domain() argument
1150 guard(msi_descs_lock)(dev); in msi_match_device_irq_domain()
1151 domain = msi_get_device_domain(dev, domid); in msi_match_device_irq_domain()
1159 static int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev, in msi_domain_prepare_irqs() argument
1165 return ops->msi_prepare(domain, dev, nvec, arg); in msi_domain_prepare_irqs()
1181 struct device *dev) in msi_check_reservation_mode() argument
1205 desc = msi_first_desc(dev, MSI_DESC_ALL); in msi_check_reservation_mode()
1274 static int populate_alloc_info(struct irq_domain *domain, struct device *dev, in populate_alloc_info() argument
1286 return msi_domain_prepare_irqs(domain, dev, nirqs, arg); in populate_alloc_info()
1292 static int __msi_domain_alloc_irqs(struct device *dev, struct irq_domain *domain, in __msi_domain_alloc_irqs() argument
1295 struct xarray *xa = &dev->msi.data->__domains[ctrl->domid].store; in __msi_domain_alloc_irqs()
1304 ret = populate_alloc_info(domain, dev, ctrl->nirqs, &arg); in __msi_domain_alloc_irqs()
1320 if (msi_check_reservation_mode(domain, info, dev)) in __msi_domain_alloc_irqs()
1337 dev_to_node(dev), &arg, false, in __msi_domain_alloc_irqs()
1344 irq_debugfs_copy_devname(virq + i, dev); in __msi_domain_alloc_irqs()
1350 ret = msi_sysfs_populate_desc(dev, desc); in __msi_domain_alloc_irqs()
1359 static int msi_domain_alloc_simple_msi_descs(struct device *dev, in msi_domain_alloc_simple_msi_descs() argument
1366 return msi_domain_add_simple_msi_descs(dev, ctrl); in msi_domain_alloc_simple_msi_descs()
1369 static int __msi_domain_alloc_locked(struct device *dev, struct msi_ctrl *ctrl) in __msi_domain_alloc_locked() argument
1376 if (!msi_ctrl_valid(dev, ctrl)) in __msi_domain_alloc_locked()
1379 domain = msi_get_device_domain(dev, ctrl->domid); in __msi_domain_alloc_locked()
1385 ret = msi_domain_alloc_simple_msi_descs(dev, info, ctrl); in __msi_domain_alloc_locked()
1391 return ops->domain_alloc_irqs(domain, dev, ctrl->nirqs); in __msi_domain_alloc_locked()
1393 return __msi_domain_alloc_irqs(dev, domain, ctrl); in __msi_domain_alloc_locked()
1396 static int msi_domain_alloc_locked(struct device *dev, struct msi_ctrl *ctrl) in msi_domain_alloc_locked() argument
1398 int ret = __msi_domain_alloc_locked(dev, ctrl); in msi_domain_alloc_locked()
1401 msi_domain_free_locked(dev, ctrl); in msi_domain_alloc_locked()
1419 int msi_domain_alloc_irqs_range_locked(struct device *dev, unsigned int domid, in msi_domain_alloc_irqs_range_locked() argument
1429 return msi_domain_alloc_locked(dev, &ctrl); in msi_domain_alloc_irqs_range_locked()
1442 int msi_domain_alloc_irqs_range(struct device *dev, unsigned int domid, in msi_domain_alloc_irqs_range() argument
1446 guard(msi_descs_lock)(dev); in msi_domain_alloc_irqs_range()
1447 return msi_domain_alloc_irqs_range_locked(dev, domid, first, last); in msi_domain_alloc_irqs_range()
1465 int msi_domain_alloc_irqs_all_locked(struct device *dev, unsigned int domid, int nirqs) in msi_domain_alloc_irqs_all_locked() argument
1470 .last = msi_domain_get_hwsize(dev, domid) - 1, in msi_domain_alloc_irqs_all_locked()
1474 return msi_domain_alloc_locked(dev, &ctrl); in msi_domain_alloc_irqs_all_locked()
1477 static struct msi_map __msi_domain_alloc_irq_at(struct device *dev, unsigned int domid, in __msi_domain_alloc_irq_at() argument
1488 domain = msi_get_device_domain(dev, domid); in __msi_domain_alloc_irq_at()
1494 desc = msi_alloc_desc(dev, 1, affdesc); in __msi_domain_alloc_irq_at()
1503 ret = msi_insert_desc(dev, desc, domid, index); in __msi_domain_alloc_irq_at()
1511 ret = __msi_domain_alloc_irqs(dev, domain, &ctrl); in __msi_domain_alloc_irq_at()
1514 msi_domain_free_locked(dev, &ctrl); in __msi_domain_alloc_irq_at()
1547 struct msi_map msi_domain_alloc_irq_at(struct device *dev, unsigned int domid, unsigned int index, in msi_domain_alloc_irq_at() argument
1551 guard(msi_descs_lock)(dev); in msi_domain_alloc_irq_at()
1552 return __msi_domain_alloc_irq_at(dev, domid, index, affdesc, icookie); in msi_domain_alloc_irq_at()
1581 struct device *dev = domain->dev; in msi_device_domain_alloc_wired() local
1584 if (WARN_ON_ONCE(!dev || domain->bus_token != DOMAIN_BUS_WIRED_TO_MSI)) in msi_device_domain_alloc_wired()
1589 guard(msi_descs_lock)(dev); in msi_device_domain_alloc_wired()
1590 if (WARN_ON_ONCE(msi_get_device_domain(dev, domid) != domain)) in msi_device_domain_alloc_wired()
1593 map = __msi_domain_alloc_irq_at(dev, domid, MSI_ANY_INDEX, NULL, &icookie); in msi_device_domain_alloc_wired()
1597 static void __msi_domain_free_irqs(struct device *dev, struct irq_domain *domain, in __msi_domain_free_irqs() argument
1600 struct xarray *xa = &dev->msi.data->__domains[ctrl->domid].store; in __msi_domain_free_irqs()
1621 msi_sysfs_remove_desc(dev, desc); in __msi_domain_free_irqs()
1626 static void msi_domain_free_locked(struct device *dev, struct msi_ctrl *ctrl) in msi_domain_free_locked() argument
1632 if (!msi_ctrl_valid(dev, ctrl)) in msi_domain_free_locked()
1635 domain = msi_get_device_domain(dev, ctrl->domid); in msi_domain_free_locked()
1643 ops->domain_free_irqs(domain, dev); in msi_domain_free_locked()
1645 __msi_domain_free_irqs(dev, domain, ctrl); in msi_domain_free_locked()
1648 ops->msi_post_free(domain, dev); in msi_domain_free_locked()
1651 msi_domain_free_descs(dev, ctrl); in msi_domain_free_locked()
1663 void msi_domain_free_irqs_range_locked(struct device *dev, unsigned int domid, in msi_domain_free_irqs_range_locked() argument
1671 msi_domain_free_locked(dev, &ctrl); in msi_domain_free_irqs_range_locked()
1683 void msi_domain_free_irqs_range(struct device *dev, unsigned int domid, in msi_domain_free_irqs_range() argument
1686 guard(msi_descs_lock)(dev); in msi_domain_free_irqs_range()
1687 msi_domain_free_irqs_range_locked(dev, domid, first, last); in msi_domain_free_irqs_range()
1702 void msi_domain_free_irqs_all_locked(struct device *dev, unsigned int domid) in msi_domain_free_irqs_all_locked() argument
1704 msi_domain_free_irqs_range_locked(dev, domid, 0, in msi_domain_free_irqs_all_locked()
1705 msi_domain_get_hwsize(dev, domid) - 1); in msi_domain_free_irqs_all_locked()
1715 void msi_domain_free_irqs_all(struct device *dev, unsigned int domid) in msi_domain_free_irqs_all() argument
1717 guard(msi_descs_lock)(dev); in msi_domain_free_irqs_all()
1718 msi_domain_free_irqs_all_locked(dev, domid); in msi_domain_free_irqs_all()
1732 struct device *dev = domain->dev; in msi_device_domain_free_wired() local
1734 if (WARN_ON_ONCE(!dev || !desc || domain->bus_token != DOMAIN_BUS_WIRED_TO_MSI)) in msi_device_domain_free_wired()
1737 guard(msi_descs_lock)(dev); in msi_device_domain_free_wired()
1738 if (WARN_ON_ONCE(msi_get_device_domain(dev, MSI_DEFAULT_DOMAIN) != domain)) in msi_device_domain_free_wired()
1740 msi_domain_free_irqs_range_locked(dev, MSI_DEFAULT_DOMAIN, desc->msi_index, in msi_device_domain_free_wired()
1771 bool msi_device_has_isolated_msi(struct device *dev) in msi_device_has_isolated_msi() argument
1773 struct irq_domain *domain = dev_get_msi_domain(dev); in msi_device_has_isolated_msi()