]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iommu/rockchip: Allocate per-device data sensibly
authorRobin Murphy <robin.murphy@arm.com>
Thu, 13 Mar 2025 17:31:04 +0000 (17:31 +0000)
committerJoerg Roedel <jroedel@suse.de>
Thu, 20 Mar 2025 07:58:22 +0000 (08:58 +0100)
Now that DT-based probing is finally happening in the right order again,
it reveals an issue in Rockchip's of_xlate, which can now be called
during registration, but is using the global dma_dev which is only
assigned later. However, this makes little sense when we're already
looking up the correct IOMMU device, who should logically be the owner
of the devm allocation anyway.

Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Tested-by: Anders Roxell <anders.roxell@linaro.org>
Fixes: bcb81ac6ae3c ("iommu: Get DT/ACPI parsing into the proper probe path")
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Tested-by: Quentin Schulz <quentin.schulz@cherry.de>
Tested-by: Dang Huynh <danct12@riseup.net>
Reviewed-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Tested-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Link: https://lore.kernel.org/r/771e91cf16b3048e93f657153b76905665878fa2.1741886382.git.robin.murphy@arm.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/rockchip-iommu.c

index 323cc665c35703baf38a2066674fe9147861ea89..48826d1ccfd85d3fbc3fb3edf4c041e028d566f1 100644 (file)
@@ -1148,12 +1148,12 @@ static int rk_iommu_of_xlate(struct device *dev,
        struct platform_device *iommu_dev;
        struct rk_iommudata *data;
 
-       data = devm_kzalloc(dma_dev, sizeof(*data), GFP_KERNEL);
+       iommu_dev = of_find_device_by_node(args->np);
+
+       data = devm_kzalloc(&iommu_dev->dev, sizeof(*data), GFP_KERNEL);
        if (!data)
                return -ENOMEM;
 
-       iommu_dev = of_find_device_by_node(args->np);
-
        data->iommu = platform_get_drvdata(iommu_dev);
        data->iommu->domain = &rk_identity_domain;
        dev_iommu_priv_set(dev, data);