Skip to content

Commit

Permalink
dmaengine: consolidate assignment of DMA cookies
Browse files Browse the repository at this point in the history
Everyone deals with assigning DMA cookies in the same way (it's part of
the API so they should be), so lets consolidate the common code into a
helper function to avoid this duplication.

Signed-off-by: Russell King <[email protected]>
Tested-by: Linus Walleij <[email protected]>
Reviewed-by: Linus Walleij <[email protected]>
Acked-by: Jassi Brar <[email protected]>
[imx-sdma.c & mxs-dma.c]
Tested-by: Shawn Guo <[email protected]>
Signed-off-by: Vinod Koul <[email protected]>
  • Loading branch information
Russell King - ARM Linux authored and Vinod Koul committed Mar 13, 2012
1 parent d2ebfb3 commit 884485e
Show file tree
Hide file tree
Showing 25 changed files with 52 additions and 272 deletions.
9 changes: 3 additions & 6 deletions drivers/dma/amba-pl08x.c
Original file line number Diff line number Diff line change
Expand Up @@ -921,13 +921,10 @@ static dma_cookie_t pl08x_tx_submit(struct dma_async_tx_descriptor *tx)
struct pl08x_dma_chan *plchan = to_pl08x_chan(tx->chan);
struct pl08x_txd *txd = to_pl08x_txd(tx);
unsigned long flags;
dma_cookie_t cookie;

spin_lock_irqsave(&plchan->lock, flags);

plchan->chan.cookie += 1;
if (plchan->chan.cookie < 0)
plchan->chan.cookie = 1;
tx->cookie = plchan->chan.cookie;
cookie = dma_cookie_assign(tx);

/* Put this onto the pending list */
list_add_tail(&txd->node, &plchan->pend_list);
Expand All @@ -947,7 +944,7 @@ static dma_cookie_t pl08x_tx_submit(struct dma_async_tx_descriptor *tx)

spin_unlock_irqrestore(&plchan->lock, flags);

return tx->cookie;
return cookie;
}

static struct dma_async_tx_descriptor *pl08x_prep_dma_interrupt(
Expand Down
23 changes: 1 addition & 22 deletions drivers/dma/at_hdmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,27 +192,6 @@ static void atc_desc_chain(struct at_desc **first, struct at_desc **prev,
*prev = desc;
}

/**
* atc_assign_cookie - compute and assign new cookie
* @atchan: channel we work on
* @desc: descriptor to assign cookie for
*
* Called with atchan->lock held and bh disabled
*/
static dma_cookie_t
atc_assign_cookie(struct at_dma_chan *atchan, struct at_desc *desc)
{
dma_cookie_t cookie = atchan->chan_common.cookie;

if (++cookie < 0)
cookie = 1;

atchan->chan_common.cookie = cookie;
desc->txd.cookie = cookie;

return cookie;
}

/**
* atc_dostart - starts the DMA engine for real
* @atchan: the channel we want to start
Expand Down Expand Up @@ -548,7 +527,7 @@ static dma_cookie_t atc_tx_submit(struct dma_async_tx_descriptor *tx)
unsigned long flags;

spin_lock_irqsave(&atchan->lock, flags);
cookie = atc_assign_cookie(atchan, desc);
cookie = dma_cookie_assign(tx);

if (list_empty(&atchan->active_list)) {
dev_vdbg(chan2dev(tx->chan), "tx_submit: started %u\n",
Expand Down
20 changes: 3 additions & 17 deletions drivers/dma/coh901318.c
Original file line number Diff line number Diff line change
Expand Up @@ -318,20 +318,6 @@ static int coh901318_prep_linked_list(struct coh901318_chan *cohc,

return 0;
}
static dma_cookie_t
coh901318_assign_cookie(struct coh901318_chan *cohc,
struct coh901318_desc *cohd)
{
dma_cookie_t cookie = cohc->chan.cookie;

if (++cookie < 0)
cookie = 1;

cohc->chan.cookie = cookie;
cohd->desc.cookie = cookie;

return cookie;
}

static struct coh901318_desc *
coh901318_desc_get(struct coh901318_chan *cohc)
Expand Down Expand Up @@ -966,16 +952,16 @@ coh901318_tx_submit(struct dma_async_tx_descriptor *tx)
desc);
struct coh901318_chan *cohc = to_coh901318_chan(tx->chan);
unsigned long flags;
dma_cookie_t cookie;

spin_lock_irqsave(&cohc->lock, flags);

tx->cookie = coh901318_assign_cookie(cohc, cohd);
cookie = dma_cookie_assign(tx);

coh901318_desc_queue(cohc, cohd);

spin_unlock_irqrestore(&cohc->lock, flags);

return tx->cookie;
return cookie;
}

static struct dma_async_tx_descriptor *
Expand Down
20 changes: 20 additions & 0 deletions drivers/dma/dmaengine.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,24 @@

#include <linux/dmaengine.h>

/**
* dma_cookie_assign - assign a DMA engine cookie to the descriptor
* @tx: descriptor needing cookie
*
* Assign a unique non-zero per-channel cookie to the descriptor.
* Note: caller is expected to hold a lock to prevent concurrency.
*/
static inline dma_cookie_t dma_cookie_assign(struct dma_async_tx_descriptor *tx)
{
struct dma_chan *chan = tx->chan;
dma_cookie_t cookie;

cookie = chan->cookie + 1;
if (cookie < DMA_MIN_COOKIE)
cookie = DMA_MIN_COOKIE;
tx->cookie = chan->cookie = cookie;

return cookie;
}

#endif
17 changes: 1 addition & 16 deletions drivers/dma/dw_dmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,21 +157,6 @@ static void dwc_desc_put(struct dw_dma_chan *dwc, struct dw_desc *desc)
}
}

