Received: by 2002:a05:6358:a55:b0:ec:fcf4:3ecf with SMTP id 21csp404301rwb; Thu, 12 Jan 2023 22:18:15 -0800 (PST) X-Google-Smtp-Source: AMrXdXt1HS5kMbbud1eHvB0yUTlZiagvI+pVlYtAWKjHMijZnQDpqlhMHuZpxv+ifuD++FWmgLLP X-Received: by 2002:a62:5f87:0:b0:576:1c37:5720 with SMTP id t129-20020a625f87000000b005761c375720mr71307509pfb.4.1673590695665; Thu, 12 Jan 2023 22:18:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673590695; cv=none; d=google.com; s=arc-20160816; b=rVR53uHjjIWzcPlG7PTvNByuqvtUho7QEE2zJt7vchK57n41yuNwfFyJDWO/Z7cxE2 E+/QbFtAUI8qFEXbzjDIZS9AYg/ftIxDc8slzvSDU1Gc18v4Qv2rpb/QScKmo/tfrIp2 qQELllcjtsPzfUInQmBjys+Envm03bVY6+SdgKzc6KlLVsaAa1cpsL0e2a31GmfvZXiJ 6a7tDr8KxYOGSWBK1xQaF5rPeLVcV8CUxfMmVwvAb0tl7xrhNeL3JdQnYKwdHmIGrf+0 Bto+qjtcXhgv0KILXQGdrZP4Y/nVFnyI3HHVeDm/Vefjp31i/4zx8ZM2GnYIGu+Umzd4 tfAg== 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:dkim-signature; bh=T1Ghxl1XJabXKhcVsoUFPdobaBEZ4/RbrX/ASwjk8BA=; b=BivQh3DAls7IBSN0hNMZ5SlpVY2FZ6jQ3MneEGTlgVkw8VZ/LFJvxWQN8fMnkL1ccH r3c6L9PNCbBOTjKTKN6XiIna+7NsQGlZ1ZpbnEWehTheGzyWXtYYt2Ic+szvqcV6fjO7 TXDa6iZMGIC0smQ3Pgd5t3rVwnHnslKfSIKRcGfqtM2D0k2bieivYi5eIXjuoHd/OTPI DHYfGiSmMFKS3Bils7SLR0PI6cGijpE90SAaCRu51qEvfbCCcd6Z3tHh4jUl4XhK3A7+ 2dIgsGcobOuLmZfAJB7oJPpxFafWiWxCaI2/bDAGXc/xDMBvZC3ZMGmGUUBGt8XW5el7 kEaw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=db5v4aFS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id r3-20020a056a00216300b00574b46d3b26si18780803pff.334.2023.01.12.22.18.09; Thu, 12 Jan 2023 22:18:15 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=db5v4aFS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234896AbjAMGHM (ORCPT + 50 others); Fri, 13 Jan 2023 01:07:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52990 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232678AbjAMGGH (ORCPT ); Fri, 13 Jan 2023 01:06:07 -0500 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 632D569534; Thu, 12 Jan 2023 22:02:40 -0800 (PST) X-UUID: dd6f09fc930711eda06fc9ecc4dadd91-20230113 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=T1Ghxl1XJabXKhcVsoUFPdobaBEZ4/RbrX/ASwjk8BA=; b=db5v4aFSq0Qx+gLcwvU9aJwZlXJIcz0Vw1VLZW7BCJs0Ez5JeXEmdb7t++F4kdcGiIcE7s1OVuVCekRe3z95m3uPbv+x5vIt1Hyx5I4+ud4PEZARzHs2oVpRMIGyR7agfeNiaZZykc6iOJDnKC9V9Tt0QwfJZTl1W6cx1CHod2w=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.17,REQID:02985d34-e0f0-4a6d-b16b-527f1e37a152,IP:0,U RL:0,TC:0,Content:-25,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTIO N:release,TS:-25 X-CID-META: VersionHash:543e81c,CLOUDID:26f18a54-dd49-462e-a4be-2143a3ddc739,B ulkID:nil,BulkQuantity:0,Recheck:0,SF:102,TC:nil,Content:0,EDM:-3,IP:nil,U RL:0,File:nil,Bulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0 X-CID-BVR: 0 X-UUID: dd6f09fc930711eda06fc9ecc4dadd91-20230113 Received: from mtkmbs10n2.mediatek.inc [(172.21.101.183)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 37150639; Fri, 13 Jan 2023 14:02:30 +0800 Received: from mtkmbs13n2.mediatek.inc (172.21.101.108) by mtkmbs10n1.mediatek.inc (172.21.101.34) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.792.15; Fri, 13 Jan 2023 14:02:29 +0800 Received: from mhfsdcap04.gcn.mediatek.inc (10.17.3.154) by mtkmbs13n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.792.15 via Frontend Transport; Fri, 13 Jan 2023 14:02:28 +0800 From: Yong Wu To: Joerg Roedel , Matthias Brugger , Mauro Carvalho Chehab , Rob Herring CC: Will Deacon , Robin Murphy , Krzysztof Kozlowski , Hans Verkuil , , , , , , , , "AngeloGioacchino Del Regno" , , , , Yunfei Dong , kyrie wu , , , , Yong Wu Subject: [PATCH 03/10] iommu/mediatek: Get regionid from larb/port id Date: Fri, 13 Jan 2023 14:01:26 +0800 Message-ID: <20230113060133.9394-4-yong.wu@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20230113060133.9394-1-yong.wu@mediatek.com> References: <20230113060133.9394-1-yong.wu@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-MTK: N X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS, SPF_PASS,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org After commit f1ad5338a4d5 ("of: Fix "dma-ranges" handling for bus controllers"), the dma-ranges is not allowed for dts leaf node. but we still would like to separate to different masters into different iova regions. Thus we have to separate it by the HW larbid and portid. For example, larb1/2 are in region2 and larb3 is in region3. The problem is that some ports inside a larb are in region4 while some ports inside this larb are in region5. Therefore I define a "larb_region_msk" to help record the information for each a port. Take a example for a larb: [1] = ~0: means all ports in this larb are in region1; [2] = BIT(3) | BIT(4): means port3/4 in this larb are region2; [3] = ~(BIT(3) | BIT(4)): means all the other ports except port3/4 in this larb are region3. This method also avoid the users forget/abuse the iova regions. Signed-off-by: Yong Wu --- drivers/iommu/mtk_iommu.c | 43 +++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c index 2badd6acfb23..d30020d0a190 100644 --- a/drivers/iommu/mtk_iommu.c +++ b/drivers/iommu/mtk_iommu.c @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include @@ -194,6 +193,7 @@ struct mtk_iommu_plat_data { enum mtk_iommu_plat m4u_plat; u32 flags; u32 inv_sel_reg; + const u32 (*larb_region_msk)[32]; char *pericfg_comp_str; struct list_head *hw_list; @@ -508,30 +508,33 @@ static unsigned int mtk_iommu_get_bank_id(struct device *dev, static int mtk_iommu_get_iova_region_id(struct device *dev, const struct mtk_iommu_plat_data *plat_data) { - const struct mtk_iommu_iova_region *rgn = plat_data->iova_region; - const struct bus_dma_region *dma_rgn = dev->dma_range_map; - int i, candidate = -1; - dma_addr_t dma_end; + struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); + unsigned int portidmsk = 0, larbid; + const u32 *rgn_larb_msk; + int i, region_id = -1; - if (!dma_rgn || plat_data->iova_region_nr == 1) + if (plat_data->iova_region_nr == 1) return 0; - dma_end = dma_rgn->dma_start + dma_rgn->size - 1; - for (i = 0; i < plat_data->iova_region_nr; i++, rgn++) { - /* Best fit. */ - if (dma_rgn->dma_start == rgn->iova_base && - dma_end == rgn->iova_base + rgn->size - 1) - return i; - /* ok if it is inside this region. */ - if (dma_rgn->dma_start >= rgn->iova_base && - dma_end < rgn->iova_base + rgn->size) - candidate = i; + larbid = MTK_M4U_TO_LARB(fwspec->ids[0]); + for (i = 0; i < fwspec->num_ids; i++) + portidmsk |= BIT(MTK_M4U_TO_PORT(fwspec->ids[i])); + + for (i = 0; i < plat_data->iova_region_nr; i++) { + rgn_larb_msk = plat_data->larb_region_msk[i]; + if (!rgn_larb_msk) + continue; + + if ((rgn_larb_msk[larbid] & portidmsk) == portidmsk) { + region_id = i; + break; + } } - if (candidate >= 0) - return candidate; - dev_err(dev, "Can NOT find the iommu domain id(%pad 0x%llx).\n", - &dma_rgn->dma_start, dma_rgn->size); + if (region_id >= 0) + return region_id; + dev_err(dev, "Can NOT find the region for larb(%d-%x).\n", + larbid, portidmsk); return -EINVAL; } -- 2.18.0