[PATCH - v7] of: Move of_dma_configure() to device.c to help re-use

Rob Herring robherring2 at gmail.com
Tue Mar 3 08:16:08 PST 2015


On Mon, Mar 2, 2015 at 3:59 PM, Murali Karicheri <m-karicheri2 at ti.com> wrote:
> Move of_dma_configure() to device.c so it can be re-used for PCI devices to
> obtain DMA configuration from DT.  Also add a second argument so that for
> PCI, the DT node of root bus host bridge can be used to obtain the DMA
> configuration for the slave PCI device.
>
> Tested-by: Suravee Suthikulpanit <Suravee.Suthikulpanit at amd.com> (AMD Seattle)
> Signed-off-by: Murali Karicheri <m-karicheri2 at ti.com>
> Signed-off-by: Bjorn Helgaas <bhelgaas at google.com>
> Reviewed-by: Catalin Marinas <catalin.marinas at arm.com>
> Acked-by: Will Deacon <will.deacon at arm.com>
> CC: Joerg Roedel <joro at 8bytes.org>
> CC: Grant Likely <grant.likely at linaro.org>
> CC: Rob Herring <robh+dt at kernel.org>
> CC: Russell King <linux at arm.linux.org.uk>
> CC: Arnd Bergmann <arnd at arndb.de>

Acked-by: Rob Herring <robh at kernel.org>

