2020-10-02 06:16:19

by Nicolin Chen

[permalink] [raw]
Subject: [PATCH v4 3/3] iommu/tegra-smmu: Add PCI support

This patch simply adds support for PCI devices.

Signed-off-by: Nicolin Chen <[email protected]>
---

Changelog
v3->v4
* Dropped !iommu_present() check
* Added CONFIG_PCI check in the exit path
v2->v3
* Replaced ternary conditional operator with if-else in .device_group()
* Dropped change in tegra_smmu_remove()
v1->v2
* Added error-out labels in tegra_smmu_probe()
* Dropped pci_request_acs() since IOMMU core would call it.

drivers/iommu/tegra-smmu.c | 37 +++++++++++++++++++++++++++----------
1 file changed, 27 insertions(+), 10 deletions(-)

diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c
index 02d02b0c55c4..b701a7b55e84 100644
--- a/drivers/iommu/tegra-smmu.c
+++ b/drivers/iommu/tegra-smmu.c
@@ -10,6 +10,7 @@
#include <linux/kernel.h>
#include <linux/of.h>
#include <linux/of_device.h>
+#include <linux/pci.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
@@ -865,7 +866,11 @@ static struct iommu_group *tegra_smmu_device_group(struct device *dev)
group->smmu = smmu;
group->soc = soc;

- group->group = iommu_group_alloc();
+ if (dev_is_pci(dev))
+ group->group = pci_device_group(dev);
+ else
+ group->group = generic_device_group(dev);
+
if (IS_ERR(group->group)) {
devm_kfree(smmu->dev, group);
mutex_unlock(&smmu->lock);
@@ -1069,22 +1074,32 @@ struct tegra_smmu *tegra_smmu_probe(struct device *dev,
iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);

err = iommu_device_register(&smmu->iommu);
- if (err) {
- iommu_device_sysfs_remove(&smmu->iommu);
- return ERR_PTR(err);
- }
+ if (err)
+ goto err_sysfs;

err = bus_set_iommu(&platform_bus_type, &tegra_smmu_ops);
- if (err < 0) {
- iommu_device_unregister(&smmu->iommu);
- iommu_device_sysfs_remove(&smmu->iommu);
- return ERR_PTR(err);
- }
+ if (err < 0)
+ goto err_unregister;
+
+#ifdef CONFIG_PCI
+ err = bus_set_iommu(&pci_bus_type, &tegra_smmu_ops);
+ if (err < 0)
+ goto err_bus_set;
+#endif

if (IS_ENABLED(CONFIG_DEBUG_FS))
tegra_smmu_debugfs_init(smmu);

return smmu;
+
+err_bus_set: __maybe_unused;
+ bus_set_iommu(&platform_bus_type, NULL);
+err_unregister:
+ iommu_device_unregister(&smmu->iommu);
+err_sysfs:
+ iommu_device_sysfs_remove(&smmu->iommu);
+
+ return ERR_PTR(err);
}

void tegra_smmu_remove(struct tegra_smmu *smmu)
--
2.17.1


2020-10-02 14:37:59

by Dmitry Osipenko

[permalink] [raw]
Subject: Re: [PATCH v4 3/3] iommu/tegra-smmu: Add PCI support

