linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Bjorn Helgaas <bhelgaas@google.com>
To: Arnd Bergmann <arnd@arndb.de>
Cc: linux-arm <linux-arm-kernel@lists.infradead.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	Grygorii Strashko <grygorii.strashko@ti.com>,
	Russell King <linux@arm.linux.org.uk>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Linus Walleij <linus.walleij@linaro.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Chris Metcalf <cmetcalf@tilera.com>,
	Grant Likely <grant.likely@linaro.org>,
	Rob Herring <robh+dt@kernel.org>,
	Santosh Shilimkar <santosh.shilimkar@ti.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Olof Johansson <olof@lixom.net>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>
Subject: Re: [PATCH v3 4/7] of: configure the platform device dma parameters
Date: Mon, 5 May 2014 16:28:02 -0600	[thread overview]
Message-ID: <CAErSpo6gYT34-sOvNgEdV+3wxv=Fdqtx7c1d-4577mFydLtZMg@mail.gmail.com> (raw)
In-Reply-To: <5575019.Hr92MUuDnc@wuerfel>

On Mon, May 5, 2014 at 2:55 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> On Monday 05 May 2014 14:45:21 Bjorn Helgaas wrote:
>> [+cc Ben, Chris]
>>
>> On Fri, May 2, 2014 at 12:59 PM, Arnd Bergmann <arnd@arndb.de> wrote:
>> > On Friday 02 May 2014 10:54:59 Bjorn Helgaas wrote:
>> >> > +static void of_dma_configure(struct device *dev)
>> >> > +{
>> >> > +     u64 dma_addr, paddr, size;
>> >> > +     int ret;
>> >> > +
>> >> > +     dev->coherent_dma_mask = DMA_BIT_MASK(32);
>> >> > +     if (!dev->dma_mask)
>> >> > +             dev->dma_mask = &dev->coherent_dma_mask;
>> >> > +
>> >> > +     /*
>> >> > +      * if dma-coherent property exist, call arch hook to setup
>> >> > +      * dma coherent operations.
>> >> > +      */
>> >> > +     if (of_dma_is_coherent(dev->of_node)) {
>> >> > +             set_arch_dma_coherent_ops(dev);
>> >> > +             dev_dbg(dev, "device is dma coherent\n");
>> >> > +     }
>> >> > +
>> >> > +     /*
>> >> > +      * if dma-ranges property doesn't exist - just return else
>> >> > +      * setup the dma offset
>> >> > +      */
>> >> > +     ret = of_dma_get_range(dev->of_node, &dma_addr, &paddr, &size);
>> >> > +     if ((ret == -ENODEV) || (ret < 0)) {
>> >> > +             dev_dbg(dev, "no dma range information to setup\n");
>> >> > +             return;
>> >> > +     }
>> >> > +
>> >> > +     /* DMA ranges found. Calculate and set dma_pfn_offset */
>> >> > +     dev->dma_pfn_offset = PFN_DOWN(paddr - dma_addr);
>> >> > +     dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", dev->dma_pfn_offset);
>> >>
>> >> Is this effectively the same as an IOMMU that applies a constant offset
>> >> to the bus address?  Could or should this be done by adding a simple IOMMU
>> >> driver instead of adding dma_pfn_offset to struct device?
>> >
>> > We currently have two dma_map_ops variants on ARM (plus another set for
>> > coherent/noncoherent differences, but we can ignore that for the sake
>> > of this discussion): one that handles linear mappings and one that
>> > handles IOMMUs by calling into the linux/iommu.h APIs.
>> >
>> > I guess what you mean by 'a simple IOMMU driver' would be another
>> > dma_map_ops implementation that is separate from real IOMMUs, right?
>>
>> I suppose so; it seems like the offset could be managed inside
>> arm_dma_ops.  My idea of an IOMMU is something that maps bus addresses
>> to physical memory addresses.  That's what we're doing here; it's just
>> that the mapping function is very simple.  So why add something new in
>> struct device for it?
>>
>> I think powerpc and tile do something similar in dma_direct_map_page()
>> and tile_pci_dma_map_page() (they store the offset in struct
>> dev_archdata).
>
> Ah, so the only question is whether to store it in dev_archdata or
> in device. I think the argument for using struct device directly
> was that it lets us access this field from architecture independent
> code. It's not important to the overall design though: we could easily
> put it in dev_archdata and call an architecture specific function to
> set it, if there are good reasons for keeping it out of the generic
> device structure.

Well, it wasn't my *only* question, since I didn't know about the
powerpc and tile usage originally :).  Putting it in dev_archdata does
seem better because it's a similar solution to a similar problem, and
it's less public.

I still wonder whether arm, powerpc, and tile (and I just noticed
microblaze also has a similar dma_direct_map_page()) could all be
handled by attaching devices to a generic trivial IOMMU driver
parameterized with the appropriate constant offset.

What arch-independent code would access this data?  I expect that
drivers will use dma_map_page(), etc., so they should already have
both the bus and the physical address and wouldn't need it.  Shouldn't
generic code just rely on the DMA API, which might use an IOMMU or
this dma_pfn_offset internally?

