Lines Matching refs:chan
88 struct dma_chan *chan; in dmaengine_dbg_summary_show() local
90 list_for_each_entry(chan, &dma_dev->channels, device_node) { in dmaengine_dbg_summary_show()
91 if (chan->client_count) { in dmaengine_dbg_summary_show()
92 seq_printf(s, " %-13s| %s", dma_chan_name(chan), in dmaengine_dbg_summary_show()
93 chan->dbg_client_name ?: "in-use"); in dmaengine_dbg_summary_show()
95 if (chan->router) in dmaengine_dbg_summary_show()
97 dev_name(chan->router->dev)); in dmaengine_dbg_summary_show()
161 return chan_dev->chan; in dev_to_dma_chan()
167 struct dma_chan *chan; in memcpy_count_show() local
173 chan = dev_to_dma_chan(dev); in memcpy_count_show()
174 if (chan) { in memcpy_count_show()
176 count += per_cpu_ptr(chan->local, i)->memcpy_count; in memcpy_count_show()
189 struct dma_chan *chan; in bytes_transferred_show() local
195 chan = dev_to_dma_chan(dev); in bytes_transferred_show()
196 if (chan) { in bytes_transferred_show()
198 count += per_cpu_ptr(chan->local, i)->bytes_transferred; in bytes_transferred_show()
211 struct dma_chan *chan; in in_use_show() local
215 chan = dev_to_dma_chan(dev); in in_use_show()
216 if (chan) in in_use_show()
217 err = sysfs_emit(buf, "%d\n", chan->client_count); in in_use_show()
258 struct dma_chan *chan; member
304 static bool dma_chan_is_local(struct dma_chan *chan, int cpu) in dma_chan_is_local() argument
306 int node = dev_to_node(chan->device->dev); in dma_chan_is_local()
325 struct dma_chan *chan; in min_chan() local
333 list_for_each_entry(chan, &device->channels, device_node) { in min_chan()
334 if (!chan->client_count) in min_chan()
336 if (!min || chan->table_count < min->table_count) in min_chan()
337 min = chan; in min_chan()
339 if (dma_chan_is_local(chan, cpu)) in min_chan()
341 chan->table_count < localmin->table_count) in min_chan()
342 localmin = chan; in min_chan()
346 chan = localmin ? localmin : min; in min_chan()
348 if (chan) in min_chan()
349 chan->table_count++; in min_chan()
351 return chan; in min_chan()
365 struct dma_chan *chan; in dma_channel_rebalance() local
373 per_cpu_ptr(channel_table[cap], cpu)->chan = NULL; in dma_channel_rebalance()
378 list_for_each_entry(chan, &device->channels, device_node) in dma_channel_rebalance()
379 chan->table_count = 0; in dma_channel_rebalance()
389 chan = min_chan(cap, cpu); in dma_channel_rebalance()
390 per_cpu_ptr(channel_table[cap], cpu)->chan = chan; in dma_channel_rebalance()
404 static struct module *dma_chan_to_owner(struct dma_chan *chan) in dma_chan_to_owner() argument
406 return chan->device->owner; in dma_chan_to_owner()
415 static void balance_ref_count(struct dma_chan *chan) in balance_ref_count() argument
417 struct module *owner = dma_chan_to_owner(chan); in balance_ref_count()
419 while (chan->client_count < dmaengine_ref_count) { in balance_ref_count()
421 chan->client_count++; in balance_ref_count()
448 static int dma_chan_get(struct dma_chan *chan) in dma_chan_get() argument
450 struct module *owner = dma_chan_to_owner(chan); in dma_chan_get()
454 if (chan->client_count) { in dma_chan_get()
456 chan->client_count++; in dma_chan_get()
463 ret = kref_get_unless_zero(&chan->device->ref); in dma_chan_get()
470 if (chan->device->device_alloc_chan_resources) { in dma_chan_get()
471 ret = chan->device->device_alloc_chan_resources(chan); in dma_chan_get()
476 chan->client_count++; in dma_chan_get()
478 if (!dma_has_cap(DMA_PRIVATE, chan->device->cap_mask)) in dma_chan_get()
479 balance_ref_count(chan); in dma_chan_get()
484 dma_device_put(chan->device); in dma_chan_get()
496 static void dma_chan_put(struct dma_chan *chan) in dma_chan_put() argument
499 if (!chan->client_count) in dma_chan_put()
502 chan->client_count--; in dma_chan_put()
505 if (!chan->client_count && chan->device->device_free_chan_resources) { in dma_chan_put()
507 dmaengine_synchronize(chan); in dma_chan_put()
508 chan->device->device_free_chan_resources(chan); in dma_chan_put()
512 if (chan->router && chan->router->route_free) { in dma_chan_put()
513 chan->router->route_free(chan->router->dev, chan->route_data); in dma_chan_put()
514 chan->router = NULL; in dma_chan_put()
515 chan->route_data = NULL; in dma_chan_put()
518 dma_device_put(chan->device); in dma_chan_put()
519 module_put(dma_chan_to_owner(chan)); in dma_chan_put()
522 enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie) in dma_sync_wait() argument
527 dma_async_issue_pending(chan); in dma_sync_wait()
529 status = dma_async_is_tx_complete(chan, cookie, NULL, NULL); in dma_sync_wait()
531 dev_err(chan->device->dev, "%s: timeout!\n", __func__); in dma_sync_wait()
549 return this_cpu_read(channel_table[tx_type]->chan); in dma_find_channel()
559 struct dma_chan *chan; in dma_issue_pending_all() local
565 list_for_each_entry(chan, &device->channels, device_node) in dma_issue_pending_all()
566 if (chan->client_count) in dma_issue_pending_all()
567 device->device_issue_pending(chan); in dma_issue_pending_all()
573 int dma_get_slave_caps(struct dma_chan *chan, struct dma_slave_caps *caps) in dma_get_slave_caps() argument
577 if (!chan || !caps) in dma_get_slave_caps()
580 device = chan->device; in dma_get_slave_caps()
615 device->device_caps(chan, caps); in dma_get_slave_caps()
625 struct dma_chan *chan; in private_candidate() local
635 list_for_each_entry(chan, &dev->channels, device_node) { in private_candidate()
637 if (chan->client_count) in private_candidate()
641 list_for_each_entry(chan, &dev->channels, device_node) { in private_candidate()
642 if (chan->client_count) { in private_candidate()
644 __func__, dma_chan_name(chan)); in private_candidate()
647 if (fn && !fn(chan, fn_param)) { in private_candidate()
649 __func__, dma_chan_name(chan)); in private_candidate()
652 return chan; in private_candidate()
662 struct dma_chan *chan = private_candidate(mask, device, fn, fn_param); in find_candidate() local
665 if (chan) { in find_candidate()
673 err = dma_chan_get(chan); in find_candidate()
678 __func__, dma_chan_name(chan)); in find_candidate()
683 __func__, dma_chan_name(chan), err); in find_candidate()
688 chan = ERR_PTR(err); in find_candidate()
692 return chan ? chan : ERR_PTR(-EPROBE_DEFER); in find_candidate()
699 struct dma_chan *dma_get_slave_channel(struct dma_chan *chan) in dma_get_slave_channel() argument
704 if (chan->client_count == 0) { in dma_get_slave_channel()
705 struct dma_device *device = chan->device; in dma_get_slave_channel()
710 err = dma_chan_get(chan); in dma_get_slave_channel()
712 dev_dbg(chan->device->dev, in dma_get_slave_channel()
714 __func__, dma_chan_name(chan), err); in dma_get_slave_channel()
715 chan = NULL; in dma_get_slave_channel()
720 chan = NULL; in dma_get_slave_channel()
725 return chan; in dma_get_slave_channel()
732 struct dma_chan *chan; in dma_get_any_slave_channel() local
740 chan = find_candidate(device, &mask, NULL, NULL); in dma_get_any_slave_channel()
744 return IS_ERR(chan) ? NULL : chan; in dma_get_any_slave_channel()
762 struct dma_chan *chan = NULL; in __dma_request_channel() local
771 chan = find_candidate(device, mask, fn, fn_param); in __dma_request_channel()
772 if (!IS_ERR(chan)) in __dma_request_channel()
775 chan = NULL; in __dma_request_channel()
781 chan ? "success" : "fail", in __dma_request_channel()
782 chan ? dma_chan_name(chan) : NULL); in __dma_request_channel()
784 return chan; in __dma_request_channel()
819 struct dma_chan *chan = NULL; in dma_request_chan() local
822 chan = of_dma_request_slave_channel(to_of_node(fwnode), name); in dma_request_chan()
824 chan = acpi_dma_request_slave_chan_by_name(dev, name); in dma_request_chan()
826 if (PTR_ERR(chan) == -EPROBE_DEFER) in dma_request_chan()
827 return chan; in dma_request_chan()
829 if (!IS_ERR_OR_NULL(chan)) in dma_request_chan()
844 chan = find_candidate(d, &mask, d->filter.fn, map->param); in dma_request_chan()
845 if (!IS_ERR(chan)) in dma_request_chan()
850 if (IS_ERR(chan)) in dma_request_chan()
851 return chan; in dma_request_chan()
852 if (!chan) in dma_request_chan()
857 chan->dbg_client_name = kasprintf(GFP_KERNEL, "%s:%s", dev_name(dev), name); in dma_request_chan()
861 chan->name = kasprintf(GFP_KERNEL, "dma:%s", name); in dma_request_chan()
862 if (!chan->name) in dma_request_chan()
863 return chan; in dma_request_chan()
864 chan->slave = dev; in dma_request_chan()
866 if (sysfs_create_link(&chan->dev->device.kobj, &dev->kobj, in dma_request_chan()
869 if (sysfs_create_link(&dev->kobj, &chan->dev->device.kobj, chan->name)) in dma_request_chan()
870 dev_warn(dev, "Cannot create DMA %s symlink\n", chan->name); in dma_request_chan()
872 return chan; in dma_request_chan()
884 struct dma_chan *chan; in dma_request_chan_by_mask() local
889 chan = __dma_request_channel(mask, NULL, NULL, NULL); in dma_request_chan_by_mask()
890 if (!chan) { in dma_request_chan_by_mask()
893 chan = ERR_PTR(-EPROBE_DEFER); in dma_request_chan_by_mask()
895 chan = ERR_PTR(-ENODEV); in dma_request_chan_by_mask()
899 return chan; in dma_request_chan_by_mask()
903 void dma_release_channel(struct dma_chan *chan) in dma_release_channel() argument
906 WARN_ONCE(chan->client_count != 1, in dma_release_channel()
907 "chan reference count %d != 1\n", chan->client_count); in dma_release_channel()
908 dma_chan_put(chan); in dma_release_channel()
910 if (--chan->device->privatecnt == 0) in dma_release_channel()
911 dma_cap_clear(DMA_PRIVATE, chan->device->cap_mask); in dma_release_channel()
913 if (chan->slave) { in dma_release_channel()
914 sysfs_remove_link(&chan->dev->device.kobj, DMA_SLAVE_NAME); in dma_release_channel()
915 sysfs_remove_link(&chan->slave->kobj, chan->name); in dma_release_channel()
916 kfree(chan->name); in dma_release_channel()
917 chan->name = NULL; in dma_release_channel()
918 chan->slave = NULL; in dma_release_channel()
922 kfree(chan->dbg_client_name); in dma_release_channel()
923 chan->dbg_client_name = NULL; in dma_release_channel()
929 static void dmaenginem_release_channel(void *chan) in dmaenginem_release_channel() argument
931 dma_release_channel(chan); in dmaenginem_release_channel()
946 struct dma_chan *chan = dma_request_chan(dev, name); in devm_dma_request_chan() local
949 if (!IS_ERR(chan)) in devm_dma_request_chan()
950 ret = devm_add_action_or_reset(dev, dmaenginem_release_channel, chan); in devm_dma_request_chan()
955 return chan; in devm_dma_request_chan()
965 struct dma_chan *chan; in dmaengine_get() local
975 list_for_each_entry(chan, &device->channels, device_node) { in dmaengine_get()
976 err = dma_chan_get(chan); in dmaengine_get()
982 dev_dbg(chan->device->dev, in dmaengine_get()
984 __func__, dma_chan_name(chan), err); in dmaengine_get()
1004 struct dma_chan *chan; in dmaengine_put() local
1013 list_for_each_entry(chan, &device->channels, device_node) in dmaengine_put()
1014 dma_chan_put(chan); in dmaengine_put()
1070 struct dma_chan *chan, in __dma_async_device_channel_register() argument
1075 chan->local = alloc_percpu(typeof(*chan->local)); in __dma_async_device_channel_register()
1076 if (!chan->local) in __dma_async_device_channel_register()
1078 chan->dev = kzalloc(sizeof(*chan->dev), GFP_KERNEL); in __dma_async_device_channel_register()
1079 if (!chan->dev) { in __dma_async_device_channel_register()
1088 chan->chan_id = ida_alloc(&device->chan_ida, GFP_KERNEL); in __dma_async_device_channel_register()
1089 if (chan->chan_id < 0) { in __dma_async_device_channel_register()
1091 __func__, chan->chan_id); in __dma_async_device_channel_register()
1092 rc = chan->chan_id; in __dma_async_device_channel_register()
1096 chan->dev->device.class = &dma_devclass; in __dma_async_device_channel_register()
1097 chan->dev->device.parent = device->dev; in __dma_async_device_channel_register()
1098 chan->dev->chan = chan; in __dma_async_device_channel_register()
1099 chan->dev->dev_id = device->dev_id; in __dma_async_device_channel_register()
1101 dev_set_name(&chan->dev->device, "dma%dchan%d", device->dev_id, chan->chan_id); in __dma_async_device_channel_register()
1103 dev_set_name(&chan->dev->device, "%s", name); in __dma_async_device_channel_register()
1104 rc = device_register(&chan->dev->device); in __dma_async_device_channel_register()
1107 chan->client_count = 0; in __dma_async_device_channel_register()
1113 ida_free(&device->chan_ida, chan->chan_id); in __dma_async_device_channel_register()
1115 kfree(chan->dev); in __dma_async_device_channel_register()
1117 free_percpu(chan->local); in __dma_async_device_channel_register()
1118 chan->local = NULL; in __dma_async_device_channel_register()
1123 struct dma_chan *chan, in dma_async_device_channel_register() argument
1128 rc = __dma_async_device_channel_register(device, chan, name); in dma_async_device_channel_register()
1138 struct dma_chan *chan) in __dma_async_device_channel_unregister() argument
1140 if (chan->local == NULL) in __dma_async_device_channel_unregister()
1143 WARN_ONCE(!device->device_release && chan->client_count, in __dma_async_device_channel_unregister()
1145 __func__, chan->client_count); in __dma_async_device_channel_unregister()
1148 chan->dev->chan = NULL; in __dma_async_device_channel_unregister()
1150 ida_free(&device->chan_ida, chan->chan_id); in __dma_async_device_channel_unregister()
1151 device_unregister(&chan->dev->device); in __dma_async_device_channel_unregister()
1152 free_percpu(chan->local); in __dma_async_device_channel_unregister()
1156 struct dma_chan *chan) in dma_async_device_channel_unregister() argument
1158 __dma_async_device_channel_unregister(device, chan); in dma_async_device_channel_unregister()
1174 struct dma_chan* chan; in dma_async_device_register() local
1239 list_for_each_entry(chan, &device->channels, device_node) { in dma_async_device_register()
1240 rc = __dma_async_device_channel_register(device, chan, NULL); in dma_async_device_register()
1248 list_for_each_entry(chan, &device->channels, device_node) { in dma_async_device_register()
1252 if (dma_chan_get(chan) == -ENODEV) { in dma_async_device_register()
1279 list_for_each_entry(chan, &device->channels, device_node) { in dma_async_device_register()
1280 if (chan->local == NULL) in dma_async_device_register()
1283 chan->dev->chan = NULL; in dma_async_device_register()
1285 device_unregister(&chan->dev->device); in dma_async_device_register()
1286 free_percpu(chan->local); in dma_async_device_register()
1301 struct dma_chan *chan, *n; in dma_async_device_unregister() local
1305 list_for_each_entry_safe(chan, n, &device->channels, device_node) in dma_async_device_unregister()
1306 __dma_async_device_channel_unregister(device, chan); in dma_async_device_unregister()
1474 struct dma_chan *chan) in dma_async_tx_descriptor_init() argument
1476 tx->chan = chan; in dma_async_tx_descriptor_init()
1488 if (dmaengine_is_metadata_mode_supported(desc->chan, mode)) in desc_check_and_set_metadata_mode()
1570 dev_err(tx->chan->device->dev, in dma_wait_for_async_tx()
1577 return dma_sync_wait(tx->chan, tx->cookie); in dma_wait_for_async_tx()
1592 struct dma_chan *chan; in dma_run_dependencies() local
1599 chan = dep->chan; in dma_run_dependencies()
1609 if (dep_next && dep_next->chan == chan) in dma_run_dependencies()
1618 chan->device->device_issue_pending(chan); in dma_run_dependencies()