iommu: Move iommu_fwspec to struct dev_iommu
authorJoerg Roedel <jroedel@suse.de>
Thu, 26 Mar 2020 15:08:31 +0000 (16:08 +0100)
committerJoerg Roedel <jroedel@suse.de>
Fri, 27 Mar 2020 10:14:51 +0000 (11:14 +0100)
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.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
Tested-by: Will Deacon <will@kernel.org> # arm-smmu
Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Link: https://lore.kernel.org/r/20200326150841.10083-7-joro@8bytes.org
drivers/iommu/iommu.c
include/linux/device.h
include/linux/iommu.h

index 15d64a1..2b47141 100644 (file)
@@ -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;
+
        /* Preallocate for the overwhelmingly common case of 1 ID */
        fwspec = kzalloc(struct_size(fwspec, ids, 1), GFP_KERNEL);
        if (!fwspec)
index af621f9..9610d0a 100644 (file)
@@ -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;
index 843baaa..d031ddc 100644 (file)
@@ -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);