Commit fb9816f9 authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Vinod Koul

dmaengine: dmatest: Add support for completion polling

With the polled parameter the DMA drivers can be tested if they can work
correctly when no completion is requested (no DMA_PREP_INTERRUPT and no
callback is provided).

If polled mode is selected then use dma_sync_wait() to execute the test
iteration instead of relying on the completion callback.
Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@ti.com>
Link: https://lore.kernel.org/r/20190731071438.24075-1-peter.ujfalusi@ti.comSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent 9fa2df6e
...@@ -72,6 +72,10 @@ static bool norandom; ...@@ -72,6 +72,10 @@ static bool norandom;
module_param(norandom, bool, 0644); module_param(norandom, bool, 0644);
MODULE_PARM_DESC(norandom, "Disable random offset setup (default: random)"); MODULE_PARM_DESC(norandom, "Disable random offset setup (default: random)");
static bool polled;
module_param(polled, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(polled, "Use polling for completion instead of interrupts");
static bool verbose; static bool verbose;
module_param(verbose, bool, S_IRUGO | S_IWUSR); module_param(verbose, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(verbose, "Enable \"success\" result messages (default: off)"); MODULE_PARM_DESC(verbose, "Enable \"success\" result messages (default: off)");
...@@ -110,6 +114,7 @@ struct dmatest_params { ...@@ -110,6 +114,7 @@ struct dmatest_params {
bool norandom; bool norandom;
int alignment; int alignment;
unsigned int transfer_size; unsigned int transfer_size;
bool polled;
}; };
/** /**
...@@ -651,6 +656,9 @@ static int dmatest_func(void *data) ...@@ -651,6 +656,9 @@ static int dmatest_func(void *data)
/* /*
* src and dst buffers are freed by ourselves below * src and dst buffers are freed by ourselves below
*/ */
if (params->polled)
flags = DMA_CTRL_ACK;
else
flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT; flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT;
ktime = ktime_get(); ktime = ktime_get();
...@@ -780,8 +788,10 @@ static int dmatest_func(void *data) ...@@ -780,8 +788,10 @@ static int dmatest_func(void *data)
} }
done->done = false; done->done = false;
if (!params->polled) {
tx->callback = dmatest_callback; tx->callback = dmatest_callback;
tx->callback_param = done; tx->callback_param = done;
}
cookie = tx->tx_submit(tx); cookie = tx->tx_submit(tx);
if (dma_submit_error(cookie)) { if (dma_submit_error(cookie)) {
...@@ -790,12 +800,22 @@ static int dmatest_func(void *data) ...@@ -790,12 +800,22 @@ static int dmatest_func(void *data)
msleep(100); msleep(100);
goto error_unmap_continue; goto error_unmap_continue;
} }
if (params->polled) {
status = dma_sync_wait(chan, cookie);
dmaengine_terminate_sync(chan);
if (status == DMA_COMPLETE)
done->done = true;
} else {
dma_async_issue_pending(chan); dma_async_issue_pending(chan);
wait_event_freezable_timeout(thread->done_wait, done->done, wait_event_freezable_timeout(thread->done_wait,
done->done,
msecs_to_jiffies(params->timeout)); msecs_to_jiffies(params->timeout));
status = dma_async_is_tx_complete(chan, cookie, NULL, NULL); status = dma_async_is_tx_complete(chan, cookie, NULL,
NULL);
}
if (!done->done) { if (!done->done) {
result("test timed out", total_tests, src->off, dst->off, result("test timed out", total_tests, src->off, dst->off,
...@@ -1065,6 +1085,7 @@ static void add_threaded_test(struct dmatest_info *info) ...@@ -1065,6 +1085,7 @@ static void add_threaded_test(struct dmatest_info *info)
params->norandom = norandom; params->norandom = norandom;
params->alignment = alignment; params->alignment = alignment;
params->transfer_size = transfer_size; params->transfer_size = transfer_size;
params->polled = polled;
request_channels(info, DMA_MEMCPY); request_channels(info, DMA_MEMCPY);
request_channels(info, DMA_MEMSET); request_channels(info, DMA_MEMSET);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment