dmaengine: advertise all channels on a device to dma_filter_fn
Allow dma_filter_fn routines to disambiguate multiple channels on a device rather than assuming that all channels on a device are equal. Cc: Maciej Sosnowski <maciej.sosnowski@intel.com> Reported-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
864498aaa9
commit
e2346677af
@ -454,10 +454,10 @@ static void dma_channel_rebalance(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct dma_chan *private_candidate(dma_cap_mask_t *mask, struct dma_device *dev)
|
static struct dma_chan *private_candidate(dma_cap_mask_t *mask, struct dma_device *dev,
|
||||||
|
dma_filter_fn fn, void *fn_param)
|
||||||
{
|
{
|
||||||
struct dma_chan *chan;
|
struct dma_chan *chan;
|
||||||
struct dma_chan *ret = NULL;
|
|
||||||
|
|
||||||
if (!__dma_device_satisfies_mask(dev, mask)) {
|
if (!__dma_device_satisfies_mask(dev, mask)) {
|
||||||
pr_debug("%s: wrong capabilities\n", __func__);
|
pr_debug("%s: wrong capabilities\n", __func__);
|
||||||
@ -479,11 +479,15 @@ static struct dma_chan *private_candidate(dma_cap_mask_t *mask, struct dma_devic
|
|||||||
__func__, dma_chan_name(chan));
|
__func__, dma_chan_name(chan));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ret = chan;
|
if (fn && !fn(chan, fn_param)) {
|
||||||
break;
|
pr_debug("%s: %s filter said false\n",
|
||||||
|
__func__, dma_chan_name(chan));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return chan;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -496,22 +500,13 @@ struct dma_chan *__dma_request_channel(dma_cap_mask_t *mask, dma_filter_fn fn, v
|
|||||||
{
|
{
|
||||||
struct dma_device *device, *_d;
|
struct dma_device *device, *_d;
|
||||||
struct dma_chan *chan = NULL;
|
struct dma_chan *chan = NULL;
|
||||||
bool ack;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
/* Find a channel */
|
/* Find a channel */
|
||||||
mutex_lock(&dma_list_mutex);
|
mutex_lock(&dma_list_mutex);
|
||||||
list_for_each_entry_safe(device, _d, &dma_device_list, global_node) {
|
list_for_each_entry_safe(device, _d, &dma_device_list, global_node) {
|
||||||
chan = private_candidate(mask, device);
|
chan = private_candidate(mask, device, fn, fn_param);
|
||||||
if (!chan)
|
if (chan) {
|
||||||
continue;
|
|
||||||
|
|
||||||
if (fn)
|
|
||||||
ack = fn(chan, fn_param);
|
|
||||||
else
|
|
||||||
ack = true;
|
|
||||||
|
|
||||||
if (ack) {
|
|
||||||
/* Found a suitable channel, try to grab, prep, and
|
/* Found a suitable channel, try to grab, prep, and
|
||||||
* return it. We first set DMA_PRIVATE to disable
|
* return it. We first set DMA_PRIVATE to disable
|
||||||
* balance_ref_count as this channel will not be
|
* balance_ref_count as this channel will not be
|
||||||
@ -529,10 +524,8 @@ struct dma_chan *__dma_request_channel(dma_cap_mask_t *mask, dma_filter_fn fn, v
|
|||||||
dma_chan_name(chan), err);
|
dma_chan_name(chan), err);
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
} else
|
chan = NULL;
|
||||||
pr_debug("%s: %s filter said false\n",
|
}
|
||||||
__func__, dma_chan_name(chan));
|
|
||||||
chan = NULL;
|
|
||||||
}
|
}
|
||||||
mutex_unlock(&dma_list_mutex);
|
mutex_unlock(&dma_list_mutex);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user