Re: [PATCH] dmaengine: qcom_bam_dma: Add descriptor flag APIs

From: Vinod Koul
Date: Fri May 02 2014 - 12:41:23 EST


On Thu, Apr 17, 2014 at 05:04:02PM -0500, Andy Gross wrote:
> This patch adds APIs that allow for BAM hardware flags to be set per
> descriptor. Each one of the new flags informs the attached peripheral of a
> special behavior that is required.
>
> The EOT flag requests that the peripheral assert an end of transaction interrupt
> when that descriptor is complete. It also results in special signaling protocol
> that is used between the attached peripheral and the core using the DMA
> controller.
DMA_PREP_INTERRUPT ??

>
> The NWD flag requests that the peripheral wait until the data has been fully
> processed before signaling an interrupt.
interrupt for transaction complete or DMA request?

--
~Vinod

>
> The CMD flag informs the peripheral that the descriptor payload contains
> command descriptors and not data descriptors.
>
> Signed-off-by: Andy Gross <agross@xxxxxxxxxxxxxx>
> ---
> drivers/dma/qcom_bam_dma.c | 48 ++++++++++++++++++++++++++++++++++++--
> include/linux/dma/qcom_bam_dma.h | 23 ++++++++++++++++++
> 2 files changed, 69 insertions(+), 2 deletions(-)
> create mode 100644 include/linux/dma/qcom_bam_dma.h
>
> diff --git a/drivers/dma/qcom_bam_dma.c b/drivers/dma/qcom_bam_dma.c
> index 02f7fef..f6c8ef1 100644
> --- a/drivers/dma/qcom_bam_dma.c
> +++ b/drivers/dma/qcom_bam_dma.c
> @@ -61,12 +61,18 @@ struct bam_desc_hw {
> #define DESC_FLAG_INT BIT(15)
> #define DESC_FLAG_EOT BIT(14)
> #define DESC_FLAG_EOB BIT(13)
> +#define DESC_FLAG_NWD BIT(12)
> +#define DESC_FLAG_CMD BIT(11)
>
> struct bam_async_desc {
> struct virt_dma_desc vd;
>
> u32 num_desc;
> u32 xfer_len;
> +
> + /* transaction flags, EOT|EOB|NWD|CMD */
> + u16 flags;
> +
> struct bam_desc_hw *curr_desc;
>
> enum dma_transfer_direction dir;
> @@ -800,6 +806,34 @@ static void bam_apply_new_config(struct bam_chan *bchan,
> bchan->reconfigure = 0;
> }
>
> +void qcom_bam_set_desc_eot(struct dma_async_tx_descriptor *txd)
> +{
> + struct bam_async_desc *async_desc = container_of(txd,
> + struct bam_async_desc, vd.tx);
> +
> + async_desc->flags |= DESC_FLAG_EOT;
> +}
> +EXPORT_SYMBOL(qcom_bam_set_desc_eot);
> +
> +void qcom_bam_set_desc_cmd(struct dma_async_tx_descriptor *txd)
> +{
> + struct bam_async_desc *async_desc = container_of(txd,
> + struct bam_async_desc, vd.tx);
> +
> + async_desc->flags |= DESC_FLAG_CMD;
> +}
> +EXPORT_SYMBOL(qcom_bam_set_desc_cmd);
> +
> +void qcom_bam_set_desc_nwd(struct dma_async_tx_descriptor *txd)
> +{
> + struct bam_async_desc *async_desc = container_of(txd,
> + struct bam_async_desc, vd.tx);
> +
> + async_desc->flags |= DESC_FLAG_NWD;
> +}
> +EXPORT_SYMBOL(qcom_bam_set_desc_nwd);
> +
> +
> /**
> * bam_start_dma - start next transaction
> * @bchan - bam dma channel
> @@ -812,6 +846,7 @@ static void bam_start_dma(struct bam_chan *bchan)
> struct bam_desc_hw *desc;
> struct bam_desc_hw *fifo = PTR_ALIGN(bchan->fifo_virt,
> sizeof(struct bam_desc_hw));
> + int i;
>
> lockdep_assert_held(&bchan->vc.lock);
>
> @@ -838,8 +873,17 @@ static void bam_start_dma(struct bam_chan *bchan)
> else
> async_desc->xfer_len = async_desc->num_desc;
>
> - /* set INT on last descriptor */
> - desc[async_desc->xfer_len - 1].flags |= DESC_FLAG_INT;
> + /* set command descriptor flag, if applicable */
> + if (async_desc->flags & DESC_FLAG_CMD)
> + for (i = 0; i < async_desc->xfer_len; i++)
> + desc[i].flags |= DESC_FLAG_CMD;
> +
> + /* set EOT or INT based on flag settings and if final transaction */
> + if (async_desc->flags & DESC_FLAG_EOT &&
> + async_desc->num_desc == async_desc->xfer_len)
> + desc[async_desc->xfer_len - 1].flags |= DESC_FLAG_EOT;
> + else
> + desc[async_desc->xfer_len - 1].flags |= DESC_FLAG_INT;
>
> if (bchan->tail + async_desc->xfer_len > MAX_DESCRIPTORS) {
> u32 partial = MAX_DESCRIPTORS - bchan->tail;
> diff --git a/include/linux/dma/qcom_bam_dma.h b/include/linux/dma/qcom_bam_dma.h
> new file mode 100644
> index 0000000..65a371eb
> --- /dev/null
> +++ b/include/linux/dma/qcom_bam_dma.h
> @@ -0,0 +1,23 @@
> +#ifndef _QCOM_BAM_DMA_H_
> +#define _QCOM_BAM_DMA_H_
> +/*
> + * Copyright (c) 2014, The Linux Foundation. All rights reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 and
> + * only version 2 as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + */
> +
> +#include <linux/dmaengine.h>
> +
> +void qcom_bam_set_desc_cmd(struct dma_async_tx_descriptor *);
> +void qcom_bam_set_desc_eot(struct dma_async_tx_descriptor *);
> +void qcom_bam_set_desc_nwd(struct dma_async_tx_descriptor *);
> +
> +#endif
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> hosted by The Linux Foundation
>
> --
> To unsubscribe from this list: send the line "unsubscribe dmaengine" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html

--
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/