Skip to content

Commit

Permalink
iommu/mediatek: Add error path for loop of mm_dts_parse
Browse files Browse the repository at this point in the history
[ Upstream commit 2659392 ]

The mtk_iommu_mm_dts_parse will parse the smi larbs nodes. if the i+1
larb is parsed fail, we should put_device for the i..0 larbs.

There are two places need to comment:
1) The larbid may be not linear mapping, we should loop whole
   the array in the error path.
2) I move this line position: "data->larb_imu[id].dev = &plarbdev->dev;"
   before "if (!plarbdev->dev.driver)", That means set
   data->larb_imu[id].dev before the error path. then we don't need
   "platform_device_put(plarbdev)" again in probe_defer case. All depend
   on "put_device" of the error path in error cases.

Fixes: d2e9a11 ("iommu/mediatek: Contain MM IOMMU flow with the MM TYPE")
Signed-off-by: Yong Wu <yong.wu@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
Link: https://lore.kernel.org/r/20221018024258.19073-4-yong.wu@mediatek.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
YongWu-HF authored and gregkh committed Dec 31, 2022
1 parent 21f56af commit 8412e5d
Showing 1 changed file with 20 additions and 7 deletions.
27 changes: 20 additions & 7 deletions drivers/iommu/mtk_iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1056,8 +1056,10 @@ static int mtk_iommu_mm_dts_parse(struct device *dev, struct component_match **m
u32 id;

larbnode = of_parse_phandle(dev->of_node, "mediatek,larbs", i);
if (!larbnode)
return -EINVAL;
if (!larbnode) {
ret = -EINVAL;
goto err_larbdev_put;
}

if (!of_device_is_available(larbnode)) {
of_node_put(larbnode);
Expand All @@ -1070,14 +1072,16 @@ static int mtk_iommu_mm_dts_parse(struct device *dev, struct component_match **m

plarbdev = of_find_device_by_node(larbnode);
of_node_put(larbnode);
if (!plarbdev)
return -ENODEV;
if (!plarbdev) {
ret = -ENODEV;
goto err_larbdev_put;
}
data->larb_imu[id].dev = &plarbdev->dev;

if (!plarbdev->dev.driver) {
platform_device_put(plarbdev);
return -EPROBE_DEFER;
ret = -EPROBE_DEFER;
goto err_larbdev_put;
}
data->larb_imu[id].dev = &plarbdev->dev;

component_match_add(dev, match, component_compare_dev, &plarbdev->dev);
platform_device_put(plarbdev);
Expand Down Expand Up @@ -1112,6 +1116,15 @@ static int mtk_iommu_mm_dts_parse(struct device *dev, struct component_match **m
return -EINVAL;
}
return 0;

err_larbdev_put:
/* id may be not linear mapping, loop whole the array */
for (i = MTK_LARB_NR_MAX - 1; i >= 0; i++) {
if (!data->larb_imu[i].dev)
continue;
put_device(data->larb_imu[i].dev);
}
return ret;
}

static int mtk_iommu_probe(struct platform_device *pdev)
Expand Down

0 comments on commit 8412e5d

Please sign in to comment.