Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp505071pxb; Thu, 23 Sep 2021 05:06:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz+iqJGT5PPfctp4rias69xmCb/U4Ed9labn9hvZ6gUsSpmTOC8uiXaeHVpdIDr1L4Fg37+ X-Received: by 2002:a50:f197:: with SMTP id x23mr5076780edl.222.1632398812627; Thu, 23 Sep 2021 05:06:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632398812; cv=none; d=google.com; s=arc-20160816; b=jWhuk9z3juHc0xm+mYrgMsOAj3xdvt7DvC4lIb++R1QHsRR0jHIeBXwKe+DglX+fwS GSKKL2PgVBS0j9H7/0Qj7p5CMkUitClCCpLAixx3TvRHdugyt87XkwV/c95eSzegd5Fn eqqJEi0rM/nv9dIKvAl3arwMxDqX+l3nNVn/vHKZ4HMEBx+I1RHTpudmy+9dhMG7AbH9 HYL/LwVe9PLah1jzBqgwFb9PSmm8kKGOuYJP/OwbZcqhl5LUuoKo5kkRMQbP0ZCqfCfD B+UdHbTpxX9A9TaeN45Z/emGhI3NgKSRNyp7ugpG57ldEDdUIHbvfPBVaQ4WjriwbpKT dorg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from; bh=hNLC8xXRVxOLgrw6w4El/jjUCqRQHLkNwdnspUBJJjc=; b=wCoL3byi5wxNFfmZjT02cJx7a8DQVxxtaAlLIeXmi8/2UUsDcWnNL3cqWN+tsXRAaH AAEiysPy5csfOqyztIWXgn8AnsuhLz+o09Svs5wJW0Gc45yBwYB4H5l8mg75k72pW4KB TcDvNBIUhyelpsD8HD89kmOo9KAGm1ObHX+ee4HK4LIxL8O1DMtaOvHw+fZQNw1YvhbZ OaLLFdUsZk27rwapDUGOy2XlDh2XJp39DAzQpbDRdc9yfhsMzcacvoCtvUS5PJxHr+zJ r7V/Cppka/J6lVP/BV8ACUXDukY8p89BVeFoxaVo1e7lT3Z3g+QngQIGCHmu0U+R6WC9 VGfw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mediatek.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g5si5730367edl.569.2021.09.23.05.06.27; Thu, 23 Sep 2021 05:06:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240939AbhIWMEQ (ORCPT + 99 others); Thu, 23 Sep 2021 08:04:16 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:53974 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S240886AbhIWMEG (ORCPT ); Thu, 23 Sep 2021 08:04:06 -0400 X-UUID: 268fe6756faf4885b84abd2d1afd736f-20210923 X-UUID: 268fe6756faf4885b84abd2d1afd736f-20210923 Received: from mtkcas07.mediatek.inc [(172.21.101.84)] by mailgw02.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 157916079; Thu, 23 Sep 2021 20:02:32 +0800 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by mtkmbs07n1.mediatek.inc (172.21.101.16) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Thu, 23 Sep 2021 20:02:30 +0800 Received: from localhost.localdomain (10.17.3.154) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Thu, 23 Sep 2021 20:02:30 +0800 From: Yong Wu To: Joerg Roedel , Rob Herring , Matthias Brugger , Will Deacon , Robin Murphy CC: Krzysztof Kozlowski , Tomasz Figa , , , , , , , Hsin-Yi Wang , , , , , Subject: [PATCH v3 22/33] iommu/mediatek: Add PCIe support Date: Thu, 23 Sep 2021 19:58:29 +0800 Message-ID: <20210923115840.17813-23-yong.wu@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20210923115840.17813-1-yong.wu@mediatek.com> References: <20210923115840.17813-1-yong.wu@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently the code for of_iommu_configure_dev_id is like this: static int of_iommu_configure_dev_id(struct device_node *master_np, struct device *dev, const u32 *id) { struct of_phandle_args iommu_spec = { .args_count = 1 }; err = of_map_id(master_np, *id, "iommu-map", "iommu-map-mask", &iommu_spec.np, iommu_spec.args); ... } It supports only one id output. BUT our PCIe HW has two ID(one is for writing, the other is for reading). I'm not sure if we should change of_map_id to support output MAX_PHANDLE_ARGS. Here add the solution in ourselve drivers. If it's pcie case, enable one more bit. Not all infra iommu support PCIe, thus add a PCIe support flag here. Signed-off-by: Yong Wu --- drivers/iommu/mtk_iommu.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c index 37d6dfb4feab..3f1fd8036345 100644 --- a/drivers/iommu/mtk_iommu.c +++ b/drivers/iommu/mtk_iommu.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -132,6 +133,7 @@ #define MTK_IOMMU_TYPE_MM (0x0 << 13) #define MTK_IOMMU_TYPE_INFRA (0x1 << 13) #define MTK_IOMMU_TYPE_MASK (0x3 << 13) +#define IFA_IOMMU_PCIe_SUPPORT BIT(15) #define MTK_IOMMU_HAS_FLAG(pdata, _x) (!!(((pdata)->flags) & (_x))) @@ -401,8 +403,11 @@ static int mtk_iommu_config(struct mtk_iommu_data *data, struct device *dev, larb_mmu->mmu &= ~MTK_SMI_MMU_EN(portid); } else if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_INFRA)) { peri_mmuen_msk = BIT(portid); - peri_mmuen = enable ? peri_mmuen_msk : 0; + /* PCIdev has only one output id, enable the next writing bit for PCIe */ + if (dev_is_pci(dev)) + peri_mmuen_msk |= BIT(portid + 1); + peri_mmuen = enable ? peri_mmuen_msk : 0; ret = regmap_update_bits(data->pericfg, PERICFG_IOMMU_1, peri_mmuen_msk, peri_mmuen); if (ret) @@ -977,6 +982,15 @@ static int mtk_iommu_probe(struct platform_device *pdev) ret = component_master_add_with_match(dev, &mtk_iommu_com_ops, match); if (ret) goto out_bus_set_null; + } else if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_INFRA) && + MTK_IOMMU_HAS_FLAG(data->plat_data, IFA_IOMMU_PCIe_SUPPORT)) { + #ifdef CONFIG_PCI + if (!iommu_present(&pci_bus_type)) { + ret = bus_set_iommu(&pci_bus_type, &mtk_iommu_ops); + if (ret) /* PCIe fail don't affect platform_bus. */ + goto out_list_del; + } + #endif } return ret; @@ -1007,6 +1021,11 @@ static int mtk_iommu_remove(struct platform_device *pdev) if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_MM)) { device_link_remove(data->smicomm_dev, &pdev->dev); component_master_del(&pdev->dev, &mtk_iommu_com_ops); + } else if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_INFRA) && + MTK_IOMMU_HAS_FLAG(data->plat_data, IFA_IOMMU_PCIe_SUPPORT)) { + #ifdef CONFIG_PCI + bus_set_iommu(&pci_bus_type, NULL); + #endif } pm_runtime_disable(&pdev->dev); devm_free_irq(&pdev->dev, data->irq, data); -- 2.18.0