From: vinod.koul@intel.com (Vinod Koul)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 4/4] dmaengine: xilinx_vdma: Improve channel idle checking
Date: Tue, 23 Feb 2016 08:41:30 +0530 [thread overview]
Message-ID: <20160223031130.GI17690@localhost> (raw)
In-Reply-To: <1456120477-32134-4-git-send-email-appanad@xilinx.com>
On Mon, Feb 22, 2016 at 11:24:37AM +0530, Kedareswara rao Appana wrote:
> This patch improves the channel idle cheking by introduing
^^^^^^^^^
typo
> a new varibale in chan private structure.
^^^^^^^
here too :(
and there is no description how this improvement is achieved and why
>
> Signed-off-by: Kedareswara rao Appana <appanad@xilinx.com>
> ---
> Changes for v2:
> ---> splitted the changes into multiple patches.
>
> drivers/dma/xilinx/xilinx_vdma.c | 41 ++++++++--------------------------------
> 1 file changed, 8 insertions(+), 33 deletions(-)
>
> diff --git a/drivers/dma/xilinx/xilinx_vdma.c b/drivers/dma/xilinx/xilinx_vdma.c
> index 8db07f7..51686d1 100644
> --- a/drivers/dma/xilinx/xilinx_vdma.c
> +++ b/drivers/dma/xilinx/xilinx_vdma.c
> @@ -202,6 +202,7 @@ struct xilinx_vdma_tx_descriptor {
> * @has_sg: Support scatter transfers
> * @genlock: Support genlock mode
> * @err: Channel has errors
> + * @idle: Check for channel idle
> * @tasklet: Cleanup work after irq
> * @config: Device configuration info
> * @flush_on_fsync: Flush on Frame sync
> @@ -225,6 +226,7 @@ struct xilinx_vdma_chan {
> bool has_sg;
> bool genlock;
> bool err;
> + bool idle;
> struct tasklet_struct tasklet;
> struct xilinx_vdma_config config;
> bool flush_on_fsync;
> @@ -519,32 +521,6 @@ static enum dma_status xilinx_vdma_tx_status(struct dma_chan *dchan,
> }
>
> /**
> - * xilinx_vdma_is_running - Check if VDMA channel is running
> - * @chan: Driver specific VDMA channel
> - *
> - * Return: '1' if running, '0' if not.
> - */
> -static bool xilinx_vdma_is_running(struct xilinx_vdma_chan *chan)
> -{
> - return !(vdma_ctrl_read(chan, XILINX_VDMA_REG_DMASR) &
> - XILINX_VDMA_DMASR_HALTED) &&
> - (vdma_ctrl_read(chan, XILINX_VDMA_REG_DMACR) &
> - XILINX_VDMA_DMACR_RUNSTOP);
> -}
> -
> -/**
> - * xilinx_vdma_is_idle - Check if VDMA channel is idle
> - * @chan: Driver specific VDMA channel
> - *
> - * Return: '1' if idle, '0' if not.
> - */
> -static bool xilinx_vdma_is_idle(struct xilinx_vdma_chan *chan)
> -{
> - return vdma_ctrl_read(chan, XILINX_VDMA_REG_DMASR) &
> - XILINX_VDMA_DMASR_IDLE;
> -}
> -
> -/**
> * xilinx_vdma_halt - Halt VDMA channel
> * @chan: Driver specific VDMA channel
> */
> @@ -614,6 +590,9 @@ static void xilinx_vdma_start_transfer(struct xilinx_vdma_chan *chan)
> if (list_empty(&chan->pending_list))
> return;
>
> + if (!chan->idle)
> + return;
> +
> desc = list_first_entry(&chan->pending_list,
> struct xilinx_vdma_tx_descriptor, node);
> tail_desc = list_last_entry(&chan->pending_list,
> @@ -622,13 +601,6 @@ static void xilinx_vdma_start_transfer(struct xilinx_vdma_chan *chan)
> tail_segment = list_last_entry(&tail_desc->segments,
> struct xilinx_vdma_tx_segment, node);
>
> - /* If it is SG mode and hardware is busy, cannot submit */
> - if (chan->has_sg && xilinx_vdma_is_running(chan) &&
> - !xilinx_vdma_is_idle(chan)) {
> - dev_dbg(chan->dev, "DMA controller still busy\n");
> - return;
> - }
> -
> /*
> * If hardware is idle, then all descriptors on the running lists are
> * done, start new transfers
> @@ -708,6 +680,7 @@ static void xilinx_vdma_start_transfer(struct xilinx_vdma_chan *chan)
>
> list_splice_tail_init(&chan->pending_list, &chan->active_list);
> chan->desc_pendingcount = 0;
> + chan->idle = false;
> }
>
> /**
> @@ -854,6 +827,7 @@ static irqreturn_t xilinx_vdma_irq_handler(int irq, void *data)
> if (status & XILINX_VDMA_DMASR_FRM_CNT_IRQ) {
> spin_lock(&chan->lock);
> xilinx_vdma_complete_descriptor(chan);
> + chan->idle = true;
> xilinx_vdma_start_transfer(chan);
> spin_unlock(&chan->lock);
> }
> @@ -1212,6 +1186,7 @@ static int xilinx_vdma_chan_probe(struct xilinx_vdma_device *xdev,
>
> list_add_tail(&chan->common.device_node, &xdev->common.channels);
> xdev->chan[chan->id] = chan;
> + chan->idle = true;
>
> /* Reset the channel */
> err = xilinx_vdma_chan_reset(chan);
> --
> 2.1.2
>
--
~Vinod
WARNING: multiple messages have this Message-ID (diff)
From: Vinod Koul <vinod.koul@intel.com>
To: Kedareswara rao Appana <appana.durga.rao@xilinx.com>
Cc: dan.j.williams@intel.com, michal.simek@xilinx.com,
soren.brinkmann@xilinx.com, appanad@xilinx.com,
moritz.fischer@ettus.com, laurent.pinchart@ideasonboard.com,
luis@debethencourt.com, anirudh@xilinx.com,
dmaengine@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 4/4] dmaengine: xilinx_vdma: Improve channel idle checking
Date: Tue, 23 Feb 2016 08:41:30 +0530 [thread overview]
Message-ID: <20160223031130.GI17690@localhost> (raw)
In-Reply-To: <1456120477-32134-4-git-send-email-appanad@xilinx.com>
On Mon, Feb 22, 2016 at 11:24:37AM +0530, Kedareswara rao Appana wrote:
> This patch improves the channel idle cheking by introduing
^^^^^^^^^
typo
> a new varibale in chan private structure.
^^^^^^^
here too :(
and there is no description how this improvement is achieved and why
>
> Signed-off-by: Kedareswara rao Appana <appanad@xilinx.com>
> ---
> Changes for v2:
> ---> splitted the changes into multiple patches.
>
> drivers/dma/xilinx/xilinx_vdma.c | 41 ++++++++--------------------------------
> 1 file changed, 8 insertions(+), 33 deletions(-)
>
> diff --git a/drivers/dma/xilinx/xilinx_vdma.c b/drivers/dma/xilinx/xilinx_vdma.c
> index 8db07f7..51686d1 100644
> --- a/drivers/dma/xilinx/xilinx_vdma.c
> +++ b/drivers/dma/xilinx/xilinx_vdma.c
> @@ -202,6 +202,7 @@ struct xilinx_vdma_tx_descriptor {
> * @has_sg: Support scatter transfers
> * @genlock: Support genlock mode
> * @err: Channel has errors
> + * @idle: Check for channel idle
> * @tasklet: Cleanup work after irq
> * @config: Device configuration info
> * @flush_on_fsync: Flush on Frame sync
> @@ -225,6 +226,7 @@ struct xilinx_vdma_chan {
> bool has_sg;
> bool genlock;
> bool err;
> + bool idle;
> struct tasklet_struct tasklet;
> struct xilinx_vdma_config config;
> bool flush_on_fsync;
> @@ -519,32 +521,6 @@ static enum dma_status xilinx_vdma_tx_status(struct dma_chan *dchan,
> }
>
> /**
> - * xilinx_vdma_is_running - Check if VDMA channel is running
> - * @chan: Driver specific VDMA channel
> - *
> - * Return: '1' if running, '0' if not.
> - */
> -static bool xilinx_vdma_is_running(struct xilinx_vdma_chan *chan)
> -{
> - return !(vdma_ctrl_read(chan, XILINX_VDMA_REG_DMASR) &
> - XILINX_VDMA_DMASR_HALTED) &&
> - (vdma_ctrl_read(chan, XILINX_VDMA_REG_DMACR) &
> - XILINX_VDMA_DMACR_RUNSTOP);
> -}
> -
> -/**
> - * xilinx_vdma_is_idle - Check if VDMA channel is idle
> - * @chan: Driver specific VDMA channel
> - *
> - * Return: '1' if idle, '0' if not.
> - */
> -static bool xilinx_vdma_is_idle(struct xilinx_vdma_chan *chan)
> -{
> - return vdma_ctrl_read(chan, XILINX_VDMA_REG_DMASR) &
> - XILINX_VDMA_DMASR_IDLE;
> -}
> -
> -/**
> * xilinx_vdma_halt - Halt VDMA channel
> * @chan: Driver specific VDMA channel
> */
> @@ -614,6 +590,9 @@ static void xilinx_vdma_start_transfer(struct xilinx_vdma_chan *chan)
> if (list_empty(&chan->pending_list))
> return;
>
> + if (!chan->idle)
> + return;
> +
> desc = list_first_entry(&chan->pending_list,
> struct xilinx_vdma_tx_descriptor, node);
> tail_desc = list_last_entry(&chan->pending_list,
> @@ -622,13 +601,6 @@ static void xilinx_vdma_start_transfer(struct xilinx_vdma_chan *chan)
> tail_segment = list_last_entry(&tail_desc->segments,
> struct xilinx_vdma_tx_segment, node);
>
> - /* If it is SG mode and hardware is busy, cannot submit */
> - if (chan->has_sg && xilinx_vdma_is_running(chan) &&
> - !xilinx_vdma_is_idle(chan)) {
> - dev_dbg(chan->dev, "DMA controller still busy\n");
> - return;
> - }
> -
> /*
> * If hardware is idle, then all descriptors on the running lists are
> * done, start new transfers
> @@ -708,6 +680,7 @@ static void xilinx_vdma_start_transfer(struct xilinx_vdma_chan *chan)
>
> list_splice_tail_init(&chan->pending_list, &chan->active_list);
> chan->desc_pendingcount = 0;
> + chan->idle = false;
> }
>
> /**
> @@ -854,6 +827,7 @@ static irqreturn_t xilinx_vdma_irq_handler(int irq, void *data)
> if (status & XILINX_VDMA_DMASR_FRM_CNT_IRQ) {
> spin_lock(&chan->lock);
> xilinx_vdma_complete_descriptor(chan);
> + chan->idle = true;
> xilinx_vdma_start_transfer(chan);
> spin_unlock(&chan->lock);
> }
> @@ -1212,6 +1186,7 @@ static int xilinx_vdma_chan_probe(struct xilinx_vdma_device *xdev,
>
> list_add_tail(&chan->common.device_node, &xdev->common.channels);
> xdev->chan[chan->id] = chan;
> + chan->idle = true;
>
> /* Reset the channel */
> err = xilinx_vdma_chan_reset(chan);
> --
> 2.1.2
>
--
~Vinod
next prev parent reply other threads:[~2016-02-23 3:11 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-22 5:54 [PATCH v2 1/4] dmaengine: xilinx_vdma: Improve SG engine handling Kedareswara rao Appana
2016-02-22 5:54 ` Kedareswara rao Appana
2016-02-22 5:54 ` [PATCH v2 2/4] dmaengine: xilinx_vdma: Simplify spin lock handling Kedareswara rao Appana
2016-02-22 5:54 ` Kedareswara rao Appana
2016-02-23 3:09 ` Vinod Koul
2016-02-23 3:09 ` Vinod Koul
2016-02-23 4:19 ` Appana Durga Kedareswara Rao
2016-02-23 4:19 ` Appana Durga Kedareswara Rao
2016-02-22 5:54 ` [PATCH v2 3/4] dmaengine: xilinx_vdma: Fix issues with non-parking mode Kedareswara rao Appana
2016-02-22 5:54 ` Kedareswara rao Appana
2016-02-22 5:54 ` [PATCH v2 4/4] dmaengine: xilinx_vdma: Improve channel idle checking Kedareswara rao Appana
2016-02-22 5:54 ` Kedareswara rao Appana
2016-02-23 3:11 ` Vinod Koul [this message]
2016-02-23 3:11 ` Vinod Koul
2016-02-23 4:21 ` Appana Durga Kedareswara Rao
2016-02-23 4:21 ` Appana Durga Kedareswara Rao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160223031130.GI17690@localhost \
--to=vinod.koul@intel.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.