mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 06:12:08 +00:00
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: Peter Ujfalusi <peter.ujfalusi@ti.com> Link: https://lore.kernel.org/r/20190731071438.24075-1-peter.ujfalusi@ti.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
9fa2df6eaf
commit
fb9816f9d0
@ -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 {
|
|||||||
bool norandom;
|
bool norandom;
|
||||||
int alignment;
|
int alignment;
|
||||||
unsigned int transfer_size;
|
unsigned int transfer_size;
|
||||||
|
bool polled;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -651,7 +656,10 @@ static int dmatest_func(void *data)
|
|||||||
/*
|
/*
|
||||||
* src and dst buffers are freed by ourselves below
|
* src and dst buffers are freed by ourselves below
|
||||||
*/
|
*/
|
||||||
flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT;
|
if (params->polled)
|
||||||
|
flags = DMA_CTRL_ACK;
|
||||||
|
else
|
||||||
|
flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT;
|
||||||
|
|
||||||
ktime = ktime_get();
|
ktime = ktime_get();
|
||||||
while (!kthread_should_stop()
|
while (!kthread_should_stop()
|
||||||
@ -780,8 +788,10 @@ static int dmatest_func(void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
done->done = false;
|
done->done = false;
|
||||||
tx->callback = dmatest_callback;
|
if (!params->polled) {
|
||||||
tx->callback_param = done;
|
tx->callback = dmatest_callback;
|
||||||
|
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)
|
|||||||
msleep(100);
|
msleep(100);
|
||||||
goto error_unmap_continue;
|
goto error_unmap_continue;
|
||||||
}
|
}
|
||||||
dma_async_issue_pending(chan);
|
|
||||||
|
|
||||||
wait_event_freezable_timeout(thread->done_wait, done->done,
|
if (params->polled) {
|
||||||
msecs_to_jiffies(params->timeout));
|
status = dma_sync_wait(chan, cookie);
|
||||||
|
dmaengine_terminate_sync(chan);
|
||||||
|
if (status == DMA_COMPLETE)
|
||||||
|
done->done = true;
|
||||||
|
} else {
|
||||||
|
dma_async_issue_pending(chan);
|
||||||
|
|
||||||
status = dma_async_is_tx_complete(chan, cookie, NULL, NULL);
|
wait_event_freezable_timeout(thread->done_wait,
|
||||||
|
done->done,
|
||||||
|
msecs_to_jiffies(params->timeout));
|
||||||
|
|
||||||
|
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)
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user