• Home
  • Raw
  • Download

Lines Matching +full:diff +full:- +full:channels

14 #include <linux/dma-mapping.h>
48 "Maximum number of channels to use (default: all)");
58 "dmatest 0-memcpy 1-memset (default: 0)");
73 "Pass -1 for infinite timeout");
88 * struct dmatest_params - test parameters.
93 * @max_channels: maximum number of channels to use
97 * @timeout: transfer timeout in msec, -1 for infinite timeout
114 * struct dmatest_info - test information.
123 struct list_head channels; member
128 .channels = LIST_HEAD_INIT(test_info.channels),
163 /* poor man's completion - we want to use wait_event_freezable() on it */
197 list_for_each_entry(dtc, &info->channels, node) { in is_threaded_test_run()
200 list_for_each_entry(thread, &dtc->threads, node) { in is_threaded_test_run()
201 if (!thread->done) in is_threaded_test_run()
212 struct dmatest_params *params = &info->params; in dmatest_wait_get()
214 if (params->iterations) in dmatest_wait_get()
230 if (params->channel[0] == '\0') in dmatest_match_channel()
232 return strcmp(dma_chan_name(chan), params->channel) == 0; in dmatest_match_channel()
238 if (params->device[0] == '\0') in dmatest_match_device()
240 return strcmp(dev_name(device->dev), params->device) == 0; in dmatest_match_device()
305 u8 diff = actual ^ pattern; in dmatest_mismatch() local
307 const char *thread_name = current->comm; in dmatest_mismatch()
313 && (diff & (PATTERN_COPY | PATTERN_OVERWRITE))) in dmatest_mismatch()
316 else if (diff & PATTERN_SRC) in dmatest_mismatch()
353 current->comm, error_count - MAX_ERROR_COUNT); in dmatest_verify()
364 if (!thread->done) { in dmatest_callback()
365 done->done = true; in dmatest_callback()
366 wake_up_all(done->wait); in dmatest_callback()
369 * If thread->done, it means that this callback occurred in dmatest_callback()
383 return val % 2 ? val : val - 1; in min_odd()
390 current->comm, n, err, src_off, dst_off, len, data); in result()
398 current->comm, n, err, src_off, dst_off, len, data); in dbg_result()
415 /* drop precision until runtime is 32-bits */ in dmatest_persec()
435 * in parallel for a single channel, and there may be multiple channels
448 struct dmatest_done *done = &thread->test_done; in dmatest_func()
464 ktime_t ktime, start, diff; in dmatest_func() local
476 ret = -ENOMEM; in dmatest_func()
479 info = thread->info; in dmatest_func()
480 params = &info->params; in dmatest_func()
481 chan = thread->chan; in dmatest_func()
482 dev = chan->device; in dmatest_func()
483 if (thread->type == DMA_MEMCPY) { in dmatest_func()
484 align = dev->copy_align; in dmatest_func()
486 } else if (thread->type == DMA_MEMSET) { in dmatest_func()
487 align = dev->fill_align; in dmatest_func()
490 } else if (thread->type == DMA_XOR) { in dmatest_func()
492 src_cnt = min_odd(params->xor_sources | 1, dev->max_xor); in dmatest_func()
494 align = dev->xor_align; in dmatest_func()
495 } else if (thread->type == DMA_PQ) { in dmatest_func()
497 src_cnt = min_odd(params->pq_sources | 1, dma_maxpq(dev, 0)); in dmatest_func()
499 align = dev->pq_align; in dmatest_func()
501 pq_coefs = kmalloc(params->pq_sources + 1, GFP_KERNEL); in dmatest_func()
510 thread->srcs = kcalloc(src_cnt + 1, sizeof(u8 *), GFP_KERNEL); in dmatest_func()
511 if (!thread->srcs) in dmatest_func()
514 thread->usrcs = kcalloc(src_cnt + 1, sizeof(u8 *), GFP_KERNEL); in dmatest_func()
515 if (!thread->usrcs) in dmatest_func()
519 thread->usrcs[i] = kmalloc(params->buf_size + align, in dmatest_func()
521 if (!thread->usrcs[i]) in dmatest_func()
526 thread->srcs[i] = PTR_ALIGN(thread->usrcs[i], align); in dmatest_func()
528 thread->srcs[i] = thread->usrcs[i]; in dmatest_func()
530 thread->srcs[i] = NULL; in dmatest_func()
532 thread->dsts = kcalloc(dst_cnt + 1, sizeof(u8 *), GFP_KERNEL); in dmatest_func()
533 if (!thread->dsts) in dmatest_func()
536 thread->udsts = kcalloc(dst_cnt + 1, sizeof(u8 *), GFP_KERNEL); in dmatest_func()
537 if (!thread->udsts) in dmatest_func()
541 thread->udsts[i] = kmalloc(params->buf_size + align, in dmatest_func()
543 if (!thread->udsts[i]) in dmatest_func()
548 thread->dsts[i] = PTR_ALIGN(thread->udsts[i], align); in dmatest_func()
550 thread->dsts[i] = thread->udsts[i]; in dmatest_func()
552 thread->dsts[i] = NULL; in dmatest_func()
571 (params->iterations && total_tests >= params->iterations))) { in dmatest_func()
586 if (1 << align > params->buf_size) { in dmatest_func()
587 pr_err("%u-byte buffer too small for %d-byte alignment\n", in dmatest_func()
588 params->buf_size, 1 << align); in dmatest_func()
592 if (params->norandom) in dmatest_func()
593 len = params->buf_size; in dmatest_func()
595 len = dmatest_random() % params->buf_size + 1; in dmatest_func()
603 if (params->norandom) { in dmatest_func()
607 src_off = dmatest_random() % (params->buf_size - len + 1); in dmatest_func()
608 dst_off = dmatest_random() % (params->buf_size - len + 1); in dmatest_func()
614 if (!params->noverify) { in dmatest_func()
616 dmatest_init_srcs(thread->srcs, src_off, len, in dmatest_func()
617 params->buf_size, is_memset); in dmatest_func()
618 dmatest_init_dsts(thread->dsts, dst_off, len, in dmatest_func()
619 params->buf_size, is_memset); in dmatest_func()
621 diff = ktime_sub(ktime_get(), start); in dmatest_func()
622 filltime = ktime_add(filltime, diff); in dmatest_func()
625 um = dmaengine_get_unmap_data(dev->dev, src_cnt + dst_cnt, in dmatest_func()
634 um->len = params->buf_size; in dmatest_func()
636 void *buf = thread->srcs[i]; in dmatest_func()
640 um->addr[i] = dma_map_page(dev->dev, pg, pg_off, in dmatest_func()
641 um->len, DMA_TO_DEVICE); in dmatest_func()
642 srcs[i] = um->addr[i] + src_off; in dmatest_func()
643 ret = dma_mapping_error(dev->dev, um->addr[i]); in dmatest_func()
649 um->to_cnt++; in dmatest_func()
652 dsts = &um->addr[src_cnt]; in dmatest_func()
654 void *buf = thread->dsts[i]; in dmatest_func()
658 dsts[i] = dma_map_page(dev->dev, pg, pg_off, um->len, in dmatest_func()
660 ret = dma_mapping_error(dev->dev, dsts[i]); in dmatest_func()
666 um->bidi_cnt++; in dmatest_func()
669 if (thread->type == DMA_MEMCPY) in dmatest_func()
670 tx = dev->device_prep_dma_memcpy(chan, in dmatest_func()
673 else if (thread->type == DMA_MEMSET) in dmatest_func()
674 tx = dev->device_prep_dma_memset(chan, in dmatest_func()
676 *(thread->srcs[0] + src_off), in dmatest_func()
678 else if (thread->type == DMA_XOR) in dmatest_func()
679 tx = dev->device_prep_dma_xor(chan, in dmatest_func()
683 else if (thread->type == DMA_PQ) { in dmatest_func()
686 tx = dev->device_prep_dma_pq(chan, dma_pq, srcs, in dmatest_func()
698 done->done = false; in dmatest_func()
699 tx->callback = dmatest_callback; in dmatest_func()
700 tx->callback_param = done; in dmatest_func()
701 cookie = tx->tx_submit(tx); in dmatest_func()
711 wait_event_freezable_timeout(thread->done_wait, done->done, in dmatest_func()
712 msecs_to_jiffies(params->timeout)); in dmatest_func()
716 if (!done->done) { in dmatest_func()
732 if (params->noverify) { in dmatest_func()
739 pr_debug("%s: verifying source buffer...\n", current->comm); in dmatest_func()
740 error_count = dmatest_verify(thread->srcs, 0, src_off, in dmatest_func()
742 error_count += dmatest_verify(thread->srcs, src_off, in dmatest_func()
745 error_count += dmatest_verify(thread->srcs, src_off + len, in dmatest_func()
746 params->buf_size, src_off + len, in dmatest_func()
749 pr_debug("%s: verifying dest buffer...\n", current->comm); in dmatest_func()
750 error_count += dmatest_verify(thread->dsts, 0, dst_off, in dmatest_func()
753 error_count += dmatest_verify(thread->dsts, dst_off, in dmatest_func()
757 error_count += dmatest_verify(thread->dsts, dst_off + len, in dmatest_func()
758 params->buf_size, dst_off + len, in dmatest_func()
761 diff = ktime_sub(ktime_get(), start); in dmatest_func()
762 comparetime = ktime_add(comparetime, diff); in dmatest_func()
789 for (i = 0; thread->udsts[i]; i++) in dmatest_func()
790 kfree(thread->udsts[i]); in dmatest_func()
791 kfree(thread->udsts); in dmatest_func()
793 kfree(thread->dsts); in dmatest_func()
796 for (i = 0; thread->usrcs[i]; i++) in dmatest_func()
797 kfree(thread->usrcs[i]); in dmatest_func()
798 kfree(thread->usrcs); in dmatest_func()
800 kfree(thread->srcs); in dmatest_func()
805 current->comm, total_tests, failed_tests, in dmatest_func()
809 /* terminate all transfers on specified channels */ in dmatest_func()
813 thread->done = true; in dmatest_func()
825 list_for_each_entry_safe(thread, _thread, &dtc->threads, node) { in dmatest_cleanup_channel()
826 ret = kthread_stop(thread->task); in dmatest_cleanup_channel()
828 thread->task->comm, ret); in dmatest_cleanup_channel()
829 list_del(&thread->node); in dmatest_cleanup_channel()
830 put_task_struct(thread->task); in dmatest_cleanup_channel()
834 /* terminate all transfers on specified channels */ in dmatest_cleanup_channel()
835 dmaengine_terminate_all(dtc->chan); in dmatest_cleanup_channel()
843 struct dmatest_params *params = &info->params; in dmatest_add_threads()
845 struct dma_chan *chan = dtc->chan; in dmatest_add_threads()
858 return -EINVAL; in dmatest_add_threads()
860 for (i = 0; i < params->threads_per_chan; i++) { in dmatest_add_threads()
863 pr_warn("No memory for %s-%s%u\n", in dmatest_add_threads()
867 thread->info = info; in dmatest_add_threads()
868 thread->chan = dtc->chan; in dmatest_add_threads()
869 thread->type = type; in dmatest_add_threads()
870 thread->test_done.wait = &thread->done_wait; in dmatest_add_threads()
871 init_waitqueue_head(&thread->done_wait); in dmatest_add_threads()
873 thread->task = kthread_create(dmatest_func, thread, "%s-%s%u", in dmatest_add_threads()
875 if (IS_ERR(thread->task)) { in dmatest_add_threads()
876 pr_warn("Failed to create thread %s-%s%u\n", in dmatest_add_threads()
883 get_task_struct(thread->task); in dmatest_add_threads()
884 list_add_tail(&thread->node, &dtc->threads); in dmatest_add_threads()
885 wake_up_process(thread->task); in dmatest_add_threads()
895 struct dma_device *dma_dev = chan->device; in dmatest_add_channel()
902 return -ENOMEM; in dmatest_add_channel()
905 dtc->chan = chan; in dmatest_add_channel()
906 INIT_LIST_HEAD(&dtc->threads); in dmatest_add_channel()
908 if (dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask)) { in dmatest_add_channel()
915 if (dma_has_cap(DMA_MEMSET, dma_dev->cap_mask)) { in dmatest_add_channel()
922 if (dma_has_cap(DMA_XOR, dma_dev->cap_mask)) { in dmatest_add_channel()
926 if (dma_has_cap(DMA_PQ, dma_dev->cap_mask)) { in dmatest_add_channel()
934 list_add_tail(&dtc->node, &info->channels); in dmatest_add_channel()
935 info->nr_channels++; in dmatest_add_channel()
945 !dmatest_match_device(params, chan->device)) in filter()
959 struct dmatest_params *params = &info->params; in request_channels()
969 break; /* no more channels available */ in request_channels()
970 if (params->max_channels && in request_channels()
971 info->nr_channels >= params->max_channels) in request_channels()
978 struct dmatest_params *params = &info->params; in run_threaded_test()
981 params->buf_size = test_buf_size; in run_threaded_test()
982 strlcpy(params->channel, strim(test_channel), sizeof(params->channel)); in run_threaded_test()
983 strlcpy(params->device, strim(test_device), sizeof(params->device)); in run_threaded_test()
984 params->threads_per_chan = threads_per_chan; in run_threaded_test()
985 params->max_channels = max_channels; in run_threaded_test()
986 params->iterations = iterations; in run_threaded_test()
987 params->xor_sources = xor_sources; in run_threaded_test()
988 params->pq_sources = pq_sources; in run_threaded_test()
989 params->timeout = timeout; in run_threaded_test()
990 params->noverify = noverify; in run_threaded_test()
991 params->norandom = norandom; in run_threaded_test()
1004 list_for_each_entry_safe(dtc, _dtc, &info->channels, node) { in stop_threaded_test()
1005 list_del(&dtc->node); in stop_threaded_test()
1006 chan = dtc->chan; in stop_threaded_test()
1012 info->nr_channels = 0; in stop_threaded_test()
1020 if (!info->did_init) in restart_threaded_test()
1034 mutex_lock(&info->lock); in dmatest_run_get()
1041 mutex_unlock(&info->lock); in dmatest_run_get()
1051 mutex_lock(&info->lock); in dmatest_run_set()
1054 mutex_unlock(&info->lock); in dmatest_run_set()
1059 ret = -EBUSY; in dmatest_run_set()
1063 mutex_unlock(&info->lock); in dmatest_run_set()
1071 struct dmatest_params *params = &info->params; in dmatest_init()
1074 mutex_lock(&info->lock); in dmatest_init()
1076 mutex_unlock(&info->lock); in dmatest_init()
1079 if (params->iterations && wait) in dmatest_init()
1085 info->did_init = true; in dmatest_init()
1089 /* when compiled-in wait for drivers to load first */
1096 mutex_lock(&info->lock); in dmatest_exit()
1098 mutex_unlock(&info->lock); in dmatest_exit()