Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx
* 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx: dmaengine: struct device - replace bus_id with dev_name(), dev_set_name() iop-adma: use iop_paranoia() for debug BUG_ONs iop-adma: add a dummy read to flush next descriptor update
This commit is contained in:
commit
4416662ece
6 changed files with 30 additions and 21 deletions
|
@ -730,7 +730,8 @@ static inline void iop_desc_set_next_desc(struct iop_adma_desc_slot *desc,
|
|||
{
|
||||
/* hw_desc->next_desc is the same location for all channels */
|
||||
union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, };
|
||||
BUG_ON(hw_desc.dma->next_desc);
|
||||
|
||||
iop_paranoia(hw_desc.dma->next_desc);
|
||||
hw_desc.dma->next_desc = next_desc_addr;
|
||||
}
|
||||
|
||||
|
@ -760,7 +761,7 @@ static inline int iop_desc_get_zero_result(struct iop_adma_desc_slot *desc)
|
|||
struct iop3xx_desc_aau *hw_desc = desc->hw_desc;
|
||||
struct iop3xx_aau_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field;
|
||||
|
||||
BUG_ON(!(desc_ctrl.tx_complete && desc_ctrl.zero_result_en));
|
||||
iop_paranoia(!(desc_ctrl.tx_complete && desc_ctrl.zero_result_en));
|
||||
return desc_ctrl.zero_result_err;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,12 @@
|
|||
|
||||
#define IOP_ADMA_SLOT_SIZE 32
|
||||
#define IOP_ADMA_THRESHOLD 4
|
||||
#ifdef DEBUG
|
||||
#define IOP_PARANOIA 1
|
||||
#else
|
||||
#define IOP_PARANOIA 0
|
||||
#endif
|
||||
#define iop_paranoia(x) BUG_ON(IOP_PARANOIA && (x))
|
||||
|
||||
/**
|
||||
* struct iop_adma_device - internal representation of an ADMA device
|
||||
|
|
|
@ -404,7 +404,8 @@ static inline void iop_desc_set_next_desc(struct iop_adma_desc_slot *desc,
|
|||
u32 next_desc_addr)
|
||||
{
|
||||
struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc;
|
||||
BUG_ON(hw_desc->next_desc);
|
||||
|
||||
iop_paranoia(hw_desc->next_desc);
|
||||
hw_desc->next_desc = next_desc_addr;
|
||||
}
|
||||
|
||||
|
|
|
@ -399,8 +399,8 @@ int dma_async_device_register(struct dma_device *device)
|
|||
chan->chan_id = chancnt++;
|
||||
chan->dev.class = &dma_devclass;
|
||||
chan->dev.parent = device->dev;
|
||||
snprintf(chan->dev.bus_id, BUS_ID_SIZE, "dma%dchan%d",
|
||||
device->dev_id, chan->chan_id);
|
||||
dev_set_name(&chan->dev, "dma%dchan%d",
|
||||
device->dev_id, chan->chan_id);
|
||||
|
||||
rc = device_register(&chan->dev);
|
||||
if (rc) {
|
||||
|
|
|
@ -20,11 +20,11 @@ static unsigned int test_buf_size = 16384;
|
|||
module_param(test_buf_size, uint, S_IRUGO);
|
||||
MODULE_PARM_DESC(test_buf_size, "Size of the memcpy test buffer");
|
||||
|
||||
static char test_channel[BUS_ID_SIZE];
|
||||
static char test_channel[20];
|
||||
module_param_string(channel, test_channel, sizeof(test_channel), S_IRUGO);
|
||||
MODULE_PARM_DESC(channel, "Bus ID of the channel to test (default: any)");
|
||||
|
||||
static char test_device[BUS_ID_SIZE];
|
||||
static char test_device[20];
|
||||
module_param_string(device, test_device, sizeof(test_device), S_IRUGO);
|
||||
MODULE_PARM_DESC(device, "Bus ID of the DMA Engine to test (default: any)");
|
||||
|
||||
|
@ -80,14 +80,14 @@ static bool dmatest_match_channel(struct dma_chan *chan)
|
|||
{
|
||||
if (test_channel[0] == '\0')
|
||||
return true;
|
||||
return strcmp(chan->dev.bus_id, test_channel) == 0;
|
||||
return strcmp(dev_name(&chan->dev), test_channel) == 0;
|
||||
}
|
||||
|
||||
static bool dmatest_match_device(struct dma_device *device)
|
||||
{
|
||||
if (test_device[0] == '\0')
|
||||
return true;
|
||||
return strcmp(device->dev->bus_id, test_device) == 0;
|
||||
return strcmp(dev_name(device->dev), test_device) == 0;
|
||||
}
|
||||
|
||||
static unsigned long dmatest_random(void)
|
||||
|
@ -332,7 +332,7 @@ static enum dma_state_client dmatest_add_channel(struct dma_chan *chan)
|
|||
|
||||
dtc = kmalloc(sizeof(struct dmatest_chan), GFP_KERNEL);
|
||||
if (!dtc) {
|
||||
pr_warning("dmatest: No memory for %s\n", chan->dev.bus_id);
|
||||
pr_warning("dmatest: No memory for %s\n", dev_name(&chan->dev));
|
||||
return DMA_NAK;
|
||||
}
|
||||
|
||||
|
@ -343,16 +343,16 @@ static enum dma_state_client dmatest_add_channel(struct dma_chan *chan)
|
|||
thread = kzalloc(sizeof(struct dmatest_thread), GFP_KERNEL);
|
||||
if (!thread) {
|
||||
pr_warning("dmatest: No memory for %s-test%u\n",
|
||||
chan->dev.bus_id, i);
|
||||
dev_name(&chan->dev), i);
|
||||
break;
|
||||
}
|
||||
thread->chan = dtc->chan;
|
||||
smp_wmb();
|
||||
thread->task = kthread_run(dmatest_func, thread, "%s-test%u",
|
||||
chan->dev.bus_id, i);
|
||||
dev_name(&chan->dev), i);
|
||||
if (IS_ERR(thread->task)) {
|
||||
pr_warning("dmatest: Failed to run thread %s-test%u\n",
|
||||
chan->dev.bus_id, i);
|
||||
dev_name(&chan->dev), i);
|
||||
kfree(thread);
|
||||
break;
|
||||
}
|
||||
|
@ -362,7 +362,7 @@ static enum dma_state_client dmatest_add_channel(struct dma_chan *chan)
|
|||
list_add_tail(&thread->node, &dtc->threads);
|
||||
}
|
||||
|
||||
pr_info("dmatest: Started %u threads using %s\n", i, chan->dev.bus_id);
|
||||
pr_info("dmatest: Started %u threads using %s\n", i, dev_name(&chan->dev));
|
||||
|
||||
list_add_tail(&dtc->node, &dmatest_channels);
|
||||
nr_channels++;
|
||||
|
@ -379,7 +379,7 @@ static enum dma_state_client dmatest_remove_channel(struct dma_chan *chan)
|
|||
list_del(&dtc->node);
|
||||
dmatest_cleanup_channel(dtc);
|
||||
pr_debug("dmatest: lost channel %s\n",
|
||||
chan->dev.bus_id);
|
||||
dev_name(&chan->dev));
|
||||
return DMA_ACK;
|
||||
}
|
||||
}
|
||||
|
@ -418,7 +418,7 @@ dmatest_event(struct dma_client *client, struct dma_chan *chan,
|
|||
|
||||
default:
|
||||
pr_info("dmatest: Unhandled event %u (%s)\n",
|
||||
state, chan->dev.bus_id);
|
||||
state, dev_name(&chan->dev));
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -411,6 +411,7 @@ iop_adma_tx_submit(struct dma_async_tx_descriptor *tx)
|
|||
int slot_cnt;
|
||||
int slots_per_op;
|
||||
dma_cookie_t cookie;
|
||||
dma_addr_t next_dma;
|
||||
|
||||
grp_start = sw_desc->group_head;
|
||||
slot_cnt = grp_start->slot_cnt;
|
||||
|
@ -425,12 +426,12 @@ iop_adma_tx_submit(struct dma_async_tx_descriptor *tx)
|
|||
&old_chain_tail->chain_node);
|
||||
|
||||
/* fix up the hardware chain */
|
||||
iop_desc_set_next_desc(old_chain_tail, grp_start->async_tx.phys);
|
||||
next_dma = grp_start->async_tx.phys;
|
||||
iop_desc_set_next_desc(old_chain_tail, next_dma);
|
||||
BUG_ON(iop_desc_get_next_desc(old_chain_tail) != next_dma); /* flush */
|
||||
|
||||
/* 1/ don't add pre-chained descriptors
|
||||
* 2/ dummy read to flush next_desc write
|
||||
*/
|
||||
BUG_ON(iop_desc_get_next_desc(sw_desc));
|
||||
/* check for pre-chained descriptors */
|
||||
iop_paranoia(iop_desc_get_next_desc(sw_desc));
|
||||
|
||||
/* increment the pending count by the number of slots
|
||||
* memcpy operations have a 1:1 (slot:operation) relation
|
||||
|
|
Loading…
Reference in a new issue