Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e2346677 authored by Dan Williams's avatar Dan Williams
Browse files

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: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>


parent 864498aa
Loading
Loading
Loading
Loading
+13 −20
Original line number Diff line number Diff line
@@ -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 *ret = NULL;

	if (!__dma_device_satisfies_mask(dev, mask)) {
		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));
			continue;
		}
		ret = chan;
		break;
		if (fn && !fn(chan, fn_param)) {
			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_chan *chan = NULL;
	bool ack;
	int err;

	/* Find a channel */
	mutex_lock(&dma_list_mutex);
	list_for_each_entry_safe(device, _d, &dma_device_list, global_node) {
		chan = private_candidate(mask, device);
		if (!chan)
			continue;

		if (fn)
			ack = fn(chan, fn_param);
		else
			ack = true;

		if (ack) {
		chan = private_candidate(mask, device, fn, fn_param);
		if (chan) {
			/* Found a suitable channel, try to grab, prep, and
			 * return it.  We first set DMA_PRIVATE to disable
			 * balance_ref_count as this channel will not be
@@ -529,11 +524,9 @@ struct dma_chan *__dma_request_channel(dma_cap_mask_t *mask, dma_filter_fn fn, v
				       dma_chan_name(chan), err);
			else
				break;
		} else
			pr_debug("%s: %s filter said false\n",
				 __func__, dma_chan_name(chan));
			chan = NULL;
		}
	}
	mutex_unlock(&dma_list_mutex);

	pr_debug("%s: %s (%s)\n", __func__, chan ? "success" : "fail",