|
@@ -61,80 +61,6 @@ static void iop_adma_free_slots(struct iop_adma_desc_slot *slot)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static void
|
|
|
|
|
-iop_desc_unmap(struct iop_adma_chan *iop_chan, struct iop_adma_desc_slot *desc)
|
|
|
|
|
-{
|
|
|
|
|
- struct dma_async_tx_descriptor *tx = &desc->async_tx;
|
|
|
|
|
- struct iop_adma_desc_slot *unmap = desc->group_head;
|
|
|
|
|
- struct device *dev = &iop_chan->device->pdev->dev;
|
|
|
|
|
- u32 len = unmap->unmap_len;
|
|
|
|
|
- enum dma_ctrl_flags flags = tx->flags;
|
|
|
|
|
- u32 src_cnt;
|
|
|
|
|
- dma_addr_t addr;
|
|
|
|
|
- dma_addr_t dest;
|
|
|
|
|
-
|
|
|
|
|
- src_cnt = unmap->unmap_src_cnt;
|
|
|
|
|
- dest = iop_desc_get_dest_addr(unmap, iop_chan);
|
|
|
|
|
- if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) {
|
|
|
|
|
- enum dma_data_direction dir;
|
|
|
|
|
-
|
|
|
|
|
- if (src_cnt > 1) /* is xor? */
|
|
|
|
|
- dir = DMA_BIDIRECTIONAL;
|
|
|
|
|
- else
|
|
|
|
|
- dir = DMA_FROM_DEVICE;
|
|
|
|
|
-
|
|
|
|
|
- dma_unmap_page(dev, dest, len, dir);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) {
|
|
|
|
|
- while (src_cnt--) {
|
|
|
|
|
- addr = iop_desc_get_src_addr(unmap, iop_chan, src_cnt);
|
|
|
|
|
- if (addr == dest)
|
|
|
|
|
- continue;
|
|
|
|
|
- dma_unmap_page(dev, addr, len, DMA_TO_DEVICE);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- desc->group_head = NULL;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-static void
|
|
|
|
|
-iop_desc_unmap_pq(struct iop_adma_chan *iop_chan, struct iop_adma_desc_slot *desc)
|
|
|
|
|
-{
|
|
|
|
|
- struct dma_async_tx_descriptor *tx = &desc->async_tx;
|
|
|
|
|
- struct iop_adma_desc_slot *unmap = desc->group_head;
|
|
|
|
|
- struct device *dev = &iop_chan->device->pdev->dev;
|
|
|
|
|
- u32 len = unmap->unmap_len;
|
|
|
|
|
- enum dma_ctrl_flags flags = tx->flags;
|
|
|
|
|
- u32 src_cnt = unmap->unmap_src_cnt;
|
|
|
|
|
- dma_addr_t pdest = iop_desc_get_dest_addr(unmap, iop_chan);
|
|
|
|
|
- dma_addr_t qdest = iop_desc_get_qdest_addr(unmap, iop_chan);
|
|
|
|
|
- int i;
|
|
|
|
|
-
|
|
|
|
|
- if (tx->flags & DMA_PREP_CONTINUE)
|
|
|
|
|
- src_cnt -= 3;
|
|
|
|
|
-
|
|
|
|
|
- if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP) && !desc->pq_check_result) {
|
|
|
|
|
- dma_unmap_page(dev, pdest, len, DMA_BIDIRECTIONAL);
|
|
|
|
|
- dma_unmap_page(dev, qdest, len, DMA_BIDIRECTIONAL);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) {
|
|
|
|
|
- dma_addr_t addr;
|
|
|
|
|
-
|
|
|
|
|
- for (i = 0; i < src_cnt; i++) {
|
|
|
|
|
- addr = iop_desc_get_src_addr(unmap, iop_chan, i);
|
|
|
|
|
- dma_unmap_page(dev, addr, len, DMA_TO_DEVICE);
|
|
|
|
|
- }
|
|
|
|
|
- if (desc->pq_check_result) {
|
|
|
|
|
- dma_unmap_page(dev, pdest, len, DMA_TO_DEVICE);
|
|
|
|
|
- dma_unmap_page(dev, qdest, len, DMA_TO_DEVICE);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- desc->group_head = NULL;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
static dma_cookie_t
|
|
static dma_cookie_t
|
|
|
iop_adma_run_tx_complete_actions(struct iop_adma_desc_slot *desc,
|
|
iop_adma_run_tx_complete_actions(struct iop_adma_desc_slot *desc,
|
|
|
struct iop_adma_chan *iop_chan, dma_cookie_t cookie)
|
|
struct iop_adma_chan *iop_chan, dma_cookie_t cookie)
|
|
@@ -153,15 +79,8 @@ iop_adma_run_tx_complete_actions(struct iop_adma_desc_slot *desc,
|
|
|
tx->callback(tx->callback_param);
|
|
tx->callback(tx->callback_param);
|
|
|
|
|
|
|
|
dma_descriptor_unmap(tx);
|
|
dma_descriptor_unmap(tx);
|
|
|
- /* unmap dma addresses
|
|
|
|
|
- * (unmap_single vs unmap_page?)
|
|
|
|
|
- */
|
|
|
|
|
- if (desc->group_head && desc->unmap_len) {
|
|
|
|
|
- if (iop_desc_is_pq(desc))
|
|
|
|
|
- iop_desc_unmap_pq(iop_chan, desc);
|
|
|
|
|
- else
|
|
|
|
|
- iop_desc_unmap(iop_chan, desc);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (desc->group_head)
|
|
|
|
|
+ desc->group_head = NULL;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* run dependent operations */
|
|
/* run dependent operations */
|
|
@@ -592,7 +511,6 @@ iop_adma_prep_dma_interrupt(struct dma_chan *chan, unsigned long flags)
|
|
|
if (sw_desc) {
|
|
if (sw_desc) {
|
|
|
grp_start = sw_desc->group_head;
|
|
grp_start = sw_desc->group_head;
|
|
|
iop_desc_init_interrupt(grp_start, iop_chan);
|
|
iop_desc_init_interrupt(grp_start, iop_chan);
|
|
|
- grp_start->unmap_len = 0;
|
|
|
|
|
sw_desc->async_tx.flags = flags;
|
|
sw_desc->async_tx.flags = flags;
|
|
|
}
|
|
}
|
|
|
spin_unlock_bh(&iop_chan->lock);
|
|
spin_unlock_bh(&iop_chan->lock);
|
|
@@ -624,8 +542,6 @@ iop_adma_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dma_dest,
|
|
|
iop_desc_set_byte_count(grp_start, iop_chan, len);
|
|
iop_desc_set_byte_count(grp_start, iop_chan, len);
|
|
|
iop_desc_set_dest_addr(grp_start, iop_chan, dma_dest);
|
|
iop_desc_set_dest_addr(grp_start, iop_chan, dma_dest);
|
|
|
iop_desc_set_memcpy_src_addr(grp_start, dma_src);
|
|
iop_desc_set_memcpy_src_addr(grp_start, dma_src);
|
|
|
- sw_desc->unmap_src_cnt = 1;
|
|
|
|
|
- sw_desc->unmap_len = len;
|
|
|
|
|
sw_desc->async_tx.flags = flags;
|
|
sw_desc->async_tx.flags = flags;
|
|
|
}
|
|
}
|
|
|
spin_unlock_bh(&iop_chan->lock);
|
|
spin_unlock_bh(&iop_chan->lock);
|
|
@@ -658,8 +574,6 @@ iop_adma_prep_dma_xor(struct dma_chan *chan, dma_addr_t dma_dest,
|
|
|
iop_desc_init_xor(grp_start, src_cnt, flags);
|
|
iop_desc_init_xor(grp_start, src_cnt, flags);
|
|
|
iop_desc_set_byte_count(grp_start, iop_chan, len);
|
|
iop_desc_set_byte_count(grp_start, iop_chan, len);
|
|
|
iop_desc_set_dest_addr(grp_start, iop_chan, dma_dest);
|
|
iop_desc_set_dest_addr(grp_start, iop_chan, dma_dest);
|
|
|
- sw_desc->unmap_src_cnt = src_cnt;
|
|
|
|
|
- sw_desc->unmap_len = len;
|
|
|
|
|
sw_desc->async_tx.flags = flags;
|
|
sw_desc->async_tx.flags = flags;
|
|
|
while (src_cnt--)
|
|
while (src_cnt--)
|
|
|
iop_desc_set_xor_src_addr(grp_start, src_cnt,
|
|
iop_desc_set_xor_src_addr(grp_start, src_cnt,
|
|
@@ -695,8 +609,6 @@ iop_adma_prep_dma_xor_val(struct dma_chan *chan, dma_addr_t *dma_src,
|
|
|
grp_start->xor_check_result = result;
|
|
grp_start->xor_check_result = result;
|
|
|
pr_debug("\t%s: grp_start->xor_check_result: %p\n",
|
|
pr_debug("\t%s: grp_start->xor_check_result: %p\n",
|
|
|
__func__, grp_start->xor_check_result);
|
|
__func__, grp_start->xor_check_result);
|
|
|
- sw_desc->unmap_src_cnt = src_cnt;
|
|
|
|
|
- sw_desc->unmap_len = len;
|
|
|
|
|
sw_desc->async_tx.flags = flags;
|
|
sw_desc->async_tx.flags = flags;
|
|
|
while (src_cnt--)
|
|
while (src_cnt--)
|
|
|
iop_desc_set_zero_sum_src_addr(grp_start, src_cnt,
|
|
iop_desc_set_zero_sum_src_addr(grp_start, src_cnt,
|
|
@@ -749,8 +661,6 @@ iop_adma_prep_dma_pq(struct dma_chan *chan, dma_addr_t *dst, dma_addr_t *src,
|
|
|
dst[0] = dst[1] & 0x7;
|
|
dst[0] = dst[1] & 0x7;
|
|
|
|
|
|
|
|
iop_desc_set_pq_addr(g, dst);
|
|
iop_desc_set_pq_addr(g, dst);
|
|
|
- sw_desc->unmap_src_cnt = src_cnt;
|
|
|
|
|
- sw_desc->unmap_len = len;
|
|
|
|
|
sw_desc->async_tx.flags = flags;
|
|
sw_desc->async_tx.flags = flags;
|
|
|
for (i = 0; i < src_cnt; i++)
|
|
for (i = 0; i < src_cnt; i++)
|
|
|
iop_desc_set_pq_src_addr(g, i, src[i], scf[i]);
|
|
iop_desc_set_pq_src_addr(g, i, src[i], scf[i]);
|
|
@@ -805,8 +715,6 @@ iop_adma_prep_dma_pq_val(struct dma_chan *chan, dma_addr_t *pq, dma_addr_t *src,
|
|
|
g->pq_check_result = pqres;
|
|
g->pq_check_result = pqres;
|
|
|
pr_debug("\t%s: g->pq_check_result: %p\n",
|
|
pr_debug("\t%s: g->pq_check_result: %p\n",
|
|
|
__func__, g->pq_check_result);
|
|
__func__, g->pq_check_result);
|
|
|
- sw_desc->unmap_src_cnt = src_cnt+2;
|
|
|
|
|
- sw_desc->unmap_len = len;
|
|
|
|
|
sw_desc->async_tx.flags = flags;
|
|
sw_desc->async_tx.flags = flags;
|
|
|
while (src_cnt--)
|
|
while (src_cnt--)
|
|
|
iop_desc_set_pq_zero_sum_src_addr(g, src_cnt,
|
|
iop_desc_set_pq_zero_sum_src_addr(g, src_cnt,
|