linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnd Bergmann <arnd@arndb.de>
To: Sinan Kaya <okaya@codeaurora.org>
Cc: dmaengine@vger.kernel.org, timur@codeaurora.org,
	cov@codeaurora.org, jcm@redhat.com,
	Rob Herring <robh+dt@kernel.org>, Pawel Moll <pawel.moll@arm.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Ian Campbell <ijc+devicetree@hellion.org.uk>,
	Kumar Gala <galak@codeaurora.org>,
	Vinod Koul <vinod.koul@intel.com>,
	Dan Williams <dan.j.williams@intel.com>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/2] dma: add Qualcomm Technologies HIDMA channel driver
Date: Mon, 02 Nov 2015 17:33:34 +0100	[thread overview]
Message-ID: <3962829.iR3I63FEm8@wuerfel> (raw)
In-Reply-To: <56365F0D.6010508@codeaurora.org>

On Sunday 01 November 2015 13:50:53 Sinan Kaya wrote:
> 
> >> The issue is not writel_relaxed vs. writel. After I issue reset, I need
> >> wait for some time to confirm reset was done. I can use readl_polling
> >> instead of mdelay if we don't like mdelay.
> >
> > I meant that both _relaxed() and mdelay() are probably wrong here.
> 
> You are right about redundant writel_relaxed + wmb. They are effectively 
> equal to writel.

Actually, writel() is wmb()+writel_relaxed(), not the other way round:

When sending a command to a device that can start a DMA transfer,
the barrier is required to ensure that the DMA happens after previously
written data has gone from the CPU write buffers into the memory that
is used as the source for the transfer.

A barrier after the writel() has no effect, as MMIO writes are posted
on the bus.

> However, after issuing the command; I still need to wait some amount of 
> time until hardware acknowledges the commands like reset/enable/disable. 
> These are relatively faster operations happening in microseconds. That's 
> why, I have mdelay there.
> 
> I'll take a look at workqueues but it could turn out to be an overkill 
> for few microseconds.

Most devices are able to provide an interrupt for long-running commands.
Are you sure that yours is unable to do this? If so, is this a design
mistake or an implementation bug?

> >>> Reading the status probably requires a readl() rather than readl_relaxed()
> >>> to guarantee that the DMA data has arrived in memory by the time that the
> >>> register data is seen by the CPU. If using readl_relaxed() here is a valid
> >>> and required optimization, please add a comment to explain why it works
> >>> and how much you gain.
> >>
> >> I will add some description. This is a high speed peripheral. I don't
> >> like spreading barriers as candies inside the readl and writel unless I
> >> have to.
> >>
> >> According to the barriers video, I watched on youtube this should be the
> >> rule for ordering.
> >>
> >> "if you do two relaxed reads and check the results of the returned
> >> variables, ARM architecture guarantees that these two relaxed variables
> >> will get observed during the check."
> >>
> >> this is called implied ordering or something of that sort.
> >
> > My point was a bit different: while it is guaranteed that the
> > result of the readl_relaxed() is observed in order, they do not
> > guarantee that a DMA from device to memory that was started by
> > the device before the readl_relaxed() has arrived in memory
> > by the time that the readl_relaxed() result is visible to the
> > CPU and it starts accessing the memory.
> >
> I checked with the hardware designers. Hardware guarantees that by the 
> time interrupt is observed, all data transactions in flight are 
> delivered to their respective places and are visible to the CPU. I'll 
> add a comment in the code about this.

I'm curious about this. Does that mean the device is not meant for
high-performance transfers and just synchronizes the bus before
triggering the interrupt?

> > In other words, when the hardware sends you data followed by an
> > interrupt to tell you the data is there, your interrupt handler
> > can tell the driver that is waiting for this data that the DMA
> > is complete while the data itself is still in flight, e.g. waiting
> > for an IOMMU to fetch page table entries.
> >
> There is HW guarantee for ordering.
> 
> On demand paging for IOMMU is only supported for PCIe via PRI (Page 
> Request Interface) not for HIDMA. All other hardware instances work on 
> pinned DMA addresses. I'll drop a note about this too to the code as well.

