ed74862103
of_iommu_configure() is called from of_dma_configure() to setup iommu ops using DT property. This API is currently used for platform devices for which DMA configuration (including IOMMU ops) may come from the device's parent. To extend this functionality for PCI devices, this API needs to take a parent node ptr as an argument instead of assuming device's parent. This is needed since for PCI, the DMA configuration may be defined in the DT node of the root bus bridge's parent device. Currently only dma-range is used for PCI and IOMMU is not supported. Return error if the device is PCI. Add "parent" parameter (a struct device_node *) to of_iommu_configure(). Tested-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> (AMD Seattle) Signed-off-by: Murali Karicheri <m-karicheri2@ti.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Acked-by: Rob Herring <robh+dt@kernel.org> Acked-by: Will Deacon <will.deacon@arm.com> CC: Joerg Roedel <joro@8bytes.org> CC: Grant Likely <grant.likely@linaro.org> CC: Russell King <linux@arm.linux.org.uk> CC: Arnd Bergmann <arnd@arndb.de>
46 lines
1.2 KiB
C
46 lines
1.2 KiB
C
#ifndef __OF_IOMMU_H
|
|
#define __OF_IOMMU_H
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/iommu.h>
|
|
#include <linux/of.h>
|
|
|
|
#ifdef CONFIG_OF_IOMMU
|
|
|
|
extern int of_get_dma_window(struct device_node *dn, const char *prefix,
|
|
int index, unsigned long *busno, dma_addr_t *addr,
|
|
size_t *size);
|
|
|
|
extern void of_iommu_init(void);
|
|
extern struct iommu_ops *of_iommu_configure(struct device *dev,
|
|
struct device_node *master_np);
|
|
|
|
#else
|
|
|
|
static inline int of_get_dma_window(struct device_node *dn, const char *prefix,
|
|
int index, unsigned long *busno, dma_addr_t *addr,
|
|
size_t *size)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
|
|
static inline void of_iommu_init(void) { }
|
|
static inline struct iommu_ops *of_iommu_configure(struct device *dev,
|
|
struct device_node *master_np)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
#endif /* CONFIG_OF_IOMMU */
|
|
|
|
void of_iommu_set_ops(struct device_node *np, struct iommu_ops *ops);
|
|
struct iommu_ops *of_iommu_get_ops(struct device_node *np);
|
|
|
|
extern struct of_device_id __iommu_of_table;
|
|
|
|
typedef int (*of_iommu_init_fn)(struct device_node *);
|
|
|
|
#define IOMMU_OF_DECLARE(name, compat, fn) \
|
|
_OF_DECLARE(iommu, name, compat, fn, of_iommu_init_fn)
|
|
|
|
#endif /* __OF_IOMMU_H */
|