Message ID | 20191209180514.272727-5-jean-philippe@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | iommu: Add PASID support to Arm SMMUv3 | expand |
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@huawei.com> > Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org> Reviewed-by: Eric Auger <eric.auger@redhat.com> 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); > } > > /* >
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); } /*