Bjorn

  reply	other threads:[~2014-05-05 22:28 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-24 15:30 [PATCH v3 0/7] of: setup dma parameters using dma-ranges and dma-coherent Santosh Shilimkar
2014-04-24 15:30 ` [PATCH v3 1/7] device: introduce per device dma_pfn_offset Santosh Shilimkar
2014-05-02  1:01   ` Rob Herring
2014-04-24 15:30 ` [PATCH v3 2/7] of: introduce of_dma_get_range() helper Santosh Shilimkar
2014-05-02  1:06   ` Rob Herring
2014-04-24 15:30 ` [PATCH v3 3/7] of: introduce of_dma_is_coherent() helper Santosh Shilimkar
2014-05-02  0:56   ` Rob Herring
2014-05-05 21:45     ` Santosh Shilimkar
2014-05-05 22:06       ` Rob Herring
2014-04-24 15:30 ` [PATCH v3 4/7] of: configure the platform device dma parameters Santosh Shilimkar
2014-04-29 14:41   ` Grant Likely
2014-04-30 14:19     ` Santosh Shilimkar
2014-05-01 13:12       ` Grant Likely
2014-05-01 13:16         ` Santosh Shilimkar
2014-05-02  9:58         ` Arnd Bergmann
2014-05-02 13:13           ` Santosh Shilimkar
2014-05-02 15:13             ` Arnd Bergmann
2014-05-27 12:56           ` Grant Likely
2014-05-27 13:30             ` Arnd Bergmann
2014-05-28  8:23               ` Linus Walleij
2014-05-28 13:29                 ` Arnd Bergmann
2014-05-28 13:32                   ` Linus Walleij
2014-05-28 14:04                     ` Santosh Shilimkar
2014-05-29 14:01                       ` Linus Walleij
2014-05-29 14:08                         ` Santosh Shilimkar
2014-05-29 19:24                           ` Arnd Bergmann
2014-05-29 20:04                             ` Santosh Shilimkar
2014-05-02  0:49   ` Rob Herring
2014-05-05 21:47     ` Santosh Shilimkar
2014-05-05 22:08       ` Rob Herring
2014-05-06  9:40       ` Arnd Bergmann
2014-05-06 20:44         ` Santosh Shilimkar
2014-05-07 13:24           ` Santosh Shilimkar
2014-05-02 16:54   ` Bjorn Helgaas
2014-05-02 18:59     ` Arnd Bergmann
2014-05-05 20:45       ` Bjorn Helgaas
2014-05-05 20:55         ` Arnd Bergmann
2014-05-05 22:28           ` Bjorn Helgaas [this message]
2014-05-06  3:44             ` Benjamin Herrenschmidt
2014-05-06  9:54               ` Arnd Bergmann
2014-05-06 13:32                 ` Santosh Shilimkar
2014-04-24 15:30 ` [PATCH v3 5/7] ARM: dma: Use dma_pfn_offset for dma address translation Santosh Shilimkar
2014-05-02 14:32   ` Rob Herring
2014-05-02 14:58   ` Russell King - ARM Linux
2014-05-02 15:05     ` Santosh Shilimkar
2014-05-05 19:50       ` Russell King - ARM Linux
2014-05-05 21:43         ` Santosh Shilimkar
2014-04-24 15:30 ` [PATCH v3 6/7] ARM: dma: implement set_arch_dma_coherent_ops() Santosh Shilimkar
2014-05-02  0:58   ` Rob Herring
2014-04-24 15:30 ` [PATCH v3 7/7] ARM: dma: use phys_addr_t in __dma_page_[cpu_to_dev/dev_to_cpu] Santosh Shilimkar
2014-04-24 15:45   ` Will Deacon
2014-05-01 13:19 ` [PATCH v3 0/7] of: setup dma parameters using dma-ranges and dma-coherent Santosh Shilimkar
2014-05-01 13:25   ` Russell King - ARM Linux
2014-05-01 14:06     ` Santosh Shilimkar
2014-05-02 14:41     ` Rob Herring
2014-05-02 16:41       ` Santosh Shilimkar
2014-05-14 10:12     ` Grant Likely
2014-06-02  6:37 ` Shawn Guo
2014-06-02 13:24   ` Santosh Shilimkar
2014-06-02 15:06     ` Arnd Bergmann
2014-06-02 15:54       ` Santosh Shilimkar
2014-06-02 19:00         ` Arnd Bergmann
2014-06-02 19:08           ` Santosh Shilimkar

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='CAErSpo6gYT34-sOvNgEdV+3wxv=Fdqtx7c1d-4577mFydLtZMg@mail.gmail.com' \
    --to=bhelgaas@google.com \
    --cc=arnd@arndb.de \
    --cc=benh@kernel.crashing.org \
    --cc=catalin.marinas@arm.com \
    --cc=cmetcalf@tilera.com \
    --cc=devicetree@vger.kernel.org \
    --cc=grant.likely@linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=grygorii.strashko@ti.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=olof@lixom.net \
    --cc=robh+dt@kernel.org \
    --cc=santosh.shilimkar@ti.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).