From: will.deacon@arm.com (Will Deacon)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC PATCH v2 2/7] dma-mapping: replace set_arch_dma_coherent_ops with arch_setup_dma_ops
Date: Tue, 2 Sep 2014 18:56:22 +0100 [thread overview]
Message-ID: <1409680587-29818-3-git-send-email-will.deacon@arm.com> (raw)
In-Reply-To: <1409680587-29818-1-git-send-email-will.deacon@arm.com>
set_arch_dma_coherent_ops is called from of_dma_configure in order to
swizzle the architectural dma-mapping functions over to a cache-coherent
implementation. This is currently implemented only for ARM.
In anticipation of re-using this mechanism for IOMMU-backed dma-mapping
ops too, this patch replaces the function with a broader
arch_setup_dma_ops callback which is also responsible for setting the
DMA mask and offset as well as selecting the correct mapping functions.
A further advantage of this split is that it nicely isolates the
of-specific code from the dma-mapping code, allowing potential reuse by
other buses (e.g. PCI) in the future.
Signed-off-by: Will Deacon <will.deacon@arm.com>
---
arch/arm/include/asm/dma-mapping.h | 13 ++++++++----
drivers/of/platform.c | 42 ++++++++++----------------------------
include/linux/dma-mapping.h | 8 +++-----
3 files changed, 23 insertions(+), 40 deletions(-)
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h
index c45b61a4b4a5..dad006dabbe6 100644
--- a/arch/arm/include/asm/dma-mapping.h
+++ b/arch/arm/include/asm/dma-mapping.h
@@ -121,12 +121,17 @@ static inline unsigned long dma_max_pfn(struct device *dev)
}
#define dma_max_pfn(dev) dma_max_pfn(dev)
-static inline int set_arch_dma_coherent_ops(struct device *dev)
+static inline void arch_setup_dma_ops(struct device *dev, u64 mask,
+ unsigned long offset, bool coherent)
{
- set_dma_ops(dev, &arm_coherent_dma_ops);
- return 0;
+ dev->coherent_dma_mask = mask;
+ dev->dma_mask = &dev->coherent_dma_mask;
+ dev->dma_pfn_offset = offset;
+
+ if (coherent)
+ set_dma_ops(dev, &arm_coherent_dma_ops);
}
-#define set_arch_dma_coherent_ops(dev) set_arch_dma_coherent_ops(dev)
+#define arch_setup_dma_ops arch_setup_dma_ops
static inline dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr)
{
diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index 0197725e033a..484c558c63a6 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -164,43 +164,23 @@ static void of_dma_configure(struct platform_device *pdev)
{
u64 dma_addr, paddr, size;
int ret;
+ bool coherent;
+ unsigned long offset;
struct device *dev = &pdev->dev;
- /*
- * Set default dma-mask to 32 bit. Drivers are expected to setup
- * the correct supported dma_mask.
- */
- dev->coherent_dma_mask = DMA_BIT_MASK(32);
-
- /*
- * Set it to coherent_dma_mask by default if the architecture
- * code has not set it.
- */
- if (!dev->dma_mask)
- dev->dma_mask = &dev->coherent_dma_mask;
+ ret = of_dma_get_range(dev->of_node, &dma_addr, &paddr, &size);
+ offset = ret < 0 ? 0 : PFN_DOWN(paddr - dma_addr);
+ dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", dev->dma_pfn_offset);
- /*
- * 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");
- }
+ coherent = of_dma_is_coherent(dev->of_node);
+ dev_dbg(dev, "device is%sdma coherent\n",
+ coherent ? " " : " not ");
/*
- * if dma-ranges property doesn't exist - just return else
- * setup the dma offset
+ * Set default dma-mask to 32 bit. Drivers are expected to setup
+ * the correct supported dma_mask.
*/
- ret = of_dma_get_range(dev->of_node, &dma_addr, &paddr, &size);
- if (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);
+ arch_setup_dma_ops(dev, DMA_BIT_MASK(32), offset, coherent);
}
/**
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index 931b70986272..0f7f7b68b0db 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -129,11 +129,9 @@ static inline int dma_coerce_mask_and_coherent(struct device *dev, u64 mask)
extern u64 dma_get_required_mask(struct device *dev);
-#ifndef set_arch_dma_coherent_ops
-static inline int set_arch_dma_coherent_ops(struct device *dev)
-{
- return 0;
-}
+#ifndef arch_setup_dma_ops
+static inline void arch_setup_dma_ops(struct device *dev, u64 mask,
+ unsigned long offset, bool coherent) { }
#endif
static inline unsigned int dma_get_max_seg_size(struct device *dev)
--
2.1.0
next prev parent reply other threads:[~2014-09-02 17:56 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-02 17:56 [RFC PATCH v2 0/7] Introduce automatic DMA configuration for IOMMU masters Will Deacon
2014-09-02 17:56 ` [RFC PATCH v2 1/7] iommu: provide early initialisation hook for IOMMU drivers Will Deacon
2014-09-10 11:29 ` Marek Szyprowski
2014-09-02 17:56 ` Will Deacon [this message]
2014-09-05 15:37 ` [RFC PATCH v2 2/7] dma-mapping: replace set_arch_dma_coherent_ops with arch_setup_dma_ops Grygorii Strashko
2014-09-08 10:31 ` Will Deacon
2014-09-09 14:15 ` Grygorii Strashko
2014-09-02 17:56 ` [RFC PATCH v2 3/7] iommu: add new iommu_ops callback for adding an OF device Will Deacon
2014-09-10 11:16 ` Marek Szyprowski
2014-09-10 11:22 ` Will Deacon
2014-09-10 11:33 ` Will Deacon
2014-09-02 17:56 ` [RFC PATCH v2 4/7] iommu: provide helper function to configure an IOMMU for an of master Will Deacon
2014-09-02 19:10 ` Arnd Bergmann
2014-09-04 11:26 ` Will Deacon
2014-09-04 11:59 ` Arnd Bergmann
2014-09-04 12:28 ` Will Deacon
2014-09-10 13:01 ` Laurent Pinchart
2014-09-10 13:06 ` Will Deacon
2014-09-02 17:56 ` [RFC PATCH v2 5/7] dma-mapping: detect and configure IOMMU in of_dma_configure Will Deacon
2014-09-02 17:56 ` [RFC PATCH v2 6/7] arm: call iommu_init before of_platform_populate Will Deacon
2014-09-02 18:13 ` Arnd Bergmann
2014-09-02 17:56 ` [RFC PATCH v2 7/7] arm: dma-mapping: plumb our iommu mapping ops into arch_setup_dma_ops Will Deacon
2014-09-02 18:14 ` Arnd Bergmann
2014-09-02 19:11 ` [RFC PATCH v2 0/7] Introduce automatic DMA configuration for IOMMU masters Arnd Bergmann
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=1409680587-29818-3-git-send-email-will.deacon@arm.com \
--to=will.deacon@arm.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 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).