I wasn't talking about paging, just fetching the IOTLB from the
preloaded page tables in RAM. This can takes several uncached memory
accesses, so it would generally be slow.


	Arnd


  parent reply	other threads:[~2015-11-02 16:34 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-30  3:08 [PATCH 1/2] dma: add Qualcomm Technologies HIDMA management driver Sinan Kaya
2015-10-30  3:08 ` [PATCH 2/2] dma: add Qualcomm Technologies HIDMA channel driver Sinan Kaya
2015-10-30  8:01   ` kbuild test robot
2015-10-30  8:07   ` kbuild test robot
2015-10-30 10:24   ` Arnd Bergmann
2015-10-30 21:42     ` Sinan Kaya
2015-10-30 21:55       ` Timur Tabi
2015-10-30 22:47         ` Arnd Bergmann
2015-10-30 22:28       ` Arnd Bergmann
2015-10-30 22:36         ` Timur Tabi
2015-10-30 22:50           ` Arnd Bergmann
2015-10-31  1:53         ` Sinan Kaya
2015-11-01 18:50         ` Sinan Kaya
2015-11-01 20:21           ` Timur Tabi
2015-11-01 20:27             ` Sinan Kaya
2015-11-02 16:33           ` Arnd Bergmann [this message]
2015-11-02 19:21             ` Sinan Kaya
2015-11-02 20:55               ` Arnd Bergmann
2015-11-03  5:29                 ` Sinan Kaya
2015-11-03 10:43                   ` Arnd Bergmann
2015-11-03 21:07                     ` Sinan Kaya
2015-11-03 21:10                       ` Arnd Bergmann
2015-10-30 14:50   ` Mark Rutland
2015-10-31  4:27     ` Sinan Kaya
2015-10-30  4:34 ` [PATCH 1/2] dma: add Qualcomm Technologies HIDMA management driver kbuild test robot
2015-10-30  4:34 ` [PATCH] dma: fix platform_no_drv_owner.cocci warnings kbuild test robot
2015-10-30  9:34 ` [PATCH 1/2] dma: add Qualcomm Technologies HIDMA management driver Arnd Bergmann
2015-10-31  6:51   ` Sinan Kaya
2015-10-31 12:53     ` Timur Tabi
2015-10-31 12:53     ` Timur Tabi
2015-11-02 21:30     ` Arnd Bergmann
2015-11-03  4:45       ` Sinan Kaya
2015-11-03 12:42         ` Arnd Bergmann
2015-11-03 14:26           ` Timur Tabi
2015-11-04  1:04           ` Sinan Kaya
2015-10-30 15:00 ` Mark Rutland
2015-10-30 17:59   ` Andy Shevchenko
2015-10-30 18:08     ` Sinan Kaya
2015-10-30 18:18       ` Mark Rutland
2015-10-30 18:18       ` Andy Shevchenko
2015-10-30 18:25         ` Mark Rutland
2015-10-30 18:40           ` Andy Shevchenko
2015-10-30 18:48             ` Sinan Kaya
2015-10-30 19:01               ` Mark Rutland
2015-10-30 20:08                 ` Al Stone
2015-10-30 20:15                   ` Andy Shevchenko
2015-10-30 20:18                     ` Mark Rutland
2015-10-31  3:33                     ` Jon Masters
2015-10-31 17:34                       ` Sinan Kaya
2015-10-30 19:36           ` Sinan Kaya
2015-10-31 17:11   ` Sinan Kaya

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=3962829.iR3I63FEm8@wuerfel \
    --to=arnd@arndb.de \
    --cc=cov@codeaurora.org \
    --cc=dan.j.williams@intel.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dmaengine@vger.kernel.org \
    --cc=galak@codeaurora.org \
    --cc=ijc+devicetree@hellion.org.uk \
    --cc=jcm@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=okaya@codeaurora.org \
    --cc=pawel.moll@arm.com \
    --cc=robh+dt@kernel.org \
    --cc=timur@codeaurora.org \
    --cc=vinod.koul@intel.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).