anolis: Revert "dmaengine: Remove dma_async_is_complete from client API"

ANBZ: #8716

This reverts commit f37eef1f1f.

This commit f37eef1f1f (dmaengine: Remove dma_async_is_complete from
client API) has led to a failure in compiling Knem. And the assumption in
the original commit message stating, "This is never actually used by any
existing DMA clients," was incorrect. So directly reverting it seems advisable.

Fixes: f37eef1f1f (dmaengine: Remove dma_async_is_complete from client API)
Signed-off-by: Guanjun <guanjun@linux.alibaba.com>
Reviewed-by: Artie Ding <artie.ding@linux.alibaba.com>
Link: https://gitee.com/anolis/cloud-kernel/pulls/3869
This commit is contained in:
Guanjun 2024-09-27 10:09:27 +08:00 committed by 小龙
parent cfca8214d0
commit 055aa14d6d
5 changed files with 32 additions and 15 deletions

View File

@ -344,8 +344,9 @@ Further APIs
the documentation in include/linux/dmaengine.h for a more complete
description of this API.
This can be used with the cookie returned from dmaengine_submit()
to check for completion of a specific DMA transaction.
This can be used in conjunction with dma_async_is_complete() and
the cookie returned from dmaengine_submit() to check for
completion of a specific DMA transaction.
.. note::

View File

@ -1544,6 +1544,7 @@ static struct dma_async_tx_descriptor *pl08x_prep_dma_interrupt(
}
/*
* Code accessing dma_async_is_complete() in a tight loop may give problems.
* If slaves are relying on interrupts to signal completion this function
* must not be called with interrupts disabled.
*/

View File

@ -1464,7 +1464,8 @@ static int atc_terminate_all(struct dma_chan *chan)
* @txstate: if not %NULL updated with transaction state
*
* If @txstate is passed in, upon return it reflect the driver
* internal state.
* internal state and can be used with dma_async_is_complete() to check
* the status of multiple cookies without re-checking hardware state.
*/
static enum dma_status
atc_tx_status(struct dma_chan *chan,

View File

@ -79,15 +79,7 @@ static inline enum dma_status dma_cookie_status(struct dma_chan *chan,
state->residue = 0;
state->in_flight_bytes = 0;
}
if (complete <= used) {
if ((cookie <= complete) || (cookie > used))
return DMA_COMPLETE;
} else {
if ((cookie <= complete) && (cookie > used))
return DMA_COMPLETE;
}
return DMA_IN_PROGRESS;
return dma_async_is_complete(cookie, complete, used);
}
static inline void dma_set_tx_state(struct dma_tx_state *st,

View File

@ -1434,9 +1434,9 @@ static inline void dma_async_issue_pending(struct dma_chan *chan)
* @last: returns last completed cookie, can be NULL
* @used: returns last issued cookie, can be NULL
*
* If @last and @used are passed in, upon return they reflect the most
* recently submitted (used) cookie and the most recently completed
* cookie.
* If @last and @used are passed in, upon return they reflect the driver
* internal state and can be used with dma_async_is_complete() to check
* the status of multiple cookies without re-checking hardware state.
*/
static inline enum dma_status dma_async_is_tx_complete(struct dma_chan *chan,
dma_cookie_t cookie, dma_cookie_t *last, dma_cookie_t *used)
@ -1452,6 +1452,28 @@ static inline enum dma_status dma_async_is_tx_complete(struct dma_chan *chan,
return status;
}
/**
* dma_async_is_complete - test a cookie against chan state
* @cookie: transaction identifier to test status of
* @last_complete: last know completed transaction
* @last_used: last cookie value handed out
*
* dma_async_is_complete() is used in dma_async_is_tx_complete()
* the test logic is separated for lightweight testing of multiple cookies
*/
static inline enum dma_status dma_async_is_complete(dma_cookie_t cookie,
dma_cookie_t last_complete, dma_cookie_t last_used)
{
if (last_complete <= last_used) {
if ((cookie <= last_complete) || (cookie > last_used))
return DMA_COMPLETE;
} else {
if ((cookie <= last_complete) && (cookie > last_used))
return DMA_COMPLETE;
}
return DMA_IN_PROGRESS;
}
#ifdef CONFIG_DMA_ENGINE
struct dma_chan *dma_find_channel(enum dma_transaction_type tx_type);
enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie);