iommu: Move iommu_fwspec out of 'struct device'
Subsystems (12)
Joerg Roedel
maintainerv4 cover iommu: Move iommu_fwspec out of 'struct device'
Hi,
here is the updated version of the changes to move iommu_fwspec out of 'struct device'. Previous versions of this patch-set can be found here:
v3: https://lore.kernel.org/lkml/[email protected]/ v2: https://lore.kernel.org/lkml/[email protected]/ v1: https://lore.kernel.org/lkml/[email protected]/
Changes to v2:
- Addressed Robins review comments
- Added Robins patch to optimize arm-smmu changes
- Rebased to v5.6-rc7
Please review.
Thanks,
Joerg
Joerg Roedel (15):
iommu: Define dev_iommu_fwspec_get() for !CONFIG_IOMMU_API ACPI/IORT: Remove direct access of dev->iommu_fwspec drm/msm/mdp5: Remove direct access of dev->iommu_fwspec iommu/tegra-gart: Remove direct access of dev->iommu_fwspec
iommu: Rename struct iommu_param to dev_iommu
iommu: Move iommu_fwspec to struct dev_iommu iommu/arm-smmu: Fix uninitilized variable warning
iommu: Introduce accessors for iommu private data iommu/arm-smmu-v3: Use accessor functions for iommu private data iommu/arm-smmu: Use accessor functions for iommu private data iommu/renesas: Use accessor functions for iommu private data iommu/mediatek: Use accessor functions for iommu private data iommu/qcom: Use accessor functions for iommu private data iommu/virtio: Use accessor functions for iommu private data
iommu: Move fwspec->iommu_priv to struct dev_iommu
Robin Murphy (1):
iommu/arm-smmu: Refactor master_cfg/fwspec usage
drivers/acpi/arm64/iort.c | 6 ++- drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 2 +- drivers/iommu/arm-smmu-v3.c | 10 ++-- drivers/iommu/arm-smmu.c | 55 +++++++++++---------- drivers/iommu/iommu.c | 31 ++++++------ drivers/iommu/ipmmu-vmsa.c | 7 +-- drivers/iommu/mtk_iommu.c | 13 +++-- drivers/iommu/mtk_iommu_v1.c | 14 +++--- drivers/iommu/qcom_iommu.c | 61 ++++++++++++++---------- drivers/iommu/tegra-gart.c | 2 +- drivers/iommu/virtio-iommu.c | 11 ++--- include/linux/device.h | 9 ++-- include/linux/iommu.h | 33 ++++++++++--- 13 files changed, 142 insertions(+), 112 deletions(-)
Signature · 1 line
2.17.1
Joerg Roedel
maintainerPATCH v4 1/16 iommu: Define dev_iommu_fwspec_get() for !CONFIG_IOMMU_API
From: Joerg Roedel <[email protected]>
There are users outside of the IOMMU code that need to call that function. Define it for !CONFIG_IOMMU_API too so that compilation does not break.
--- include/linux/iommu.h | 4 ++++ 1 file changed, 4 insertions(+)
include/linux/iommu.h +4 -0
@@ -1073,6 +1073,10 @@ static inline int iommu_sva_unbind_gpasid(struct iommu_domain *domain, return -ENODEV; } +static inline struct iommu_fwspec *dev_iommu_fwspec_get (struct device *dev) +{ +return NULL ; +}#endif /* CONFIG_IOMMU_API */ #ifdef CONFIG_IOMMU_DEBUGFS
Signature · 1 line
2.17.1
Joerg Roedel
maintainerPATCH v4 2/16 ACPI/IORT: Remove direct access of dev->iommu_fwspec
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Use the accessor functions instead of directly dereferencing dev->iommu_fwspec.
--- drivers/acpi/arm64/iort.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/acpi/arm64/iort.c +4 -2
@@ -1015,6 +1015,7 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev)return ops;if (dev_is_pci (dev)) { +struct iommu_fwspec *fwspec;struct pci_bus *bus =to_pci_dev (dev)->bus;struct iort_pci_alias_info info = { .dev = dev };
@@ -1027,8 +1028,9 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev) err =pci_for_each_dma_alias (to_pci_dev (dev), iort_pci_iommu_init, &info); -if (!err &&iort_pci_rc_supports_ats (node)) - dev->iommu_fwspec->flags |=IOMMU_FWSPEC_PCI_RC_ATS ; + fwspec =dev_iommu_fwspec_get (dev); +if (fwspec &&iort_pci_rc_supports_ats (node)) + fwspec->flags |=IOMMU_FWSPEC_PCI_RC_ATS ; }else {int i =0 ;
Signature · 1 line
2.17.1
Hanjun Guo
maintainerRe: [PATCH v4 02/16] ACPI/IORT: Remove direct access of dev->iommu_fwspec
Quoted 27 lines · Joerg Roedel
From: Joerg Roedel <[email protected]>
Use the accessor functions instead of directly dereferencing
dev->iommu_fwspec.Tested-by Hanjun Guo <[email protected]>Reviewed-by Jean-Philippe Brucker <[email protected]>Signed-off-by Joerg Roedel <[email protected]>--- drivers/acpi/arm64/iort.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)drivers/acpi/arm64/iort.c +1
-0@@ -1015,6 +1015,7 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev)return ops;if (dev_is_pci (dev)) { +struct iommu_fwspec *fwspec;struct pci_bus *bus =to_pci_dev (dev)->bus;struct iort_pci_alias_info info = { .dev = dev };@@ -1027,8 +1028,9 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev) err =pci_for_each_dma_alias (to_pci_dev (dev), iort_pci_iommu_init, &info);
...
drivers/acpi/arm64/iort.c const struct iommu_ops *iort_iommu_configure(struct device *dev) · line 1032
Quoted 5 lines
drivers/acpi/arm64/iort.c +2
-2-if (!err &&iort_pci_rc_supports_ats (node)) - dev->iommu_fwspec->flags |=IOMMU_FWSPEC_PCI_RC_ATS ; + fwspec =dev_iommu_fwspec_get (dev); +if (fwspec &&iort_pci_rc_supports_ats (node))
Should we check !err as well?
Thanks
Hanjun
drivers/acpi/arm64/iort.c const struct iommu_ops *iort_iommu_configure(struct device *dev) · line 1035
Quoted 5 lines
drivers/acpi/arm64/iort.c +1
-0+ fwspec->flags |=IOMMU_FWSPEC_PCI_RC_ATS ; }else {int i =0 ;
_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu
Re: [PATCH v4 02/16] ACPI/IORT: Remove direct access of dev->iommu_fwspec
Quoted 32 lines · Hanjun Guo
Quoted 27 lines · Joerg Roedel
From: Joerg Roedel <[email protected]>
Use the accessor functions instead of directly dereferencing
dev->iommu_fwspec.Tested-by Hanjun Guo <[email protected]>Reviewed-by Jean-Philippe Brucker <[email protected]>Signed-off-by Joerg Roedel <[email protected]>--- drivers/acpi/arm64/iort.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)drivers/acpi/arm64/iort.c +1
-0@@ -1015,6 +1015,7 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev)return ops;if (dev_is_pci (dev)) { +struct iommu_fwspec *fwspec;struct pci_bus *bus =to_pci_dev (dev)->bus;struct iort_pci_alias_info info = { .dev = dev };@@ -1027,8 +1028,9 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev) err =pci_for_each_dma_alias (to_pci_dev (dev), iort_pci_iommu_init, &info);...
Quoted 1 line
Quoted 6 lines
drivers/acpi/arm64/iort.c const struct iommu_ops *iort_iommu_configure(struct device *dev) · line 1032
Quoted 4 lines
drivers/acpi/arm64/iort.c +2
-2-if (!err &&iort_pci_rc_supports_ats (node)) - dev->iommu_fwspec->flags |=IOMMU_FWSPEC_PCI_RC_ATS ; + fwspec =dev_iommu_fwspec_get (dev); +if (fwspec &&iort_pci_rc_supports_ats (node))Should we check !err as well?
No need, the check should have been on fwspec from the beginning. Checking err was just a lazy shortcut on my part, as we're really just making sure that we can dereference fwspec->flags here.
Thanks,
Jean
Quoted 10 lines
Thanks
HanjunQuoted 5 lines
drivers/acpi/arm64/iort.c +1
-0+ fwspec->flags |=IOMMU_FWSPEC_PCI_RC_ATS ; }else {int i =0 ;
Joerg Roedel
maintainerPATCH v4 3/16 drm/msm/mdp5: Remove direct access of dev->iommu_fwspec
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Use the accessor functions instead of directly dereferencing dev->iommu_fwspec.
--- drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c +1 -1
@@ -725,7 +725,7 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)if (config->platform.iommu) { iommu_dev = &pdev->dev; -if (!iommu_dev->iommu_fwspec) +if (!dev_iommu_fwspec_get (iommu_dev)) iommu_dev = iommu_dev->parent; aspace = msm_gem_address_space_create(iommu_dev,
Signature · 1 line
2.17.1
Joerg Roedel
maintainerPATCH v4 4/16 iommu/tegra-gart: Remove direct access of dev->iommu_fwspec
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Use the accessor functions instead of directly dereferencing dev->iommu_fwspec.
--- drivers/iommu/tegra-gart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iommu/tegra-gart.c +1 -1
@@ -247,7 +247,7 @@ static int gart_iommu_add_device(struct device *dev) {struct iommu_group *group; -if (!dev->iommu_fwspec) +if (!dev_iommu_fwspec_get (dev))return -ENODEV ; group =iommu_group_get_for_dev (dev);
Signature · 6 lines
2.17.1 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Joerg Roedel
maintainerPATCH v4 5/16 iommu: Rename struct iommu_param to dev_iommu
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
The term dev_iommu aligns better with other existing structures and their accessor functions.
--- drivers/iommu/iommu.c | 28 ++++++++++++++-------------- include/linux/device.h | 6 +++--- include/linux/iommu.h | 4 ++-- 3 files changed, 19 insertions(+), 19 deletions(-)
drivers/iommu/iommu.c +14 -14
@@ -152,9 +152,9 @@ void iommu_device_unregister(struct iommu_device *iommu) }EXPORT_SYMBOL_GPL (iommu_device_unregister); -static struct iommu_param *iommu_get_dev_param (struct device *dev) +static struct dev_iommu *dev_iommu_get (struct device *dev) { -struct iommu_param *param = dev->iommu_param; +struct dev_iommu *param = dev->iommu;if (param)return param;
@@ -164,14 +164,14 @@ static struct iommu_param *iommu_get_dev_param(struct device *dev)return NULL ;mutex_init (¶m->lock); - dev->iommu_param = param; + dev->iommu = param;return param; } -static void iommu_free_dev_param (struct device *dev) +static void dev_iommu_free (struct device *dev) { -kfree (dev->iommu_param); - dev->iommu_param =NULL ; +kfree (dev->iommu); + dev->iommu =NULL ; }int iommu_probe_device (struct device *dev)
@@ -183,7 +183,7 @@ int iommu_probe_device(struct device *dev)if (!ops)return -EINVAL ; -if (!iommu_get_dev_param (dev)) +if (!dev_iommu_get (dev))return -ENOMEM ;if (!try_module_get (ops->owner)) {
@@ -200,7 +200,7 @@ int iommu_probe_device(struct device *dev) err_module_put:module_put (ops->owner); err_free_dev_param: -iommu_free_dev_param (dev); +dev_iommu_free (dev);return ret; }
@@ -211,9 +211,9 @@ void iommu_release_device(struct device *dev)if (dev->iommu_group) ops->remove_device (dev); -if (dev->iommu_param) { +if (dev->iommu) {module_put (ops->owner); -iommu_free_dev_param (dev); +dev_iommu_free (dev); } }
@@ -972,7 +972,7 @@ int iommu_register_device_fault_handler(struct device *dev,iommu_dev_fault_handler_t handler, void *data) { - struct iommu_param *param = dev->iommu_param; + struct dev_iommu *param = dev->iommu;int ret =0 ;if (!param)
@@ -1015,7 +1015,7 @@ EXPORT_SYMBOL_GPL(iommu_register_device_fault_handler);*/ int iommu_unregister_device_fault_handler (struct device *dev) { -struct iommu_param *param = dev->iommu_param; +struct dev_iommu *param = dev->iommu;int ret =0 ;if (!param)
@@ -1055,7 +1055,7 @@ EXPORT_SYMBOL_GPL(iommu_unregister_device_fault_handler);*/ int iommu_report_device_fault (struct device *dev,struct iommu_fault_event *evt) { -struct iommu_param *param = dev->iommu_param; +struct dev_iommu *param = dev->iommu;struct iommu_fault_event *evt_pending =NULL ;struct iommu_fault_param *fparam;int ret =0 ;
@@ -1104,7 +1104,7 @@ int iommu_page_response(struct device *dev,int ret = -EINVAL ;struct iommu_fault_event *evt;struct iommu_fault_page_request *prm; -struct iommu_param *param = dev->iommu_param; +struct dev_iommu *param = dev->iommu;struct iommu_domain *domain =iommu_get_domain_for_dev (dev);if (!domain || !domain->ops->page_response)
include/linux/device.h +3 -3
@@ -44,7 +44,7 @@ struct iommu_ops;struct iommu_group ;struct iommu_fwspec ;struct dev_pin_info ; -struct iommu_param ; +struct dev_iommu ;/** * struct subsys_interface - interfaces to device functions
@@ -514,7 +514,7 @@ struct dev_links_info {* device (i.e. the bus driver that discovered the device). * @iommu_group: IOMMU group the device belongs to. * @iommu_fwspec: IOMMU-specific properties supplied by firmware. -* @iommu_param: Per device generic IOMMU runtime data +* @iommu: Per device generic IOMMU runtime data * * @offline_disabled: If set, the device is permanently online. * @offline: Set after successful invocation of bus type's .offline().
@@ -614,7 +614,7 @@ struct device {void (*release)(struct device *dev);struct iommu_group *iommu_group;struct iommu_fwspec *iommu_fwspec; -struct iommu_param *iommu_param; +struct dev_iommu *iommu; bool offline_disabled:1; bool offline:1;
include/linux/iommu.h +2 -2
@@ -365,7 +365,7 @@ struct iommu_fault_param { };/** -* struct iommu_param - collection of per-device IOMMU data +* struct dev_iommu - Collection of per-device IOMMU data * * @fault_param: IOMMU detected device fault reporting data *
@@ -373,7 +373,7 @@ struct iommu_fault_param {* struct iommu_group *iommu_group; * struct iommu_fwspec *iommu_fwspec; */ -struct iommu_param { +struct dev_iommu {struct mutex lock;struct iommu_fault_param *fault_param; };
Signature · 6 lines
2.17.1 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Re: [PATCH v4 05/16] iommu: Rename struct iommu_param to dev_iommu
Quoted 9 lines · Joerg Roedel
From: Joerg Roedel <[email protected]>
The term
dev_iommualigns better with other existing structures and their accessor functions.Cc Greg Kroah-Hartman <[email protected]>Reviewed-by Jean-Philippe Brucker <[email protected]>Signed-off-by Joerg Roedel <[email protected]>
Quoted 5 lines
--- drivers/iommu/iommu.c | 28 ++++++++++++++-------------- include/linux/device.h | 6 +++--- include/linux/iommu.h | 4 ++-- 3 files changed, 19 insertions(+), 19 deletions(-)
Joerg Roedel
maintainerPATCH v4 6/16 iommu: Move iommu_fwspec to struct dev_iommu
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Move the iommu_fwspec pointer in struct device into struct dev_iommu. This is a step in the effort to reduce the iommu related pointers in struct device to one.
--- drivers/iommu/iommu.c | 3 +++ include/linux/device.h | 3 --- include/linux/iommu.h | 12 ++++++++---- 3 files changed, 11 insertions(+), 7 deletions(-)
drivers/iommu/iommu.c +3 -0
@@ -2405,6 +2405,9 @@ int iommu_fwspec_init(struct device *dev, struct fwnode_handle *iommu_fwnode,if (fwspec)return ops == fwspec->ops ?0 : -EINVAL ; +if (!dev_iommu_get (dev)) +return -ENOMEM ; + fwspec =kzalloc (sizeof (*fwspec),GFP_KERNEL );if (!fwspec)return -ENOMEM ;
include/linux/device.h +0 -3
@@ -42,7 +42,6 @@ struct device_node;struct fwnode_handle ;struct iommu_ops ;struct iommu_group ; -struct iommu_fwspec ;struct dev_pin_info ;struct dev_iommu ;
@@ -513,7 +512,6 @@ struct dev_links_info {* gone away. This should be set by the allocator of the * device (i.e. the bus driver that discovered the device). * @iommu_group: IOMMU group the device belongs to. -* @iommu_fwspec: IOMMU-specific properties supplied by firmware. * @iommu: Per device generic IOMMU runtime data * * @offline_disabled: If set, the device is permanently online.
@@ -613,7 +611,6 @@ struct device {void (*release)(struct device *dev);struct iommu_group *iommu_group; -struct iommu_fwspec *iommu_fwspec;struct dev_iommu *iommu; bool offline_disabled:1;
include/linux/iommu.h +8 -4
@@ -368,14 +368,15 @@ struct iommu_fault_param {* struct dev_iommu - Collection of per-device IOMMU data * * @fault_param: IOMMU detected device fault reporting data +* @fwspec: IOMMU fwspec data * * TODO: migrate other per device data pointers under iommu_dev_data, e.g. * struct iommu_group *iommu_group; -* struct iommu_fwspec *iommu_fwspec; */ struct dev_iommu {struct mutex lock; -struct iommu_fault_param *fault_param; +struct iommu_fault_param *fault_param; +struct iommu_fwspec *fwspec; };int iommu_device_register (struct iommu_device *iommu);
@@ -614,13 +615,16 @@ const struct iommu_ops *iommu_ops_from_fwnode(struct fwnode_handle *fwnode);static inline struct iommu_fwspec *dev_iommu_fwspec_get (struct device *dev) { -return dev->iommu_fwspec; +if (dev->iommu) +return dev->iommu->fwspec; +else +return NULL ; }static inline void dev_iommu_fwspec_set (struct device *dev,struct iommu_fwspec *fwspec) { - dev->iommu_fwspec = fwspec; + dev->iommu->fwspec = fwspec; }int iommu_probe_device (struct device *dev);
Signature · 6 lines
2.17.1 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Re: [PATCH v4 06/16] iommu: Move iommu_fwspec to struct dev_iommu
Quoted 10 lines · Joerg Roedel
From: Joerg Roedel <[email protected]>
Move the
iommu_fwspecpointer in struct device into structdev_iommu. This is a step in the effort to reduce the iommu related pointers in struct device to one.Cc Greg Kroah-Hartman <[email protected]>Reviewed-by Jean-Philippe Brucker <[email protected]>Signed-off-by Joerg Roedel <[email protected]>
Quoted 5 lines
--- drivers/iommu/iommu.c | 3 +++ include/linux/device.h | 3 --- include/linux/iommu.h | 12 ++++++++---- 3 files changed, 11 insertions(+), 7 deletions(-)
Joerg Roedel
maintainerPATCH v4 7/16 iommu/arm-smmu: Fix uninitilized variable warning
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Some unrelated changes in the iommu code caused a new warning to appear in the arm-smmu driver:
CC drivers/iommu/arm-smmu.odrivers/iommu/arm-smmu.c: In function 'arm_smmu_add_device':drivers/iommu/arm-smmu.c:1441:2: warning: 'smmu' may be used uninitialized in this function [-Wmaybe-uninitialized]
arm_smmu_rpm_put(smmu);
^~~~~~~~~~~~~~~~~~~~~~
The warning is a false positive, but initialize the variable to NULL to get rid of it.
--- drivers/iommu/arm-smmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iommu/arm-smmu.c +1 -1
@@ -1383,7 +1383,7 @@ struct arm_smmu_device *arm_smmu_get_by_fwnode(struct fwnode_handle *fwnode)static int arm_smmu_add_device (struct device *dev) { -struct arm_smmu_device *smmu; +struct arm_smmu_device *smmu =NULL ;struct arm_smmu_master_cfg *cfg;struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev);int i, ret;
Signature · 1 line
2.17.1
Joerg Roedel
maintainerPATCH v4 8/16 iommu: Introduce accessors for iommu private data
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Add dev_iommu_priv_get/set() functions to access per-device iommu private data. This makes it easier to move the pointer to a different location.
--- include/linux/iommu.h | 10 ++++++++++ 1 file changed, 10 insertions(+)
include/linux/iommu.h +10 -0
@@ -627,6 +627,16 @@ static inline void dev_iommu_fwspec_set(struct device *dev, dev->iommu->fwspec = fwspec; } +static inline void *dev_iommu_priv_get (struct device *dev) +{ +return dev->iommu->fwspec->iommu_priv; +} + +static inline void dev_iommu_priv_set (struct device *dev,void *priv) +{ + dev->iommu->fwspec->iommu_priv = priv; +} +int iommu_probe_device (struct device *dev);void iommu_release_device (struct device *dev);
Signature · 6 lines
2.17.1 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Joerg Roedel
maintainerPATCH v4 9/16 iommu/arm-smmu-v3: Use accessor functions for iommu private data
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Make use of dev_iommu_priv_set/get() functions in the code.
--- drivers/iommu/arm-smmu-v3.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/iommu/arm-smmu-v3.c +5 -5
@@ -2659,7 +2659,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)if (!fwspec)return -ENOENT ; - master = fwspec->iommu_priv; + master =dev_iommu_priv_get (dev); smmu = master->smmu;arm_smmu_detach_dev (master);
@@ -2795,7 +2795,7 @@ static int arm_smmu_add_device(struct device *dev)if (!fwspec || fwspec->ops != &arm_smmu_ops)return -ENODEV ; -if (WARN_ON_ONCE (fwspec->iommu_priv)) +if (WARN_ON_ONCE (dev_iommu_priv_get (dev)))return -EBUSY ; smmu =arm_smmu_get_by_fwnode (fwspec->iommu_fwnode);
@@ -2810,7 +2810,7 @@ static int arm_smmu_add_device(struct device *dev) master->smmu = smmu; master->sids = fwspec->ids; master->num_sids = fwspec->num_ids; - fwspec->iommu_priv = master; +dev_iommu_priv_set (dev, master);/* Check the SIDs are in range of the SMMU and our stream table */ for (i =0 ; i < master->num_sids; i++) {
@@ -2852,7 +2852,7 @@ static int arm_smmu_add_device(struct device *dev)iommu_device_unlink (&smmu->iommu, dev); err_free_master:kfree (master); - fwspec->iommu_priv =NULL ; +dev_iommu_priv_set (dev,NULL );return ret; }
@@ -2865,7 +2865,7 @@ static void arm_smmu_remove_device(struct device *dev)if (!fwspec || fwspec->ops != &arm_smmu_ops)return ; - master = fwspec->iommu_priv; + master =dev_iommu_priv_get (dev); smmu = master->smmu;arm_smmu_detach_dev (master);iommu_group_remove_device (dev);
Signature · 6 lines
2.17.1 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Joerg Roedel
maintainerPATCH v4 10/16 iommu/arm-smmu: Refactor master_cfg/fwspec usage
In reply to Joerg RoedelFrom: Robin Murphy <[email protected]>
In preparation for restructuring iommu_fwspec, refactor the way we access the arm_smmu_master_cfg private data to be less dependent on the current layout.
--- drivers/iommu/arm-smmu.c | 42 +++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 20 deletions(-)
drivers/iommu/arm-smmu.c +22 -20
@@ -98,12 +98,10 @@ struct arm_smmu_master_cfg {s16 smendx[]; };#define INVALID_SMENDX -1 -#define __fwspec_cfg (fw) ((struct arm_smmu_master_cfg *)fw->iommu_priv) -#define fwspec_smmu (fw) (__fwspec_cfg(fw)->smmu) -#define fwspec_smendx (fw, i) \ - (i >= fw->num_ids ? INVALID_SMENDX : __fwspec_cfg(fw)->smendx[i]) -#define for_each_cfg_sme (fw, i, idx) \ - for (i = 0; idx = fwspec_smendx(fw, i), i < fw->num_ids; ++i) +#define cfg_smendx (cfg, fw, i) \ + (i >= fw->num_ids ? INVALID_SMENDX : cfg->smendx[i]) +#define for_each_cfg_sme (cfg, fw, i, idx) \ + for (i = 0; idx = cfg_smendx(cfg, fw, i), i < fw->num_ids; ++i)static bool using_legacy_binding, using_generic_binding;
@@ -1069,7 +1067,7 @@ static int arm_smmu_master_alloc_smes(struct device *dev)mutex_lock (&smmu->stream_map_mutex);/* Figure out a viable stream map entry allocation */ -for_each_cfg_sme (fwspec, i, idx) { +for_each_cfg_sme (cfg, fwspec, i, idx) {u16 sid =FIELD_GET (ARM_SMMU_SMR_ID , fwspec->ids[i]);u16 mask =FIELD_GET (ARM_SMMU_SMR_MASK , fwspec->ids[i]);
@@ -1100,7 +1098,7 @@ static int arm_smmu_master_alloc_smes(struct device *dev)iommu_group_put (group);/* It worked! Now, poke the actual hardware */ -for_each_cfg_sme (fwspec, i, idx) { +for_each_cfg_sme (cfg, fwspec, i, idx) {arm_smmu_write_sme (smmu, idx); smmu->s2crs[idx].group = group; }
@@ -1117,14 +1115,14 @@ static int arm_smmu_master_alloc_smes(struct device *dev)return ret; } -static void arm_smmu_master_free_smes (struct iommu_fwspec *fwspec) +static void arm_smmu_master_free_smes (struct arm_smmu_master_cfg *cfg, +struct iommu_fwspec *fwspec) { -struct arm_smmu_device *smmu =fwspec_smmu (fwspec); -struct arm_smmu_master_cfg *cfg = fwspec->iommu_priv; +struct arm_smmu_device *smmu = cfg->smmu;int i, idx;mutex_lock (&smmu->stream_map_mutex); -for_each_cfg_sme (fwspec, i, idx) { +for_each_cfg_sme (cfg, fwspec, i, idx) {if (arm_smmu_free_sme (smmu, idx))arm_smmu_write_sme (smmu, idx); cfg->smendx[i] =INVALID_SMENDX ;
@@ -1133,6 +1131,7 @@ static void arm_smmu_master_free_smes(struct iommu_fwspec *fwspec) }static int arm_smmu_domain_add_master (struct arm_smmu_domain *smmu_domain, +struct arm_smmu_master_cfg *cfg,struct iommu_fwspec *fwspec) {struct arm_smmu_device *smmu = smmu_domain->smmu;
@@ -1146,7 +1145,7 @@ static int arm_smmu_domain_add_master(struct arm_smmu_domain *smmu_domain,else type =S2CR_TYPE_TRANS ; -for_each_cfg_sme (fwspec, i, idx) { +for_each_cfg_sme (cfg, fwspec, i, idx) {if (type == s2cr[idx].type && cbndx == s2cr[idx].cbndx)continue ;
@@ -1162,8 +1161,9 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) {int ret;struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev); -struct arm_smmu_device *smmu;struct arm_smmu_domain *smmu_domain =to_smmu_domain (domain); +struct arm_smmu_master_cfg *cfg; +struct arm_smmu_device *smmu;if (!fwspec || fwspec->ops != &arm_smmu_ops) {dev_err (dev,"cannot attach to SMMU, is it on the same bus?\n" );
@@ -1177,10 +1177,11 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)* domains, just say no (but more politely than by dereferencing NULL). * This should be at least a WARN_ON once that's sorted. */ -if (!fwspec->iommu_priv) + cfg = fwspec->iommu_priv; +if (!cfg)return -ENODEV ; - smmu =fwspec_smmu (fwspec); + smmu = cfg->smmu; ret =arm_smmu_rpm_get (smmu);if (ret <0 )
@@ -1204,7 +1205,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) }/* Looks ok, so add the device to the domain */ - ret =arm_smmu_domain_add_master (smmu_domain, fwspec); + ret =arm_smmu_domain_add_master (smmu_domain, cfg, fwspec);/* * Setup an autosuspend delay to avoid bouncing runpm state.
@@ -1475,7 +1476,7 @@ static void arm_smmu_remove_device(struct device *dev)return ;iommu_device_unlink (&smmu->iommu, dev); -arm_smmu_master_free_smes (fwspec); +arm_smmu_master_free_smes (cfg, fwspec);arm_smmu_rpm_put (smmu);
@@ -1487,11 +1488,12 @@ static void arm_smmu_remove_device(struct device *dev)static struct iommu_group *arm_smmu_device_group (struct device *dev) {struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev); -struct arm_smmu_device *smmu =fwspec_smmu (fwspec); +struct arm_smmu_master_cfg *cfg = fwspec->iommu_priv; +struct arm_smmu_device *smmu = cfg->smmu;struct iommu_group *group =NULL ;int i, idx; -for_each_cfg_sme (fwspec, i, idx) { +for_each_cfg_sme (cfg, fwspec, i, idx) {if (group && smmu->s2crs[idx].group && group != smmu->s2crs[idx].group)return ERR_PTR (-EINVAL );
Signature · 1 line
2.17.1
Joerg Roedel
maintainerPATCH v4 11/16 iommu/arm-smmu: Use accessor functions for iommu private data
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Make use of dev_iommu_priv_set/get() functions and simplify the code where possible with this change.
--- drivers/iommu/arm-smmu.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
drivers/iommu/arm-smmu.c +9 -8
@@ -1059,7 +1059,7 @@ static bool arm_smmu_free_sme(struct arm_smmu_device *smmu, int idx)static int arm_smmu_master_alloc_smes (struct device *dev) {struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev); -struct arm_smmu_master_cfg *cfg = fwspec->iommu_priv; +struct arm_smmu_master_cfg *cfg =dev_iommu_priv_get (dev);struct arm_smmu_device *smmu = cfg->smmu;struct arm_smmu_smr *smrs = smmu->smrs;struct iommu_group *group;
@@ -1159,11 +1159,11 @@ static int arm_smmu_domain_add_master(struct arm_smmu_domain *smmu_domain,static int arm_smmu_attach_dev (struct iommu_domain *domain,struct device *dev) { -int ret; -struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev);struct arm_smmu_domain *smmu_domain =to_smmu_domain (domain); +struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev);struct arm_smmu_master_cfg *cfg;struct arm_smmu_device *smmu; +int ret;if (!fwspec || fwspec->ops != &arm_smmu_ops) {dev_err (dev,"cannot attach to SMMU, is it on the same bus?\n" );
@@ -1177,7 +1177,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)* domains, just say no (but more politely than by dereferencing NULL). * This should be at least a WARN_ON once that's sorted. */ - cfg = fwspec->iommu_priv; + cfg =dev_iommu_priv_get (dev);if (!cfg)return -ENODEV ;
@@ -1430,7 +1430,7 @@ static int arm_smmu_add_device(struct device *dev) goto out_free; cfg->smmu = smmu; - fwspec->iommu_priv = cfg; +dev_iommu_priv_set (dev, cfg);while (i--) cfg->smendx[i] =INVALID_SMENDX ;
@@ -1468,7 +1468,7 @@ static void arm_smmu_remove_device(struct device *dev)if (!fwspec || fwspec->ops != &arm_smmu_ops)return ; - cfg = fwspec->iommu_priv; + cfg =dev_iommu_priv_get (dev); smmu = cfg->smmu; ret =arm_smmu_rpm_get (smmu);
@@ -1480,15 +1480,16 @@ static void arm_smmu_remove_device(struct device *dev)arm_smmu_rpm_put (smmu); +dev_iommu_priv_set (dev,NULL );iommu_group_remove_device (dev); -kfree (fwspec->iommu_priv); +kfree (cfg);iommu_fwspec_free (dev); }static struct iommu_group *arm_smmu_device_group (struct device *dev) { +struct arm_smmu_master_cfg *cfg =dev_iommu_priv_get (dev);struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev); -struct arm_smmu_master_cfg *cfg = fwspec->iommu_priv;struct arm_smmu_device *smmu = cfg->smmu;struct iommu_group *group =NULL ;int i, idx;
Signature · 6 lines
2.17.1 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Joerg Roedel
maintainerPATCH v4 12/16 iommu/renesas: Use accessor functions for iommu private data
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Make use of dev_iommu_priv_set/get() functions.
--- drivers/iommu/ipmmu-vmsa.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
drivers/iommu/ipmmu-vmsa.c +2 -5
@@ -89,9 +89,7 @@ static struct ipmmu_vmsa_domain *to_vmsa_domain(struct iommu_domain *dom)static struct ipmmu_vmsa_device *to_ipmmu (struct device *dev) { -struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev); - -return fwspec ? fwspec->iommu_priv :NULL ; +return dev_iommu_priv_get (dev); }#define TLB_LOOP_TIMEOUT 100/* 100us */
@@ -727,14 +725,13 @@ static phys_addr_t ipmmu_iova_to_phys(struct iommu_domain *io_domain,static int ipmmu_init_platform_device (struct device *dev,struct of_phandle_args *args) { -struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev);struct platform_device *ipmmu_pdev; ipmmu_pdev =of_find_device_by_node (args->np);if (!ipmmu_pdev)return -ENODEV ; - fwspec->iommu_priv =platform_get_drvdata (ipmmu_pdev); +dev_iommu_priv_set (dev,platform_get_drvdata (ipmmu_pdev));return 0 ; }
Signature · 6 lines
2.17.1 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Joerg Roedel
maintainerPATCH v4 13/16 iommu/mediatek: Use accessor functions for iommu private data
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Make use of dev_iommu_priv_set/get() functions.
--- drivers/iommu/mtk_iommu.c | 13 ++++++------- drivers/iommu/mtk_iommu_v1.c | 14 +++++++------- 2 files changed, 13 insertions(+), 14 deletions(-)
drivers/iommu/mtk_iommu.c +6 -7
@@ -358,8 +358,8 @@ static void mtk_iommu_domain_free(struct iommu_domain *domain)static int mtk_iommu_attach_device (struct iommu_domain *domain,struct device *dev) { +struct mtk_iommu_data *data =dev_iommu_priv_get (dev);struct mtk_iommu_domain *dom =to_mtk_domain (domain); -struct mtk_iommu_data *data =dev_iommu_fwspec_get (dev)->iommu_priv;if (!data)return -ENODEV ;
@@ -378,7 +378,7 @@ static int mtk_iommu_attach_device(struct iommu_domain *domain,static void mtk_iommu_detach_device (struct iommu_domain *domain,struct device *dev) { -struct mtk_iommu_data *data =dev_iommu_fwspec_get (dev)->iommu_priv; +struct mtk_iommu_data *data =dev_iommu_priv_get (dev);if (!data)return ;
@@ -450,7 +450,7 @@ static int mtk_iommu_add_device(struct device *dev)if (!fwspec || fwspec->ops != &mtk_iommu_ops)return -ENODEV ;/* Not a iommu client device */ - data = fwspec->iommu_priv; + data =dev_iommu_priv_get (dev);iommu_device_link (&data->iommu, dev); group =iommu_group_get_for_dev (dev);
@@ -469,7 +469,7 @@ static void mtk_iommu_remove_device(struct device *dev)if (!fwspec || fwspec->ops != &mtk_iommu_ops)return ; - data = fwspec->iommu_priv; + data =dev_iommu_priv_get (dev);iommu_device_unlink (&data->iommu, dev);iommu_group_remove_device (dev);
@@ -496,7 +496,6 @@ static struct iommu_group *mtk_iommu_device_group(struct device *dev)static int mtk_iommu_of_xlate (struct device *dev,struct of_phandle_args *args) { -struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev);struct platform_device *m4updev;if (args->args_count !=1 ) {
@@ -505,13 +504,13 @@ static int mtk_iommu_of_xlate(struct device *dev, struct of_phandle_args *args)return -EINVAL ; } -if (!fwspec->iommu_priv) { +if (!dev_iommu_priv_get (dev)) {/* Get the m4u device */ m4updev =of_find_device_by_node (args->np);if (WARN_ON (!m4updev))return -EINVAL ; - fwspec->iommu_priv =platform_get_drvdata (m4updev); +dev_iommu_priv_set (dev,platform_get_drvdata (m4updev)); }return iommu_fwspec_add_ids (dev, args->args,1 );
drivers/iommu/mtk_iommu_v1.c +7 -7
@@ -263,8 +263,8 @@ static void mtk_iommu_domain_free(struct iommu_domain *domain)static int mtk_iommu_attach_device (struct iommu_domain *domain,struct device *dev) { +struct mtk_iommu_data *data =dev_iommu_priv_get (dev);struct mtk_iommu_domain *dom =to_mtk_domain (domain); -struct mtk_iommu_data *data =dev_iommu_fwspec_get (dev)->iommu_priv;int ret;if (!data)
@@ -286,7 +286,7 @@ static int mtk_iommu_attach_device(struct iommu_domain *domain,static void mtk_iommu_detach_device (struct iommu_domain *domain,struct device *dev) { -struct mtk_iommu_data *data =dev_iommu_fwspec_get (dev)->iommu_priv; +struct mtk_iommu_data *data =dev_iommu_priv_get (dev);if (!data)return ;
@@ -387,20 +387,20 @@ static int mtk_iommu_create_mapping(struct device *dev,return -EINVAL ; } -if (!fwspec->iommu_priv) { +if (!dev_iommu_priv_get (dev)) {/* Get the m4u device */ m4updev =of_find_device_by_node (args->np);if (WARN_ON (!m4updev))return -EINVAL ; - fwspec->iommu_priv =platform_get_drvdata (m4updev); +dev_iommu_priv_set (dev,platform_get_drvdata (m4updev)); } ret =iommu_fwspec_add_ids (dev, args->args,1 );if (ret)return ret; - data = fwspec->iommu_priv; + data =dev_iommu_priv_get (dev); m4udev = data->dev; mtk_mapping = m4udev->archdata.iommu;if (!mtk_mapping) {
@@ -459,7 +459,7 @@ static int mtk_iommu_add_device(struct device *dev)if (err)return err; - data = fwspec->iommu_priv; + data =dev_iommu_priv_get (dev); mtk_mapping = data->dev->archdata.iommu; err =arm_iommu_attach_device (dev, mtk_mapping);if (err) {
@@ -478,7 +478,7 @@ static void mtk_iommu_remove_device(struct device *dev)if (!fwspec || fwspec->ops != &mtk_iommu_ops)return ; - data = fwspec->iommu_priv; + data =dev_iommu_priv_get (dev);iommu_device_unlink (&data->iommu, dev);iommu_group_remove_device (dev);
Signature · 6 lines
2.17.1 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Joerg Roedel
maintainerPATCH v4 14/16 iommu/qcom: Use accessor functions for iommu private data
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Make use of dev_iommu_priv_set/get() functions.
--- drivers/iommu/qcom_iommu.c | 61 ++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 25 deletions(-)
drivers/iommu/qcom_iommu.c +36 -25
@@ -74,16 +74,19 @@ static struct qcom_iommu_domain *to_qcom_iommu_domain(struct iommu_domain *dom)static const struct iommu_ops qcom_iommu_ops; -static struct qcom_iommu_dev *to_iommu (struct iommu_fwspec *fwspec) +static struct qcom_iommu_dev *to_iommu (struct device *dev) { +struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev); +if (!fwspec || fwspec->ops != &qcom_iommu_ops)return NULL ; -return fwspec->iommu_priv; + +return dev_iommu_priv_get (dev); } -static struct qcom_iommu_ctx *to_ctx (struct iommu_fwspec *fwspec,unsigned asid) +static struct qcom_iommu_ctx *to_ctx (struct device *dev,unsigned asid) { -struct qcom_iommu_dev *qcom_iommu =to_iommu (fwspec); +struct qcom_iommu_dev *qcom_iommu =to_iommu (dev);if (!qcom_iommu)return NULL ;return qcom_iommu->ctxs[asid -1 ];
@@ -115,11 +118,14 @@ iommu_readq(struct qcom_iommu_ctx *ctx, unsigned reg)static void qcom_iommu_tlb_sync (void *cookie) { -struct iommu_fwspec *fwspec = cookie; +struct iommu_fwspec *fwspec; +struct device *dev = cookie;unsigned i; + fwspec =dev_iommu_fwspec_get (dev); +for (i =0 ; i < fwspec->num_ids; i++) { -struct qcom_iommu_ctx *ctx =to_ctx (fwspec, fwspec->ids[i]); +struct qcom_iommu_ctx *ctx =to_ctx (dev, fwspec->ids[i]);unsigned int val, ret;iommu_writel (ctx,ARM_SMMU_CB_TLBSYNC ,0 );
@@ -133,11 +139,14 @@ static void qcom_iommu_tlb_sync(void *cookie)static void qcom_iommu_tlb_inv_context (void *cookie) { -struct iommu_fwspec *fwspec = cookie; +struct device *dev = cookie; +struct iommu_fwspec *fwspec;unsigned i; + fwspec =dev_iommu_fwspec_get (dev); +for (i =0 ; i < fwspec->num_ids; i++) { -struct qcom_iommu_ctx *ctx =to_ctx (fwspec, fwspec->ids[i]); +struct qcom_iommu_ctx *ctx =to_ctx (dev, fwspec->ids[i]);iommu_writel (ctx,ARM_SMMU_CB_S1_TLBIASID , ctx->asid); }
@@ -147,13 +156,16 @@ static void qcom_iommu_tlb_inv_context(void *cookie)static void qcom_iommu_tlb_inv_range_nosync (unsigned long iova,size_t size,size_t granule,bool leaf,void *cookie) { -struct iommu_fwspec *fwspec = cookie; +struct device *dev = cookie; +struct iommu_fwspec *fwspec;unsigned i, reg; reg = leaf ?ARM_SMMU_CB_S1_TLBIVAL :ARM_SMMU_CB_S1_TLBIVA ; + fwspec =dev_iommu_fwspec_get (dev); +for (i =0 ; i < fwspec->num_ids; i++) { -struct qcom_iommu_ctx *ctx =to_ctx (fwspec, fwspec->ids[i]); +struct qcom_iommu_ctx *ctx =to_ctx (dev, fwspec->ids[i]);size_t s = size; iova = (iova >>12 ) <<12 ;
@@ -222,9 +234,10 @@ static irqreturn_t qcom_iommu_fault(int irq, void *dev)static int qcom_iommu_init_domain (struct iommu_domain *domain,struct qcom_iommu_dev *qcom_iommu, -struct iommu_fwspec *fwspec) +struct device *dev) {struct qcom_iommu_domain *qcom_domain =to_qcom_iommu_domain (domain); +struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev);struct io_pgtable_ops *pgtbl_ops;struct io_pgtable_cfg pgtbl_cfg;int i, ret =0 ;
@@ -243,7 +256,7 @@ static int qcom_iommu_init_domain(struct iommu_domain *domain, }; qcom_domain->iommu = qcom_iommu; - pgtbl_ops =alloc_io_pgtable_ops (ARM_32_LPAE_S1 , &pgtbl_cfg, fwspec); + pgtbl_ops =alloc_io_pgtable_ops (ARM_32_LPAE_S1 , &pgtbl_cfg, dev);if (!pgtbl_ops) {dev_err (qcom_iommu->dev,"failed to allocate pagetable ops\n" ); ret = -ENOMEM ;
@@ -256,7 +269,7 @@ static int qcom_iommu_init_domain(struct iommu_domain *domain, domain->geometry.force_aperture = true;for (i =0 ; i < fwspec->num_ids; i++) { -struct qcom_iommu_ctx *ctx =to_ctx (fwspec, fwspec->ids[i]); +struct qcom_iommu_ctx *ctx =to_ctx (dev, fwspec->ids[i]);if (!ctx->secure_init) { ret =qcom_scm_restore_sec_cfg (qcom_iommu->sec_id, ctx->asid);
@@ -363,8 +376,7 @@ static void qcom_iommu_domain_free(struct iommu_domain *domain)static int qcom_iommu_attach_dev (struct iommu_domain *domain,struct device *dev) { -struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev); -struct qcom_iommu_dev *qcom_iommu =to_iommu (fwspec); +struct qcom_iommu_dev *qcom_iommu =to_iommu (dev);struct qcom_iommu_domain *qcom_domain =to_qcom_iommu_domain (domain);int ret;
@@ -375,7 +387,7 @@ static int qcom_iommu_attach_dev(struct iommu_domain *domain, struct device *dev/* Ensure that the domain is finalized */ pm_runtime_get_sync (qcom_iommu->dev); - ret =qcom_iommu_init_domain (domain, qcom_iommu, fwspec); + ret =qcom_iommu_init_domain (domain, qcom_iommu, dev);pm_runtime_put_sync (qcom_iommu->dev);if (ret <0 )return ret;
@@ -397,9 +409,9 @@ static int qcom_iommu_attach_dev(struct iommu_domain *domain, struct device *devstatic void qcom_iommu_detach_dev (struct iommu_domain *domain,struct device *dev) { -struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev); -struct qcom_iommu_dev *qcom_iommu =to_iommu (fwspec);struct qcom_iommu_domain *qcom_domain =to_qcom_iommu_domain (domain); +struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev); +struct qcom_iommu_dev *qcom_iommu =to_iommu (dev);unsigned i;if (WARN_ON (!qcom_domain->iommu))
@@ -407,7 +419,7 @@ static void qcom_iommu_detach_dev(struct iommu_domain *domain, struct device *depm_runtime_get_sync (qcom_iommu->dev);for (i =0 ; i < fwspec->num_ids; i++) { -struct qcom_iommu_ctx *ctx =to_ctx (fwspec, fwspec->ids[i]); +struct qcom_iommu_ctx *ctx =to_ctx (dev, fwspec->ids[i]);/* Disable the context bank: */ iommu_writel (ctx,ARM_SMMU_CB_SCTLR ,0 );
@@ -514,7 +526,7 @@ static bool qcom_iommu_capable(enum iommu_cap cap)static int qcom_iommu_add_device (struct device *dev) { -struct qcom_iommu_dev *qcom_iommu =to_iommu (dev_iommu_fwspec_get (dev)); +struct qcom_iommu_dev *qcom_iommu =to_iommu (dev);struct iommu_group *group;struct device_link *link;
@@ -545,7 +557,7 @@ static int qcom_iommu_add_device(struct device *dev)static void qcom_iommu_remove_device (struct device *dev) { -struct qcom_iommu_dev *qcom_iommu =to_iommu (dev_iommu_fwspec_get (dev)); +struct qcom_iommu_dev *qcom_iommu =to_iommu (dev);if (!qcom_iommu)return ;
@@ -557,7 +569,6 @@ static void qcom_iommu_remove_device(struct device *dev)static int qcom_iommu_of_xlate (struct device *dev,struct of_phandle_args *args) { -struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev);struct qcom_iommu_dev *qcom_iommu;struct platform_device *iommu_pdev;unsigned asid = args->args[0 ];
@@ -583,14 +594,14 @@ static int qcom_iommu_of_xlate(struct device *dev, struct of_phandle_args *args) WARN_ON(asid > qcom_iommu->num_ctxs))return -EINVAL ; -if (!fwspec->iommu_priv) { - fwspec->iommu_priv = qcom_iommu; +if (!dev_iommu_priv_get (dev)) { +dev_iommu_priv_set (dev, qcom_iommu); }else {/* make sure devices iommus dt node isn't referring to * multiple different iommu devices. Multiple context * banks are ok, but multiple devices are not: */ -if (WARN_ON (qcom_iommu != fwspec->iommu_priv)) +if (WARN_ON (qcom_iommu !=dev_iommu_priv_get (dev)))return -EINVAL ; }
Signature · 6 lines
2.17.1 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Joerg Roedel
maintainerPATCH v4 15/16 iommu/virtio: Use accessor functions for iommu private data
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Make use of dev_iommu_priv_set/get() functions.
--- drivers/iommu/virtio-iommu.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/iommu/virtio-iommu.c +5 -6
@@ -466,7 +466,7 @@ static int viommu_probe_endpoint(struct viommu_dev *viommu, struct device *dev)struct virtio_iommu_req_probe *probe;struct virtio_iommu_probe_property *prop;struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev); -struct viommu_endpoint *vdev = fwspec->iommu_priv; +struct viommu_endpoint *vdev =dev_iommu_priv_get (dev);if (!fwspec->num_ids)return -EINVAL ;
@@ -648,7 +648,7 @@ static int viommu_attach_dev(struct iommu_domain *domain, struct device *dev)int ret =0 ;struct virtio_iommu_req_attach req;struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev); -struct viommu_endpoint *vdev = fwspec->iommu_priv; +struct viommu_endpoint *vdev =dev_iommu_priv_get (dev);struct viommu_domain *vdomain =to_viommu_domain (domain);mutex_lock (&vdomain->mutex);
@@ -807,8 +807,7 @@ static void viommu_iotlb_sync(struct iommu_domain *domain,static void viommu_get_resv_regions (struct device *dev,struct list_head *head) {struct iommu_resv_region *entry, *new_entry, *msi =NULL ; -struct iommu_fwspec *fwspec =dev_iommu_fwspec_get (dev); -struct viommu_endpoint *vdev = fwspec->iommu_priv; +struct viommu_endpoint *vdev =dev_iommu_priv_get (dev);int prot =IOMMU_WRITE |IOMMU_NOEXEC |IOMMU_MMIO ;list_for_each_entry (entry, &vdev->resv_regions, list) {
@@ -876,7 +875,7 @@ static int viommu_add_device(struct device *dev) vdev->dev = dev; vdev->viommu = viommu;INIT_LIST_HEAD (&vdev->resv_regions); - fwspec->iommu_priv = vdev; +dev_iommu_priv_set (dev, vdev);if (viommu->probe_size) {/* Get additional information for this endpoint */
@@ -920,7 +919,7 @@ static void viommu_remove_device(struct device *dev)if (!fwspec || fwspec->ops != &viommu_ops)return ; - vdev = fwspec->iommu_priv; + vdev =dev_iommu_priv_get (dev);iommu_group_remove_device (dev);iommu_device_unlink (&vdev->viommu->iommu, dev);
Signature · 6 lines
2.17.1 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Joerg Roedel
maintainerPATCH v4 16/16 iommu: Move fwspec->iommu_priv to struct dev_iommu
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Move the pointer for iommu private data from struct iommu_fwspec to struct dev_iommu.
--- include/linux/iommu.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
include/linux/iommu.h +4 -3
@@ -369,6 +369,7 @@ struct iommu_fault_param {* * @fault_param: IOMMU detected device fault reporting data * @fwspec: IOMMU fwspec data +* @priv: IOMMU Driver private data * * TODO: migrate other per device data pointers under iommu_dev_data, e.g. * struct iommu_group *iommu_group;
@@ -377,6 +378,7 @@ struct dev_iommu {struct mutex lock;struct iommu_fault_param *fault_param;struct iommu_fwspec *fwspec; +void *priv; };int iommu_device_register (struct iommu_device *iommu);
@@ -589,7 +591,6 @@ struct iommu_group *fsl_mc_device_group(struct device *dev);struct iommu_fwspec {const struct iommu_ops *ops;struct fwnode_handle *iommu_fwnode; -void *iommu_priv;u32 flags;u32 num_pasid_bits;unsigned int num_ids;
@@ -629,12 +630,12 @@ static inline void dev_iommu_fwspec_set(struct device *dev,static inline void *dev_iommu_priv_get (struct device *dev) { -return dev->iommu->fwspec->iommu_priv; +return dev->iommu->priv; }static inline void dev_iommu_priv_set (struct device *dev,void *priv) { - dev->iommu->fwspec->iommu_priv = priv; + dev->iommu->priv = priv; }int iommu_probe_device (struct device *dev);
Signature · 6 lines
2.17.1 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Quoted 8 lines · Joerg Roedel
Joerg Roedel (15):
iommu: Definedev_iommu_fwspec_get()for !CONFIG_IOMMU_API ACPI/IORT: Remove direct access ofdev->iommu_fwspecdrm/msm/mdp5: Remove direct access ofdev->iommu_fwspeciommu/tegra-gart: Remove direct access ofdev->iommu_fwspec
iommu: Rename structiommu_paramtodev_iommu
iommu: Moveiommu_fwspecto structdev_iommuiommu/arm-smmu: Fix uninitilized variable warning
Quoted 8 lines
iommu: Introduce accessors for iommu private data iommu/arm-smmu-v3: Use accessor functions for iommu private data iommu/arm-smmu: Use accessor functions for iommu private data iommu/renesas: Use accessor functions for iommu private data iommu/mediatek: Use accessor functions for iommu private data iommu/qcom: Use accessor functions for iommu private data iommu/virtio: Use accessor functions for iommu private data
iommu: Movefwspec->iommu_privto structdev_iommu
Applied.