iommu/mediatek: Convert M4Uv2 to iommu_fwspec
Subsystems (3)
Robin Murphy
reviewerPATCH 1/2 iommu/mediatek: Convert M4Uv2 to iommu_fwspec
Our per-device data consists of the M4U instance and firmware-provided list of LARB IDs, which is a perfect fit for the generic iommu_fwspec machinery. Use that directly as a simpler alternative to the custom archdata code.
---
These are fairly mechanical cleanups, so I'm pretty confident, but it still bears mentioning that they're only compile-tested as I don't have the relevant hardware.
Robin.
drivers/iommu/mtk_iommu.c | 75 ++++++++++++----------------------------------- 1 file changed, 18 insertions(+), 57 deletions(-)
drivers/iommu/mtk_iommu.c +18 -57
@@ -195,14 +195,14 @@ static irqreturn_t mtk_iommu_isr(int irq, void *dev_id)static void mtk_iommu_config (struct mtk_iommu_data *data,struct device *dev,bool enable) { -struct mtk_iommu_client_priv *head, *cur, *next;struct mtk_smi_larb_iommu *larb_mmu;unsigned int larbid, portid; +struct iommu_fwspec *fwspec = dev->iommu_fwspec; +int i; - head = dev->archdata.iommu; -list_for_each_entry_safe (cur, next, &head->client, client) { - larbid =MTK_M4U_TO_LARB (cur->mtk_m4u_id); - portid =MTK_M4U_TO_PORT (cur->mtk_m4u_id); +for (i =0 ; i < fwspec->num_ids; ++i) { + larbid =MTK_M4U_TO_LARB (fwspec->ids[i]); + portid =MTK_M4U_TO_PORT (fwspec->ids[i]); larb_mmu = &data->smi_imu.larb_imu[larbid]; dev_dbg(dev, "%s iommu port: %d\n",
@@ -282,14 +282,12 @@ static int mtk_iommu_attach_device(struct iommu_domain *domain, struct device *dev) {struct mtk_iommu_domain *dom =to_mtk_domain (domain); -struct mtk_iommu_client_priv *priv = dev->archdata.iommu; -struct mtk_iommu_data *data; +struct mtk_iommu_data *data = dev->iommu_fwspec->iommu_priv;int ret; -if (!priv) +if (!data)return -ENODEV ; - data =dev_get_drvdata (priv->m4udev);if (!data->m4u_dom) { data->m4u_dom = dom; ret =mtk_iommu_domain_finalise (data);
@@ -310,13 +308,11 @@ 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_client_priv *priv = dev->archdata.iommu; -struct mtk_iommu_data *data; +struct mtk_iommu_data *data = dev->iommu_fwspec->iommu_priv; -if (!priv) +if (!data)return ; - data =dev_get_drvdata (priv->m4udev);mtk_iommu_config (data, dev, false); }
@@ -366,8 +362,8 @@ static int mtk_iommu_add_device(struct device *dev) {struct iommu_group *group; -if (!dev->archdata.iommu)/* Not a iommu client device */ -return -ENODEV ; +if (!dev->iommu_fwspec || dev->iommu_fwspec->ops != &mtk_iommu_ops) +return -ENODEV ;/* Not a iommu client device */ group =iommu_group_get_for_dev (dev);if (IS_ERR (group))
@@ -379,33 +375,21 @@ static int mtk_iommu_add_device(struct device *dev)static void mtk_iommu_remove_device (struct device *dev) { -struct mtk_iommu_client_priv *head, *cur, *next; - - head = dev->archdata.iommu; -if (!head) +if (!dev->iommu_fwspec || dev->iommu_fwspec->ops != &mtk_iommu_ops)return ; -list_for_each_entry_safe (cur, next, &head->client, client) { -list_del (&cur->client); -kfree (cur); - } -kfree (head); - dev->archdata.iommu =NULL ; -iommu_group_remove_device (dev); +iommu_fwspec_free (dev); }static struct iommu_group *mtk_iommu_device_group (struct device *dev) { -struct mtk_iommu_data *data; -struct mtk_iommu_client_priv *priv; +struct mtk_iommu_data *data = dev->iommu_fwspec->iommu_priv; - priv = dev->archdata.iommu; -if (!priv) +if (!data)return ERR_PTR (-ENODEV );/* All the client devices are in the same m4u iommu-group */ - data =dev_get_drvdata (priv->m4udev);if (!data->m4u_group) { data->m4u_group =iommu_group_alloc ();if (IS_ERR (data->m4u_group))
@@ -416,7 +400,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 mtk_iommu_client_priv *head, *priv, *next;struct platform_device *m4updev;if (args->args_count !=1 ) {
@@ -425,38 +408,16 @@ static int mtk_iommu_of_xlate(struct device *dev, struct of_phandle_args *args)return -EINVAL ; } -if (!dev->archdata.iommu) { +if (!dev->iommu_fwspec->iommu_priv) {/* Get the m4u device */ m4updev =of_find_device_by_node (args->np);if (WARN_ON (!m4updev))return -EINVAL ; - head =kzalloc (sizeof (*head),GFP_KERNEL ); -if (!head) -return -ENOMEM ; - - dev->archdata.iommu = head; -INIT_LIST_HEAD (&head->client); - head->m4udev = &m4updev->dev; - }else { - head = dev->archdata.iommu; + dev->iommu_fwspec->iommu_priv =platform_get_drvdata (m4updev); } - priv =kzalloc (sizeof (*priv),GFP_KERNEL ); -if (!priv) - goto err_free_mem; - - priv->mtk_m4u_id = args->args[0 ]; -list_add_tail (&priv->client, &head->client); - -return 0 ; - -err_free_mem: -list_for_each_entry_safe (priv, next, &head->client, client) -kfree (priv); -kfree (head); - dev->archdata.iommu =NULL ; -return -ENOMEM ; +return iommu_fwspec_add_ids (dev, args->args,1 ); }static struct iommu_ops mtk_iommu_ops = {
Signature · 1 line
1.9.1
Robin Murphy
reviewerPATCH 2/2 iommu/mediatek: Convert M4Uv1 to iommu_fwspec
Our per-device data consists of the M4U instance and firmware-provided list of LARB IDs, which is a perfect fit for the generic iommu_fwspec machinery. Use that directly instead of the custom archdata code - while we can't rely on the of_xlate() mechanism to initialise things until the 32-bit ARM DMA code learns about groups and default domains, it still results in a reasonable simplification overall.
--- drivers/iommu/mtk_iommu.h | 6 --- drivers/iommu/mtk_iommu_v1.c | 95 +++++++++++++++++--------------------------- 2 files changed, 36 insertions(+), 65 deletions(-)
drivers/iommu/mtk_iommu.h +0 -6
@@ -34,12 +34,6 @@ struct mtk_iommu_suspend_reg {u32 int_main_control; }; -struct mtk_iommu_client_priv { -struct list_head client; -unsigned int mtk_m4u_id; -struct device *m4udev; -}; -struct mtk_iommu_domain ;struct mtk_iommu_data {
drivers/iommu/mtk_iommu_v1.c +36 -59
183 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH 2/2 iommu/mediatek: Convert M4Uv1 to iommu_fwspec
Quoted 9 lines · Robin Murphy
Our per-device data consists of the M4U instance and firmware-provided list of LARB IDs, which is a perfect fit for the generic
iommu_fwspecmachinery. Use that directly instead of the custom archdata code - while we can't rely on theof_xlate()mechanism to initialise things until the 32-bit ARM DMA code learns about groups and default domains, it still results in a reasonable simplification overall.CC Honghui Zhang <[email protected]>Signed-off-by Robin Murphy <[email protected]>
Thanks Robin.
Quoted 5 lines
--- drivers/iommu/mtk_iommu.h | 6 --- drivers/iommu/mtk_iommu_v1.c | 95 +++++++++++++++++--------------------------- 2 files changed, 36 insertions(+), 65 deletions(-)
Yong Wu
maintainerPATCH 1/2 iommu/mediatek: Convert M4Uv2 to iommu_fwspec
In reply to Robin MurphyQuoted 5 lines · Robin Murphy
Our per-device data consists of the M4U instance and firmware-provided list of LARB IDs, which is a perfect fit for the generic
iommu_fwspecmachinery. Use that directly as a simpler alternative to the custom archdata code.
Quoted 7 lines
CC Yong Wu <[email protected]>Signed-off-by Robin Murphy <[email protected]>---
These are fairly mechanical cleanups, so I'm pretty confident, but it still bears mentioning that they're only compile-tested as I don't have the relevant hardware.
Thanks for the improvement.
Quoted 6 lines
Robin.
drivers/iommu/mtk_iommu.c | 75 ++++++++++++----------------------------------- 1 file changed, 18 insertions(+), 57 deletions(-)
[...]
PATCH 1/2 iommu/mediatek: Convert M4Uv2 to iommu_fwspec
In reply to Robin MurphyQuoted 9 lines · Robin Murphy
Our per-device data consists of the M4U instance and firmware-provided list of LARB IDs, which is a perfect fit for the generic
iommu_fwspecmachinery. Use that directly as a simpler alternative to the custom archdata code.CC Yong Wu <[email protected]>Signed-off-by Robin Murphy <[email protected]>---
Quoted 8 lines
These are fairly mechanical cleanups, so I'm pretty confident, but it still bears mentioning that they're only compile-tested as I don't have the relevant hardware.
Robin.
drivers/iommu/mtk_iommu.c | 75 ++++++++++++----------------------------------- 1 file changed, 18 insertions(+), 57 deletions(-)
Applied both, thanks Robin.