Hi Jean, On 12/9/19 7:05 PM, Jean-Philippe Brucker wrote: > Named component nodes in the IORT tables describe the number of > Substream ID bits (aka. PASID) supported by the device. Propagate this > value to the fwspec structure in order to enable PASID for platform > devices. > > Acked-by: Hanjun Guo <guohanjun@xxxxxxxxxx> > Signed-off-by: Jean-Philippe Brucker <jean-philippe@xxxxxxxxxx> Reviewed-by: Eric Auger <eric.auger@xxxxxxxxxx> Thanks Eric > --- > drivers/acpi/arm64/iort.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c > index 33f71983e001..39f389214ecf 100644 > --- a/drivers/acpi/arm64/iort.c > +++ b/drivers/acpi/arm64/iort.c > @@ -11,6 +11,7 @@ > #define pr_fmt(fmt) "ACPI: IORT: " fmt > > #include <linux/acpi_iort.h> > +#include <linux/bitfield.h>> #include <linux/iommu.h> > #include <linux/kernel.h> > #include <linux/list.h> > @@ -924,6 +925,20 @@ static int iort_pci_iommu_init(struct pci_dev *pdev, u16 alias, void *data) > return iort_iommu_xlate(info->dev, parent, streamid); > } > > +static void iort_named_component_init(struct device *dev, > + struct acpi_iort_node *node) > +{ > + struct acpi_iort_named_component *nc; > + struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > + > + if (!fwspec) > + return; > + > + nc = (struct acpi_iort_named_component *)node->node_data; > + fwspec->num_pasid_bits = FIELD_GET(ACPI_IORT_NC_PASID_BITS, > + nc->node_flags); > +} > + > /** > * iort_iommu_configure - Set-up IOMMU configuration for a device. > * > @@ -978,6 +993,9 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev) > if (parent) > err = iort_iommu_xlate(dev, parent, streamid); > } while (parent && !err); > + > + if (!err) > + iort_named_component_init(dev, node); > } > > /* >