提交 4416662e 编写于 作者: L Linus Torvalds

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
...@@ -730,7 +730,8 @@ static inline void iop_desc_set_next_desc(struct iop_adma_desc_slot *desc, ...@@ -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) ...@@ -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 @@ ...@@ -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, ...@@ -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) ...@@ -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; ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册