Lines Matching full:dt
122 static void dma_test_free_rings(struct dma_test *dt) in dma_test_free_rings() argument
124 if (dt->rx_ring) { in dma_test_free_rings()
125 tb_xdomain_release_in_hopid(dt->xd, dt->rx_hopid); in dma_test_free_rings()
126 tb_ring_free(dt->rx_ring); in dma_test_free_rings()
127 dt->rx_ring = NULL; in dma_test_free_rings()
129 if (dt->tx_ring) { in dma_test_free_rings()
130 tb_xdomain_release_out_hopid(dt->xd, dt->tx_hopid); in dma_test_free_rings()
131 tb_ring_free(dt->tx_ring); in dma_test_free_rings()
132 dt->tx_ring = NULL; in dma_test_free_rings()
136 static int dma_test_start_rings(struct dma_test *dt) in dma_test_start_rings() argument
139 struct tb_xdomain *xd = dt->xd; in dma_test_start_rings()
148 if (dt->packets_to_send && dt->packets_to_receive) in dma_test_start_rings()
151 if (dt->packets_to_send) { in dma_test_start_rings()
157 dt->tx_ring = ring; in dma_test_start_rings()
162 dma_test_free_rings(dt); in dma_test_start_rings()
166 dt->tx_hopid = ret; in dma_test_start_rings()
169 if (dt->packets_to_receive) { in dma_test_start_rings()
179 dma_test_free_rings(dt); in dma_test_start_rings()
183 dt->rx_ring = ring; in dma_test_start_rings()
187 dma_test_free_rings(dt); in dma_test_start_rings()
191 dt->rx_hopid = ret; in dma_test_start_rings()
194 ret = tb_xdomain_enable_paths(dt->xd, dt->tx_hopid, in dma_test_start_rings()
195 dt->tx_ring ? dt->tx_ring->hop : -1, in dma_test_start_rings()
196 dt->rx_hopid, in dma_test_start_rings()
197 dt->rx_ring ? dt->rx_ring->hop : -1); in dma_test_start_rings()
199 dma_test_free_rings(dt); in dma_test_start_rings()
203 if (dt->tx_ring) in dma_test_start_rings()
204 tb_ring_start(dt->tx_ring); in dma_test_start_rings()
205 if (dt->rx_ring) in dma_test_start_rings()
206 tb_ring_start(dt->rx_ring); in dma_test_start_rings()
211 static void dma_test_stop_rings(struct dma_test *dt) in dma_test_stop_rings() argument
215 if (dt->rx_ring) in dma_test_stop_rings()
216 tb_ring_stop(dt->rx_ring); in dma_test_stop_rings()
217 if (dt->tx_ring) in dma_test_stop_rings()
218 tb_ring_stop(dt->tx_ring); in dma_test_stop_rings()
220 ret = tb_xdomain_disable_paths(dt->xd, dt->tx_hopid, in dma_test_stop_rings()
221 dt->tx_ring ? dt->tx_ring->hop : -1, in dma_test_stop_rings()
222 dt->rx_hopid, in dma_test_stop_rings()
223 dt->rx_ring ? dt->rx_ring->hop : -1); in dma_test_stop_rings()
225 dev_warn(&dt->svc->dev, "failed to disable DMA paths\n"); in dma_test_stop_rings()
227 dma_test_free_rings(dt); in dma_test_stop_rings()
234 struct dma_test *dt = tf->dma_test; in dma_test_rx_callback() local
235 struct device *dma_dev = tb_ring_dma_device(dt->rx_ring); in dma_test_rx_callback()
246 dt->packets_received++; in dma_test_rx_callback()
247 dev_dbg(&dt->svc->dev, "packet %u/%u received\n", dt->packets_received, in dma_test_rx_callback()
248 dt->packets_to_receive); in dma_test_rx_callback()
251 dt->crc_errors++; in dma_test_rx_callback()
253 dt->buffer_overflow_errors++; in dma_test_rx_callback()
257 if (dt->packets_received == dt->packets_to_receive) in dma_test_rx_callback()
258 complete(&dt->complete); in dma_test_rx_callback()
261 static int dma_test_submit_rx(struct dma_test *dt, size_t npackets) in dma_test_submit_rx() argument
263 struct device *dma_dev = tb_ring_dma_device(dt->rx_ring); in dma_test_submit_rx()
290 tf->dma_test = dt; in dma_test_submit_rx()
293 tb_ring_rx(dt->rx_ring, &tf->frame); in dma_test_submit_rx()
303 struct dma_test *dt = tf->dma_test; in dma_test_tx_callback() local
304 struct device *dma_dev = tb_ring_dma_device(dt->tx_ring); in dma_test_tx_callback()
312 static int dma_test_submit_tx(struct dma_test *dt, size_t npackets) in dma_test_submit_tx() argument
314 struct device *dma_dev = tb_ring_dma_device(dt->tx_ring); in dma_test_submit_tx()
326 tf->dma_test = dt; in dma_test_submit_tx()
348 dt->packets_sent++; in dma_test_submit_tx()
349 dev_dbg(&dt->svc->dev, "packet %u/%u sent\n", dt->packets_sent, in dma_test_submit_tx()
350 dt->packets_to_send); in dma_test_submit_tx()
352 tb_ring_tx(dt->tx_ring, &tf->frame); in dma_test_submit_tx()
362 struct dma_test *dt = tb_service_get_drvdata(svc); \
365 ret = mutex_lock_interruptible(&dt->lock); \
368 __get(dt, val); \
369 mutex_unlock(&dt->lock); \
375 struct dma_test *dt = tb_service_get_drvdata(svc); \
381 ret = mutex_lock_interruptible(&dt->lock); \
384 __set(dt, val); \
385 mutex_unlock(&dt->lock); \
391 static void lanes_get(const struct dma_test *dt, u64 *val) in lanes_get() argument
393 *val = dt->link_width; in lanes_get()
401 static void lanes_set(struct dma_test *dt, u64 val) in lanes_set() argument
403 dt->link_width = val; in lanes_set()
407 static void speed_get(const struct dma_test *dt, u64 *val) in speed_get() argument
409 *val = dt->link_speed; in speed_get()
425 static void speed_set(struct dma_test *dt, u64 val) in speed_set() argument
427 dt->link_speed = val; in speed_set()
431 static void packets_to_receive_get(const struct dma_test *dt, u64 *val) in packets_to_receive_get() argument
433 *val = dt->packets_to_receive; in packets_to_receive_get()
441 static void packets_to_receive_set(struct dma_test *dt, u64 val) in packets_to_receive_set() argument
443 dt->packets_to_receive = val; in packets_to_receive_set()
448 static void packets_to_send_get(const struct dma_test *dt, u64 *val) in packets_to_send_get() argument
450 *val = dt->packets_to_send; in packets_to_send_get()
458 static void packets_to_send_set(struct dma_test *dt, u64 val) in packets_to_send_set() argument
460 dt->packets_to_send = val; in packets_to_send_set()
465 static int dma_test_set_bonding(struct dma_test *dt) in dma_test_set_bonding() argument
467 switch (dt->link_width) { in dma_test_set_bonding()
469 return tb_xdomain_lane_bonding_enable(dt->xd); in dma_test_set_bonding()
471 tb_xdomain_lane_bonding_disable(dt->xd); in dma_test_set_bonding()
478 static bool dma_test_validate_config(struct dma_test *dt) in dma_test_validate_config() argument
480 if (!dt->packets_to_send && !dt->packets_to_receive) in dma_test_validate_config()
482 if (dt->packets_to_send && dt->packets_to_receive && in dma_test_validate_config()
483 dt->packets_to_send != dt->packets_to_receive) in dma_test_validate_config()
488 static void dma_test_check_errors(struct dma_test *dt, int ret) in dma_test_check_errors() argument
490 if (!dt->error_code) { in dma_test_check_errors()
491 if (dt->link_speed && dt->xd->link_speed != dt->link_speed) { in dma_test_check_errors()
492 dt->error_code = DMA_TEST_SPEED_ERROR; in dma_test_check_errors()
493 } else if (dt->link_width) { in dma_test_check_errors()
494 const struct tb_xdomain *xd = dt->xd; in dma_test_check_errors()
496 if ((dt->link_width == 1 && xd->link_width != TB_LINK_WIDTH_SINGLE) || in dma_test_check_errors()
497 (dt->link_width == 2 && xd->link_width < TB_LINK_WIDTH_DUAL)) in dma_test_check_errors()
498 dt->error_code = DMA_TEST_WIDTH_ERROR; in dma_test_check_errors()
499 } else if (dt->packets_to_send != dt->packets_sent || in dma_test_check_errors()
500 dt->packets_to_receive != dt->packets_received || in dma_test_check_errors()
501 dt->crc_errors || dt->buffer_overflow_errors) { in dma_test_check_errors()
502 dt->error_code = DMA_TEST_PACKET_ERROR; in dma_test_check_errors()
508 dt->result = DMA_TEST_FAIL; in dma_test_check_errors()
514 struct dma_test *dt = tb_service_get_drvdata(svc); in test_store() local
520 ret = mutex_lock_interruptible(&dt->lock); in test_store()
524 dt->packets_sent = 0; in test_store()
525 dt->packets_received = 0; in test_store()
526 dt->crc_errors = 0; in test_store()
527 dt->buffer_overflow_errors = 0; in test_store()
528 dt->result = DMA_TEST_SUCCESS; in test_store()
529 dt->error_code = DMA_TEST_NO_ERROR; in test_store()
532 if (dt->link_speed) in test_store()
533 dev_dbg(&svc->dev, "link_speed: %u Gb/s\n", dt->link_speed); in test_store()
534 if (dt->link_width) in test_store()
535 dev_dbg(&svc->dev, "link_width: %u\n", dt->link_width); in test_store()
536 dev_dbg(&svc->dev, "packets_to_send: %u\n", dt->packets_to_send); in test_store()
537 dev_dbg(&svc->dev, "packets_to_receive: %u\n", dt->packets_to_receive); in test_store()
539 if (!dma_test_validate_config(dt)) { in test_store()
541 dt->error_code = DMA_TEST_CONFIG_ERROR; in test_store()
545 ret = dma_test_set_bonding(dt); in test_store()
548 dt->error_code = DMA_TEST_BONDING_ERROR; in test_store()
552 ret = dma_test_start_rings(dt); in test_store()
555 dt->error_code = DMA_TEST_DMA_ERROR; in test_store()
559 if (dt->packets_to_receive) { in test_store()
560 reinit_completion(&dt->complete); in test_store()
561 ret = dma_test_submit_rx(dt, dt->packets_to_receive); in test_store()
564 dt->error_code = DMA_TEST_BUFFER_ERROR; in test_store()
569 if (dt->packets_to_send) { in test_store()
570 ret = dma_test_submit_tx(dt, dt->packets_to_send); in test_store()
573 dt->error_code = DMA_TEST_BUFFER_ERROR; in test_store()
578 if (dt->packets_to_receive) { in test_store()
579 ret = wait_for_completion_interruptible(&dt->complete); in test_store()
581 dt->error_code = DMA_TEST_INTERRUPTED; in test_store()
587 dma_test_stop_rings(dt); in test_store()
589 dma_test_check_errors(dt, ret); in test_store()
590 mutex_unlock(&dt->lock); in test_store()
592 dev_dbg(&svc->dev, "DMA test %s\n", dma_test_result_names[dt->result]); in test_store()
600 struct dma_test *dt = tb_service_get_drvdata(svc); in status_show() local
603 ret = mutex_lock_interruptible(&dt->lock); in status_show()
607 seq_printf(s, "result: %s\n", dma_test_result_names[dt->result]); in status_show()
608 if (dt->result == DMA_TEST_NOT_RUN) in status_show()
611 seq_printf(s, "packets received: %u\n", dt->packets_received); in status_show()
612 seq_printf(s, "packets sent: %u\n", dt->packets_sent); in status_show()
613 seq_printf(s, "CRC errors: %u\n", dt->crc_errors); in status_show()
615 dt->buffer_overflow_errors); in status_show()
616 seq_printf(s, "error: %s\n", dma_test_error_names[dt->error_code]); in status_show()
619 mutex_unlock(&dt->lock); in status_show()
626 struct dma_test *dt = tb_service_get_drvdata(svc); in dma_test_debugfs_init() local
628 dt->debugfs_dir = debugfs_create_dir("dma_test", svc->debugfs_dir); in dma_test_debugfs_init()
630 debugfs_create_file("lanes", 0600, dt->debugfs_dir, svc, &lanes_fops); in dma_test_debugfs_init()
631 debugfs_create_file("speed", 0600, dt->debugfs_dir, svc, &speed_fops); in dma_test_debugfs_init()
632 debugfs_create_file("packets_to_receive", 0600, dt->debugfs_dir, svc, in dma_test_debugfs_init()
634 debugfs_create_file("packets_to_send", 0600, dt->debugfs_dir, svc, in dma_test_debugfs_init()
636 debugfs_create_file("status", 0400, dt->debugfs_dir, svc, &status_fops); in dma_test_debugfs_init()
637 debugfs_create_file("test", 0200, dt->debugfs_dir, svc, &test_fops); in dma_test_debugfs_init()
643 struct dma_test *dt; in dma_test_probe() local
645 dt = devm_kzalloc(&svc->dev, sizeof(*dt), GFP_KERNEL); in dma_test_probe()
646 if (!dt) in dma_test_probe()
649 dt->svc = svc; in dma_test_probe()
650 dt->xd = xd; in dma_test_probe()
651 mutex_init(&dt->lock); in dma_test_probe()
652 init_completion(&dt->complete); in dma_test_probe()
654 tb_service_set_drvdata(svc, dt); in dma_test_probe()
662 struct dma_test *dt = tb_service_get_drvdata(svc); in dma_test_remove() local
664 mutex_lock(&dt->lock); in dma_test_remove()
665 debugfs_remove_recursive(dt->debugfs_dir); in dma_test_remove()
666 mutex_unlock(&dt->lock); in dma_test_remove()