Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp4173034pxb; Tue, 25 Jan 2022 05:07:37 -0800 (PST) X-Google-Smtp-Source: ABdhPJzzskQ4LU+lnjq+ey3U9ID6SNI1DATP++t/1PDHlh3Z4H/3TkN62RTVGZer0YnGu23E1mWc X-Received: by 2002:a17:907:62a3:: with SMTP id nd35mr14372487ejc.431.1643116057055; Tue, 25 Jan 2022 05:07:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643116057; cv=none; d=google.com; s=arc-20160816; b=c5uAKZpGxN0JPhknVcM9jPk5Shqt8Bx3wSjqLW00AB+NU8k5Y/ytb9zDtoHBt8B6A7 FVoJOSX/hWt64RPHYTQATj7BVHASBVw3T6jb0NxNKdUseJS+KxoPwcBvcodJr14Ih8T+ 3ytHnWveS9kEaQcNMH2zKBX/LdkrmDGawqezLay7i/HlHAKBYtAefvQPeC12BiJXhau6 6p14sgH/1iOHJQPRgPfLvekR8GWtxmA6+xWLN5Zu1CZS/vwruUzVJZc2Tr36LBzJTwpe Ob/95MfAxTVMFgu3Zy6ues52Y9p1jv4Eq+/2P0IcR2FPP0otH4pNpdcx0Hs1vIlKT8m/ accQ== 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=/1TGgBoKW/hjObL1WqZ2+3S3wieWm4y68oIVwDE1CYc=; b=EcgopG+5Vk04z5BwEwbtDxAkAj0zPS0HsKUIVYLIM3lu1rIxwe+AG93FXWCgU8FqLb D46bcE/W8vxP4LuZ4mKR/PerHIjZ3rXoeQzDpgyu2sc0J0mVqAfQ6pnLk5J/ai2+Kxbp bfOajJ6hu7/7+4XBhRWjkGirdt/jfWXKUuyLxWhrc3tsD9cyn9nLZjYwjmJ4oqQMYyZA QEw+D3Txyv/DaZ/8FZBHKouONxoWPakbl6KBU21UdzanQXcW/k7kmlCsEaAkz35KTmlY vCYOMklKRS93liRXEKMTjVbwITyT3Cnj6EzMDx+6kT4T11/U6tg6Qpj2M522ixjSJ6p1 5zkg== 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 v19si3588561edc.188.2022.01.25.05.07.11; Tue, 25 Jan 2022 05:07:37 -0800 (PST) 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 S1456572AbiAYJLw (ORCPT + 99 others); Tue, 25 Jan 2022 04:11:52 -0500 Received: from mailgw01.mediatek.com ([60.244.123.138]:58610 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1455242AbiAYJDm (ORCPT ); Tue, 25 Jan 2022 04:03:42 -0500 X-UUID: 6c6c577ab6bb45299cbb57666b11c0ec-20220125 X-UUID: 6c6c577ab6bb45299cbb57666b11c0ec-20220125 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 1520066034; Tue, 25 Jan 2022 17:01:05 +0800 Received: from mtkcas10.mediatek.inc (172.21.101.39) by mtkmbs10n2.mediatek.inc (172.21.101.183) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.2.792.3; Tue, 25 Jan 2022 17:01:04 +0800 Received: from localhost.localdomain (10.17.3.154) by mtkcas10.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 25 Jan 2022 17:01:02 +0800 From: Yong Wu To: Joerg Roedel , Rob Herring , "Matthias Brugger" , Will Deacon CC: Robin Murphy , Krzysztof Kozlowski , Tomasz Figa , , , , , , , Hsin-Yi Wang , , , , , , "AngeloGioacchino Del Regno" , , , , Subject: [PATCH v4 33/35] iommu/mediatek: Initialise/Remove for multi bank dev Date: Tue, 25 Jan 2022 16:56:32 +0800 Message-ID: <20220125085634.17972-34-yong.wu@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20220125085634.17972-1-yong.wu@mediatek.com> References: <20220125085634.17972-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 The registers for each bank of the IOMMU base are in order, delta is 0x1000. Initialise the base for each bank. For all the previous SoC, we only have bank0. thus use "do {} while()" to allow bank0 always go. When removing the device, Not always all the banks are initialised, it depend on if there is masters for that bank. Signed-off-by: Yong Wu --- drivers/iommu/mtk_iommu.c | 44 ++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c index c6de9304bbc6..3a2907c19bd8 100644 --- a/drivers/iommu/mtk_iommu.c +++ b/drivers/iommu/mtk_iommu.c @@ -113,6 +113,7 @@ #define F_MMU_INT_ID_PORT_ID(a) (((a) >> 2) & 0x1f) #define MTK_PROTECT_PA_ALIGN 256 +#define MTK_IOMMU_BANK_SZ 0x1000 #define PERICFG_IOMMU_1 0x714 @@ -1076,7 +1077,7 @@ static int mtk_iommu_probe(struct platform_device *pdev) struct component_match *match = NULL; struct regmap *infracfg; void *protect; - int ret, banks_num; + int ret, banks_num, i = 0; u32 val; char *p; struct mtk_iommu_bank_data *bank; @@ -1117,27 +1118,36 @@ static int mtk_iommu_probe(struct platform_device *pdev) data->enable_4GB = !!(val & F_DDR_4GB_SUPPORT_EN); } + banks_num = data->plat_data->banks_num; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (resource_size(res) < banks_num * MTK_IOMMU_BANK_SZ) { + dev_err(dev, "banknr %d. res %pR is not enough.\n", banks_num, res); + return -EINVAL; + } base = devm_ioremap_resource(dev, res); if (IS_ERR(base)) return PTR_ERR(base); ioaddr = res->start; - banks_num = data->plat_data->banks_num; data->bank = devm_kmalloc(dev, banks_num * sizeof(*data->bank), GFP_KERNEL); if (!data->bank) return -ENOMEM; - bank = &data->bank[0]; - bank->id = 0; - bank->base = base; - bank->m4u_dom = NULL; - bank->irq = platform_get_irq(pdev, 0); - if (bank->irq < 0) - return bank->irq; - bank->parent_dev = dev; - bank->parent_data = data; - spin_lock_init(&bank->tlb_lock); + do { + if (!data->plat_data->banks_enable[i]) + continue; + bank = &data->bank[i]; + bank->id = i; + bank->base = base + i * MTK_IOMMU_BANK_SZ; + bank->m4u_dom = NULL; + + bank->irq = platform_get_irq(pdev, i); + if (bank->irq < 0) + return bank->irq; + bank->parent_dev = dev; + bank->parent_data = data; + spin_lock_init(&bank->tlb_lock); + } while (++i < banks_num); if (MTK_IOMMU_HAS_FLAG(data->plat_data, HAS_BCLK)) { data->bclk = devm_clk_get(dev, "bclk"); @@ -1223,7 +1233,8 @@ static int mtk_iommu_probe(struct platform_device *pdev) static int mtk_iommu_remove(struct platform_device *pdev) { struct mtk_iommu_data *data = platform_get_drvdata(pdev); - struct mtk_iommu_bank_data *bank = &data->bank[0]; + struct mtk_iommu_bank_data *bank; + int i; iommu_device_sysfs_remove(&data->iommu); iommu_device_unregister(&data->iommu); @@ -1240,7 +1251,12 @@ static int mtk_iommu_remove(struct platform_device *pdev) #endif } pm_runtime_disable(&pdev->dev); - devm_free_irq(&pdev->dev, bank->irq, bank); + for (i = 0; i < data->plat_data->banks_num; i++) { + bank = &data->bank[i]; + if (!bank->m4u_dom) + continue; + devm_free_irq(&pdev->dev, bank->irq, bank); + } return 0; } -- 2.18.0