lkml.org 
[lkml]   [2018]   [Apr]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.15 033/189] iommu/exynos: Don't unconditionally steal bus ops
    Date
    From: Robin Murphy <robin.murphy@arm.com>

    [ Upstream commit dc98b8480d8a68c2ce9aa28b9f0d714fd258bc0b ]

    Removing the early device registration hook overlooked the fact that
    it only ran conditionally on a compatible device being present in the
    DT. With exynos_iommu_init() now running as an unconditional initcall,
    problems arise on non-Exynos systems when other IOMMU drivers find
    themselves unable to install their ops on the platform bus, or at worst
    the Exynos ops get called with someone else's domain and all hell breaks
    loose.

    The global ops/cache setup could probably all now be triggered from the
    first IOMMU probe, as with dma_dev assigment, but for the time being the
    simplest fix is to resurrect the logic from commit a7b67cd5d9af
    ("iommu/exynos: Play nice in multi-platform builds") to explicitly check
    the DT for the presence of an Exynos IOMMU before trying anything.

    Fixes: 928055a01b3f ("iommu/exynos: Remove custom platform device registration code")
    Signed-off-by: Robin Murphy <robin.murphy@arm.com>
    Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    drivers/iommu/exynos-iommu.c | 7 +++++++
    1 file changed, 7 insertions(+)

    diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c
    index 79c45650f8de..736d4552d96f 100644
    --- a/drivers/iommu/exynos-iommu.c
    +++ b/drivers/iommu/exynos-iommu.c
    @@ -1353,8 +1353,15 @@ static const struct iommu_ops exynos_iommu_ops = {

    static int __init exynos_iommu_init(void)
    {
    + struct device_node *np;
    int ret;

    + np = of_find_matching_node(NULL, sysmmu_of_match);
    + if (!np)
    + return 0;
    +
    + of_node_put(np);
    +
    lv2table_kmem_cache = kmem_cache_create("exynos-iommu-lv2table",
    LV2TABLE_SIZE, LV2TABLE_SIZE, 0, NULL);
    if (!lv2table_kmem_cache) {
    --
    2.15.1
    \
     
     \ /
      Last update: 2018-04-09 06:07    [W:2.070 / U:1.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site