From patchwork Fri Jan 16 09:13:06 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 5646611 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 3B90E9F3A0 for ; Fri, 16 Jan 2015 09:23:38 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 63FFD200EC for ; Fri, 16 Jan 2015 09:23:37 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9823B200DE for ; Fri, 16 Jan 2015 09:23:36 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1YC34u-0001oU-K7; Fri, 16 Jan 2015 09:20:28 +0000 Received: from mailout1.w1.samsung.com ([210.118.77.11]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1YC2yp-0003p5-S1 for linux-arm-kernel@lists.infradead.org; Fri, 16 Jan 2015 09:14:19 +0000 Received: from eucpsbgm1.samsung.com (unknown [203.254.199.244]) by mailout1.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NI900J0VJ5QR160@mailout1.w1.samsung.com> for linux-arm-kernel@lists.infradead.org; Fri, 16 Jan 2015 09:17:50 +0000 (GMT) X-AuditID: cbfec7f4-b7f126d000001e9a-8d-54b8d64680da Received: from eusync2.samsung.com ( [203.254.199.212]) by eucpsbgm1.samsung.com (EUCPMTA) with SMTP id 4B.53.07834.646D8B45; Fri, 16 Jan 2015 09:13:42 +0000 (GMT) Received: from amdc1339.digital.local ([106.116.147.30]) by eusync2.samsung.com (Oracle Communications Messaging Server 7u4-23.01 (7.0.4.23.0) 64bit (built Aug 10 2011)) with ESMTPA id <0NI9003PAIY85K90@eusync2.samsung.com>; Fri, 16 Jan 2015 09:13:42 +0000 (GMT) From: Marek Szyprowski To: iommu@lists.linux-foundation.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v4 12/18] iommu: exynos: add support for binding more than one sysmmu to master device Date: Fri, 16 Jan 2015 10:13:06 +0100 Message-id: <1421399592-7482-13-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.2 In-reply-to: <1421399592-7482-1-git-send-email-m.szyprowski@samsung.com> References: <1421399592-7482-1-git-send-email-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrDLMWRmVeSWpSXmKPExsVy+t/xK7pu13aEGCzqEbX4O+kYu8XElZOZ LSbdn8BisWC/tUXn7A3sFv2PXzNbnG16w27ROXEJu8WXKw+ZLDY9vsZqMeP8PiaLtUfusluc uv6ZzeJf70FGi/97drBbHHm4m91i1a4/jBa3f/NZvPx4gsVB2OPJwXlMHmvmrWH0+P1rEqPH zll32T1md8xk9di8Qstj06pONo/NS+o9bv97zOwx+cZyRo8rJ5pYPXqb37F59G1ZxejxeZNc AF8Ul01Kak5mWWqRvl0CV8bdfScZC/4IVjx4O4O9gfEBXxcjJ4eEgInEgSOr2CBsMYkL99YD 2VwcQgJLGSVebr8B5fQxSWzeOY8RpIpNwFCi620XWIeIQL7Ei71/WUCKmAWes0jMW7OBCSQh LJAhcfHYD7AGFgFViZ/HXoA18Ap4SGycuI8ZYp2cxP+XK8DqOYHiB1Y/YAWxhQTcJb5e3MI+ gZF3ASPDKkbR1NLkguKk9FxDveLE3OLSvHS95PzcTYyQGPmyg3HxMatDjAIcjEo8vDO27AgR Yk0sK67MPcQowcGsJMK7cRtQiDclsbIqtSg/vqg0J7X4ECMTB6dUA+OMh2YTt9vYbOFv7ORb Nyl+n8eyhoCFU/zn2DGZmkzmY9m7UXOD24I9acv5rSalp4me3bu/2UZwS4/9LomANAmD5YrT HvHyS3sc5Jef/riLZ+WmU+++77rtuZZp2ZmJ7q3CWw/M0M35+StlbzBP+o/1gjXxjoFGaxYz GrPx6yxsbGpdqloxq1aJpTgj0VCLuag4EQAIjfRBbwIAAA== X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150116_011412_083275_A01A5E05 X-CRM114-Status: GOOD ( 12.90 ) X-Spam-Score: -5.0 (-----) Cc: Rob Herring , Thierry Reding , Shaik Ameer Basha , Arnd Bergmann , Inki Dae , Joerg Roedel , Will Deacon , Tomasz Figa , linaro-mm-sig@lists.linaro.org, Kyungmin Park , Kukjin Kim , Laurent Pinchart , Olof Johansson , Cho KyongHo , David Wodhouse , Marek Szyprowski X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch adds support for assigning more than one SYSMMU controller to the master device. This has been achieved simply by chaning the struct device pointer in struct exynos_iommu_owner into the list of struct sysmmu_drvdata of all controllers assigned to the given master device. Signed-off-by: Marek Szyprowski --- drivers/iommu/exynos-iommu.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c index e40e699423a6..c6cca44d7858 100644 --- a/drivers/iommu/exynos-iommu.c +++ b/drivers/iommu/exynos-iommu.c @@ -186,7 +186,7 @@ static char *sysmmu_fault_name[SYSMMU_FAULTS_NUM] = { /* attached to dev.archdata.iommu of the master device */ struct exynos_iommu_owner { - struct device *sysmmu; + struct list_head clients; }; struct exynos_iommu_domain { @@ -207,6 +207,7 @@ struct sysmmu_drvdata { spinlock_t lock; struct iommu_domain *domain; struct list_head domain_node; + struct list_head owner_node; phys_addr_t pgtable; int version; }; @@ -693,8 +694,7 @@ static int exynos_iommu_attach_device(struct iommu_domain *domain, if (!has_sysmmu(dev)) return -ENODEV; - data = dev_get_drvdata(owner->sysmmu); - if (data) { + list_for_each_entry(data, &owner->clients, owner_node) { ret = __sysmmu_enable(data, pagetable, domain); if (ret >= 0) { data->master = dev; @@ -722,7 +722,7 @@ static void exynos_iommu_detach_device(struct iommu_domain *domain, { struct exynos_iommu_domain *priv = domain->priv; phys_addr_t pagetable = virt_to_phys(priv->pgtable); - struct sysmmu_drvdata *data; + struct sysmmu_drvdata *data, *next; unsigned long flags; int found = 0; @@ -730,14 +730,13 @@ static void exynos_iommu_detach_device(struct iommu_domain *domain, return; spin_lock_irqsave(&priv->lock, flags); - list_for_each_entry(data, &priv->clients, domain_node) { + list_for_each_entry_safe(data, next, &priv->clients, domain_node) { if (data->master == dev) { if (__sysmmu_disable(data)) { data->master = NULL; list_del_init(&data->domain_node); } found = true; - break; } } spin_unlock_irqrestore(&priv->lock, flags);