Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp4903204pxv; Tue, 29 Jun 2021 19:39:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyTPhVljbHpnL/Zw4Xap7K/mnFTXK9iPdvOZfMvhUYEPmLhyZmGEseqcfK3Nm2GOkPknNgY X-Received: by 2002:a05:6e02:1a4d:: with SMTP id u13mr23413636ilv.42.1625020778689; Tue, 29 Jun 2021 19:39:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625020778; cv=none; d=google.com; s=arc-20160816; b=GjbxhuutI8mTxMsZzc2Ei0aFndxKITNJRhu4kZcajUNI9gjpPe5Vb3rguOBMtRSTqH yTJ1oPVDK5n9x49UdKQMQvDb6RdPr4pdHv0vQCCfX539j4E5a80mWL/o4XuHo07Wa5nU Q4DMqATx0VFUCnpJv6qrECto+YLjJp7yt5Dg4sDNTMzzVcwV9PERP2OTi9RncIERz9W2 QRlKypM8LGRanwas5ExgWPdEdPDY1JQ02418pJRqKE+jSvYUbED6IvXJyvYO/SkBgjSY 5p3fzW+jksLTKQ3f/0TyIUH3f/4fEuSwKjYE4b2XswWYMWP8eKo+OAB+BLt6K8bws/A0 TCcA== 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=mr2y7DWF9glDV4lN5fKF/fCIVqxJPBLZDxummHSZn/4=; b=j5uCUwDRUY9hMCTbtcRqwucEi61JhpplVOU7x6cUUWWsXX74hv+LmngUIWNvM7cCtJ jYOHaoCZAVYKn0CNhXN3wPGIy2I6HMxllODtbMjjyNT6CCpK/sZLi5MksLiuL1d8X/r3 f2Km768DyewWEIiHh/ojmPrFPEJY+lBu/AdbhM/2+avOpTC3X1iPiHBME1YBTuN0nzmi xG1ZPM9TjNoaLD64fSIEL4ZHTc+sGmJsL1/HWg1P4aaR3MrFVq6eNoI5rdqrbhjNJXXF laH13wE9tUgLzWRh7ulugR7ZyNbdoGUw43x0dChWqcewFHYTR5+Kf9TFCuW+27PEKMas u9Gg== 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 b7si14869060ile.135.2021.06.29.19.39.26; Tue, 29 Jun 2021 19:39:38 -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 S233271AbhF3Cjh (ORCPT + 99 others); Tue, 29 Jun 2021 22:39:37 -0400 Received: from mailgw01.mediatek.com ([60.244.123.138]:34636 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S232714AbhF3Cjg (ORCPT ); Tue, 29 Jun 2021 22:39:36 -0400 X-UUID: 8a78d9aad4b9452eb45683c590de4a46-20210630 X-UUID: 8a78d9aad4b9452eb45683c590de4a46-20210630 Received: from mtkcas06.mediatek.inc [(172.21.101.30)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 605778033; Wed, 30 Jun 2021 10:37:06 +0800 Received: from mtkcas11.mediatek.inc (172.21.101.40) by mtkmbs07n1.mediatek.inc (172.21.101.16) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 30 Jun 2021 10:37:05 +0800 Received: from localhost.localdomain (10.17.3.153) by mtkcas11.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 30 Jun 2021 10:37:03 +0800 From: Yong Wu To: Joerg Roedel , Rob Herring , Matthias Brugger , Will Deacon , Robin Murphy CC: Krzysztof Kozlowski , Evan Green , Tomasz Figa , Tomasz Figa , , , , , , , , , Nicolas Boichat , , Subject: [PATCH 13/24] iommu/mediatek: Add infra iommu support Date: Wed, 30 Jun 2021 10:34:53 +0800 Message-ID: <20210630023504.18177-14-yong.wu@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20210630023504.18177-1-yong.wu@mediatek.com> References: <20210630023504.18177-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 This patch adds infra iommu supports, the infra iommu enable bits in mt8195 is in the pericfg register segment. use regmap to update it. If infra iommu master translation fault, It don't have the larbid/portid, thus I print the whole register value output. Since regmap_update_bits may fail, add return value for mtk_iommu_config. Signed-off-by: Yong Wu --- drivers/iommu/mtk_iommu.c | 36 +++++++++++++++++++++++++++++------- drivers/iommu/mtk_iommu.h | 3 +++ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c index 365732309486..1b62896c6666 100644 --- a/drivers/iommu/mtk_iommu.c +++ b/drivers/iommu/mtk_iommu.c @@ -114,6 +114,8 @@ #define MTK_PROTECT_PA_ALIGN 256 +#define PERICFG_IOMMU_1 0x714 + #define HAS_4GB_MODE BIT(0) /* HW will use the EMI clock if there isn't the "bclk". */ #define HAS_BCLK BIT(1) @@ -322,8 +324,8 @@ static irqreturn_t mtk_iommu_isr(int irq, void *dev_id) write ? IOMMU_FAULT_WRITE : IOMMU_FAULT_READ)) { dev_err_ratelimited( data->dev, - "fault type=0x%x iova=0x%llx pa=0x%llx larb=%d port=%d layer=%d %s\n", - int_state, fault_iova, fault_pa, fault_larb, fault_port, + "fault type=0x%x iova=0x%llx pa=0x%llx master=0x%x(larb=%d port=%d) layer=%d %s\n", + int_state, fault_iova, fault_pa, regval, fault_larb, fault_port, layer, write ? "write" : "read"); } @@ -367,14 +369,15 @@ static int mtk_iommu_get_domain_id(struct device *dev, return -EINVAL; } -static void mtk_iommu_config(struct mtk_iommu_data *data, struct device *dev, - bool enable, unsigned int domid) +static int mtk_iommu_config(struct mtk_iommu_data *data, struct device *dev, + bool enable, unsigned int domid) { struct mtk_smi_larb_iommu *larb_mmu; unsigned int larbid, portid; struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); const struct mtk_iommu_iova_region *region; - int i; + u32 peri_mmuen, peri_mmuen_msk; + int i, ret = 0; for (i = 0; i < fwspec->num_ids; ++i) { larbid = MTK_M4U_TO_LARB(fwspec->ids[i]); @@ -394,8 +397,19 @@ static void mtk_iommu_config(struct mtk_iommu_data *data, struct device *dev, larb_mmu->mmu |= MTK_SMI_MMU_EN(portid); else 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; + + ret = regmap_update_bits(data->pericfg, PERICFG_IOMMU_1, + peri_mmuen_msk, peri_mmuen); + if (ret) + dev_err(dev, "%s iommu(%s) inframaster 0x%x fail(%d).\n", + enable ? "enable" : "disable", + dev_name(data->dev), peri_mmuen_msk, ret); } } + return ret; } static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom, @@ -512,8 +526,7 @@ static int mtk_iommu_attach_device(struct iommu_domain *domain, pm_runtime_put(m4udev); } - mtk_iommu_config(data, dev, true, domid); - return 0; + return mtk_iommu_config(data, dev, true, domid); } static void mtk_iommu_detach_device(struct iommu_domain *domain, @@ -924,6 +937,15 @@ static int mtk_iommu_probe(struct platform_device *pdev) ret = mtk_iommu_mm_dts_parse(dev, &match, data); if (ret) goto out_runtime_disable; + } else if (MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_INFRA) && + data->plat_data->pericfg_comp_str) { + infracfg = syscon_regmap_lookup_by_compatible(data->plat_data->pericfg_comp_str); + if (IS_ERR(infracfg)) { + ret = PTR_ERR(infracfg); + goto out_runtime_disable; + } + + data->pericfg = infracfg; } platform_set_drvdata(pdev, data); diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h index ce11e260d1d7..cdc241a51c2f 100644 --- a/drivers/iommu/mtk_iommu.h +++ b/drivers/iommu/mtk_iommu.h @@ -55,6 +55,7 @@ struct mtk_iommu_plat_data { u32 flags; u32 inv_sel_reg; + char *pericfg_comp_str; struct list_head *hw_list; unsigned int iova_region_nr; const struct mtk_iommu_iova_region *iova_region; @@ -80,6 +81,8 @@ struct mtk_iommu_data { struct device *smicomm_dev; struct dma_iommu_mapping *mapping; /* For mtk_iommu_v1.c */ + struct regmap *pericfg; + struct list_head *hw_list; struct list_head hw_list_head; -- 2.18.0