Message ID | 20171006140450.89652-3-shameerali.kolothum.thodi@huawei.com |
---|---|
State | New |
Headers | show |
Series | iommu/smmu-v3: Workaround for hisilicon 161010801 erratum(reserve HW MSI) | expand |
On Fri, Oct 06, 2017 at 03:04:48PM +0100, Shameer Kolothum wrote: > IOMMU drivers can use this to implement their .get_resv_regions callback > for HW MSI specific reservations(e.g. ARM GICv3 ITS MSI region). > > Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> > --- > drivers/iommu/dma-iommu.c | 20 ++++++++++++++++++++ > include/linux/dma-iommu.h | 7 +++++++ > 2 files changed, 27 insertions(+) I'd like to see Robin's Ack on this, because this is his code and he had ideas on ways to solve this problem properly. Will > diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c > index 9d1cebe..bae677e 100644 > --- a/drivers/iommu/dma-iommu.c > +++ b/drivers/iommu/dma-iommu.c > @@ -19,6 +19,7 @@ > * along with this program. If not, see <http://www.gnu.org/licenses/>. > */ > > +#include <linux/acpi_iort.h> > #include <linux/device.h> > #include <linux/dma-iommu.h> > #include <linux/gfp.h> > @@ -27,6 +28,7 @@ > #include <linux/iova.h> > #include <linux/irq.h> > #include <linux/mm.h> > +#include <linux/of_iommu.h> > #include <linux/pci.h> > #include <linux/scatterlist.h> > #include <linux/vmalloc.h> > @@ -198,6 +200,24 @@ void iommu_dma_get_resv_regions(struct device *dev, struct list_head *list) > } > EXPORT_SYMBOL(iommu_dma_get_resv_regions); > > +/** > + * iommu_dma_get_msi_resv_regions - Reserved region driver helper > + * @dev: Device from iommu_get_resv_regions() > + * @list: Reserved region list from iommu_get_resv_regions() > + * > + * IOMMU drivers can use this to implement their .get_resv_regions > + * callback for HW MSI specific reservations. For now, this only > + * covers ITS MSI region reservation using ACPI IORT helper function. > + */ > +int iommu_dma_get_msi_resv_regions(struct device *dev, struct list_head *list) > +{ > + if (!is_of_node(dev->iommu_fwspec->iommu_fwnode)) > + return iort_iommu_msi_get_resv_regions(dev, list); > + > + return -ENODEV; > +} > +EXPORT_SYMBOL(iommu_dma_get_msi_resv_regions); > + > static int cookie_init_hw_msi_region(struct iommu_dma_cookie *cookie, > phys_addr_t start, phys_addr_t end) > { > diff --git a/include/linux/dma-iommu.h b/include/linux/dma-iommu.h > index 92f2083..6062ef0 100644 > --- a/include/linux/dma-iommu.h > +++ b/include/linux/dma-iommu.h > @@ -74,6 +74,8 @@ void iommu_dma_unmap_resource(struct device *dev, dma_addr_t handle, > void iommu_dma_map_msi_msg(int irq, struct msi_msg *msg); > void iommu_dma_get_resv_regions(struct device *dev, struct list_head *list); > > +int iommu_dma_get_msi_resv_regions(struct device *dev, struct list_head *list); > + > #else > > struct iommu_domain; > @@ -107,6 +109,11 @@ static inline void iommu_dma_get_resv_regions(struct device *dev, struct list_he > { > } > > +static inline int iommu_dma_get_msi_resv_regions(struct device *dev, struct list_head *list) > +{ > + return -ENODEV; > +} > + > #endif /* CONFIG_IOMMU_DMA */ > #endif /* __KERNEL__ */ > #endif /* __DMA_IOMMU_H */ > -- > 1.9.1 > > -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Robin, > -----Original Message----- > From: Will Deacon [mailto:will.deacon@arm.com] > Sent: Friday, October 13, 2017 8:24 PM > To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com> > Cc: lorenzo.pieralisi@arm.com; marc.zyngier@arm.com; > sudeep.holla@arm.com; robin.murphy@arm.com; joro@8bytes.org; > bhelgaas@google.com; Gabriele Paoloni <gabriele.paoloni@huawei.com>; > John Garry <john.garry@huawei.com>; iommu@lists.linux-foundation.org; > linux-arm-kernel@lists.infradead.org; linux-acpi@vger.kernel.org; linux- > pci@vger.kernel.org; devel@acpica.org; Linuxarm <linuxarm@huawei.com>; > Wangzhou (B) <wangzhou1@hisilicon.com>; Guohanjun (Hanjun Guo) > <guohanjun@huawei.com> > Subject: Re: [PATCH v9 2/4] iommu/dma: Add a helper function to reserve HW > MSI address regions for IOMMU drivers > > On Fri, Oct 06, 2017 at 03:04:48PM +0100, Shameer Kolothum wrote: > > IOMMU drivers can use this to implement their .get_resv_regions callback > > for HW MSI specific reservations(e.g. ARM GICv3 ITS MSI region). > > > > Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> > > --- > > drivers/iommu/dma-iommu.c | 20 ++++++++++++++++++++ > > include/linux/dma-iommu.h | 7 +++++++ > > 2 files changed, 27 insertions(+) > > I'd like to see Robin's Ack on this, because this is his code and he had > ideas on ways to solve this problem properly. Please let us know if it is ok to go ahead with ACPI support for now. It will help our customers to start using pass-through for PCIe. Thanks, Shameer > > Will > > > diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c > > index 9d1cebe..bae677e 100644 > > --- a/drivers/iommu/dma-iommu.c > > +++ b/drivers/iommu/dma-iommu.c > > @@ -19,6 +19,7 @@ > > * along with this program. If not, see <http://www.gnu.org/licenses/>. > > */ > > > > +#include <linux/acpi_iort.h> > > #include <linux/device.h> > > #include <linux/dma-iommu.h> > > #include <linux/gfp.h> > > @@ -27,6 +28,7 @@ > > #include <linux/iova.h> > > #include <linux/irq.h> > > #include <linux/mm.h> > > +#include <linux/of_iommu.h> > > #include <linux/pci.h> > > #include <linux/scatterlist.h> > > #include <linux/vmalloc.h> > > @@ -198,6 +200,24 @@ void iommu_dma_get_resv_regions(struct device > *dev, struct list_head *list) > > } > > EXPORT_SYMBOL(iommu_dma_get_resv_regions); > > > > +/** > > + * iommu_dma_get_msi_resv_regions - Reserved region driver helper > > + * @dev: Device from iommu_get_resv_regions() > > + * @list: Reserved region list from iommu_get_resv_regions() > > + * > > + * IOMMU drivers can use this to implement their .get_resv_regions > > + * callback for HW MSI specific reservations. For now, this only > > + * covers ITS MSI region reservation using ACPI IORT helper function. > > + */ > > +int iommu_dma_get_msi_resv_regions(struct device *dev, struct list_head > *list) > > +{ > > + if (!is_of_node(dev->iommu_fwspec->iommu_fwnode)) > > + return iort_iommu_msi_get_resv_regions(dev, list); > > + > > + return -ENODEV; > > +} > > +EXPORT_SYMBOL(iommu_dma_get_msi_resv_regions); > > + > > static int cookie_init_hw_msi_region(struct iommu_dma_cookie *cookie, > > phys_addr_t start, phys_addr_t end) > > { > > diff --git a/include/linux/dma-iommu.h b/include/linux/dma-iommu.h > > index 92f2083..6062ef0 100644 > > --- a/include/linux/dma-iommu.h > > +++ b/include/linux/dma-iommu.h > > @@ -74,6 +74,8 @@ void iommu_dma_unmap_resource(struct device *dev, > dma_addr_t handle, > > void iommu_dma_map_msi_msg(int irq, struct msi_msg *msg); > > void iommu_dma_get_resv_regions(struct device *dev, struct list_head > *list); > > > > +int iommu_dma_get_msi_resv_regions(struct device *dev, struct list_head > *list); > > + > > #else > > > > struct iommu_domain; > > @@ -107,6 +109,11 @@ static inline void > iommu_dma_get_resv_regions(struct device *dev, struct list_he > > { > > } > > > > +static inline int iommu_dma_get_msi_resv_regions(struct device *dev, > struct list_head *list) > > +{ > > + return -ENODEV; > > +} > > + > > #endif /* CONFIG_IOMMU_DMA */ > > #endif /* __KERNEL__ */ > > #endif /* __DMA_IOMMU_H */ > > -- > > 1.9.1 > > > > -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 16/10/17 17:09, Shameerali Kolothum Thodi wrote: > Hi Robin, > >> -----Original Message----- >> From: Will Deacon [mailto:will.deacon@arm.com] >> Sent: Friday, October 13, 2017 8:24 PM >> To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com> >> Cc: lorenzo.pieralisi@arm.com; marc.zyngier@arm.com; >> sudeep.holla@arm.com; robin.murphy@arm.com; joro@8bytes.org; >> bhelgaas@google.com; Gabriele Paoloni <gabriele.paoloni@huawei.com>; >> John Garry <john.garry@huawei.com>; iommu@lists.linux-foundation.org; >> linux-arm-kernel@lists.infradead.org; linux-acpi@vger.kernel.org; linux- >> pci@vger.kernel.org; devel@acpica.org; Linuxarm <linuxarm@huawei.com>; >> Wangzhou (B) <wangzhou1@hisilicon.com>; Guohanjun (Hanjun Guo) >> <guohanjun@huawei.com> >> Subject: Re: [PATCH v9 2/4] iommu/dma: Add a helper function to reserve HW >> MSI address regions for IOMMU drivers >> >> On Fri, Oct 06, 2017 at 03:04:48PM +0100, Shameer Kolothum wrote: >>> IOMMU drivers can use this to implement their .get_resv_regions callback >>> for HW MSI specific reservations(e.g. ARM GICv3 ITS MSI region). >>> >>> Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> >>> --- >>> drivers/iommu/dma-iommu.c | 20 ++++++++++++++++++++ >>> include/linux/dma-iommu.h | 7 +++++++ >>> 2 files changed, 27 insertions(+) >> >> I'd like to see Robin's Ack on this, because this is his code and he had >> ideas on ways to solve this problem properly. > > Please let us know if it is ok to go ahead with ACPI support for now. > It will help our customers to start using pass-through for PCIe. > > Thanks, > Shameer > >> >> Will >> >>> diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c >>> index 9d1cebe..bae677e 100644 >>> --- a/drivers/iommu/dma-iommu.c >>> +++ b/drivers/iommu/dma-iommu.c >>> @@ -19,6 +19,7 @@ >>> * along with this program. If not, see <http://www.gnu.org/licenses/>. >>> */ >>> >>> +#include <linux/acpi_iort.h> >>> #include <linux/device.h> >>> #include <linux/dma-iommu.h> >>> #include <linux/gfp.h> >>> @@ -27,6 +28,7 @@ >>> #include <linux/iova.h> >>> #include <linux/irq.h> >>> #include <linux/mm.h> >>> +#include <linux/of_iommu.h> >>> #include <linux/pci.h> >>> #include <linux/scatterlist.h> >>> #include <linux/vmalloc.h> >>> @@ -198,6 +200,24 @@ void iommu_dma_get_resv_regions(struct device >> *dev, struct list_head *list) >>> } >>> EXPORT_SYMBOL(iommu_dma_get_resv_regions); >>> >>> +/** >>> + * iommu_dma_get_msi_resv_regions - Reserved region driver helper >>> + * @dev: Device from iommu_get_resv_regions() >>> + * @list: Reserved region list from iommu_get_resv_regions() >>> + * >>> + * IOMMU drivers can use this to implement their .get_resv_regions >>> + * callback for HW MSI specific reservations. For now, this only This doesn't make an awful lot of sense - there's only one reserved region callback, so iommu-dma shouldn't be offering two separate and non-overlapping implementations. >>> + * covers ITS MSI region reservation using ACPI IORT helper function. >>> + */ >>> +int iommu_dma_get_msi_resv_regions(struct device *dev, struct list_head >> *list) >>> +{ >>> + if (!is_of_node(dev->iommu_fwspec->iommu_fwnode)) >>> + return iort_iommu_msi_get_resv_regions(dev, list); Either this call knows how to do the right thing for any platform and should be made from iommu_dma_get_reserved_regions() directly, or it's tightly coupled to the HiSilicon quirk in the SMMUv3 driver and iommu-dma doesn't need to know - the middle ground presented here is surely the worst of both worlds. Robin. >>> + >>> + return -ENODEV; >>> +} >>> +EXPORT_SYMBOL(iommu_dma_get_msi_resv_regions); >>> + >>> static int cookie_init_hw_msi_region(struct iommu_dma_cookie *cookie, >>> phys_addr_t start, phys_addr_t end) >>> { >>> diff --git a/include/linux/dma-iommu.h b/include/linux/dma-iommu.h >>> index 92f2083..6062ef0 100644 >>> --- a/include/linux/dma-iommu.h >>> +++ b/include/linux/dma-iommu.h >>> @@ -74,6 +74,8 @@ void iommu_dma_unmap_resource(struct device *dev, >> dma_addr_t handle, >>> void iommu_dma_map_msi_msg(int irq, struct msi_msg *msg); >>> void iommu_dma_get_resv_regions(struct device *dev, struct list_head >> *list); >>> >>> +int iommu_dma_get_msi_resv_regions(struct device *dev, struct list_head >> *list); >>> + >>> #else >>> >>> struct iommu_domain; >>> @@ -107,6 +109,11 @@ static inline void >> iommu_dma_get_resv_regions(struct device *dev, struct list_he >>> { >>> } >>> >>> +static inline int iommu_dma_get_msi_resv_regions(struct device *dev, >> struct list_head *list) >>> +{ >>> + return -ENODEV; >>> +} >>> + >>> #endif /* CONFIG_IOMMU_DMA */ >>> #endif /* __KERNEL__ */ >>> #endif /* __DMA_IOMMU_H */ >>> -- >>> 1.9.1 >>> >>> > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogUm9iaW4gTXVycGh5IFtt YWlsdG86cm9iaW4ubXVycGh5QGFybS5jb21dDQo+IFNlbnQ6IFdlZG5lc2RheSwgT2N0b2JlciAx OCwgMjAxNyAxOjM0IFBNDQo+IFRvOiBTaGFtZWVyYWxpIEtvbG90aHVtIFRob2RpIDxzaGFtZWVy YWxpLmtvbG90aHVtLnRob2RpQGh1YXdlaS5jb20+Ow0KPiBXaWxsIERlYWNvbiA8d2lsbC5kZWFj b25AYXJtLmNvbT4NCj4gQ2M6IGxvcmVuem8ucGllcmFsaXNpQGFybS5jb207IEdhYnJpZWxlIFBh b2xvbmkNCj4gPGdhYnJpZWxlLnBhb2xvbmlAaHVhd2VpLmNvbT47IG1hcmMuenluZ2llckBhcm0u Y29tOyBsaW51eC0NCj4gcGNpQHZnZXIua2VybmVsLm9yZzsgam9yb0A4Ynl0ZXMub3JnOyBKb2hu IEdhcnJ5IDxqb2huLmdhcnJ5QGh1YXdlaS5jb20+Ow0KPiBHdW9oYW5qdW4gKEhhbmp1biBHdW8p IDxndW9oYW5qdW5AaHVhd2VpLmNvbT47IExpbnV4YXJtDQo+IDxsaW51eGFybUBodWF3ZWkuY29t PjsgbGludXgtYWNwaUB2Z2VyLmtlcm5lbC5vcmc7IGlvbW11QGxpc3RzLmxpbnV4LQ0KPiBmb3Vu ZGF0aW9uLm9yZzsgV2FuZ3pob3UgKEIpIDx3YW5nemhvdTFAaGlzaWxpY29uLmNvbT47DQo+IHN1 ZGVlcC5ob2xsYUBhcm0uY29tOyBiaGVsZ2Fhc0Bnb29nbGUuY29tOyBsaW51eC1hcm0tDQo+IGtl cm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnOyBkZXZlbEBhY3BpY2Eub3JnDQo+IFN1YmplY3Q6IFJl OiBbUEFUQ0ggdjkgMi80XSBpb21tdS9kbWE6IEFkZCBhIGhlbHBlciBmdW5jdGlvbiB0byByZXNl cnZlIEhXDQo+IE1TSSBhZGRyZXNzIHJlZ2lvbnMgZm9yIElPTU1VIGRyaXZlcnMNCj4gDQo+IE9u IDE2LzEwLzE3IDE3OjA5LCBTaGFtZWVyYWxpIEtvbG90aHVtIFRob2RpIHdyb3RlOg0KPiA+IEhp IFJvYmluLA0KPiA+DQo+ID4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4+IEZyb206 IFdpbGwgRGVhY29uIFttYWlsdG86d2lsbC5kZWFjb25AYXJtLmNvbV0NCj4gPj4gU2VudDogRnJp ZGF5LCBPY3RvYmVyIDEzLCAyMDE3IDg6MjQgUE0NCj4gPj4gVG86IFNoYW1lZXJhbGkgS29sb3Ro dW0gVGhvZGkgPHNoYW1lZXJhbGkua29sb3RodW0udGhvZGlAaHVhd2VpLmNvbT4NCj4gPj4gQ2M6 IGxvcmVuem8ucGllcmFsaXNpQGFybS5jb207IG1hcmMuenluZ2llckBhcm0uY29tOw0KPiA+PiBz dWRlZXAuaG9sbGFAYXJtLmNvbTsgcm9iaW4ubXVycGh5QGFybS5jb207IGpvcm9AOGJ5dGVzLm9y ZzsNCj4gPj4gYmhlbGdhYXNAZ29vZ2xlLmNvbTsgR2FicmllbGUgUGFvbG9uaSA8Z2FicmllbGUu cGFvbG9uaUBodWF3ZWkuY29tPjsNCj4gPj4gSm9obiBHYXJyeSA8am9obi5nYXJyeUBodWF3ZWku Y29tPjsgaW9tbXVAbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmc7DQo+ID4+IGxpbnV4LWFybS1r ZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZzsgbGludXgtYWNwaUB2Z2VyLmtlcm5lbC5vcmc7IGxp bnV4LQ0KPiA+PiBwY2lAdmdlci5rZXJuZWwub3JnOyBkZXZlbEBhY3BpY2Eub3JnOyBMaW51eGFy bQ0KPiA8bGludXhhcm1AaHVhd2VpLmNvbT47DQo+ID4+IFdhbmd6aG91IChCKSA8d2FuZ3pob3Ux QGhpc2lsaWNvbi5jb20+OyBHdW9oYW5qdW4gKEhhbmp1biBHdW8pDQo+ID4+IDxndW9oYW5qdW5A aHVhd2VpLmNvbT4NCj4gPj4gU3ViamVjdDogUmU6IFtQQVRDSCB2OSAyLzRdIGlvbW11L2RtYTog QWRkIGEgaGVscGVyIGZ1bmN0aW9uIHRvIHJlc2VydmUNCj4gSFcNCj4gPj4gTVNJIGFkZHJlc3Mg cmVnaW9ucyBmb3IgSU9NTVUgZHJpdmVycw0KPiA+Pg0KPiA+PiBPbiBGcmksIE9jdCAwNiwgMjAx NyBhdCAwMzowNDo0OFBNICswMTAwLCBTaGFtZWVyIEtvbG90aHVtIHdyb3RlOg0KPiA+Pj4gSU9N TVUgZHJpdmVycyBjYW4gdXNlIHRoaXMgdG8gaW1wbGVtZW50IHRoZWlyIC5nZXRfcmVzdl9yZWdp b25zIGNhbGxiYWNrDQo+ID4+PiBmb3IgSFcgTVNJIHNwZWNpZmljIHJlc2VydmF0aW9ucyhlLmcu IEFSTSBHSUN2MyBJVFMgTVNJIHJlZ2lvbikuDQo+ID4+Pg0KPiA+Pj4gU2lnbmVkLW9mZi1ieTog U2hhbWVlciBLb2xvdGh1bQ0KPiA8c2hhbWVlcmFsaS5rb2xvdGh1bS50aG9kaUBodWF3ZWkuY29t Pg0KPiA+Pj4gLS0tDQo+ID4+PiAgZHJpdmVycy9pb21tdS9kbWEtaW9tbXUuYyB8IDIwICsrKysr KysrKysrKysrKysrKysrDQo+ID4+PiAgaW5jbHVkZS9saW51eC9kbWEtaW9tbXUuaCB8ICA3ICsr KysrKysNCj4gPj4+ICAyIGZpbGVzIGNoYW5nZWQsIDI3IGluc2VydGlvbnMoKykNCj4gPj4NCj4g Pj4gSSdkIGxpa2UgdG8gc2VlIFJvYmluJ3MgQWNrIG9uIHRoaXMsIGJlY2F1c2UgdGhpcyBpcyBo aXMgY29kZSBhbmQgaGUgaGFkDQo+ID4+IGlkZWFzIG9uIHdheXMgdG8gc29sdmUgdGhpcyBwcm9i bGVtIHByb3Blcmx5Lg0KPiA+DQo+ID4gUGxlYXNlIGxldCB1cyBrbm93IGlmIGl0IGlzIG9rIHRv IGdvIGFoZWFkIHdpdGggQUNQSSBzdXBwb3J0IGZvciBub3cuDQo+ID4gSXQgd2lsbCBoZWxwIG91 ciBjdXN0b21lcnMgdG8gc3RhcnQgdXNpbmcgcGFzcy10aHJvdWdoIGZvciBQQ0llLg0KPiA+DQo+ ID4gVGhhbmtzLA0KPiA+IFNoYW1lZXINCj4gPg0KPiA+Pg0KPiA+PiBXaWxsDQo+ID4+DQo+ID4+ PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9kbWEtaW9tbXUuYyBiL2RyaXZlcnMvaW9tbXUv ZG1hLWlvbW11LmMNCj4gPj4+IGluZGV4IDlkMWNlYmUuLmJhZTY3N2UgMTAwNjQ0DQo+ID4+PiAt LS0gYS9kcml2ZXJzL2lvbW11L2RtYS1pb21tdS5jDQo+ID4+PiArKysgYi9kcml2ZXJzL2lvbW11 L2RtYS1pb21tdS5jDQo+ID4+PiBAQCAtMTksNiArMTksNyBAQA0KPiA+Pj4gICAqIGFsb25nIHdp dGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNl cy8+Lg0KPiA+Pj4gICAqLw0KPiA+Pj4NCj4gPj4+ICsjaW5jbHVkZSA8bGludXgvYWNwaV9pb3J0 Lmg+DQo+ID4+PiAgI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPg0KPiA+Pj4gICNpbmNsdWRlIDxs aW51eC9kbWEtaW9tbXUuaD4NCj4gPj4+ICAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+DQo+ID4+PiBA QCAtMjcsNiArMjgsNyBAQA0KPiA+Pj4gICNpbmNsdWRlIDxsaW51eC9pb3ZhLmg+DQo+ID4+PiAg I2luY2x1ZGUgPGxpbnV4L2lycS5oPg0KPiA+Pj4gICNpbmNsdWRlIDxsaW51eC9tbS5oPg0KPiA+ Pj4gKyNpbmNsdWRlIDxsaW51eC9vZl9pb21tdS5oPg0KPiA+Pj4gICNpbmNsdWRlIDxsaW51eC9w Y2kuaD4NCj4gPj4+ICAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4NCj4gPj4+ICAjaW5j bHVkZSA8bGludXgvdm1hbGxvYy5oPg0KPiA+Pj4gQEAgLTE5OCw2ICsyMDAsMjQgQEAgdm9pZCBp b21tdV9kbWFfZ2V0X3Jlc3ZfcmVnaW9ucyhzdHJ1Y3QgZGV2aWNlDQo+ID4+ICpkZXYsIHN0cnVj dCBsaXN0X2hlYWQgKmxpc3QpDQo+ID4+PiAgfQ0KPiA+Pj4gIEVYUE9SVF9TWU1CT0woaW9tbXVf ZG1hX2dldF9yZXN2X3JlZ2lvbnMpOw0KPiA+Pj4NCj4gPj4+ICsvKioNCj4gPj4+ICsgKiBpb21t dV9kbWFfZ2V0X21zaV9yZXN2X3JlZ2lvbnMgLSBSZXNlcnZlZCByZWdpb24gZHJpdmVyIGhlbHBl cg0KPiA+Pj4gKyAqIEBkZXY6IERldmljZSBmcm9tIGlvbW11X2dldF9yZXN2X3JlZ2lvbnMoKQ0K PiA+Pj4gKyAqIEBsaXN0OiBSZXNlcnZlZCByZWdpb24gbGlzdCBmcm9tIGlvbW11X2dldF9yZXN2 X3JlZ2lvbnMoKQ0KPiA+Pj4gKyAqDQo+ID4+PiArICogSU9NTVUgZHJpdmVycyBjYW4gdXNlIHRo aXMgdG8gaW1wbGVtZW50IHRoZWlyIC5nZXRfcmVzdl9yZWdpb25zDQo+ID4+PiArICogY2FsbGJh Y2sgZm9yIEhXIE1TSSBzcGVjaWZpYyByZXNlcnZhdGlvbnMuIEZvciBub3csIHRoaXMgb25seQ0K PiANCj4gVGhpcyBkb2Vzbid0IG1ha2UgYW4gYXdmdWwgbG90IG9mIHNlbnNlIC0gdGhlcmUncyBv bmx5IG9uZSByZXNlcnZlZA0KPiByZWdpb24gY2FsbGJhY2ssIHNvIGlvbW11LWRtYSBzaG91bGRu J3QgYmUgb2ZmZXJpbmcgdHdvIHNlcGFyYXRlIGFuZA0KPiBub24tb3ZlcmxhcHBpbmcgaW1wbGVt ZW50YXRpb25zLg0KPiANCj4gPj4+ICsgKiBjb3ZlcnMgSVRTIE1TSSByZWdpb24gcmVzZXJ2YXRp b24gdXNpbmcgQUNQSSBJT1JUIGhlbHBlciBmdW5jdGlvbi4NCj4gPj4+ICsgKi8NCj4gPj4+ICtp bnQgaW9tbXVfZG1hX2dldF9tc2lfcmVzdl9yZWdpb25zKHN0cnVjdCBkZXZpY2UgKmRldiwgc3Ry dWN0DQo+IGxpc3RfaGVhZA0KPiA+PiAqbGlzdCkNCj4gPj4+ICt7DQo+ID4+PiArCWlmICghaXNf b2Zfbm9kZShkZXYtPmlvbW11X2Z3c3BlYy0+aW9tbXVfZndub2RlKSkNCj4gPj4+ICsJCXJldHVy biBpb3J0X2lvbW11X21zaV9nZXRfcmVzdl9yZWdpb25zKGRldiwgbGlzdCk7DQo+IA0KPiBFaXRo ZXIgdGhpcyBjYWxsIGtub3dzIGhvdyB0byBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIGFueSBwbGF0 Zm9ybSBhbmQNCj4gc2hvdWxkIGJlIG1hZGUgZnJvbSBpb21tdV9kbWFfZ2V0X3Jlc2VydmVkX3Jl Z2lvbnMoKSBkaXJlY3RseSwgb3IgaXQncw0KPiB0aWdodGx5IGNvdXBsZWQgdG8gdGhlIEhpU2ls aWNvbiBxdWlyayBpbiB0aGUgU01NVXYzIGRyaXZlciBhbmQNCj4gaW9tbXUtZG1hIGRvZXNuJ3Qg bmVlZCB0byBrbm93IC0gdGhlIG1pZGRsZSBncm91bmQgcHJlc2VudGVkIGhlcmUgaXMNCj4gc3Vy ZWx5IHRoZSB3b3JzdCBvZiBib3RoIHdvcmxkcy4NCg0KUmlnaHQuIEkgdGhpbmsgd2UgaGF2ZSBk aXNjdXNzZWQgdGhpcyBlYXJsaWVyWzFdIGFuZCBoYWQgYSB2NCBiYXNlZCBvbiBpbnZva2luZw0K dGhlIGlvcnRfaW9tbXVfaXRzX2dldF9yZXN2X3JlZ2lvbnMoKSB3aXRoaW4gdGhlIGlvbW11X2Rt YV9nZXRfcmVzdl9yZWdpb25zKCkuDQpCdXQgbGF0ZXIgYXMgeW91IHJpZ2h0bHkgcG9pbnRlZCBv dXQsIHdlIHdlcmUgbm90IGNoZWNraW5nIGZvciBwbGF0Zm9ybXMgd2hpY2gNCnJlcXVpcmVzIHRo aXMgcXVpcmsgaW5zaWRlIHRoZSBpb3J0IGNvZGUgYW5kIHRoYXQgd2lsbCBicmVhayB0aGUgcGxh dGZvcm1zIHdoaWNoIGFyZSANCmhhcHB5IHdpdGggTVNJIHRyYW5zbGF0aW9ucy4gSGVuY2UgbW92 ZWQgdG8gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaW4gdjYNCmFmdGVyIHRoaXMgZGlzY3Vz c2lvbiBoZXJlWzJdDQogDQpBbmQgZWFybGllciBJIHRoaW5rIGluIHRoZSB2MyB2ZXJzaW9uIHdl IGhhZCB0aGUgZnVuY3Rpb24gY2FsbGVkIGZyb20gc21tdSBkcml2ZXINCmRpcmVjdGx5IGFuZCB0 aGUgZmVlZGJhY2sgd2FzIHRoYXQgaXQgc2hvdWxkIGJlIGFic3RyYWN0ZWQgZnJvbSB0aGUgZHJp dmVyLg0KDQpNYXkgYmUgaXQgaXMgc3RpbGwgcG9zc2libGUgdG8gbW92ZSB0aGUgZnVuY3Rpb24g Y2FsbCBpbnNpZGUgdGhlIA0KaW9tbXVfZG1hX2dldF9yZXN2X3JlZ2lvbnMoKSBhbmQgZG8gdGhl IHNtbXUgbW9kZWwgY2hlY2sgaW5zaWRlDQogdGhlIGlvcnQgaGVscGVyIGZ1bmN0aW9uIGFuZCBz ZWxlY3RpdmVseSBhcHBseSB0aGUgSFcgTVNJIHJlc2VydmF0aW9ucy4NCg0KQnV0IEkgdGhpbmsg aXQgaXMgbXVjaCBuZWF0ZXIgaWYgd2UgY2FuIGludm9rZSB0aGUgaW9ydF9nZXRfbXNpX3JlZ2lv bnMoKSBkaXJlY3RseQ0KZnJvbSBTTU1VdjMgYmFzZWQgb24gdGhlIG1vZGVsLg0KDQpUaG91Z2h0 cz8NCg0KVGhhbmtzLA0KU2hhbWVlcg0KMS4gaHR0cHM6Ly9wYXRjaGVzLmxpbmFyby5vcmcvcGF0 Y2gvMTA2MjY4Lw0KMi4gaHR0cHM6Ly93d3cuc3Bpbmljcy5uZXQvbGlzdHMvYXJtLWtlcm5lbC9t c2c1OTkxNjIuaHRtbA0KDQoNCg0K -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Lorenzo/Will, > -----Original Message----- > From: Shameerali Kolothum Thodi > Sent: Wednesday, October 18, 2017 3:24 PM > To: 'Robin Murphy' <robin.murphy@arm.com>; Will Deacon > <will.deacon@arm.com> > Cc: lorenzo.pieralisi@arm.com; Gabriele Paoloni > <gabriele.paoloni@huawei.com>; marc.zyngier@arm.com; linux- > pci@vger.kernel.org; joro@8bytes.org; John Garry <john.garry@huawei.com>; > Guohanjun (Hanjun Guo) <guohanjun@huawei.com>; Linuxarm > <linuxarm@huawei.com>; linux-acpi@vger.kernel.org; iommu@lists.linux- > foundation.org; Wangzhou (B) <wangzhou1@hisilicon.com>; > sudeep.holla@arm.com; bhelgaas@google.com; linux-arm- > kernel@lists.infradead.org; devel@acpica.org > Subject: RE: [PATCH v9 2/4] iommu/dma: Add a helper function to reserve HW > MSI address regions for IOMMU drivers > > > > > -----Original Message----- > > From: Robin Murphy [mailto:robin.murphy@arm.com] > > Sent: Wednesday, October 18, 2017 1:34 PM > > To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>; > > Will Deacon <will.deacon@arm.com> > > Cc: lorenzo.pieralisi@arm.com; Gabriele Paoloni > > <gabriele.paoloni@huawei.com>; marc.zyngier@arm.com; linux- > > pci@vger.kernel.org; joro@8bytes.org; John Garry > > <john.garry@huawei.com>; Guohanjun (Hanjun Guo) > > <guohanjun@huawei.com>; Linuxarm <linuxarm@huawei.com>; > > linux-acpi@vger.kernel.org; iommu@lists.linux- foundation.org; > > Wangzhou (B) <wangzhou1@hisilicon.com>; sudeep.holla@arm.com; > > bhelgaas@google.com; linux-arm- kernel@lists.infradead.org; > > devel@acpica.org > > Subject: Re: [PATCH v9 2/4] iommu/dma: Add a helper function to > > reserve HW MSI address regions for IOMMU drivers > > > > On 16/10/17 17:09, Shameerali Kolothum Thodi wrote: > > > Hi Robin, > > > > > >> -----Original Message----- > > >> From: Will Deacon [mailto:will.deacon@arm.com] > > >> Sent: Friday, October 13, 2017 8:24 PM > > >> To: Shameerali Kolothum Thodi > > >> <shameerali.kolothum.thodi@huawei.com> > > >> Cc: lorenzo.pieralisi@arm.com; marc.zyngier@arm.com; > > >> sudeep.holla@arm.com; robin.murphy@arm.com; joro@8bytes.org; > > >> bhelgaas@google.com; Gabriele Paoloni > > >> <gabriele.paoloni@huawei.com>; John Garry <john.garry@huawei.com>; > > >> iommu@lists.linux-foundation.org; > > >> linux-arm-kernel@lists.infradead.org; linux-acpi@vger.kernel.org; > > >> linux- pci@vger.kernel.org; devel@acpica.org; Linuxarm > > <linuxarm@huawei.com>; > > >> Wangzhou (B) <wangzhou1@hisilicon.com>; Guohanjun (Hanjun Guo) > > >> <guohanjun@huawei.com> > > >> Subject: Re: [PATCH v9 2/4] iommu/dma: Add a helper function to > > >> reserve > > HW > > >> MSI address regions for IOMMU drivers > > >> > > >> On Fri, Oct 06, 2017 at 03:04:48PM +0100, Shameer Kolothum wrote: > > >>> IOMMU drivers can use this to implement their .get_resv_regions > > >>> callback for HW MSI specific reservations(e.g. ARM GICv3 ITS MSI > region). > > >>> > > >>> Signed-off-by: Shameer Kolothum > > <shameerali.kolothum.thodi@huawei.com> > > >>> --- > > >>> drivers/iommu/dma-iommu.c | 20 ++++++++++++++++++++ > > >>> include/linux/dma-iommu.h | 7 +++++++ > > >>> 2 files changed, 27 insertions(+) > > >> > > >> I'd like to see Robin's Ack on this, because this is his code and > > >> he had ideas on ways to solve this problem properly. > > > > > > Please let us know if it is ok to go ahead with ACPI support for now. > > > It will help our customers to start using pass-through for PCIe. > > > > > > Thanks, > > > Shameer > > > > > >> > > >> Will > > >> > > >>> diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c > > >>> index 9d1cebe..bae677e 100644 > > >>> --- a/drivers/iommu/dma-iommu.c > > >>> +++ b/drivers/iommu/dma-iommu.c > > >>> @@ -19,6 +19,7 @@ > > >>> * along with this program. If not, see <http://www.gnu.org/licenses/>. > > >>> */ > > >>> > > >>> +#include <linux/acpi_iort.h> > > >>> #include <linux/device.h> > > >>> #include <linux/dma-iommu.h> > > >>> #include <linux/gfp.h> > > >>> @@ -27,6 +28,7 @@ > > >>> #include <linux/iova.h> > > >>> #include <linux/irq.h> > > >>> #include <linux/mm.h> > > >>> +#include <linux/of_iommu.h> > > >>> #include <linux/pci.h> > > >>> #include <linux/scatterlist.h> > > >>> #include <linux/vmalloc.h> > > >>> @@ -198,6 +200,24 @@ void iommu_dma_get_resv_regions(struct > device > > >> *dev, struct list_head *list) > > >>> } > > >>> EXPORT_SYMBOL(iommu_dma_get_resv_regions); > > >>> > > >>> +/** > > >>> + * iommu_dma_get_msi_resv_regions - Reserved region driver helper > > >>> + * @dev: Device from iommu_get_resv_regions() > > >>> + * @list: Reserved region list from iommu_get_resv_regions() > > >>> + * > > >>> + * IOMMU drivers can use this to implement their > > >>> +.get_resv_regions > > >>> + * callback for HW MSI specific reservations. For now, this only > > > > This doesn't make an awful lot of sense - there's only one reserved > > region callback, so iommu-dma shouldn't be offering two separate and > > non-overlapping implementations. > > > > >>> + * covers ITS MSI region reservation using ACPI IORT helper function. > > >>> + */ > > >>> +int iommu_dma_get_msi_resv_regions(struct device *dev, struct > > list_head > > >> *list) > > >>> +{ > > >>> + if (!is_of_node(dev->iommu_fwspec->iommu_fwnode)) > > >>> + return iort_iommu_msi_get_resv_regions(dev, list); > > > > Either this call knows how to do the right thing for any platform and > > should be made from iommu_dma_get_reserved_regions() directly, or it's > > tightly coupled to the HiSilicon quirk in the SMMUv3 driver and > > iommu-dma doesn't need to know - the middle ground presented here is > > surely the worst of both worlds. > > Right. I think we have discussed this earlier[1] and had a v4 based on invoking > the iort_iommu_its_get_resv_regions() within the > iommu_dma_get_resv_regions(). > But later as you rightly pointed out, we were not checking for platforms which > requires this quirk inside the iort code and that will break the platforms which > are happy with MSI translations. Hence moved to the current implementation > in v6 after this discussion here[2] > > And earlier I think in the v3 version we had the function called from smmu > driver directly and the feedback was that it should be abstracted from the > driver. > > May be it is still possible to move the function call inside the > iommu_dma_get_resv_regions() and do the smmu model check inside the iort > helper function and selectively apply the HW MSI reservations. > > But I think it is much neater if we can invoke the iort_get_msi_regions() > directly from SMMUv3 based on the model. > > Thoughts? As we still don’t have a clear resolution on how to invoke the iort_iommu_msi_get_resv_regions(), I have gone back and attempted to move the smmu model check inside the iort code. This means the function will selectively apply HW MSI reservation based on the platform and also the function can be invoked from the iommu_dma_get_resv_regions() directly. Could you please take a look at the below snippet and let me know your feedback. Hope we can make some progress on this series. Thanks, Shameer -->8-- diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c index 876c0e1..a27233d 100644 --- a/drivers/acpi/arm64/iort.c +++ b/drivers/acpi/arm64/iort.c @@ -619,6 +619,39 @@ static int __maybe_unused __get_pci_rid(struct pci_dev *pdev, u16 alias, return 0; } +static bool __maybe_unused iort_hw_msi_resv_enable(struct device *dev, + struct acpi_iort_node *node) +{ + struct acpi_iort_node *iommu = NULL; + int i; + + if (dev_is_pci(dev)) { + u32 rid; + + pci_for_each_dma_alias(to_pci_dev(dev), __get_pci_rid, &rid); + iommu = iort_node_map_id(node, rid, NULL, IORT_IOMMU_TYPE); + } else { + for (i = 0; i < node->mapping_count; i++) { + iommu = iort_node_map_platform_id(node, NULL, + IORT_IOMMU_TYPE, i); + if (iommu) + break; + } + } + + if (iommu && (iommu->type == ACPI_IORT_NODE_SMMU_V3)) { + struct acpi_iort_smmu_v3 *smmu; + + smmu = (struct acpi_iort_smmu_v3 *)iommu->node_data; + if (smmu->model == ACPI_IORT_SMMU_V3_HISILICON_HI161X) { + dev_notice(dev, "Enabling HiSilicon erratum 161010801\n"); + return true; + } + } + + return false; +} + static int arm_smmu_iort_xlate(struct device *dev, u32 streamid, struct fwnode_handle *fwnode, const struct iommu_ops *ops) @@ -682,6 +715,9 @@ int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head) if (!node) return -ENODEV; + if (!iort_hw_msi_resv_enable(dev, node)) + return 0; + /* * Current logic to reserve ITS regions relies on HW topologies * where a given PCI or named component maps its IDs to only one diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index 9d1cebe..67c6e30 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -19,6 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <linux/acpi_iort.h> #include <linux/device.h> #include <linux/dma-iommu.h> #include <linux/gfp.h> @@ -174,6 +175,10 @@ void iommu_dma_get_resv_regions(struct device *dev, struct list_head *list) struct pci_host_bridge *bridge; struct resource_entry *window; + if (!is_of_node(dev->iommu_fwspec->iommu_fwnode) && + iort_iommu_msi_get_resv_regions(dev, list) < 0) + return; + if (!dev_is_pci(dev)) return; diff --git a/include/linux/acpi_iort.h b/include/linux/acpi_iort.h index 182a577..88f17c9 100644 --- a/include/linux/acpi_iort.h +++ b/include/linux/acpi_iort.h @@ -56,7 +56,7 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev) { return NULL; } static inline int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head) -{ return -ENODEV; } +{ return 0; } #endif #endif /* __ACPI_IORT_H__ */ -->8--
On Thu, Oct 26, 2017 at 10:11:58AM +0000, Shameerali Kolothum Thodi wrote: [...] > > > >>> +int iommu_dma_get_msi_resv_regions(struct device *dev, struct > > > list_head > > > >> *list) > > > >>> +{ > > > >>> + if (!is_of_node(dev->iommu_fwspec->iommu_fwnode)) > > > >>> + return iort_iommu_msi_get_resv_regions(dev, list); > > > > > > Either this call knows how to do the right thing for any platform and > > > should be made from iommu_dma_get_reserved_regions() directly, or it's > > > tightly coupled to the HiSilicon quirk in the SMMUv3 driver and > > > iommu-dma doesn't need to know - the middle ground presented here is > > > surely the worst of both worlds. > > > > Right. I think we have discussed this earlier[1] and had a v4 based on invoking > > the iort_iommu_its_get_resv_regions() within the > > iommu_dma_get_resv_regions(). > > But later as you rightly pointed out, we were not checking for platforms which > > requires this quirk inside the iort code and that will break the platforms which > > are happy with MSI translations. Hence moved to the current implementation > > in v6 after this discussion here[2] > > > > And earlier I think in the v3 version we had the function called from smmu > > driver directly and the feedback was that it should be abstracted from the > > driver. > > > > May be it is still possible to move the function call inside the > > iommu_dma_get_resv_regions() and do the smmu model check inside the iort > > helper function and selectively apply the HW MSI reservations. > > > > But I think it is much neater if we can invoke the iort_get_msi_regions() > > directly from SMMUv3 based on the model. > > > > Thoughts? > > As we still don’t have a clear resolution on how to invoke the > iort_iommu_msi_get_resv_regions(), I have gone back and attempted to move the > smmu model check inside the iort code. This means the function will selectively > apply HW MSI reservation based on the platform and also the function can be > invoked from the iommu_dma_get_resv_regions() directly. > > Could you please take a look at the below snippet and let me know your feedback. > Hope we can make some progress on this series. > > Thanks, > Shameer > > -->8-- > diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c > index 876c0e1..a27233d 100644 > --- a/drivers/acpi/arm64/iort.c > +++ b/drivers/acpi/arm64/iort.c > @@ -619,6 +619,39 @@ static int __maybe_unused __get_pci_rid(struct pci_dev *pdev, u16 alias, > return 0; > } > > +static bool __maybe_unused iort_hw_msi_resv_enable(struct device *dev, > + struct acpi_iort_node *node) > +{ > + struct acpi_iort_node *iommu = NULL; > + int i; > + > + if (dev_is_pci(dev)) { > + u32 rid; > + > + pci_for_each_dma_alias(to_pci_dev(dev), __get_pci_rid, &rid); > + iommu = iort_node_map_id(node, rid, NULL, IORT_IOMMU_TYPE); > + } else { > + for (i = 0; i < node->mapping_count; i++) { > + iommu = iort_node_map_platform_id(node, NULL, > + IORT_IOMMU_TYPE, i); > + if (iommu) > + break; > + } > + } You do not need (and I do not want this code) to do the mapping again. You have the fwnode (ie dev->iommu_fwspec) corresponding to the IOMMU, you can retrieve the SMMU IORT node by a simple look-up and carry out the check below. It would be simpler to set an option in the SMMUv3 driver but then you go back to square one with DT/ACPI SMMUv3 driver awareness so, if, with the change above this can make the generic approach work (ie Robin is happy with it) I am fine with this IORT update as well. Lorenzo > + > + if (iommu && (iommu->type == ACPI_IORT_NODE_SMMU_V3)) { > + struct acpi_iort_smmu_v3 *smmu; > + > + smmu = (struct acpi_iort_smmu_v3 *)iommu->node_data; > + if (smmu->model == ACPI_IORT_SMMU_V3_HISILICON_HI161X) { > + dev_notice(dev, "Enabling HiSilicon erratum 161010801\n"); > + return true; > + } > + } > + > + return false; > +} > + > static int arm_smmu_iort_xlate(struct device *dev, u32 streamid, > struct fwnode_handle *fwnode, > const struct iommu_ops *ops) > @@ -682,6 +715,9 @@ int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head) > if (!node) > return -ENODEV; > > + if (!iort_hw_msi_resv_enable(dev, node)) > + return 0; > + > /* > * Current logic to reserve ITS regions relies on HW topologies > * where a given PCI or named component maps its IDs to only one > diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c > index 9d1cebe..67c6e30 100644 > --- a/drivers/iommu/dma-iommu.c > +++ b/drivers/iommu/dma-iommu.c > @@ -19,6 +19,7 @@ > * along with this program. If not, see <http://www.gnu.org/licenses/>. > */ > > +#include <linux/acpi_iort.h> > #include <linux/device.h> > #include <linux/dma-iommu.h> > #include <linux/gfp.h> > @@ -174,6 +175,10 @@ void iommu_dma_get_resv_regions(struct device *dev, struct list_head *list) > struct pci_host_bridge *bridge; > struct resource_entry *window; > > + if (!is_of_node(dev->iommu_fwspec->iommu_fwnode) && > + iort_iommu_msi_get_resv_regions(dev, list) < 0) > + return; > + > if (!dev_is_pci(dev)) > return; > > diff --git a/include/linux/acpi_iort.h b/include/linux/acpi_iort.h > index 182a577..88f17c9 100644 > --- a/include/linux/acpi_iort.h > +++ b/include/linux/acpi_iort.h > @@ -56,7 +56,7 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev) > { return NULL; } > static inline > int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head) > -{ return -ENODEV; } > +{ return 0; } > #endif > > #endif /* __ACPI_IORT_H__ */ > > -->8-- > > > -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogTG9yZW56byBQaWVyYWxp c2kgW21haWx0bzpsb3JlbnpvLnBpZXJhbGlzaUBhcm0uY29tXQ0KPiBTZW50OiBGcmlkYXksIE5v dmVtYmVyIDAzLCAyMDE3IDExOjM1IEFNDQo+IFRvOiBTaGFtZWVyYWxpIEtvbG90aHVtIFRob2Rp IDxzaGFtZWVyYWxpLmtvbG90aHVtLnRob2RpQGh1YXdlaS5jb20+DQo+IENjOiBSb2JpbiBNdXJw aHkgPHJvYmluLm11cnBoeUBhcm0uY29tPjsgV2lsbCBEZWFjb24NCj4gPHdpbGwuZGVhY29uQGFy bS5jb20+OyBHYWJyaWVsZSBQYW9sb25pIDxnYWJyaWVsZS5wYW9sb25pQGh1YXdlaS5jb20+Ow0K PiBtYXJjLnp5bmdpZXJAYXJtLmNvbTsgbGludXgtcGNpQHZnZXIua2VybmVsLm9yZzsgam9yb0A4 Ynl0ZXMub3JnOyBKb2huDQo+IEdhcnJ5IDxqb2huLmdhcnJ5QGh1YXdlaS5jb20+OyBHdW9oYW5q dW4gKEhhbmp1biBHdW8pDQo+IDxndW9oYW5qdW5AaHVhd2VpLmNvbT47IExpbnV4YXJtIDxsaW51 eGFybUBodWF3ZWkuY29tPjsgbGludXgtDQo+IGFjcGlAdmdlci5rZXJuZWwub3JnOyBpb21tdUBs aXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZzsgV2FuZ3pob3UgKEIpDQo+IDx3YW5nemhvdTFAaGlz aWxpY29uLmNvbT47IHN1ZGVlcC5ob2xsYUBhcm0uY29tOyBiaGVsZ2Fhc0Bnb29nbGUuY29tOw0K PiBsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmc7IGRldmVsQGFjcGljYS5vcmcN Cj4gU3ViamVjdDogUmU6IFtQQVRDSCB2OSAyLzRdIGlvbW11L2RtYTogQWRkIGEgaGVscGVyIGZ1 bmN0aW9uIHRvIHJlc2VydmUgSFcNCj4gTVNJIGFkZHJlc3MgcmVnaW9ucyBmb3IgSU9NTVUgZHJp dmVycw0KPiANCj4gT24gVGh1LCBPY3QgMjYsIDIwMTcgYXQgMTA6MTE6NThBTSArMDAwMCwgU2hh bWVlcmFsaSBLb2xvdGh1bSBUaG9kaSB3cm90ZToNCj4gDQpbLi5dDQoNCj4gPg0KPiA+IEFzIHdl IHN0aWxsIGRvbuKAmXQgaGF2ZSBhIGNsZWFyIHJlc29sdXRpb24gb24gaG93IHRvIGludm9rZSB0 aGUNCj4gPiBpb3J0X2lvbW11X21zaV9nZXRfcmVzdl9yZWdpb25zKCksIEkgaGF2ZSBnb25lIGJh Y2sgYW5kIGF0dGVtcHRlZCB0bw0KPiA+IG1vdmUgdGhlIHNtbXUgbW9kZWwgY2hlY2sgaW5zaWRl IHRoZSBpb3J0IGNvZGUuIFRoaXMgbWVhbnMgdGhlDQo+ID4gZnVuY3Rpb24gd2lsbCBzZWxlY3Rp dmVseSBhcHBseSBIVyBNU0kgcmVzZXJ2YXRpb24gYmFzZWQgb24gdGhlDQo+ID4gcGxhdGZvcm0g YW5kIGFsc28gdGhlIGZ1bmN0aW9uIGNhbiBiZSBpbnZva2VkIGZyb20gdGhlDQo+IGlvbW11X2Rt YV9nZXRfcmVzdl9yZWdpb25zKCkgZGlyZWN0bHkuDQo+ID4NCj4gPiBDb3VsZCB5b3UgcGxlYXNl IHRha2UgYSBsb29rIGF0IHRoZSBiZWxvdyBzbmlwcGV0IGFuZCBsZXQgbWUga25vdyB5b3VyDQo+ IGZlZWRiYWNrLg0KPiA+IEhvcGUgd2UgY2FuIG1ha2Ugc29tZSBwcm9ncmVzcyBvbiB0aGlzIHNl cmllcy4NCj4gPg0KPiA+IFRoYW5rcywNCj4gPiBTaGFtZWVyDQo+ID4NCj4gPiAtLT44LS0NCj4g PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FybTY0L2lvcnQuYyBiL2RyaXZlcnMvYWNwaS9h cm02NC9pb3J0LmMNCj4gPiBpbmRleCA4NzZjMGUxLi5hMjcyMzNkIDEwMDY0NA0KPiA+IC0tLSBh L2RyaXZlcnMvYWNwaS9hcm02NC9pb3J0LmMNCj4gPiArKysgYi9kcml2ZXJzL2FjcGkvYXJtNjQv aW9ydC5jDQo+ID4gQEAgLTYxOSw2ICs2MTksMzkgQEAgc3RhdGljIGludCBfX21heWJlX3VudXNl ZCBfX2dldF9wY2lfcmlkKHN0cnVjdA0KPiBwY2lfZGV2ICpwZGV2LCB1MTYgYWxpYXMsDQo+ID4g IAlyZXR1cm4gMDsNCj4gPiAgfQ0KPiA+DQo+ID4gK3N0YXRpYyBib29sIF9fbWF5YmVfdW51c2Vk IGlvcnRfaHdfbXNpX3Jlc3ZfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwNCj4gPiArCQkJCQlz dHJ1Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGUpDQo+ID4gK3sNCj4gPiArCXN0cnVjdCBhY3BpX2lv cnRfbm9kZSAqaW9tbXUgPSBOVUxMOw0KPiA+ICsJaW50IGk7DQo+ID4gKw0KPiA+ICsJaWYgKGRl dl9pc19wY2koZGV2KSkgew0KPiA+ICsJCXUzMiByaWQ7DQo+ID4gKw0KPiA+ICsJCXBjaV9mb3Jf ZWFjaF9kbWFfYWxpYXModG9fcGNpX2RldihkZXYpLCBfX2dldF9wY2lfcmlkLCAmcmlkKTsNCj4g PiArCQlpb21tdSA9IGlvcnRfbm9kZV9tYXBfaWQobm9kZSwgcmlkLCBOVUxMLA0KPiBJT1JUX0lP TU1VX1RZUEUpOw0KPiA+ICsJfSBlbHNlIHsNCj4gPiArCQlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+ bWFwcGluZ19jb3VudDsgaSsrKSB7DQo+ID4gKwkJCWlvbW11ID0gaW9ydF9ub2RlX21hcF9wbGF0 Zm9ybV9pZChub2RlLCBOVUxMLA0KPiA+ICsJCQkJCQkJSU9SVF9JT01NVV9UWVBFLA0KPiBpKTsN Cj4gPiArCQkJaWYgKGlvbW11KQ0KPiA+ICsJCQkJYnJlYWs7DQo+ID4gKwkJfQ0KPiA+ICsJfQ0K PiANCj4gWW91IGRvIG5vdCBuZWVkIChhbmQgSSBkbyBub3Qgd2FudCB0aGlzIGNvZGUpIHRvIGRv IHRoZSBtYXBwaW5nIGFnYWluLg0KPiANCj4gWW91IGhhdmUgdGhlIGZ3bm9kZSAoaWUgZGV2LT5p b21tdV9md3NwZWMpIGNvcnJlc3BvbmRpbmcgdG8gdGhlIElPTU1VLA0KPiB5b3UgY2FuIHJldHJp ZXZlIHRoZSBTTU1VIElPUlQgbm9kZSBieSBhIHNpbXBsZSBsb29rLXVwIGFuZCBjYXJyeSBvdXQg dGhlDQo+IGNoZWNrIGJlbG93Lg0KDQpPay4gVW5kZXJzdG9vZC4gSSB3aWxsIHJld29yayB0aGlz IHBhcnQgdGhlbi4NCg0KPiBJdCB3b3VsZCBiZSBzaW1wbGVyIHRvIHNldCBhbiBvcHRpb24gaW4g dGhlIFNNTVV2MyBkcml2ZXIgYnV0IHRoZW4geW91IGdvIGJhY2sNCj4gdG8gc3F1YXJlIG9uZSB3 aXRoIERUL0FDUEkgU01NVXYzIGRyaXZlciBhd2FyZW5lc3Mgc28sIGlmLCB3aXRoIHRoZSBjaGFu Z2UNCj4gYWJvdmUgdGhpcyBjYW4gbWFrZSB0aGUgZ2VuZXJpYyBhcHByb2FjaCB3b3JrIChpZSBS b2JpbiBpcyBoYXBweSB3aXRoIGl0KSBJIGFtDQo+IGZpbmUgd2l0aCB0aGlzIElPUlQgdXBkYXRl IGFzIHdlbGwuDQoNClRoYW5rcyBMb3JlbnpvLiBJIHdpbGwgcmViYXNlIG9uIHRvcCBvZiByYzEg YW5kIHByZXBhcmUgdjEwIHdpdGggdGhlc2UgY2hhbmdlcw0KYW5kIHNlbnQgaXQgb3V0Lg0KDQpT aGFtZWVyIA0KDQo+ID4gKw0KPiA+ICsJaWYgKGlvbW11ICYmIChpb21tdS0+dHlwZSA9PSBBQ1BJ X0lPUlRfTk9ERV9TTU1VX1YzKSkgew0KPiA+ICsJCXN0cnVjdCBhY3BpX2lvcnRfc21tdV92MyAq c21tdTsNCj4gPiArDQo+ID4gKwkJc21tdSA9IChzdHJ1Y3QgYWNwaV9pb3J0X3NtbXVfdjMgKilp b21tdS0+bm9kZV9kYXRhOw0KPiA+ICsJCWlmIChzbW11LT5tb2RlbCA9PQ0KPiBBQ1BJX0lPUlRf U01NVV9WM19ISVNJTElDT05fSEkxNjFYKSB7DQo+ID4gKwkJCWRldl9ub3RpY2UoZGV2LCAiRW5h YmxpbmcgSGlTaWxpY29uIGVycmF0dW0NCj4gMTYxMDEwODAxXG4iKTsNCj4gPiArCQkJcmV0dXJu IHRydWU7DQo+ID4gKwkJfQ0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldHVybiBmYWxzZTsNCj4g PiArfQ0KPiA+ICsNCj4gPiAgc3RhdGljIGludCBhcm1fc21tdV9pb3J0X3hsYXRlKHN0cnVjdCBk ZXZpY2UgKmRldiwgdTMyIHN0cmVhbWlkLA0KPiA+ICAJCQkgICAgICAgc3RydWN0IGZ3bm9kZV9o YW5kbGUgKmZ3bm9kZSwNCj4gPiAgCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpb21tdV9vcHMgKm9w cykgQEAgLTY4Miw2ICs3MTUsOQ0KPiBAQCBpbnQNCj4gPiBpb3J0X2lvbW11X21zaV9nZXRfcmVz dl9yZWdpb25zKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGxpc3RfaGVhZA0KPiAqaGVhZCkN Cj4gPiAgCWlmICghbm9kZSkNCj4gPiAgCQlyZXR1cm4gLUVOT0RFVjsNCj4gPg0KPiA+ICsJaWYg KCFpb3J0X2h3X21zaV9yZXN2X2VuYWJsZShkZXYsIG5vZGUpKQ0KPiA+ICsJCXJldHVybiAwOw0K PiA+ICsNCj4gPiAgCS8qDQo+ID4gIAkgKiBDdXJyZW50IGxvZ2ljIHRvIHJlc2VydmUgSVRTIHJl Z2lvbnMgcmVsaWVzIG9uIEhXIHRvcG9sb2dpZXMNCj4gPiAgCSAqIHdoZXJlIGEgZ2l2ZW4gUENJ IG9yIG5hbWVkIGNvbXBvbmVudCBtYXBzIGl0cyBJRHMgdG8gb25seSBvbmUNCj4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9pb21tdS9kbWEtaW9tbXUuYyBiL2RyaXZlcnMvaW9tbXUvZG1hLWlvbW11 LmMNCj4gPiBpbmRleCA5ZDFjZWJlLi42N2M2ZTMwIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMv aW9tbXUvZG1hLWlvbW11LmMNCj4gPiArKysgYi9kcml2ZXJzL2lvbW11L2RtYS1pb21tdS5jDQo+ ID4gQEAgLTE5LDYgKzE5LDcgQEANCj4gPiAgICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJ ZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQo+ID4gICAqLw0KPiA+ DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9hY3BpX2lvcnQuaD4NCj4gPiAgI2luY2x1ZGUgPGxpbnV4 L2RldmljZS5oPg0KPiA+ICAjaW5jbHVkZSA8bGludXgvZG1hLWlvbW11Lmg+DQo+ID4gICNpbmNs dWRlIDxsaW51eC9nZnAuaD4NCj4gPiBAQCAtMTc0LDYgKzE3NSwxMCBAQCB2b2lkIGlvbW11X2Rt YV9nZXRfcmVzdl9yZWdpb25zKHN0cnVjdCBkZXZpY2UNCj4gKmRldiwgc3RydWN0IGxpc3RfaGVh ZCAqbGlzdCkNCj4gPiAgCXN0cnVjdCBwY2lfaG9zdF9icmlkZ2UgKmJyaWRnZTsNCj4gPiAgCXN0 cnVjdCByZXNvdXJjZV9lbnRyeSAqd2luZG93Ow0KPiA+DQo+ID4gKwlpZiAoIWlzX29mX25vZGUo ZGV2LT5pb21tdV9md3NwZWMtPmlvbW11X2Z3bm9kZSkgJiYNCj4gPiArCQlpb3J0X2lvbW11X21z aV9nZXRfcmVzdl9yZWdpb25zKGRldiwgbGlzdCkgPCAwKQ0KPiA+ICsJCXJldHVybjsNCj4gPiAr DQo+ID4gIAlpZiAoIWRldl9pc19wY2koZGV2KSkNCj4gPiAgCQlyZXR1cm47DQo+ID4NCj4gPiBk aWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hY3BpX2lvcnQuaCBiL2luY2x1ZGUvbGludXgvYWNw aV9pb3J0LmgNCj4gPiBpbmRleCAxODJhNTc3Li44OGYxN2M5IDEwMDY0NA0KPiA+IC0tLSBhL2lu Y2x1ZGUvbGludXgvYWNwaV9pb3J0LmgNCj4gPiArKysgYi9pbmNsdWRlL2xpbnV4L2FjcGlfaW9y dC5oDQo+ID4gQEAgLTU2LDcgKzU2LDcgQEAgY29uc3Qgc3RydWN0IGlvbW11X29wcyAqaW9ydF9p b21tdV9jb25maWd1cmUoc3RydWN0DQo+ID4gZGV2aWNlICpkZXYpICB7IHJldHVybiBOVUxMOyB9 ICBzdGF0aWMgaW5saW5lICBpbnQNCj4gPiBpb3J0X2lvbW11X21zaV9nZXRfcmVzdl9yZWdpb25z KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGxpc3RfaGVhZA0KPiA+ICpoZWFkKSAteyByZXR1 cm4gLUVOT0RFVjsgfQ0KPiA+ICt7IHJldHVybiAwOyB9DQo+ID4gICNlbmRpZg0KPiA+DQo+ID4g ICNlbmRpZiAvKiBfX0FDUElfSU9SVF9IX18gKi8NCj4gPg0KPiA+IC0tPjgtLQ0KPiA+DQo+ID4N Cj4gPg0K -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index 9d1cebe..bae677e 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -19,6 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <linux/acpi_iort.h> #include <linux/device.h> #include <linux/dma-iommu.h> #include <linux/gfp.h> @@ -27,6 +28,7 @@ #include <linux/iova.h> #include <linux/irq.h> #include <linux/mm.h> +#include <linux/of_iommu.h> #include <linux/pci.h> #include <linux/scatterlist.h> #include <linux/vmalloc.h> @@ -198,6 +200,24 @@ void iommu_dma_get_resv_regions(struct device *dev, struct list_head *list) } EXPORT_SYMBOL(iommu_dma_get_resv_regions); +/** + * iommu_dma_get_msi_resv_regions - Reserved region driver helper + * @dev: Device from iommu_get_resv_regions() + * @list: Reserved region list from iommu_get_resv_regions() + * + * IOMMU drivers can use this to implement their .get_resv_regions + * callback for HW MSI specific reservations. For now, this only + * covers ITS MSI region reservation using ACPI IORT helper function. + */ +int iommu_dma_get_msi_resv_regions(struct device *dev, struct list_head *list) +{ + if (!is_of_node(dev->iommu_fwspec->iommu_fwnode)) + return iort_iommu_msi_get_resv_regions(dev, list); + + return -ENODEV; +} +EXPORT_SYMBOL(iommu_dma_get_msi_resv_regions); + static int cookie_init_hw_msi_region(struct iommu_dma_cookie *cookie, phys_addr_t start, phys_addr_t end) { diff --git a/include/linux/dma-iommu.h b/include/linux/dma-iommu.h index 92f2083..6062ef0 100644 --- a/include/linux/dma-iommu.h +++ b/include/linux/dma-iommu.h @@ -74,6 +74,8 @@ void iommu_dma_unmap_resource(struct device *dev, dma_addr_t handle, void iommu_dma_map_msi_msg(int irq, struct msi_msg *msg); void iommu_dma_get_resv_regions(struct device *dev, struct list_head *list); +int iommu_dma_get_msi_resv_regions(struct device *dev, struct list_head *list); + #else struct iommu_domain; @@ -107,6 +109,11 @@ static inline void iommu_dma_get_resv_regions(struct device *dev, struct list_he { } +static inline int iommu_dma_get_msi_resv_regions(struct device *dev, struct list_head *list) +{ + return -ENODEV; +} + #endif /* CONFIG_IOMMU_DMA */ #endif /* __KERNEL__ */ #endif /* __DMA_IOMMU_H */
IOMMU drivers can use this to implement their .get_resv_regions callback for HW MSI specific reservations(e.g. ARM GICv3 ITS MSI region). Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> --- drivers/iommu/dma-iommu.c | 20 ++++++++++++++++++++ include/linux/dma-iommu.h | 7 +++++++ 2 files changed, 27 insertions(+) -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html