> ---
>  - Based on the existing patch applied to arm-pci/pci/iommu for pci next (Bjorn)
>  - Fixed the build issue reported on ARCH=x86_64
>  drivers/of/device.c       |   59 +++++++++++++++++++++++++++++++++++++++++++++
>  drivers/of/platform.c     |   58 ++------------------------------------------
>  include/linux/of_device.h |    2 ++
>  3 files changed, 63 insertions(+), 56 deletions(-)
>
> diff --git a/drivers/of/device.c b/drivers/of/device.c
> index 46d6c75c..31a7875 100644
> --- a/drivers/of/device.c
> +++ b/drivers/of/device.c
> @@ -2,6 +2,9 @@
>  #include <linux/kernel.h>
>  #include <linux/of.h>
>  #include <linux/of_device.h>
> +#include <linux/of_address.h>
> +#include <linux/of_iommu.h>
> +#include <linux/dma-mapping.h>
>  #include <linux/init.h>
>  #include <linux/module.h>
>  #include <linux/mod_devicetable.h>
> @@ -66,6 +69,62 @@ int of_device_add(struct platform_device *ofdev)
>         return device_add(&ofdev->dev);
>  }
>
> +/**
> + * of_dma_configure - Setup DMA configuration
> + * @dev:       Device to apply DMA configuration
> + * @np:                Pointer to OF node having DMA configuration
> + *
> + * Try to get devices's DMA configuration from DT and update it
> + * accordingly.
> + *
> + * If platform code needs to use its own special DMA configuration, it
> + * can use a platform bus notifier and handle BUS_NOTIFY_ADD_DEVICE events
> + * to fix up DMA configuration.
> + */
> +void of_dma_configure(struct device *dev, struct device_node *np)
> +{
> +       u64 dma_addr, paddr, size;
> +       int ret;
> +       bool coherent;
> +       unsigned long offset;
> +       struct iommu_ops *iommu;
> +
> +       /*
> +        * 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(np, &dma_addr, &paddr, &size);
> +       if (ret < 0) {
> +               dma_addr = offset = 0;
> +               size = dev->coherent_dma_mask;
> +       } else {
> +               offset = PFN_DOWN(paddr - dma_addr);
> +               dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", offset);
> +       }
> +
> +       dev->dma_pfn_offset = offset;
> +
> +       coherent = of_dma_is_coherent(np);
> +       dev_dbg(dev, "device is%sdma coherent\n",
> +               coherent ? " " : " not ");
> +
> +       iommu = of_iommu_configure(dev, np);
> +       dev_dbg(dev, "device is%sbehind an iommu\n",
> +               iommu ? " " : " not ");
> +
> +       arch_setup_dma_ops(dev, dma_addr, size, iommu, coherent);
> +}
> +EXPORT_SYMBOL_GPL(of_dma_configure);
> +
>  int of_device_register(struct platform_device *pdev)
>  {
>         device_initialize(&pdev->dev);
> diff --git a/drivers/of/platform.c b/drivers/of/platform.c
> index 667c6f1..a01f57c 100644
> --- a/drivers/of/platform.c
> +++ b/drivers/of/platform.c
> @@ -19,7 +19,6 @@
>  #include <linux/slab.h>
>  #include <linux/of_address.h>
>  #include <linux/of_device.h>
> -#include <linux/of_iommu.h>
>  #include <linux/of_irq.h>
>  #include <linux/of_platform.h>
>  #include <linux/platform_device.h>
> @@ -150,59 +149,6 @@ struct platform_device *of_device_alloc(struct device_node *np,
>  }
>  EXPORT_SYMBOL(of_device_alloc);
>
> -/**
> - * of_dma_configure - Setup DMA configuration
> - * @dev:       Device to apply DMA configuration
> - *
> - * Try to get devices's DMA configuration from DT and update it
> - * accordingly.
> - *
> - * In case if platform code need to use own special DMA configuration,it
> - * can use Platform bus notifier and handle BUS_NOTIFY_ADD_DEVICE event
> - * to fix up DMA configuration.
> - */
> -static void of_dma_configure(struct device *dev)
> -{
> -       u64 dma_addr, paddr, size;
> -       int ret;
> -       bool coherent;
> -       unsigned long offset;
> -       struct iommu_ops *iommu;
> -
> -       /*
> -        * 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);
> -       if (ret < 0) {
> -               dma_addr = offset = 0;
> -               size = dev->coherent_dma_mask;
> -       } else {
> -               offset = PFN_DOWN(paddr - dma_addr);
> -               dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", offset);
> -       }
> -       dev->dma_pfn_offset = offset;
> -
> -       coherent = of_dma_is_coherent(dev->of_node);
> -       dev_dbg(dev, "device is%sdma coherent\n",
> -               coherent ? " " : " not ");
> -
> -       iommu = of_iommu_configure(dev, dev->of_node);
> -       dev_dbg(dev, "device is%sbehind an iommu\n",
> -               iommu ? " " : " not ");
> -
> -       arch_setup_dma_ops(dev, dma_addr, size, iommu, coherent);
> -}
> -
>  static void of_dma_deconfigure(struct device *dev)
>  {
>         arch_teardown_dma_ops(dev);
> @@ -236,7 +182,7 @@ static struct platform_device *of_platform_device_create_pdata(
>
>         dev->dev.bus = &platform_bus_type;
>         dev->dev.platform_data = platform_data;
> -       of_dma_configure(&dev->dev);
> +       of_dma_configure(&dev->dev, dev->dev.of_node);
>
>         if (of_device_add(dev) != 0) {
>                 of_dma_deconfigure(&dev->dev);
> @@ -299,7 +245,7 @@ static struct amba_device *of_amba_device_create(struct device_node *node,
>                 dev_set_name(&dev->dev, "%s", bus_id);
>         else
>                 of_device_make_bus_id(&dev->dev);
> -       of_dma_configure(&dev->dev);
> +       of_dma_configure(&dev->dev, dev->dev.of_node);
>
>         /* Allow the HW Peripheral ID to be overridden */
>         prop = of_get_property(node, "arm,primecell-periphid", NULL);
> diff --git a/include/linux/of_device.h b/include/linux/of_device.h
> index ef37021..be70cb4 100644
> --- a/include/linux/of_device.h
> +++ b/include/linux/of_device.h
> @@ -53,6 +53,7 @@ static inline struct device_node *of_cpu_device_node_get(int cpu)
>         return of_node_get(cpu_dev->of_node);
>  }
>
> +void of_dma_configure(struct device *dev, struct device_node *np);
>  #else /* CONFIG_OF */
>
>  static inline int of_driver_match_device(struct device *dev,
> @@ -90,6 +91,7 @@ static inline struct device_node *of_cpu_device_node_get(int cpu)
>  {
>         return NULL;
>  }
> +static inline void of_dma_configure(struct device *dev, struct device_node *np) { }
>  #endif /* CONFIG_OF */
>
>  #endif /* _LINUX_OF_DEVICE_H */
> --
> 1.7.9.5
>



More information about the linux-arm-kernel mailing list