[v9,2/4] iommu/dma: Add a helper function to reserve HW MSI address regions for IOMMU drivers

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)
Related show

Commit Message

Shameer Kolothum Oct. 6, 2017, 2:04 p.m.
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

Comments

Will Deacon Oct. 13, 2017, 7:23 p.m. | #1
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
Shameer Kolothum Oct. 16, 2017, 4:09 p.m. | #2
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
Robin Murphy Oct. 18, 2017, 12:34 p.m. | #3
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
Shameer Kolothum Oct. 18, 2017, 2:23 p.m. | #4
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
Shameer Kolothum Oct. 26, 2017, 10:11 a.m. | #5
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--
Lorenzo Pieralisi Nov. 3, 2017, 11:35 a.m. | #6
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
Shameer Kolothum Nov. 7, 2017, 9:37 a.m. | #7
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

Patch

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 */