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:
@@ -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 */
|
/* hw_desc->next_desc is the same location for all channels */
|
||||||
union iop3xx_desc hw_desc = { .ptr = desc->hw_desc, };
|
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;
|
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_desc_aau *hw_desc = desc->hw_desc;
|
||||||
struct iop3xx_aau_desc_ctrl desc_ctrl = hw_desc->desc_ctrl_field;
|
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;
|
return desc_ctrl.zero_result_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -23,6 +23,12 @@
|
|||||||
|
|
||||||
#define IOP_ADMA_SLOT_SIZE 32
|
#define IOP_ADMA_SLOT_SIZE 32
|
||||||
#define IOP_ADMA_THRESHOLD 4
|
#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
|
* 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)
|
u32 next_desc_addr)
|
||||||
{
|
{
|
||||||
struct iop13xx_adma_desc_hw *hw_desc = desc->hw_desc;
|
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;
|
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->chan_id = chancnt++;
|
||||||
chan->dev.class = &dma_devclass;
|
chan->dev.class = &dma_devclass;
|
||||||
chan->dev.parent = device->dev;
|
chan->dev.parent = device->dev;
|
||||||
snprintf(chan->dev.bus_id, BUS_ID_SIZE, "dma%dchan%d",
|
dev_set_name(&chan->dev, "dma%dchan%d",
|
||||||
device->dev_id, chan->chan_id);
|
device->dev_id, chan->chan_id);
|
||||||
|
|
||||||
rc = device_register(&chan->dev);
|
rc = device_register(&chan->dev);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
|
@@ -20,11 +20,11 @@ static unsigned int test_buf_size = 16384;
|
|||||||
module_param(test_buf_size, uint, S_IRUGO);
|
module_param(test_buf_size, uint, S_IRUGO);
|
||||||
MODULE_PARM_DESC(test_buf_size, "Size of the memcpy test buffer");
|
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_param_string(channel, test_channel, sizeof(test_channel), S_IRUGO);
|
||||||
MODULE_PARM_DESC(channel, "Bus ID of the channel to test (default: any)");
|
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_param_string(device, test_device, sizeof(test_device), S_IRUGO);
|
||||||
MODULE_PARM_DESC(device, "Bus ID of the DMA Engine to test (default: any)");
|
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')
|
if (test_channel[0] == '\0')
|
||||||
return true;
|
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)
|
static bool dmatest_match_device(struct dma_device *device)
|
||||||
{
|
{
|
||||||
if (test_device[0] == '\0')
|
if (test_device[0] == '\0')
|
||||||
return true;
|
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)
|
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);
|
dtc = kmalloc(sizeof(struct dmatest_chan), GFP_KERNEL);
|
||||||
if (!dtc) {
|
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;
|
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);
|
thread = kzalloc(sizeof(struct dmatest_thread), GFP_KERNEL);
|
||||||
if (!thread) {
|
if (!thread) {
|
||||||
pr_warning("dmatest: No memory for %s-test%u\n",
|
pr_warning("dmatest: No memory for %s-test%u\n",
|
||||||
chan->dev.bus_id, i);
|
dev_name(&chan->dev), i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
thread->chan = dtc->chan;
|
thread->chan = dtc->chan;
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
thread->task = kthread_run(dmatest_func, thread, "%s-test%u",
|
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)) {
|
if (IS_ERR(thread->task)) {
|
||||||
pr_warning("dmatest: Failed to run thread %s-test%u\n",
|
pr_warning("dmatest: Failed to run thread %s-test%u\n",
|
||||||
chan->dev.bus_id, i);
|
dev_name(&chan->dev), i);
|
||||||
kfree(thread);
|
kfree(thread);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -362,7 +362,7 @@ static enum dma_state_client dmatest_add_channel(struct dma_chan *chan)
|
|||||||
list_add_tail(&thread->node, &dtc->threads);
|
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);
|
list_add_tail(&dtc->node, &dmatest_channels);
|
||||||
nr_channels++;
|
nr_channels++;
|
||||||
@@ -379,7 +379,7 @@ static enum dma_state_client dmatest_remove_channel(struct dma_chan *chan)
|
|||||||
list_del(&dtc->node);
|
list_del(&dtc->node);
|
||||||
dmatest_cleanup_channel(dtc);
|
dmatest_cleanup_channel(dtc);
|
||||||
pr_debug("dmatest: lost channel %s\n",
|
pr_debug("dmatest: lost channel %s\n",
|
||||||
chan->dev.bus_id);
|
dev_name(&chan->dev));
|
||||||
return DMA_ACK;
|
return DMA_ACK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -418,7 +418,7 @@ dmatest_event(struct dma_client *client, struct dma_chan *chan,
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
pr_info("dmatest: Unhandled event %u (%s)\n",
|
pr_info("dmatest: Unhandled event %u (%s)\n",
|
||||||
state, chan->dev.bus_id);
|
state, dev_name(&chan->dev));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -411,6 +411,7 @@ iop_adma_tx_submit(struct dma_async_tx_descriptor *tx)
|
|||||||
int slot_cnt;
|
int slot_cnt;
|
||||||
int slots_per_op;
|
int slots_per_op;
|
||||||
dma_cookie_t cookie;
|
dma_cookie_t cookie;
|
||||||
|
dma_addr_t next_dma;
|
||||||
|
|
||||||
grp_start = sw_desc->group_head;
|
grp_start = sw_desc->group_head;
|
||||||
slot_cnt = grp_start->slot_cnt;
|
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);
|
&old_chain_tail->chain_node);
|
||||||
|
|
||||||
/* fix up the hardware chain */
|
/* 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
|
/* check for pre-chained descriptors */
|
||||||
* 2/ dummy read to flush next_desc write
|
iop_paranoia(iop_desc_get_next_desc(sw_desc));
|
||||||
*/
|
|
||||||
BUG_ON(iop_desc_get_next_desc(sw_desc));
|
|
||||||
|
|
||||||
/* increment the pending count by the number of slots
|
/* increment the pending count by the number of slots
|
||||||
* memcpy operations have a 1:1 (slot:operation) relation
|
* memcpy operations have a 1:1 (slot:operation) relation
|
||||||
|
Reference in New Issue
Block a user