02.10.2020 09:08, Nicolin Chen пишет:
> @@ -865,7 +866,11 @@ static struct iommu_group *tegra_smmu_device_group(struct device *dev)
> group->smmu = smmu;
> group->soc = soc;
>
> - group->group = iommu_group_alloc();
> + if (dev_is_pci(dev))
> + group->group = pci_device_group(dev);
> + else
> + group->group = generic_device_group(dev);
> +
> if (IS_ERR(group->group)) {
> devm_kfree(smmu->dev, group);
> mutex_unlock(&smmu->lock);
> @@ -1069,22 +1074,32 @@ struct tegra_smmu *tegra_smmu_probe(struct device *dev,
> iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
>
> err = iommu_device_register(&smmu->iommu);
> - if (err) {
> - iommu_device_sysfs_remove(&smmu->iommu);
> - return ERR_PTR(err);
> - }
> + if (err)
> + goto err_sysfs;
>
> err = bus_set_iommu(&platform_bus_type, &tegra_smmu_ops);
> - if (err < 0) {
> - iommu_device_unregister(&smmu->iommu);
> - iommu_device_sysfs_remove(&smmu->iommu);
> - return ERR_PTR(err);
> - }
> + if (err < 0)
> + goto err_unregister;
> +
> +#ifdef CONFIG_PCI
> + err = bus_set_iommu(&pci_bus_type, &tegra_smmu_ops);
> + if (err < 0)
> + goto err_bus_set;
> +#endif
>
> if (IS_ENABLED(CONFIG_DEBUG_FS))
> tegra_smmu_debugfs_init(smmu);
>
> return smmu;
> +
> +err_bus_set: __maybe_unused;

__maybe_unused?

2020-10-02 17:53:17

by Nicolin Chen

[permalink] [raw]
Subject: Re: [PATCH v4 3/3] iommu/tegra-smmu: Add PCI support

On Fri, Oct 02, 2020 at 05:35:24PM +0300, Dmitry Osipenko wrote:
> 02.10.2020 09:08, Nicolin Chen пишет:
> > @@ -865,7 +866,11 @@ static struct iommu_group *tegra_smmu_device_group(struct device *dev)
> > group->smmu = smmu;
> > group->soc = soc;
> >
> > - group->group = iommu_group_alloc();
> > + if (dev_is_pci(dev))
> > + group->group = pci_device_group(dev);
> > + else
> > + group->group = generic_device_group(dev);
> > +
> > if (IS_ERR(group->group)) {
> > devm_kfree(smmu->dev, group);
> > mutex_unlock(&smmu->lock);
> > @@ -1069,22 +1074,32 @@ struct tegra_smmu *tegra_smmu_probe(struct device *dev,
> > iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
> >
> > err = iommu_device_register(&smmu->iommu);
> > - if (err) {
> > - iommu_device_sysfs_remove(&smmu->iommu);
> > - return ERR_PTR(err);
> > - }
> > + if (err)
> > + goto err_sysfs;
> >
> > err = bus_set_iommu(&platform_bus_type, &tegra_smmu_ops);
> > - if (err < 0) {
> > - iommu_device_unregister(&smmu->iommu);
> > - iommu_device_sysfs_remove(&smmu->iommu);
> > - return ERR_PTR(err);
> > - }
> > + if (err < 0)
> > + goto err_unregister;
> > +
> > +#ifdef CONFIG_PCI
> > + err = bus_set_iommu(&pci_bus_type, &tegra_smmu_ops);
> > + if (err < 0)
> > + goto err_bus_set;
> > +#endif
> >
> > if (IS_ENABLED(CONFIG_DEBUG_FS))
> > tegra_smmu_debugfs_init(smmu);
> >
> > return smmu;
> > +
> > +err_bus_set: __maybe_unused;
>
> __maybe_unused?

In order to mute a build warning when CONFIG_PCI=n...

2020-10-02 18:05:37

by Dmitry Osipenko

[permalink] [raw]
Subject: Re: [PATCH v4 3/3] iommu/tegra-smmu: Add PCI support

02.10.2020 20:45, Nicolin Chen пишет:
> On Fri, Oct 02, 2020 at 05:35:24PM +0300, Dmitry Osipenko wrote:
>> 02.10.2020 09:08, Nicolin Chen пишет:
>>> @@ -865,7 +866,11 @@ static struct iommu_group *tegra_smmu_device_group(struct device *dev)
>>> group->smmu = smmu;
>>> group->soc = soc;
>>>
>>> - group->group = iommu_group_alloc();
>>> + if (dev_is_pci(dev))
>>> + group->group = pci_device_group(dev);
>>> + else
>>> + group->group = generic_device_group(dev);
>>> +
>>> if (IS_ERR(group->group)) {
>>> devm_kfree(smmu->dev, group);
>>> mutex_unlock(&smmu->lock);
>>> @@ -1069,22 +1074,32 @@ struct tegra_smmu *tegra_smmu_probe(struct device *dev,
>>> iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
>>>
>>> err = iommu_device_register(&smmu->iommu);
>>> - if (err) {
>>> - iommu_device_sysfs_remove(&smmu->iommu);
>>> - return ERR_PTR(err);
>>> - }
>>> + if (err)
>>> + goto err_sysfs;
>>>
>>> err = bus_set_iommu(&platform_bus_type, &tegra_smmu_ops);
>>> - if (err < 0) {
>>> - iommu_device_unregister(&smmu->iommu);
>>> - iommu_device_sysfs_remove(&smmu->iommu);
>>> - return ERR_PTR(err);
>>> - }
>>> + if (err < 0)
>>> + goto err_unregister;
>>> +
>>> +#ifdef CONFIG_PCI
>>> + err = bus_set_iommu(&pci_bus_type, &tegra_smmu_ops);
>>> + if (err < 0)
>>> + goto err_bus_set;
>>> +#endif
>>>
>>> if (IS_ENABLED(CONFIG_DEBUG_FS))
>>> tegra_smmu_debugfs_init(smmu);
>>>
>>> return smmu;
>>> +
>>> +err_bus_set: __maybe_unused;
>>
>> __maybe_unused?
>
> In order to mute a build warning when CONFIG_PCI=n...
>

okay

2020-10-02 18:06:15

by Dmitry Osipenko

[permalink] [raw]
Subject: Re: [PATCH v4 3/3] iommu/tegra-smmu: Add PCI support

02.10.2020 09:08, Nicolin Chen пишет:
> This patch simply adds support for PCI devices.
>
> Signed-off-by: Nicolin Chen <[email protected]>
> ---

Reviewed-by: Dmitry Osipenko <[email protected]>

2020-10-05 10:05:49

by Thierry Reding

[permalink] [raw]
Subject: Re: [PATCH v4 3/3] iommu/tegra-smmu: Add PCI support

On Thu, Oct 01, 2020 at 11:08:07PM -0700, Nicolin Chen wrote:
> This patch simply adds support for PCI devices.
>
> Signed-off-by: Nicolin Chen <[email protected]>
> ---
>
> Changelog
> v3->v4
> * Dropped !iommu_present() check
> * Added CONFIG_PCI check in the exit path
> v2->v3
> * Replaced ternary conditional operator with if-else in .device_group()
> * Dropped change in tegra_smmu_remove()
> v1->v2
> * Added error-out labels in tegra_smmu_probe()
> * Dropped pci_request_acs() since IOMMU core would call it.
>
> drivers/iommu/tegra-smmu.c | 37 +++++++++++++++++++++++++++----------
> 1 file changed, 27 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c
> index 02d02b0c55c4..b701a7b55e84 100644
> --- a/drivers/iommu/tegra-smmu.c
> +++ b/drivers/iommu/tegra-smmu.c
> @@ -10,6 +10,7 @@
> #include <linux/kernel.h>
> #include <linux/of.h>
> #include <linux/of_device.h>
> +#include <linux/pci.h>
> #include <linux/platform_device.h>
> #include <linux/slab.h>
> #include <linux/spinlock.h>
> @@ -865,7 +866,11 @@ static struct iommu_group *tegra_smmu_device_group(struct device *dev)
> group->smmu = smmu;
> group->soc = soc;
>
> - group->group = iommu_group_alloc();
> + if (dev_is_pci(dev))
> + group->group = pci_device_group(dev);
> + else
> + group->group = generic_device_group(dev);
> +
> if (IS_ERR(group->group)) {
> devm_kfree(smmu->dev, group);
> mutex_unlock(&smmu->lock);
> @@ -1069,22 +1074,32 @@ struct tegra_smmu *tegra_smmu_probe(struct device *dev,
> iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
>
> err = iommu_device_register(&smmu->iommu);
> - if (err) {
> - iommu_device_sysfs_remove(&smmu->iommu);
> - return ERR_PTR(err);
> - }
> + if (err)
> + goto err_sysfs;
>
> err = bus_set_iommu(&platform_bus_type, &tegra_smmu_ops);
> - if (err < 0) {
> - iommu_device_unregister(&smmu->iommu);
> - iommu_device_sysfs_remove(&smmu->iommu);
> - return ERR_PTR(err);
> - }
> + if (err < 0)
> + goto err_unregister;
> +
> +#ifdef CONFIG_PCI
> + err = bus_set_iommu(&pci_bus_type, &tegra_smmu_ops);
> + if (err < 0)
> + goto err_bus_set;
> +#endif
>
> if (IS_ENABLED(CONFIG_DEBUG_FS))
> tegra_smmu_debugfs_init(smmu);
>
> return smmu;
> +
> +err_bus_set: __maybe_unused;
> + bus_set_iommu(&platform_bus_type, NULL);
> +err_unregister:
> + iommu_device_unregister(&smmu->iommu);
> +err_sysfs:
> + iommu_device_sysfs_remove(&smmu->iommu);

Can you please switch to label names that are more consistent with the
others in this driver? Notably the ones in tegra_smmu_domain_alloc().
The idea is to describe in the name of the label what's happening at the
label. Something like this, for example:

unset_platform_bus:
bus_set_iommu(&platform_bus_type, NULL);
unregister:
iommu_device_unregister(&smmu->iommu);
remove_sysfs:
iommu_device_sysfs_remove(&smmu->iommu);

Thierry


Attachments:
(No filename) (2.94 kB)
signature.asc (849.00 B)
Download all attachments

2020-10-06 01:07:48

by Nicolin Chen

[permalink] [raw]
Subject: Re: [PATCH v4 3/3] iommu/tegra-smmu: Add PCI support

On Mon, Oct 05, 2020 at 12:04:19PM +0200, Thierry Reding wrote:
> > +err_bus_set: __maybe_unused;
> > + bus_set_iommu(&platform_bus_type, NULL);
> > +err_unregister:
> > + iommu_device_unregister(&smmu->iommu);
> > +err_sysfs:
> > + iommu_device_sysfs_remove(&smmu->iommu);
>
> Can you please switch to label names that are more consistent with the
> others in this driver? Notably the ones in tegra_smmu_domain_alloc().
> The idea is to describe in the name of the label what's happening at the
> label. Something like this, for example:
>
> unset_platform_bus:
> bus_set_iommu(&platform_bus_type, NULL);
> unregister:
> iommu_device_unregister(&smmu->iommu);
> remove_sysfs:
> iommu_device_sysfs_remove(&smmu->iommu);

Okay. Will update in v7.