ACPI/IORT: Fix CONFIG_IOMMU_API dependency
The IOMMU probe deferral IORT rework had to add code in iort_iommu_configure() and iort_iommu_xlate() that requires the IOMMU_API to be selected in order to compile and work. Stub out the pieces of code that depend on CONFIG_IOMMU_API to be selected to prevent compilation failures such as: drivers/acpi/arm64/iort.c: In function 'iort_iommu_xlate': drivers/acpi/arm64/iort.c:647:22: error: 'struct iommu_fwspec' has no member named 'ops' by wrapping the code in static inline functions that provide a NOP implementation when CONFIG_IOMMU_API is not selected. Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Reported-by: Arnd Bergmann <arnd@arndb.de> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Will Deacon <will.deacon@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Robin Murphy <robin.murphy@arm.com> Cc: Joerg Roedel <joro@8bytes.org> Cc: Sricharan R <sricharan@codeaurora.org> Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
316ca8804e
commit
d49f2dedf3
1 changed files with 34 additions and 10 deletions
|
@ -536,6 +536,33 @@ static inline bool iort_iommu_driver_enabled(u8 type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_IOMMU_API
|
||||||
|
static inline
|
||||||
|
const struct iommu_ops *iort_fwspec_iommu_ops(struct iommu_fwspec *fwspec)
|
||||||
|
{
|
||||||
|
return (fwspec && fwspec->ops) ? fwspec->ops : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
int iort_add_device_replay(const struct iommu_ops *ops, struct device *dev)
|
||||||
|
{
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
if (!IS_ERR_OR_NULL(ops) && ops->add_device && dev->bus &&
|
||||||
|
!dev->iommu_group)
|
||||||
|
err = ops->add_device(dev);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline
|
||||||
|
const struct iommu_ops *iort_fwspec_iommu_ops(struct iommu_fwspec *fwspec)
|
||||||
|
{ return NULL; }
|
||||||
|
static inline
|
||||||
|
int iort_add_device_replay(const struct iommu_ops *ops, struct device *dev)
|
||||||
|
{ return 0; }
|
||||||
|
#endif
|
||||||
|
|
||||||
static const struct iommu_ops *iort_iommu_xlate(struct device *dev,
|
static const struct iommu_ops *iort_iommu_xlate(struct device *dev,
|
||||||
struct acpi_iort_node *node,
|
struct acpi_iort_node *node,
|
||||||
u32 streamid)
|
u32 streamid)
|
||||||
|
@ -543,14 +570,14 @@ static const struct iommu_ops *iort_iommu_xlate(struct device *dev,
|
||||||
const struct iommu_ops *ops = NULL;
|
const struct iommu_ops *ops = NULL;
|
||||||
int ret = -ENODEV;
|
int ret = -ENODEV;
|
||||||
struct fwnode_handle *iort_fwnode;
|
struct fwnode_handle *iort_fwnode;
|
||||||
struct iommu_fwspec *fwspec = dev->iommu_fwspec;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we already translated the fwspec there
|
* If we already translated the fwspec there
|
||||||
* is nothing left to do, return the iommu_ops.
|
* is nothing left to do, return the iommu_ops.
|
||||||
*/
|
*/
|
||||||
if (fwspec && fwspec->ops)
|
ops = iort_fwspec_iommu_ops(dev->iommu_fwspec);
|
||||||
return fwspec->ops;
|
if (ops)
|
||||||
|
return ops;
|
||||||
|
|
||||||
if (node) {
|
if (node) {
|
||||||
iort_fwnode = iort_get_fwnode(node);
|
iort_fwnode = iort_get_fwnode(node);
|
||||||
|
@ -611,6 +638,7 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev)
|
||||||
struct acpi_iort_node *node, *parent;
|
struct acpi_iort_node *node, *parent;
|
||||||
const struct iommu_ops *ops = NULL;
|
const struct iommu_ops *ops = NULL;
|
||||||
u32 streamid = 0;
|
u32 streamid = 0;
|
||||||
|
int err;
|
||||||
|
|
||||||
if (dev_is_pci(dev)) {
|
if (dev_is_pci(dev)) {
|
||||||
struct pci_bus *bus = to_pci_dev(dev)->bus;
|
struct pci_bus *bus = to_pci_dev(dev)->bus;
|
||||||
|
@ -654,13 +682,9 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev)
|
||||||
* If we have reason to believe the IOMMU driver missed the initial
|
* If we have reason to believe the IOMMU driver missed the initial
|
||||||
* add_device callback for dev, replay it to get things in order.
|
* add_device callback for dev, replay it to get things in order.
|
||||||
*/
|
*/
|
||||||
if (!IS_ERR_OR_NULL(ops) && ops->add_device &&
|
err = iort_add_device_replay(ops, dev);
|
||||||
dev->bus && !dev->iommu_group) {
|
if (err)
|
||||||
int err = ops->add_device(dev);
|
ops = ERR_PTR(err);
|
||||||
|
|
||||||
if (err)
|
|
||||||
ops = ERR_PTR(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ops;
|
return ops;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue