Skip to content

Commit

Permalink
dmaengine: Add metadat_ops for dma_async_tx_descriptor
Browse files Browse the repository at this point in the history
If the DMA supports per descriptor metadata it can implement the attach,
get_ptr/set_len callbacks.

Client drivers must only use either attach or get_ptr/set_len to avoid
miss configuration.

Wrappers are also added for the metadata_ops:
dmaengine_desc_attach_metadata()
dmaengine_desc_get_metadata_ptr()
dmaengine_desc_set_metadata_len()

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
  • Loading branch information
Peter Ujfalusi authored and Tero Kristo committed Jun 15, 2018
1 parent 1b66673 commit 02e095d
Showing 1 changed file with 50 additions and 0 deletions.
50 changes: 50 additions & 0 deletions include/linux/dmaengine.h
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,18 @@ struct dmaengine_unmap_data {
dma_addr_t addr[0];
};

struct dma_async_tx_descriptor;

struct dma_descriptor_metadata_ops {
int (*attach)(struct dma_async_tx_descriptor *desc, void *data,
size_t len);

void *(*get_ptr)(struct dma_async_tx_descriptor *desc,
size_t *payload_len, size_t *max_len);
int (*set_len)(struct dma_async_tx_descriptor *desc,
size_t payload_len);
};

/**
* struct dma_async_tx_descriptor - async transaction descriptor
* ---dma generic offload fields---
Expand Down Expand Up @@ -507,6 +519,7 @@ struct dma_async_tx_descriptor {
dma_async_tx_callback_result callback_result;
void *callback_param;
struct dmaengine_unmap_data *unmap;
struct dma_descriptor_metadata_ops *metadata_ops;
#ifdef CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH
struct dma_async_tx_descriptor *next;
struct dma_async_tx_descriptor *parent;
Expand Down Expand Up @@ -928,6 +941,43 @@ static inline int dmaengine_attach_metadata(
return chan->device->device_attach_metadata(desc, data, len);
}

static inline int dmaengine_desc_attach_metadata(
struct dma_async_tx_descriptor *desc, void *data, size_t len)
{
if (!desc)
return 0;

if (!desc->metadata_ops || !desc->metadata_ops->attach)
return -ENOTSUPP;

return desc->metadata_ops->attach(desc, data, len);
}

static inline void *dmaengine_desc_get_metadata_ptr(
struct dma_async_tx_descriptor *desc, size_t *payload_len,
size_t *max_len)
{
if (!desc)
return NULL;

if (!desc->metadata_ops || !desc->metadata_ops->get_ptr)
return ERR_PTR(-ENOTSUPP);

return desc->metadata_ops->get_ptr(desc, payload_len, max_len);
}

static inline int dmaengine_desc_set_metadata_len(
struct dma_async_tx_descriptor *desc, size_t payload_len)
{
if (!desc)
return 0;

if (!desc->metadata_ops || !desc->metadata_ops->set_len)
return -ENOTSUPP;

return desc->metadata_ops->set_len(desc, payload_len);
}

/**
* dmaengine_terminate_all() - Terminate all active DMA transfers
* @chan: The channel for which to terminate the transfers
Expand Down

0 comments on commit 02e095d

Please sign in to comment.