diff options
-rw-r--r-- | drivers/iommu/amd_iommu_types.h | 4 | ||||
-rw-r--r-- | drivers/iommu/intel-iommu.c | 4 | ||||
-rw-r--r-- | drivers/iommu/iommu-sysfs.c | 32 | ||||
-rw-r--r-- | include/linux/iommu.h | 12 |
4 files changed, 37 insertions, 15 deletions
diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h index 294a409e283b..d6b873b57054 100644 --- a/drivers/iommu/amd_iommu_types.h +++ b/drivers/iommu/amd_iommu_types.h | |||
@@ -574,7 +574,9 @@ struct amd_iommu { | |||
574 | 574 | ||
575 | static inline struct amd_iommu *dev_to_amd_iommu(struct device *dev) | 575 | static inline struct amd_iommu *dev_to_amd_iommu(struct device *dev) |
576 | { | 576 | { |
577 | return container_of(dev, struct amd_iommu, iommu.dev); | 577 | struct iommu_device *iommu = dev_to_iommu_device(dev); |
578 | |||
579 | return container_of(iommu, struct amd_iommu, iommu); | ||
578 | } | 580 | } |
579 | 581 | ||
580 | #define ACPIHID_UID_LEN 256 | 582 | #define ACPIHID_UID_LEN 256 |
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 687f18f65cea..3e8636f1220e 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c | |||
@@ -4736,7 +4736,9 @@ static void intel_disable_iommus(void) | |||
4736 | 4736 | ||
4737 | static inline struct intel_iommu *dev_to_intel_iommu(struct device *dev) | 4737 | static inline struct intel_iommu *dev_to_intel_iommu(struct device *dev) |
4738 | { | 4738 | { |
4739 | return container_of(dev, struct intel_iommu, iommu.dev); | 4739 | struct iommu_device *iommu_dev = dev_to_iommu_device(dev); |
4740 | |||
4741 | return container_of(iommu_dev, struct intel_iommu, iommu); | ||
4740 | } | 4742 | } |
4741 | 4743 | ||
4742 | static ssize_t intel_iommu_show_version(struct device *dev, | 4744 | static ssize_t intel_iommu_show_version(struct device *dev, |
diff --git a/drivers/iommu/iommu-sysfs.c b/drivers/iommu/iommu-sysfs.c index c58351ed61c1..36d1a7ce7fc4 100644 --- a/drivers/iommu/iommu-sysfs.c +++ b/drivers/iommu/iommu-sysfs.c | |||
@@ -62,32 +62,40 @@ int iommu_device_sysfs_add(struct iommu_device *iommu, | |||
62 | va_list vargs; | 62 | va_list vargs; |
63 | int ret; | 63 | int ret; |
64 | 64 | ||
65 | device_initialize(&iommu->dev); | 65 | iommu->dev = kzalloc(sizeof(*iommu->dev), GFP_KERNEL); |
66 | if (!iommu->dev) | ||
67 | return -ENOMEM; | ||
66 | 68 | ||
67 | iommu->dev.class = &iommu_class; | 69 | device_initialize(iommu->dev); |
68 | iommu->dev.parent = parent; | 70 | |
69 | iommu->dev.groups = groups; | 71 | iommu->dev->class = &iommu_class; |
72 | iommu->dev->parent = parent; | ||
73 | iommu->dev->groups = groups; | ||
70 | 74 | ||
71 | va_start(vargs, fmt); | 75 | va_start(vargs, fmt); |
72 | ret = kobject_set_name_vargs(&iommu->dev.kobj, fmt, vargs); | 76 | ret = kobject_set_name_vargs(&iommu->dev->kobj, fmt, vargs); |
73 | va_end(vargs); | 77 | va_end(vargs); |
74 | if (ret) | 78 | if (ret) |
75 | goto error; | 79 | goto error; |
76 | 80 | ||
77 | ret = device_add(&iommu->dev); | 81 | ret = device_add(iommu->dev); |
78 | if (ret) | 82 | if (ret) |
79 | goto error; | 83 | goto error; |
80 | 84 | ||
85 | dev_set_drvdata(iommu->dev, iommu); | ||
86 | |||
81 | return 0; | 87 | return 0; |
82 | 88 | ||
83 | error: | 89 | error: |
84 | put_device(&iommu->dev); | 90 | put_device(iommu->dev); |
85 | return ret; | 91 | return ret; |
86 | } | 92 | } |
87 | 93 | ||
88 | void iommu_device_sysfs_remove(struct iommu_device *iommu) | 94 | void iommu_device_sysfs_remove(struct iommu_device *iommu) |
89 | { | 95 | { |
90 | device_unregister(&iommu->dev); | 96 | dev_set_drvdata(iommu->dev, NULL); |
97 | device_unregister(iommu->dev); | ||
98 | iommu->dev = NULL; | ||
91 | } | 99 | } |
92 | /* | 100 | /* |
93 | * IOMMU drivers can indicate a device is managed by a given IOMMU using | 101 | * IOMMU drivers can indicate a device is managed by a given IOMMU using |
@@ -102,14 +110,14 @@ int iommu_device_link(struct iommu_device *iommu, struct device *link) | |||
102 | if (!iommu || IS_ERR(iommu)) | 110 | if (!iommu || IS_ERR(iommu)) |
103 | return -ENODEV; | 111 | return -ENODEV; |
104 | 112 | ||
105 | ret = sysfs_add_link_to_group(&iommu->dev.kobj, "devices", | 113 | ret = sysfs_add_link_to_group(&iommu->dev->kobj, "devices", |
106 | &link->kobj, dev_name(link)); | 114 | &link->kobj, dev_name(link)); |
107 | if (ret) | 115 | if (ret) |
108 | return ret; | 116 | return ret; |
109 | 117 | ||
110 | ret = sysfs_create_link_nowarn(&link->kobj, &iommu->dev.kobj, "iommu"); | 118 | ret = sysfs_create_link_nowarn(&link->kobj, &iommu->dev->kobj, "iommu"); |
111 | if (ret) | 119 | if (ret) |
112 | sysfs_remove_link_from_group(&iommu->dev.kobj, "devices", | 120 | sysfs_remove_link_from_group(&iommu->dev->kobj, "devices", |
113 | dev_name(link)); | 121 | dev_name(link)); |
114 | 122 | ||
115 | return ret; | 123 | return ret; |
@@ -121,5 +129,5 @@ void iommu_device_unlink(struct iommu_device *iommu, struct device *link) | |||
121 | return; | 129 | return; |
122 | 130 | ||
123 | sysfs_remove_link(&link->kobj, "iommu"); | 131 | sysfs_remove_link(&link->kobj, "iommu"); |
124 | sysfs_remove_link_from_group(&iommu->dev.kobj, "devices", dev_name(link)); | 132 | sysfs_remove_link_from_group(&iommu->dev->kobj, "devices", dev_name(link)); |
125 | } | 133 | } |
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 2cb54adc4a33..176f7569d874 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h | |||
@@ -240,7 +240,7 @@ struct iommu_device { | |||
240 | struct list_head list; | 240 | struct list_head list; |
241 | const struct iommu_ops *ops; | 241 | const struct iommu_ops *ops; |
242 | struct fwnode_handle *fwnode; | 242 | struct fwnode_handle *fwnode; |
243 | struct device dev; | 243 | struct device *dev; |
244 | }; | 244 | }; |
245 | 245 | ||
246 | int iommu_device_register(struct iommu_device *iommu); | 246 | int iommu_device_register(struct iommu_device *iommu); |
@@ -265,6 +265,11 @@ static inline void iommu_device_set_fwnode(struct iommu_device *iommu, | |||
265 | iommu->fwnode = fwnode; | 265 | iommu->fwnode = fwnode; |
266 | } | 266 | } |
267 | 267 | ||
268 | static inline struct iommu_device *dev_to_iommu_device(struct device *dev) | ||
269 | { | ||
270 | return (struct iommu_device *)dev_get_drvdata(dev); | ||
271 | } | ||
272 | |||
268 | #define IOMMU_GROUP_NOTIFY_ADD_DEVICE 1 /* Device added */ | 273 | #define IOMMU_GROUP_NOTIFY_ADD_DEVICE 1 /* Device added */ |
269 | #define IOMMU_GROUP_NOTIFY_DEL_DEVICE 2 /* Pre Device removed */ | 274 | #define IOMMU_GROUP_NOTIFY_DEL_DEVICE 2 /* Pre Device removed */ |
270 | #define IOMMU_GROUP_NOTIFY_BIND_DRIVER 3 /* Pre Driver bind */ | 275 | #define IOMMU_GROUP_NOTIFY_BIND_DRIVER 3 /* Pre Driver bind */ |
@@ -589,6 +594,11 @@ static inline void iommu_device_set_fwnode(struct iommu_device *iommu, | |||
589 | { | 594 | { |
590 | } | 595 | } |
591 | 596 | ||
597 | static inline struct iommu_device *dev_to_iommu_device(struct device *dev) | ||
598 | { | ||
599 | return NULL; | ||
600 | } | ||
601 | |||
592 | static inline void iommu_device_unregister(struct iommu_device *iommu) | 602 | static inline void iommu_device_unregister(struct iommu_device *iommu) |
593 | { | 603 | { |
594 | } | 604 | } |