/* Called with dwc->lock held and bh disabled */
static dma_cookie_t
dwc_assign_cookie(struct dw_dma_chan *dwc, struct dw_desc *desc)
{
dma_cookie_t cookie = dwc->chan.cookie;

if (++cookie < 0)
cookie = 1;

dwc->chan.cookie = cookie;
desc->txd.cookie = cookie;

return cookie;
}

static void dwc_initialize(struct dw_dma_chan *dwc)
{
struct dw_dma *dw = to_dw_dma(dwc->chan.device);
Expand Down Expand Up @@ -603,7 +588,7 @@ static dma_cookie_t dwc_tx_submit(struct dma_async_tx_descriptor *tx)
unsigned long flags;

spin_lock_irqsave(&dwc->lock, flags);
cookie = dwc_assign_cookie(dwc, desc);
cookie = dma_cookie_assign(tx);

/*
* REVISIT: We should attempt to chain as many descriptors as
Expand Down
9 changes: 1 addition & 8 deletions drivers/dma/ep93xx_dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -783,17 +783,10 @@ static dma_cookie_t ep93xx_dma_tx_submit(struct dma_async_tx_descriptor *tx)
unsigned long flags;

spin_lock_irqsave(&edmac->lock, flags);

cookie = edmac->chan.cookie;

if (++cookie < 0)
cookie = 1;
cookie = dma_cookie_assign(tx);

desc = container_of(tx, struct ep93xx_dma_desc, txd);

edmac->chan.cookie = cookie;
desc->txd.cookie = cookie;

/*
* If nothing is currently prosessed, we push this descriptor
* directly to the hardware. Otherwise we put the descriptor
Expand Down
9 changes: 1 addition & 8 deletions drivers/dma/fsldma.c
Original file line number Diff line number Diff line change
Expand Up @@ -414,17 +414,10 @@ static dma_cookie_t fsl_dma_tx_submit(struct dma_async_tx_descriptor *tx)
* assign cookies to all of the software descriptors
* that make up this transaction
*/
cookie = chan->common.cookie;
list_for_each_entry(child, &desc->tx_list, node) {
cookie++;
if (cookie < DMA_MIN_COOKIE)
cookie = DMA_MIN_COOKIE;

child->async_tx.cookie = cookie;
cookie = dma_cookie_assign(&child->async_tx);
}

chan->common.cookie = cookie;

/* put this transaction onto the tail of the pending queue */
append_ld_queue(chan, desc);

Expand Down
15 changes: 1 addition & 14 deletions drivers/dma/imx-dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,27 +165,14 @@ static enum dma_status imxdma_tx_status(struct dma_chan *chan,
return ret;
}

static dma_cookie_t imxdma_assign_cookie(struct imxdma_channel *imxdma)
{
dma_cookie_t cookie = imxdma->chan.cookie;

if (++cookie < 0)
cookie = 1;

imxdma->chan.cookie = cookie;
imxdma->desc.cookie = cookie;

return cookie;
}

static dma_cookie_t imxdma_tx_submit(struct dma_async_tx_descriptor *tx)
{
struct imxdma_channel *imxdmac = to_imxdma_chan(tx->chan);
dma_cookie_t cookie;

spin_lock_irq(&imxdmac->lock);

cookie = imxdma_assign_cookie(imxdmac);
cookie = dma_cookie_assign(tx);

spin_unlock_irq(&imxdmac->lock);

Expand Down
16 changes: 1 addition & 15 deletions drivers/dma/imx-sdma.c
Original file line number Diff line number Diff line change
Expand Up @@ -815,19 +815,6 @@ static int sdma_request_channel(struct sdma_channel *sdmac)
return ret;
}

static dma_cookie_t sdma_assign_cookie(struct sdma_channel *sdmac)
{
dma_cookie_t cookie = sdmac->chan.cookie;

if (++cookie < 0)
cookie = 1;

sdmac->chan.cookie = cookie;
sdmac->desc.cookie = cookie;

return cookie;
}

static struct sdma_channel *to_sdma_chan(struct dma_chan *chan)
{
return container_of(chan, struct sdma_channel, chan);
Expand All @@ -841,7 +828,7 @@ static dma_cookie_t sdma_tx_submit(struct dma_async_tx_descriptor *tx)

spin_lock_irqsave(&sdmac->lock, flags);

cookie = sdma_assign_cookie(sdmac);
cookie = dma_cookie_assign(tx);

spin_unlock_irqrestore(&sdmac->lock, flags);

Expand Down Expand Up @@ -1140,7 +1127,6 @@ static void sdma_issue_pending(struct dma_chan *chan)
struct sdma_engine *sdma = sdmac->sdma;

if (sdmac->status == DMA_IN_PROGRESS)
sdma_enable_channel(sdma, sdmac->channel);
}

#define SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1 34
Expand Down
9 changes: 1 addition & 8 deletions drivers/dma/intel_mid_dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -436,14 +436,7 @@ static dma_cookie_t intel_mid_dma_tx_submit(struct dma_async_tx_descriptor *tx)
dma_cookie_t cookie;

spin_lock_bh(&midc->lock);
cookie = midc->chan.cookie;

if (++cookie < 0)
cookie = 1;

midc->chan.cookie = cookie;
desc->txd.cookie = cookie;

cookie = dma_cookie_assign(tx);

if (list_empty(&midc->active_list))
list_add_tail(&desc->desc_node, &midc->active_list);
Expand Down
7 changes: 1 addition & 6 deletions drivers/dma/ioat/dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,12 +237,7 @@ static dma_cookie_t ioat1_tx_submit(struct dma_async_tx_descriptor *tx)

spin_lock_bh(&ioat->desc_lock);
/* cookie incr and addition to used_list must be atomic */
cookie = c->cookie;
cookie++;
if (cookie < 0)
cookie = 1;
c->cookie = cookie;
tx->cookie = cookie;
cookie = dma_cookie_assign(tx);
dev_dbg(to_dev(&ioat->base), "%s: cookie: %d\n", __func__, cookie);

/* write address into NextDescriptor field of last desc in chain */
Expand Down
8 changes: 2 additions & 6 deletions drivers/dma/ioat/dma_v2.c
Original file line number Diff line number Diff line change
Expand Up @@ -400,13 +400,9 @@ static dma_cookie_t ioat2_tx_submit_unlock(struct dma_async_tx_descriptor *tx)
struct dma_chan *c = tx->chan;
struct ioat2_dma_chan *ioat = to_ioat2_chan(c);
struct ioat_chan_common *chan = &ioat->base;
dma_cookie_t cookie = c->cookie;
dma_cookie_t cookie;

cookie++;
if (cookie < 0)
cookie = 1;
tx->cookie = cookie;
c->cookie = cookie;
cookie = dma_cookie_assign(tx);
dev_dbg(to_dev(&ioat->base), "%s: cookie: %d\n", __func__, cookie);

if (!test_and_set_bit(IOAT_COMPLETION_PENDING, &chan->state))
Expand Down
14 changes: 1 addition & 13 deletions drivers/dma/iop-adma.c
Original file line number Diff line number Diff line change
Expand Up @@ -440,18 +440,6 @@ iop_adma_alloc_slots(struct iop_adma_chan *iop_chan, int num_slots,
return NULL;
}

static dma_cookie_t
iop_desc_assign_cookie(struct iop_adma_chan *iop_chan,
struct iop_adma_desc_slot *desc)
{
dma_cookie_t cookie = iop_chan->common.cookie;
cookie++;
if (cookie < 0)
cookie = 1;
iop_chan->common.cookie = desc->async_tx.cookie = cookie;
return cookie;
}

static void iop_adma_check_threshold(struct iop_adma_chan *iop_chan)
{
dev_dbg(iop_chan->device->common.dev, "pending: %d\n",
Expand Down Expand Up @@ -479,7 +467,7 @@ iop_adma_tx_submit(struct dma_async_tx_descriptor *tx)
slots_per_op = grp_start->slots_per_op;

spin_lock_bh(&iop_chan->lock);
cookie = iop_desc_assign_cookie(iop_chan, sw_desc);
cookie = dma_cookie_assign(tx);

old_chain_tail = list_entry(iop_chan->chain.prev,
struct iop_adma_desc_slot, chain_node);
Expand Down
9 changes: 1 addition & 8 deletions drivers/dma/ipu/ipu_idmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -867,14 +867,7 @@ static dma_cookie_t idmac_tx_submit(struct dma_async_tx_descriptor *tx)

dev_dbg(dev, "Submitting sg %p\n", &desc->sg[0]);

cookie = ichan->dma_chan.cookie;

if (++cookie < 0)
cookie = 1;

/* from dmaengine.h: "last cookie value returned to client" */
ichan->dma_chan.cookie = cookie;
tx->cookie = cookie;
cookie = dma_cookie_assign(tx);

/* ipu->lock can be taken under ichan->lock, but not v.v. */
spin_lock_irqsave(&ichan->lock, flags);
Expand Down
8 changes: 1 addition & 7 deletions drivers/dma/mpc512x_dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -439,13 +439,7 @@ static dma_cookie_t mpc_dma_tx_submit(struct dma_async_tx_descriptor *txd)
mpc_dma_execute(mchan);

/* Update cookie */
cookie = mchan->chan.cookie + 1;
if (cookie <= 0)
cookie = 1;

mchan->chan.cookie = cookie;
mdesc->desc.cookie = cookie;

cookie = dma_cookie_assign(txd);
spin_unlock_irqrestore(&mchan->lock, flags);

return cookie;
Expand Down
14 changes: 1 addition & 13 deletions drivers/dma/mv_xor.c
Original file line number Diff line number Diff line change
Expand Up @@ -536,18 +536,6 @@ mv_xor_alloc_slots(struct mv_xor_chan *mv_chan, int num_slots,
return NULL;
}

static dma_cookie_t
mv_desc_assign_cookie(struct mv_xor_chan *mv_chan,
struct mv_xor_desc_slot *desc)
{
dma_cookie_t cookie = mv_chan->common.cookie;

if (++cookie < 0)
cookie = 1;
mv_chan->common.cookie = desc->async_tx.cookie = cookie;
return cookie;
}

/************************ DMA engine API functions ****************************/
static dma_cookie_t
mv_xor_tx_submit(struct dma_async_tx_descriptor *tx)
Expand All @@ -565,7 +553,7 @@ mv_xor_tx_submit(struct dma_async_tx_descriptor *tx)
grp_start = sw_desc->group_head;

spin_lock_bh(&mv_chan->lock);
cookie = mv_desc_assign_cookie(mv_chan, sw_desc);
cookie = dma_cookie_assign(tx);

if (list_empty(&mv_chan->chain))
list_splice_init(&sw_desc->tx_list, &mv_chan->chain);
Expand Down
Loading

0 comments on commit 884485e

Please sign in to comment.