On Wed, Nov 16, 2016 at 03:29:31PM +0000, Lorenzo Pieralisi wrote: > In ACPI bases systems, in order to be able to create platform > devices and initialize them for ARM SMMU v3 components, the IORT > kernel implementation requires a set of static functions to be > used by the IORT kernel layer to configure platform devices for > ARM SMMU v3 components. > > Add static configuration functions to the IORT kernel layer for > the ARM SMMU v3 components, so that the ARM SMMU v3 driver can > initialize its respective platform device by relying on the IORT > kernel infrastructure and by adding a corresponding ACPI device > early probe section entry. > > Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@xxxxxxx> > Reviewed-by: Tomasz Nowicki <tn@xxxxxxxxxxxx> > Tested-by: Hanjun Guo <hanjun.guo@xxxxxxxxxx> > Tested-by: Tomasz Nowicki <tn@xxxxxxxxxxxx> > Cc: Will Deacon <will.deacon@xxxxxxx> > Cc: Robin Murphy <robin.murphy@xxxxxxx> > Cc: Joerg Roedel <joro@xxxxxxxxxx> > --- > drivers/acpi/arm64/iort.c | 103 +++++++++++++++++++++++++++++++++++++++++++- > drivers/iommu/arm-smmu-v3.c | 49 ++++++++++++++++++++- > 2 files changed, 150 insertions(+), 2 deletions(-) [...] > diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c > index ed563307..9315bf3 100644 > --- a/drivers/iommu/arm-smmu-v3.c > +++ b/drivers/iommu/arm-smmu-v3.c > @@ -20,6 +20,8 @@ > * This driver is powered by bad coffee and bombay mix. > */ > > +#include <linux/acpi.h> > +#include <linux/acpi_iort.h> > #include <linux/delay.h> > #include <linux/dma-iommu.h> > #include <linux/err.h> > @@ -2559,6 +2561,36 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu) > return 0; > } > > +#ifdef CONFIG_ACPI > +static int arm_smmu_device_acpi_probe(struct platform_device *pdev, > + struct arm_smmu_device *smmu, > + bool *bypass) > +{ > + struct acpi_iort_smmu_v3 *iort_smmu; > + struct device *dev = smmu->dev; > + struct acpi_iort_node *node; > + > + node = *(struct acpi_iort_node **)dev_get_platdata(dev); > + > + /* Retrieve SMMUv3 specific data */ > + iort_smmu = (struct acpi_iort_smmu_v3 *)node->node_data; > + > + if (iort_smmu->flags & ACPI_IORT_SMMU_V3_COHACC_OVERRIDE) > + smmu->features |= ARM_SMMU_FEAT_COHERENCY; > + > + *bypass = false; > + > + return 0; > +} > +#else > +static inline int arm_smmu_device_acpi_probe(struct platform_device *pdev, > + struct arm_smmu_device *smmu, > + bool *bypass) > +{ > + return -ENODEV; > +} > +#endif Same bypass comments as before, but you'll probably need to do something so that you *can* abort the probe if !ACPI, perhaps by allocating two error codes to distinguish the "I no nothing about this SMMU" from "I know enough to put it into bypass, but nothing more". Will -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html