From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 03CEEC79FB7 for ; Wed, 9 Sep 2026 14:14:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Reply-To:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To: References:Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version: Subject:Date:From:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=P7aLdzSztXk8d1tscwaKKy8S5ER0yzOYoze2MjbQGHY=; b=DsXvX9+v0apJ82X+x7AWwcaxdv w1pzZyRBfExWfXpbMpSp6H9ODX5TwQ/atybwFg5lVbX9xeGMQ+x6hvasq5lapxCpx6IeT3I58pu6U Hcy822Do61ymeB1/TLjy8/mshdgTTvbUYXnWNmObW/LSHd33vV31UURsW3b7vFSINm1tgAMP4gb5+ Pi+JruEDgYEx49FY4P/nOTf4HuhS03jZ4Nrbbqq4Azt+n/uS3he3UT+Ht7Uyus5nLVMZoY90+kNfi Xh6Lgm1RujeK/niDsOUw/rfXycDVJ9Z4qdKm4dTjvziEiu0YeuZrv2jPGUiaEk/oxFNessOkS/XWP LWadZxRQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1x4J4D-0000000BvSE-0kDB; Wed, 09 Sep 2026 14:14:25 +0000 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1x4J4B-0000000BvR2-42R7; Wed, 09 Sep 2026 14:14:24 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 848BE43D45; Wed, 9 Sep 2026 14:14:23 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPS id 5972FC2BCFD; Wed, 9 Sep 2026 14:14:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788963263; bh=UOy3RLR6CRtSVXcPk+TROu7qwHZMTjKJX4eKolUbKy4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=I+Lu6d82/7QlPdwrhPDbCxAqzJLyBcigs7FETHX0rrfU1Hc9ygphTie2bYSeHzR4F JruipS5QFwBnpU4OQaCEVUzhY3G3xc9hRWrWQRQyQbRYDC3RdIr0lfZ76CvR1f/J0v Rx4nk6y3hlx09A4iDCCWQ6sITp8Bnt6c5F+03TEyo2CPhN/S7CrW93DMCkEkfNCpp3 KDzvQJ9Gda47QbxXZvMCM1tEWDTbwLldOmyM2glf0sMem0uuPGctNmPiICQWvITV9N MjZXTb89gE40w3ie0NxuLwPAWl3yL5MeIJyc0FutyUNEEZtoe49jPMWizU0Rq0BE7N uvsY84yW73How== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3C6CCC88E40; Wed, 9 Sep 2026 14:14:23 +0000 (UTC) From: Roman Vivchar via B4 Relay Date: Wed, 09 Sep 2026 17:14:06 +0300 Subject: [PATCH 2/3] iommu/mediatek-v1: fix IOMMU device binding MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260909-6572-iommu-v1-2-de261da09fb2@protonmail.com> References: <20260909-6572-iommu-v1-0-de261da09fb2@protonmail.com> In-Reply-To: <20260909-6572-iommu-v1-0-de261da09fb2@protonmail.com> To: Yong Wu , "Joerg Roedel (AMD)" , Will Deacon , Robin Murphy , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: iommu@lists.linux.dev, linux-mediatek@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Roman Vivchar , stable@vger.kernel.org X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788963261; l=4888; i=rva333@protonmail.com; s=20260510; h=from:subject:message-id; bh=EcGIcOox9foAPPSzCZAPzZ4As2FunuolmFilHRQ5qcg=; b=soNtO8zKf8oyMiaDfTmWSrvH5R6+Rzyfb/MHjpHC1PLcyTcvCY4+RsyYiRV/GmHNQ5XuEQcZL 2eh4Z8weCS2AwlTxK5SzzdxX4aW+pOYoocewtcaUIK+KIP3UxUMNLTs X-Developer-Key: i=rva333@protonmail.com; a=ed25519; pk=zww/nWjBGoQ4POXCG0BV6fx2iuXK6jx77rsKPA5YK5Y= X-Endpoint-Received: by B4 Relay for rva333@protonmail.com/20260510 with auth_id=777 X-Original-From: Roman Vivchar X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: rva333@protonmail.com Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Roman Vivchar Currently the driver silently fails to bind devices and DRM subsystem (which is the primary IOMMU user on MediaTek SoCs) falls back to PA mode. Fix this by providing of_xlate callback, which lets the driver actually bind devices and use VA mode. The fix can be verified by reading overlay engine input address. Before: ~ # devmem 0x14007040 32 0xBB900000 After: ~ # devmem 0x14007040 32 0x00000000 Fixes: b17336c55d89 ("iommu/mediatek: add support for mtk iommu generation one HW") Cc: stable@vger.kernel.org Signed-off-by: Roman Vivchar --- Untested on mt2701. --- drivers/iommu/mtk_iommu_v1.c | 86 ++++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 47 deletions(-) diff --git a/drivers/iommu/mtk_iommu_v1.c b/drivers/iommu/mtk_iommu_v1.c index ac97dd2868d4..72355f41c36a 100644 --- a/drivers/iommu/mtk_iommu_v1.c +++ b/drivers/iommu/mtk_iommu_v1.c @@ -413,38 +413,10 @@ static const struct iommu_ops mtk_iommu_v1_ops; * MTK generation one iommu HW only support one iommu domain, and all the client * sharing the same iova address space. */ -static int mtk_iommu_v1_create_mapping(struct device *dev, - const struct of_phandle_args *args) +static int mtk_iommu_v1_create_mapping(struct device *dev) { struct mtk_iommu_v1_data *data; - struct platform_device *m4updev; struct dma_iommu_mapping *mtk_mapping; - int ret; - - if (args->args_count != 1) { - dev_err(dev, "invalid #iommu-cells(%d) property for IOMMU\n", - args->args_count); - return -EINVAL; - } - - ret = iommu_fwspec_init(dev, of_fwnode_handle(args->np)); - if (ret) - return ret; - - if (!dev_iommu_priv_get(dev)) { - /* Get the m4u device */ - m4updev = of_find_device_by_node(args->np); - if (WARN_ON(!m4updev)) - return -EINVAL; - - dev_iommu_priv_set(dev, platform_get_drvdata(m4updev)); - - put_device(&m4updev->dev); - } - - ret = iommu_fwspec_add_ids(dev, args->args, 1); - if (ret) - return ret; data = dev_iommu_priv_get(dev); mtk_mapping = data->mapping; @@ -462,27 +434,12 @@ static int mtk_iommu_v1_create_mapping(struct device *dev, static struct iommu_device *mtk_iommu_v1_probe_device(struct device *dev) { - struct iommu_fwspec *fwspec = NULL; - struct of_phandle_args iommu_spec; + struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); struct mtk_iommu_v1_data *data; - int err, idx = 0, larbid, larbidx; + int idx, larbid, larbidx; struct device_link *link; struct device *larbdev; - while (!of_parse_phandle_with_args(dev->of_node, "iommus", - "#iommu-cells", - idx, &iommu_spec)) { - - err = mtk_iommu_v1_create_mapping(dev, &iommu_spec); - of_node_put(iommu_spec.np); - if (err) - return ERR_PTR(err); - - /* dev->iommu_fwspec might have changed */ - fwspec = dev_iommu_fwspec_get(dev); - idx++; - } - if (!fwspec) return ERR_PTR(-ENODEV); @@ -519,9 +476,15 @@ static void mtk_iommu_v1_probe_finalize(struct device *dev) __maybe_unused struct mtk_iommu_v1_data *data = dev_iommu_priv_get(dev); int err; + err = mtk_iommu_v1_create_mapping(dev); + if (err) { + dev_err(dev, "Can't create IOMMU mapping - DMA-OPS will not work\n"); + return; + } + err = arm_iommu_attach_device(dev, data->mapping); if (err) - dev_err(dev, "Can't create IOMMU mapping - DMA-OPS will not work\n"); + dev_err(dev, "Can't attach to IOMMU mapping - DMA-OPS will not work\n"); } static void mtk_iommu_v1_release_device(struct device *dev) @@ -537,6 +500,34 @@ static void mtk_iommu_v1_release_device(struct device *dev) device_link_remove(dev, larbdev); } +static int mtk_iommu_v1_of_xlate(struct device *dev, + const struct of_phandle_args *args) +{ + struct platform_device *m4updev; + int ret; + + if (args->args_count != 1) { + dev_err(dev, "invalid #iommu-cells(%d) property for IOMMU\n", + args->args_count); + return -EINVAL; + } + + ret = iommu_fwspec_init(dev, of_fwnode_handle(args->np)); + if (ret) + return ret; + + if (!dev_iommu_priv_get(dev)) { + m4updev = of_find_device_by_node(args->np); + if (WARN_ON(!m4updev)) + return -EINVAL; + + dev_iommu_priv_set(dev, platform_get_drvdata(m4updev)); + put_device(&m4updev->dev); + } + + return iommu_fwspec_add_ids(dev, args->args, 1); +} + static int mtk_iommu_v1_hw_init(const struct mtk_iommu_v1_data *data) { u32 regval; @@ -585,6 +576,7 @@ static const struct iommu_ops mtk_iommu_v1_ops = { .probe_finalize = mtk_iommu_v1_probe_finalize, .release_device = mtk_iommu_v1_release_device, .device_group = generic_device_group, + .of_xlate = mtk_iommu_v1_of_xlate, .owner = THIS_MODULE, .default_domain_ops = &(const struct iommu_domain_ops) { .attach_dev = mtk_iommu_v1_attach_device, -- 2.55.0