* [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device'
@ 2020-02-28 15:08 Joerg Roedel
2020-02-28 15:08 ` [PATCH 01/14] ACPI/IORT: Remove direct access of dev->iommu_fwspec Joerg Roedel
` (15 more replies)
0 siblings, 16 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson
Hi,
here is a patch-set to rename iommu_param to dev_iommu and
establish it as a struct for generic per-device iommu-data.
Also move the iommu_fwspec pointer from struct device into
dev_iommu to have less iommu-related pointers in struct
device.
The bigger part of this patch-set moves the iommu_priv
pointer from struct iommu_fwspec to dev_iommu, making is
usable for iommu-drivers which do not use fwspecs.
The changes for that were mostly straightforward, except for
the arm-smmu (_not_ arm-smmu-v3) and the qcom iommu driver.
Unfortunatly I don't have the hardware for those, so any
testing of these drivers is greatly appreciated.
I boot-tested these changes on arm-smmu-v3 enabled KVM VM.
Please review.
Regards,
Joerg
Joerg Roedel (14):
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/arm-smmu: Fix uninitilized variable warning
iommu: Rename struct iommu_param to dev_iommu
iommu: Move iommu_fwspec to struct dev_iommu
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
drivers/acpi/arm64/iort.c | 3 +-
drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 2 +-
drivers/iommu/arm-smmu-v3.c | 10 ++--
drivers/iommu/arm-smmu.c | 58 +++++++++++-----------
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 | 7 ++-
include/linux/iommu.h | 29 ++++++++---
13 files changed, 137 insertions(+), 111 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 01/14] ACPI/IORT: Remove direct access of dev->iommu_fwspec
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-02-28 15:08 ` [PATCH 02/14] drm/msm/mdp5: " Joerg Roedel
` (14 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
Use the accessor functions instead of directly dereferencing
dev->iommu_fwspec.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
drivers/acpi/arm64/iort.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index ed3d2d1a7ae9..0e981d7f3c7d 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -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 = dev_iommu_fwspec_get(dev);
struct pci_bus *bus = to_pci_dev(dev)->bus;
struct iort_pci_alias_info info = { .dev = dev };
@@ -1028,7 +1029,7 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev)
iort_pci_iommu_init, &info);
if (!err && iort_pci_rc_supports_ats(node))
- dev->iommu_fwspec->flags |= IOMMU_FWSPEC_PCI_RC_ATS;
+ fwspec->flags |= IOMMU_FWSPEC_PCI_RC_ATS;
} else {
int i = 0;
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 02/14] drm/msm/mdp5: Remove direct access of dev->iommu_fwspec
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
2020-02-28 15:08 ` [PATCH 01/14] ACPI/IORT: Remove direct access of dev->iommu_fwspec Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-02-29 3:04 ` kbuild test robot
2020-02-28 15:08 ` [PATCH 03/14] iommu/tegra-gart: " Joerg Roedel
` (13 subsequent siblings)
15 siblings, 1 reply; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
Use the accessor functions instead of directly dereferencing
dev->iommu_fwspec.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
index e43ecd4be10a..1252e1d76340 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
@@ -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,
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 03/14] iommu/tegra-gart: Remove direct access of dev->iommu_fwspec
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
2020-02-28 15:08 ` [PATCH 01/14] ACPI/IORT: Remove direct access of dev->iommu_fwspec Joerg Roedel
2020-02-28 15:08 ` [PATCH 02/14] drm/msm/mdp5: " Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-02-28 15:08 ` [PATCH 04/14] iommu/arm-smmu: Fix uninitilized variable warning Joerg Roedel
` (12 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
Use the accessor functions instead of directly dereferencing
dev->iommu_fwspec.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
drivers/iommu/tegra-gart.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c
index 3fb7ba72507d..db6559e8336f 100644
--- a/drivers/iommu/tegra-gart.c
+++ b/drivers/iommu/tegra-gart.c
@@ -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);
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 04/14] iommu/arm-smmu: Fix uninitilized variable warning
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
` (2 preceding siblings ...)
2020-02-28 15:08 ` [PATCH 03/14] iommu/tegra-gart: " Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-02-28 15:08 ` [PATCH 05/14] iommu: Rename struct iommu_param to dev_iommu Joerg Roedel
` (11 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
Some unrelated changes in the iommu code caused a new warning to
appear in the arm-smmu driver:
CC drivers/iommu/arm-smmu.o
drivers/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.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
drivers/iommu/arm-smmu.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 16c4b87af42b..980aae73b45b 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -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;
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 05/14] iommu: Rename struct iommu_param to dev_iommu
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
` (3 preceding siblings ...)
2020-02-28 15:08 ` [PATCH 04/14] iommu/arm-smmu: Fix uninitilized variable warning Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-02-28 15:08 ` [PATCH 06/14] iommu: Move iommu_fwspec to struct dev_iommu Joerg Roedel
` (10 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
The term dev_iommu aligns better with other existing structures and
their accessor functions.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
drivers/iommu/iommu.c | 28 ++++++++++++++--------------
include/linux/device.h | 6 +++---
include/linux/iommu.h | 4 ++--
3 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 3e3528436e0b..beac2ef063dd 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -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)
diff --git a/include/linux/device.h b/include/linux/device.h
index 0cd7c647c16c..af621f9fe85b 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -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;
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index d1b5f4d98569..a2dc84183fce 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -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;
};
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 06/14] iommu: Move iommu_fwspec to struct dev_iommu
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
` (4 preceding siblings ...)
2020-02-28 15:08 ` [PATCH 05/14] iommu: Rename struct iommu_param to dev_iommu Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-02-28 15:08 ` [PATCH 07/14] iommu: Introduce accessors for iommu private data Joerg Roedel
` (9 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
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>
---
drivers/iommu/iommu.c | 3 +++
include/linux/device.h | 1 -
include/linux/iommu.h | 12 ++++++++----
3 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index beac2ef063dd..826a67ba247f 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -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;
diff --git a/include/linux/device.h b/include/linux/device.h
index af621f9fe85b..9cc7da36a9b6 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -613,7 +613,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;
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index a2dc84183fce..a049bcb660e1 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -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);
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 07/14] iommu: Introduce accessors for iommu private data
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
` (5 preceding siblings ...)
2020-02-28 15:08 ` [PATCH 06/14] iommu: Move iommu_fwspec to struct dev_iommu Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-02-28 15:08 ` [PATCH 08/14] iommu/arm-smmu-v3: Use accessor functions " Joerg Roedel
` (8 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
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.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
include/linux/iommu.h | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index a049bcb660e1..904fb24418e5 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -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);
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 08/14] iommu/arm-smmu-v3: Use accessor functions for iommu private data
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
` (6 preceding siblings ...)
2020-02-28 15:08 ` [PATCH 07/14] iommu: Introduce accessors for iommu private data Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-02-28 15:08 ` [PATCH 09/14] iommu/arm-smmu: " Joerg Roedel
` (7 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
Make use of dev_iommu_priv_set/get() functions in the code.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
drivers/iommu/arm-smmu-v3.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
index aa3ac2a03807..2b68498dfb66 100644
--- a/drivers/iommu/arm-smmu-v3.c
+++ b/drivers/iommu/arm-smmu-v3.c
@@ -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);
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 09/14] iommu/arm-smmu: Use accessor functions for iommu private data
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
` (7 preceding siblings ...)
2020-02-28 15:08 ` [PATCH 08/14] iommu/arm-smmu-v3: Use accessor functions " Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-02-28 15:08 ` [PATCH 10/14] iommu/renesas: " Joerg Roedel
` (6 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
Make use of dev_iommu_priv_set/get() functions and simplify the code
where possible with this change.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
drivers/iommu/arm-smmu.c | 56 +++++++++++++++++++++-------------------
1 file changed, 29 insertions(+), 27 deletions(-)
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 980aae73b45b..8276fff5f7dc 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -98,12 +98,15 @@ 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 __fwspec_cfg(dev) ((struct arm_smmu_master_cfg *)dev_iommu_priv_get(dev))
+#define fwspec_smmu(dev) (__fwspec_cfg(dev)->smmu)
+#define fwspec_smendx(dev, i) \
+ (i >= dev_iommu_fwspec_get(dev)->num_ids ? \
+ INVALID_SMENDX : \
+ __fwspec_cfg(dev)->smendx[i])
+#define for_each_cfg_sme(dev, i, idx) \
+ for (i = 0; idx = fwspec_smendx(dev, i), \
+ i < dev_iommu_fwspec_get(dev)->num_ids; ++i)
static bool using_legacy_binding, using_generic_binding;
@@ -1061,7 +1064,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;
@@ -1069,7 +1072,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(dev, 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 +1103,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(dev, i, idx) {
arm_smmu_write_sme(smmu, idx);
smmu->s2crs[idx].group = group;
}
@@ -1117,14 +1120,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 device *dev)
{
- struct arm_smmu_device *smmu = fwspec_smmu(fwspec);
- 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 = fwspec_smmu(dev);
int i, idx;
mutex_lock(&smmu->stream_map_mutex);
- for_each_cfg_sme(fwspec, i, idx) {
+ for_each_cfg_sme(dev, i, idx) {
if (arm_smmu_free_sme(smmu, idx))
arm_smmu_write_sme(smmu, idx);
cfg->smendx[i] = INVALID_SMENDX;
@@ -1133,7 +1136,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 iommu_fwspec *fwspec)
+ struct device *dev)
{
struct arm_smmu_device *smmu = smmu_domain->smmu;
struct arm_smmu_s2cr *s2cr = smmu->s2crs;
@@ -1146,7 +1149,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(dev, i, idx) {
if (type == s2cr[idx].type && cbndx == s2cr[idx].cbndx)
continue;
@@ -1160,10 +1163,10 @@ 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 arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
struct arm_smmu_device *smmu;
- struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
+ int ret;
if (!fwspec || fwspec->ops != &arm_smmu_ops) {
dev_err(dev, "cannot attach to SMMU, is it on the same bus?\n");
@@ -1177,10 +1180,10 @@ 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)
+ if (!dev_iommu_priv_get(dev))
return -ENODEV;
- smmu = fwspec_smmu(fwspec);
+ smmu = fwspec_smmu(dev);
ret = arm_smmu_rpm_get(smmu);
if (ret < 0)
@@ -1204,7 +1207,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, dev);
/*
* Setup an autosuspend delay to avoid bouncing runpm state.
@@ -1429,7 +1432,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;
@@ -1467,7 +1470,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);
@@ -1475,23 +1478,22 @@ 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(dev);
arm_smmu_rpm_put(smmu);
iommu_group_remove_device(dev);
- kfree(fwspec->iommu_priv);
iommu_fwspec_free(dev);
+ kfree(cfg);
}
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_device *smmu = fwspec_smmu(dev);
struct iommu_group *group = NULL;
int i, idx;
- for_each_cfg_sme(fwspec, i, idx) {
+ for_each_cfg_sme(dev, i, idx) {
if (group && smmu->s2crs[idx].group &&
group != smmu->s2crs[idx].group)
return ERR_PTR(-EINVAL);
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 10/14] iommu/renesas: Use accessor functions for iommu private data
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
` (8 preceding siblings ...)
2020-02-28 15:08 ` [PATCH 09/14] iommu/arm-smmu: " Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-02-28 15:08 ` [PATCH 11/14] iommu/mediatek: " Joerg Roedel
` (5 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
Make use of dev_iommu_priv_set/get() functions.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
drivers/iommu/ipmmu-vmsa.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c
index ecb3f9464dd5..310cf09feea3 100644
--- a/drivers/iommu/ipmmu-vmsa.c
+++ b/drivers/iommu/ipmmu-vmsa.c
@@ -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;
}
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 11/14] iommu/mediatek: Use accessor functions for iommu private data
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
` (9 preceding siblings ...)
2020-02-28 15:08 ` [PATCH 10/14] iommu/renesas: " Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-02-28 15:08 ` [PATCH 12/14] iommu/qcom: " Joerg Roedel
` (4 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
Make use of dev_iommu_priv_set/get() functions.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
drivers/iommu/mtk_iommu.c | 13 ++++++-------
drivers/iommu/mtk_iommu_v1.c | 14 +++++++-------
2 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c
index 95945f467c03..5f4d6df59cf6 100644
--- a/drivers/iommu/mtk_iommu.c
+++ b/drivers/iommu/mtk_iommu.c
@@ -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);
diff --git a/drivers/iommu/mtk_iommu_v1.c b/drivers/iommu/mtk_iommu_v1.c
index e93b94ecac45..9930ac7413cc 100644
--- a/drivers/iommu/mtk_iommu_v1.c
+++ b/drivers/iommu/mtk_iommu_v1.c
@@ -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);
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 12/14] iommu/qcom: Use accessor functions for iommu private data
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
` (10 preceding siblings ...)
2020-02-28 15:08 ` [PATCH 11/14] iommu/mediatek: " Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-02-28 15:08 ` [PATCH 13/14] iommu/virtio: " Joerg Roedel
` (3 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
Make use of dev_iommu_priv_set/get() functions.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
drivers/iommu/qcom_iommu.c | 61 ++++++++++++++++++++++----------------
1 file changed, 36 insertions(+), 25 deletions(-)
diff --git a/drivers/iommu/qcom_iommu.c b/drivers/iommu/qcom_iommu.c
index 4328da0b0a9f..80147f82d427 100644
--- a/drivers/iommu/qcom_iommu.c
+++ b/drivers/iommu/qcom_iommu.c
@@ -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 *dev
static 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 *de
pm_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;
}
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 13/14] iommu/virtio: Use accessor functions for iommu private data
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
` (11 preceding siblings ...)
2020-02-28 15:08 ` [PATCH 12/14] iommu/qcom: " Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-02-28 15:08 ` [PATCH 14/14] iommu: Move fwspec->iommu_priv to struct dev_iommu Joerg Roedel
` (2 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
Make use of dev_iommu_priv_set/get() functions.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
drivers/iommu/virtio-iommu.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
index cce329d71fba..8ead57f031f5 100644
--- a/drivers/iommu/virtio-iommu.c
+++ b/drivers/iommu/virtio-iommu.c
@@ -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);
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 14/14] iommu: Move fwspec->iommu_priv to struct dev_iommu
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
` (12 preceding siblings ...)
2020-02-28 15:08 ` [PATCH 13/14] iommu/virtio: " Joerg Roedel
@ 2020-02-28 15:08 ` Joerg Roedel
2020-03-03 19:16 ` [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Will Deacon
2020-03-06 8:39 ` Hanjun Guo
15 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-02-28 15:08 UTC (permalink / raw)
To: iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
From: Joerg Roedel <jroedel@suse.de>
Move the pointer for iommu private data from struct iommu_fwspec to
struct dev_iommu.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
include/linux/iommu.h | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 904fb24418e5..77fc6bb35fe9 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -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);
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH 02/14] drm/msm/mdp5: Remove direct access of dev->iommu_fwspec
2020-02-28 15:08 ` [PATCH 02/14] drm/msm/mdp5: " Joerg Roedel
@ 2020-02-29 3:04 ` kbuild test robot
0 siblings, 0 replies; 22+ messages in thread
From: kbuild test robot @ 2020-02-29 3:04 UTC (permalink / raw)
To: Joerg Roedel
Cc: kbuild-all, iommu, linux-kernel, linux-arm-msm, linux-mediatek,
virtualization, Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla,
Rob Clark, Sean Paul, Will Deacon, Robin Murphy, Joerg Roedel,
Matthias Brugger, Thierry Reding, Jean-Philippe Brucker,
Andy Gross, Bjorn Andersson, Joerg Roedel
[-- Attachment #1: Type: text/plain, Size: 4957 bytes --]
Hi Joerg,
I love your patch! Yet something to improve:
[auto build test ERROR on pm/linux-next]
[also build test ERROR on tegra/for-next linux/master linus/master v5.6-rc3 next-20200228]
[cannot apply to iommu/next]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Joerg-Roedel/iommu-Move-iommu_fwspec-out-of-struct-device/20200229-075740
base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next
config: arm-imx_v6_v7_defconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (GCC) 7.5.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
GCC_VERSION=7.5.0 make.cross ARCH=arm
If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c: In function 'mdp5_kms_init':
>> drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c:728:8: error: implicit declaration of function 'dev_iommu_fwspec_get'; did you mean 'iommu_fwspec_free'? [-Werror=implicit-function-declaration]
if (!dev_iommu_fwspec_get(iommu_dev))
^~~~~~~~~~~~~~~~~~~~
iommu_fwspec_free
cc1: some warnings being treated as errors
vim +728 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
677
678 struct msm_kms *mdp5_kms_init(struct drm_device *dev)
679 {
680 struct msm_drm_private *priv = dev->dev_private;
681 struct platform_device *pdev;
682 struct mdp5_kms *mdp5_kms;
683 struct mdp5_cfg *config;
684 struct msm_kms *kms;
685 struct msm_gem_address_space *aspace;
686 int irq, i, ret;
687 struct device *iommu_dev;
688
689 /* priv->kms would have been populated by the MDP5 driver */
690 kms = priv->kms;
691 if (!kms)
692 return NULL;
693
694 mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
695
696 mdp_kms_init(&mdp5_kms->base, &kms_funcs);
697
698 pdev = mdp5_kms->pdev;
699
700 irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
701 if (irq < 0) {
702 ret = irq;
703 DRM_DEV_ERROR(&pdev->dev, "failed to get irq: %d\n", ret);
704 goto fail;
705 }
706
707 kms->irq = irq;
708
709 config = mdp5_cfg_get_config(mdp5_kms->cfg);
710
711 /* make sure things are off before attaching iommu (bootloader could
712 * have left things on, in which case we'll start getting faults if
713 * we don't disable):
714 */
715 pm_runtime_get_sync(&pdev->dev);
716 for (i = 0; i < MDP5_INTF_NUM_MAX; i++) {
717 if (mdp5_cfg_intf_is_virtual(config->hw->intf.connect[i]) ||
718 !config->hw->intf.base[i])
719 continue;
720 mdp5_write(mdp5_kms, REG_MDP5_INTF_TIMING_ENGINE_EN(i), 0);
721
722 mdp5_write(mdp5_kms, REG_MDP5_INTF_FRAME_LINE_COUNT_EN(i), 0x3);
723 }
724 mdelay(16);
725
726 if (config->platform.iommu) {
727 iommu_dev = &pdev->dev;
> 728 if (!dev_iommu_fwspec_get(iommu_dev))
729 iommu_dev = iommu_dev->parent;
730
731 aspace = msm_gem_address_space_create(iommu_dev,
732 config->platform.iommu, "mdp5");
733 if (IS_ERR(aspace)) {
734 ret = PTR_ERR(aspace);
735 goto fail;
736 }
737
738 kms->aspace = aspace;
739
740 ret = aspace->mmu->funcs->attach(aspace->mmu);
741 if (ret) {
742 DRM_DEV_ERROR(&pdev->dev, "failed to attach iommu: %d\n",
743 ret);
744 goto fail;
745 }
746 } else {
747 DRM_DEV_INFO(&pdev->dev,
748 "no iommu, fallback to phys contig buffers for scanout\n");
749 aspace = NULL;
750 }
751
752 pm_runtime_put_sync(&pdev->dev);
753
754 ret = modeset_init(mdp5_kms);
755 if (ret) {
756 DRM_DEV_ERROR(&pdev->dev, "modeset_init failed: %d\n", ret);
757 goto fail;
758 }
759
760 dev->mode_config.min_width = 0;
761 dev->mode_config.min_height = 0;
762 dev->mode_config.max_width = 0xffff;
763 dev->mode_config.max_height = 0xffff;
764
765 dev->driver->get_vblank_timestamp = drm_calc_vbltimestamp_from_scanoutpos;
766 dev->driver->get_scanout_position = mdp5_get_scanoutpos;
767 dev->driver->get_vblank_counter = mdp5_get_vblank_counter;
768 dev->max_vblank_count = 0; /* max_vblank_count is set on each CRTC */
769 dev->vblank_disable_immediate = true;
770
771 return kms;
772 fail:
773 if (kms)
774 mdp5_kms_destroy(kms);
775 return ERR_PTR(ret);
776 }
777
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 37249 bytes --]
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device'
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
` (13 preceding siblings ...)
2020-02-28 15:08 ` [PATCH 14/14] iommu: Move fwspec->iommu_priv to struct dev_iommu Joerg Roedel
@ 2020-03-03 19:16 ` Will Deacon
2020-03-04 13:27 ` Joerg Roedel
2020-03-06 8:39 ` Hanjun Guo
15 siblings, 1 reply; 22+ messages in thread
From: Will Deacon @ 2020-03-03 19:16 UTC (permalink / raw)
To: Joerg Roedel
Cc: iommu, linux-kernel, linux-arm-msm, linux-mediatek,
virtualization, Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla,
Rob Clark, Sean Paul, Robin Murphy, Matthias Brugger,
Thierry Reding, Jean-Philippe Brucker, Andy Gross,
Bjorn Andersson
Hi Joerg,
On Fri, Feb 28, 2020 at 04:08:06PM +0100, Joerg Roedel wrote:
> here is a patch-set to rename iommu_param to dev_iommu and
> establish it as a struct for generic per-device iommu-data.
> Also move the iommu_fwspec pointer from struct device into
> dev_iommu to have less iommu-related pointers in struct
> device.
>
> The bigger part of this patch-set moves the iommu_priv
> pointer from struct iommu_fwspec to dev_iommu, making is
> usable for iommu-drivers which do not use fwspecs.
>
> The changes for that were mostly straightforward, except for
> the arm-smmu (_not_ arm-smmu-v3) and the qcom iommu driver.
> Unfortunatly I don't have the hardware for those, so any
> testing of these drivers is greatly appreciated.
I haven't had a chance to review this properly yet, but I did take it
for a spin on my Seattle board with MMU-400 (arm-smmu) and it seems to
work the same as before, so:
Tested-by: Will Deacon <will@kernel.org> # arm-smmu
I'll try to review the patches soon.
Cheers,
Will
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device'
2020-03-03 19:16 ` [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Will Deacon
@ 2020-03-04 13:27 ` Joerg Roedel
0 siblings, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-03-04 13:27 UTC (permalink / raw)
To: Will Deacon
Cc: iommu, linux-kernel, linux-arm-msm, linux-mediatek,
virtualization, Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla,
Rob Clark, Sean Paul, Robin Murphy, Matthias Brugger,
Thierry Reding, Jean-Philippe Brucker, Andy Gross,
Bjorn Andersson
Hi Will,
On Tue, Mar 03, 2020 at 07:16:25PM +0000, Will Deacon wrote:
> I haven't had a chance to review this properly yet, but I did take it
> for a spin on my Seattle board with MMU-400 (arm-smmu) and it seems to
> work the same as before, so:
>
> Tested-by: Will Deacon <will@kernel.org> # arm-smmu
>
> I'll try to review the patches soon.
Thanks for testing it! I will send out a new version probably beginning
of next week (I am travelling this week) to fix the kbuild issue and
anything you might find.
Thanks,
Joerg
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device'
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
` (14 preceding siblings ...)
2020-03-03 19:16 ` [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Will Deacon
@ 2020-03-06 8:39 ` Hanjun Guo
2020-03-06 10:09 ` Jean-Philippe Brucker
15 siblings, 1 reply; 22+ messages in thread
From: Hanjun Guo @ 2020-03-06 8:39 UTC (permalink / raw)
To: Joerg Roedel, iommu
Cc: linux-kernel, linux-arm-msm, linux-mediatek, virtualization,
Lorenzo Pieralisi, Sudeep Holla, Rob Clark, Sean Paul,
Will Deacon, Robin Murphy, Matthias Brugger, Thierry Reding,
Jean-Philippe Brucker, Andy Gross, Bjorn Andersson, Linuxarm
Hi Joerg,
On 2020/2/28 23:08, Joerg Roedel wrote:
> Hi,
>
> here is a patch-set to rename iommu_param to dev_iommu and
> establish it as a struct for generic per-device iommu-data.
> Also move the iommu_fwspec pointer from struct device into
> dev_iommu to have less iommu-related pointers in struct
> device.
>
> The bigger part of this patch-set moves the iommu_priv
> pointer from struct iommu_fwspec to dev_iommu, making is
> usable for iommu-drivers which do not use fwspecs.
>
> The changes for that were mostly straightforward, except for
> the arm-smmu (_not_ arm-smmu-v3) and the qcom iommu driver.
> Unfortunatly I don't have the hardware for those, so any
> testing of these drivers is greatly appreciated.
I tested this patch set on Kunpeng 920 ARM64 server which
using smmu-v3 with ACPI booting, but triggered a NULL
pointer dereference and panic at boot:
[ 14.832752] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010
[ 14.851425] Mem abort info:
[ 14.858940] ESR = 0x96000004
[ 14.866519] EC = 0x25: DABT (current EL), IL = 32 bits
[ 14.876580] SET = 0, FnV = 0
[ 14.884412] EA = 0, S1PTW = 0
[ 14.892275] Data abort info:
[ 14.899802] ISV = 0, ISS = 0x00000004
[ 14.908141] CM = 0, WnR = 0
[ 14.915401] [0000000000000010] user address but active_mm is swapper
[ 14.926367] Internal error: Oops: 96000004 [#1] SMP
[ 14.935992] Modules linked in:
[ 14.943724] CPU: 36 PID: 1 Comm: swapper/0 Not tainted 5.6.0-rc2+ #4
[ 14.955020] Hardware name: Huawei TaiShan 2280 V2/BC82AMDC, BIOS 0.81 07/10/2019
[ 14.972008] pstate: 80c00009 (Nzcv daif +PAN +UAO)
[ 14.981774] pc : iort_iommu_configure+0xdc/0x230
[ 14.991481] lr : iort_iommu_configure+0xcc/0x230
[ 15.001075] sp : ffff800011b3bad0
[ 15.009338] x29: ffff800011b3bad0 x28: ffff8000110a8968
[ 15.019483] x27: ffff800011540000 x26: ffff8000110004c8
[ 15.029390] x25: 0000000000000006 x24: 0000000000000000
[ 15.039336] x23: 0000000000000000 x22: 0000000000000000
[ 15.049270] x21: ffff8000113f9000 x20: ffff00002f5b0414
[ 15.059038] x19: ffff002fdc8f90b0 x18: ffffffffffffffff
[ 15.068590] x17: 0000000000000008 x16: 0000000000000005
[ 15.078182] x15: ffff8000113f9948 x14: ffff2027d993e91c
[ 15.087824] x13: ffff2027d993e16d x12: 0000000000000000
[ 15.097440] x11: 0101010101010101 x10: 00000000ffffff76
[ 15.106995] x9 : 0000000000000000 x8 : ffff2027d9a79b80
[ 15.116629] x7 : 0000000000000000 x6 : 000000000000003f
[ 15.126252] x5 : 0000000000000001 x4 : 0000000000000000
[ 15.135781] x3 : 0000000000000600 x2 : 0000000000000040
[ 15.145221] x1 : 0000000000000004 x0 : 0000000000000001
[ 15.154472] Call trace:
[ 15.160674] iort_iommu_configure+0xdc/0x230
[ 15.168752] acpi_dma_configure+0x88/0xb8
[ 15.176461] pci_dma_configure+0xc0/0xe0
[ 15.183935] really_probe+0xbc/0x498
[ 15.190853] driver_probe_device+0x12c/0x148
[ 15.198426] device_driver_attach+0x74/0x98
[ 15.205860] __driver_attach+0xc4/0x178
[ 15.213045] bus_for_each_dev+0x84/0xd8
[ 15.220185] driver_attach+0x30/0x40
[ 15.227051] bus_add_driver+0x170/0x258
[ 15.234241] driver_register+0x64/0x118
[ 15.241432] __pci_register_driver+0x58/0x68
[ 15.249202] hibmc_pci_driver_init+0x28/0x30
[ 15.256966] do_one_initcall+0x54/0x250
[ 15.264301] kernel_init_freeable+0x24c/0x2e0
[ 15.272164] kernel_init+0x18/0x110
[ 15.279068] ret_from_fork+0x10/0x18
[ 15.286033] Code: 2a0003f6 35000840 b9401a80 360005a0 (b94012e0)
[ 15.295791] ---[ end trace 881fe61747538fd0 ]---
[ 15.304039] Kernel panic - not syncing: Fatal exception
I don't have a time slot to do the detail investigation, but seems
that we don't have the iommu_fwspec properly initialized with ACPI
booting after applying this patch set.
Thanks
Hanjun
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device'
2020-03-06 8:39 ` Hanjun Guo
@ 2020-03-06 10:09 ` Jean-Philippe Brucker
2020-03-06 11:04 ` Hanjun Guo
2020-03-09 16:32 ` Joerg Roedel
0 siblings, 2 replies; 22+ messages in thread
From: Jean-Philippe Brucker @ 2020-03-06 10:09 UTC (permalink / raw)
To: Hanjun Guo
Cc: Joerg Roedel, iommu, linux-kernel, linux-arm-msm, linux-mediatek,
virtualization, Lorenzo Pieralisi, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Matthias Brugger,
Thierry Reding, Andy Gross, Bjorn Andersson, Linuxarm
On Fri, Mar 06, 2020 at 04:39:37PM +0800, Hanjun Guo wrote:
> Hi Joerg,
>
> On 2020/2/28 23:08, Joerg Roedel wrote:
> > Hi,
> >
> > here is a patch-set to rename iommu_param to dev_iommu and
> > establish it as a struct for generic per-device iommu-data.
> > Also move the iommu_fwspec pointer from struct device into
> > dev_iommu to have less iommu-related pointers in struct
> > device.
> >
> > The bigger part of this patch-set moves the iommu_priv
> > pointer from struct iommu_fwspec to dev_iommu, making is
> > usable for iommu-drivers which do not use fwspecs.
> >
> > The changes for that were mostly straightforward, except for
> > the arm-smmu (_not_ arm-smmu-v3) and the qcom iommu driver.
> > Unfortunatly I don't have the hardware for those, so any
> > testing of these drivers is greatly appreciated.
>
> I tested this patch set on Kunpeng 920 ARM64 server which
> using smmu-v3 with ACPI booting, but triggered a NULL
> pointer dereference and panic at boot:
I think that's because patch 01/14 move the fwspec access too early. In
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;
the iommu_fwspec is only valid if iort_pci_iommu_init() initialized it
successfully, if err == 0. The following might fix it:
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index 0e981d7f3c7d..7d04424189df 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -1015,7 +1015,7 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev)
return ops;
if (dev_is_pci(dev)) {
- struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
+ struct iommu_fwspec *fwspec;
struct pci_bus *bus = to_pci_dev(dev)->bus;
struct iort_pci_alias_info info = { .dev = dev };
@@ -1028,7 +1028,8 @@ 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))
+ 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;
Note that this use of iommu_fwspec will be removed by the ATS cleanup
series [1], but this change should work as a temporary fix.
Thanks,
Jean
[1] https://lore.kernel.org/linux-iommu/20200213165049.508908-10-jean-philippe@linaro.org/
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device'
2020-03-06 10:09 ` Jean-Philippe Brucker
@ 2020-03-06 11:04 ` Hanjun Guo
2020-03-09 16:32 ` Joerg Roedel
1 sibling, 0 replies; 22+ messages in thread
From: Hanjun Guo @ 2020-03-06 11:04 UTC (permalink / raw)
To: Jean-Philippe Brucker
Cc: Joerg Roedel, iommu, linux-kernel, linux-arm-msm, linux-mediatek,
virtualization, Lorenzo Pieralisi, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Matthias Brugger,
Thierry Reding, Andy Gross, Bjorn Andersson, Linuxarm
On 2020/3/6 18:09, Jean-Philippe Brucker wrote:
> On Fri, Mar 06, 2020 at 04:39:37PM +0800, Hanjun Guo wrote:
>> Hi Joerg,
>>
>> On 2020/2/28 23:08, Joerg Roedel wrote:
>>> Hi,
>>>
>>> here is a patch-set to rename iommu_param to dev_iommu and
>>> establish it as a struct for generic per-device iommu-data.
>>> Also move the iommu_fwspec pointer from struct device into
>>> dev_iommu to have less iommu-related pointers in struct
>>> device.
>>>
>>> The bigger part of this patch-set moves the iommu_priv
>>> pointer from struct iommu_fwspec to dev_iommu, making is
>>> usable for iommu-drivers which do not use fwspecs.
>>>
>>> The changes for that were mostly straightforward, except for
>>> the arm-smmu (_not_ arm-smmu-v3) and the qcom iommu driver.
>>> Unfortunatly I don't have the hardware for those, so any
>>> testing of these drivers is greatly appreciated.
>>
>> I tested this patch set on Kunpeng 920 ARM64 server which
>> using smmu-v3 with ACPI booting, but triggered a NULL
>> pointer dereference and panic at boot:
>
> I think that's because patch 01/14 move the fwspec access too early. In
>
> 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;
>
> the iommu_fwspec is only valid if iort_pci_iommu_init() initialized it
> successfully, if err == 0. The following might fix it:
Good catch :)
>
> diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
> index 0e981d7f3c7d..7d04424189df 100644
> --- a/drivers/acpi/arm64/iort.c
> +++ b/drivers/acpi/arm64/iort.c
> @@ -1015,7 +1015,7 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev)
> return ops;
>
> if (dev_is_pci(dev)) {
> - struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
> + struct iommu_fwspec *fwspec;
> struct pci_bus *bus = to_pci_dev(dev)->bus;
> struct iort_pci_alias_info info = { .dev = dev };
>
> @@ -1028,7 +1028,8 @@ 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))
> + 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;
And the panic disappeared. Joerg, please feel free to add my Tested-by
for smmu-v3 and IORT ACPI patches with above changes.
>
>
> Note that this use of iommu_fwspec will be removed by the ATS cleanup
> series [1], but this change should work as a temporary fix.
Yes, as your patch set will set the ats_supported flag in the
host bridge level, not per device, nice cleanup.
Thanks
Hanjun
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device'
2020-03-06 10:09 ` Jean-Philippe Brucker
2020-03-06 11:04 ` Hanjun Guo
@ 2020-03-09 16:32 ` Joerg Roedel
1 sibling, 0 replies; 22+ messages in thread
From: Joerg Roedel @ 2020-03-09 16:32 UTC (permalink / raw)
To: Jean-Philippe Brucker
Cc: Hanjun Guo, iommu, linux-kernel, linux-arm-msm, linux-mediatek,
virtualization, Lorenzo Pieralisi, Sudeep Holla, Rob Clark,
Sean Paul, Will Deacon, Robin Murphy, Matthias Brugger,
Thierry Reding, Andy Gross, Bjorn Andersson, Linuxarm
Hi Jean-Philippe,
On Fri, Mar 06, 2020 at 11:09:55AM +0100, Jean-Philippe Brucker wrote:
> I think that's because patch 01/14 move the fwspec access too early. In
>
> 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;
>
> the iommu_fwspec is only valid if iort_pci_iommu_init() initialized it
> successfully, if err == 0. The following might fix it:
>
> diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
> index 0e981d7f3c7d..7d04424189df 100644
> --- a/drivers/acpi/arm64/iort.c
> +++ b/drivers/acpi/arm64/iort.c
> @@ -1015,7 +1015,7 @@ const struct iommu_ops *iort_iommu_configure(struct device *dev)
> return ops;
>
> if (dev_is_pci(dev)) {
> - struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
> + struct iommu_fwspec *fwspec;
> struct pci_bus *bus = to_pci_dev(dev)->bus;
> struct iort_pci_alias_info info = { .dev = dev };
>
> @@ -1028,7 +1028,8 @@ 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))
> + 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;
Thanks a lot for the fix! I added it to patch 1/14.
Regards,
Joerg
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2020-03-09 16:32 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-28 15:08 [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Joerg Roedel
2020-02-28 15:08 ` [PATCH 01/14] ACPI/IORT: Remove direct access of dev->iommu_fwspec Joerg Roedel
2020-02-28 15:08 ` [PATCH 02/14] drm/msm/mdp5: " Joerg Roedel
2020-02-29 3:04 ` kbuild test robot
2020-02-28 15:08 ` [PATCH 03/14] iommu/tegra-gart: " Joerg Roedel
2020-02-28 15:08 ` [PATCH 04/14] iommu/arm-smmu: Fix uninitilized variable warning Joerg Roedel
2020-02-28 15:08 ` [PATCH 05/14] iommu: Rename struct iommu_param to dev_iommu Joerg Roedel
2020-02-28 15:08 ` [PATCH 06/14] iommu: Move iommu_fwspec to struct dev_iommu Joerg Roedel
2020-02-28 15:08 ` [PATCH 07/14] iommu: Introduce accessors for iommu private data Joerg Roedel
2020-02-28 15:08 ` [PATCH 08/14] iommu/arm-smmu-v3: Use accessor functions " Joerg Roedel
2020-02-28 15:08 ` [PATCH 09/14] iommu/arm-smmu: " Joerg Roedel
2020-02-28 15:08 ` [PATCH 10/14] iommu/renesas: " Joerg Roedel
2020-02-28 15:08 ` [PATCH 11/14] iommu/mediatek: " Joerg Roedel
2020-02-28 15:08 ` [PATCH 12/14] iommu/qcom: " Joerg Roedel
2020-02-28 15:08 ` [PATCH 13/14] iommu/virtio: " Joerg Roedel
2020-02-28 15:08 ` [PATCH 14/14] iommu: Move fwspec->iommu_priv to struct dev_iommu Joerg Roedel
2020-03-03 19:16 ` [PATCH 00/14] iommu: Move iommu_fwspec out of 'struct device' Will Deacon
2020-03-04 13:27 ` Joerg Roedel
2020-03-06 8:39 ` Hanjun Guo
2020-03-06 10:09 ` Jean-Philippe Brucker
2020-03-06 11:04 ` Hanjun Guo
2020-03-09 16:32 ` Joerg Roedel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).