@@ -596,6 +596,7 @@ static int ioat_enumerate_channels(struct ioatdma_device *ioat_dma)
if (xfercap_log == 0)
return 0;
dev_dbg(dev, "%s: xfercap = %d\n", __func__, 1 << xfercap_log);
+ dma->xfercap = 1 << xfercap_log;
for (i = 0; i < dma->chancnt; i++) {
ioat_chan = devm_kzalloc(dev, sizeof(*ioat_chan), GFP_KERNEL);
@@ -743,6 +743,7 @@ struct dma_device {
u32 max_burst;
bool descriptor_reuse;
enum dma_residue_granularity residue_granularity;
+ u64 xfercap; /* descriptor transfer capability limit */
int (*device_alloc_chan_resources)(struct dma_chan *chan);
void (*device_free_chan_resources)(struct dma_chan *chan);
@@ -1326,6 +1327,11 @@ struct dma_chan *dma_request_chan_by_mask(const dma_cap_mask_t *mask);
void dma_release_channel(struct dma_chan *chan);
int dma_get_slave_caps(struct dma_chan *chan, struct dma_slave_caps *caps);
+
+static inline u64 dma_get_desc_xfercap(struct dma_chan *chan)
+{
+ return chan->device->xfercap;
+}
#else
static inline struct dma_chan *dma_find_channel(enum dma_transaction_type tx_type)
{
@@ -1370,6 +1376,10 @@ static inline int dma_get_slave_caps(struct dma_chan *chan,
{
return -ENXIO;
}
+static inline u64 dma_get_desc_xfercap(struct dma_chan *chan)
+{
+ return -ENXIO;
+}
#endif
#define dma_request_slave_channel_reason(dev, name) dma_request_chan(dev, name)
Adding a function that will export the transfer capability per descriptor for a DMA device for the dmaengine subsystem. Signed-off-by: Dave Jiang <dave.jiang@intel.com> --- drivers/dma/ioat/init.c | 1 + include/linux/dmaengine.h | 10 ++++++++++ 2 files changed, 11 insertions(+)