From patchwork Tue Sep 25 08:23:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrzej Hajda X-Patchwork-Id: 10613635 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6AA4D6CB for ; Tue, 25 Sep 2018 08:23:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5D0FE29A6F for ; Tue, 25 Sep 2018 08:23:33 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 514F429ACC; Tue, 25 Sep 2018 08:23:33 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D632029A6F for ; Tue, 25 Sep 2018 08:23:32 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3139F6E34E; Tue, 25 Sep 2018 08:23:29 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by gabe.freedesktop.org (Postfix) with ESMTPS id B6CAC6E317 for ; Tue, 25 Sep 2018 08:23:17 +0000 (UTC) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20180925082316euoutp010a600647957360b077869001c0ea6946~XlvmgLyx42110221102euoutp01X for ; Tue, 25 Sep 2018 08:23:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20180925082316euoutp010a600647957360b077869001c0ea6946~XlvmgLyx42110221102euoutp01X Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20180925082315eucas1p2e11aaa559011cb584e4fb7aa23a8654c~XlvlpsCMy0046300463eucas1p2a; Tue, 25 Sep 2018 08:23:15 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id 4C.54.04806.370F9AB5; Tue, 25 Sep 2018 09:23:15 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20180925082314eucas1p27428784088ab6ccd9d6d11ce0ab5063e~Xlvk04UDJ0684006840eucas1p2J; Tue, 25 Sep 2018 08:23:14 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20180925082314eusmtrp10fcc92f33c7b61b26a65cbad37e48ff7~XlvkzwYac2406924069eusmtrp1b; Tue, 25 Sep 2018 08:23:14 +0000 (GMT) X-AuditID: cbfec7f5-367ff700000012c6-b9-5ba9f07392b8 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id F2.D8.04284.270F9AB5; Tue, 25 Sep 2018 09:23:14 +0100 (BST) Received: from AMDC2768.DIGITAL.local (unknown [106.120.43.17]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20180925082314eusmtip1517b12dcda2a7574ce7f0b7dc19be6ab~Xlvkci7e11372213722eusmtip1C; Tue, 25 Sep 2018 08:23:14 +0000 (GMT) From: Andrzej Hajda To: Inki Dae Subject: [PATCH 5/6] drm/exynos/iommu: replace preprocessor conditionals with C conditionals Date: Tue, 25 Sep 2018 10:23:07 +0200 X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180925082308.1388-1-a.hajda@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrDIsWRmVeSWpSXmKPExsWy7djPc7rFH1ZGG3ycIGFxa905VouNM9az Wlz5+p7NYtL9CSwWM87vY7JYe+QuuwObx/3u40wefVtWMXp83iQXwBzFZZOSmpNZllqkb5fA lfF3YwtrwVvdiuWbprA1ML5U62Lk5JAQMJH4dK6XvYuRi0NIYAWjxJN/x5khnC+MEvcX/GGD cD4zSkzuu8cM09LyYiZU1XJGibfPJ7HDtUzY2MwOUsUmoCnxd/NNNhBbREBZYtW+drAiZoFL jBKvT3YzgiSEBeIk2v7OAWtgEVCVuNrxnQ1ihbzEw+PtYDWcAhYSlxuuMkLEb7NJLF/P0cXI wcErUCax9YUrRNhF4t/EBawQtrDEq+Nb2CFsGYnTk3tYIOx6iaaZV8CulhDoYJQ4sXg51C5r icPHL7KCzGQGOnr9Ln2IsKPEictbwMISAnwSN94KgoSZgcxJ26YzQ4R5JTrahCCqFSXun90K DR9xiaUXvkIN95BY9OkZNKy6GSWm3F3GOIFRfhbCsgWMjKsYxVNLi3PTU4uN81LL9YoTc4tL 89L1kvNzNzEC08Dpf8e/7mDc9yfpEKMAB6MSD++NZyuihVgTy4orcw8xSnAwK4nwNumujBbi TUmsrEotyo8vKs1JLT7EKM3BoiTOy6eVFi0kkJ5YkpqdmlqQWgSTZeLglGpgtIhxypnek53V s6CqxUrmw0mR/erNXXoNNju3s+05+GqjsO6V4qbSb5ec1je0bNVYx73ZaNZX3VlF0eUcQuVC LFc6C4wnLwvqCwzcPLs4nKnact/sWfWOr7dwTVr7IKRXt6G3MKerVuUm41GFKN7ZRbb6y14w hGiuDfi4+GFjpdZ/xjw/5zglluKMREMt5qLiRABdXBIT/wIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrPLMWRmVeSWpSXmKPExsVy+t/xu7pFH1ZGG0zs0rW4te4cq8XGGetZ La58fc9mMen+BBaLGef3MVmsPXKX3YHN4373cSaPvi2rGD0+b5ILYI7SsynKLy1JVcjILy6x VYo2tDDSM7S00DMysdQzNDaPtTIyVdK3s0lJzcksSy3St0vQy/i7sYW14K1uxfJNU9gaGF+q dTFyckgImEi0vJjJ3MXIxSEksJRR4kDLNnaIhLjE7vlvmSFsYYk/17rYIIo+MUp8OHOJDSTB JqAp8XfzTTBbREBZYtW+dnaQImaBa4wS+9d9YgFJCAvESLR+3Qc2iUVAVeJqx3ewBl4Bc4nn P/awQWyQl3h4vJ0RxOYUsJC43HAVzBYCqjnSe4F5AiPfAkaGVYwiqaXFuem5xYZ6xYm5xaV5 6XrJ+bmbGIGBue3Yz807GC9tDD7EKMDBqMTDe+PZimgh1sSy4srcQ4wSHMxKIrxNuiujhXhT EiurUovy44tKc1KLDzGaAh01kVlKNDkfGDV5JfGGpobmFpaG5sbmxmYWSuK85w0qo4QE0hNL UrNTUwtSi2D6mDg4pRoYXQ6dLV6hrsjnsptr7tPLUfPUdaXeZWf1O/iX/NESN7t2tkr8VfvF Fxfn9imy13w7uOsR55NpYZcv/WVU6NXpNm3+WyATUTG5SHCSxqS3uTyXQ3KXVbldOLSsfuap UtU5eqUebwXPmP9InOlzlM/+JveVa8vSbwqzx/xgvG5dNce68IC/jMETJZbijERDLeai4kQA ACJL02ICAAA= Message-Id: <20180925082314eucas1p27428784088ab6ccd9d6d11ce0ab5063e~Xlvk04UDJ0684006840eucas1p2J@eucas1p2.samsung.com> X-CMS-MailID: 20180925082314eucas1p27428784088ab6ccd9d6d11ce0ab5063e X-Msg-Generator: CA X-RootMTR: 20180925082314eucas1p27428784088ab6ccd9d6d11ce0ab5063e X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20180925082314eucas1p27428784088ab6ccd9d6d11ce0ab5063e References: <20180925082308.1388-1-a.hajda@samsung.com> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-samsung-soc@vger.kernel.org, Marek Szyprowski , dri-devel@lists.freedesktop.org, Bartlomiej Zolnierkiewicz MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Using C conditionals is preferred solution - it provides better code coverage, makes code more clear. Signed-off-by: Andrzej Hajda --- drivers/gpu/drm/exynos/exynos_drm_iommu.c | 114 +++++++++------------- 1 file changed, 47 insertions(+), 67 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_iommu.c b/drivers/gpu/drm/exynos/exynos_drm_iommu.c index 96df5819fd52..54ac262a95aa 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_iommu.c +++ b/drivers/gpu/drm/exynos/exynos_drm_iommu.c @@ -12,59 +12,39 @@ #include #include +#include #include #include #include "exynos_drm_drv.h" #include "exynos_drm_iommu.h" -#define EXYNOS_DEV_ADDR_START 0x20000000 -#define EXYNOS_DEV_ADDR_SIZE 0x40000000 - #if defined(CONFIG_ARM_DMA_USE_IOMMU) #include +#else +#define arm_iommu_create_mapping(...) ({ NULL; }) +#define arm_iommu_attach_device(...) ({ -ENODEV; }) +#define arm_iommu_release_mapping(...) ({ }) +#define arm_iommu_detach_device(...) ({ }) +#define to_dma_iommu_mapping(dev) NULL +#endif -static inline int __exynos_iommu_create_mapping(struct exynos_drm_private *priv, - unsigned long start, unsigned long size) -{ - priv->mapping = arm_iommu_create_mapping(&platform_bus_type, start, - size); - return IS_ERR(priv->mapping); -} - -static inline void -__exynos_iommu_release_mapping(struct exynos_drm_private *priv) -{ - arm_iommu_release_mapping(priv->mapping); -} - -static inline int __exynos_iommu_attach(struct exynos_drm_private *priv, - struct device *dev) -{ - if (dev->archdata.mapping) - arm_iommu_detach_device(dev); - - return arm_iommu_attach_device(dev, priv->mapping); -} - -static inline void __exynos_iommu_detach(struct exynos_drm_private *priv, - struct device *dev) -{ - arm_iommu_detach_device(dev); -} +#if !defined(CONFIG_IOMMU_DMA) +#define iommu_dma_init_domain(...) ({ -EINVAL; }) +#endif -#elif defined(CONFIG_IOMMU_DMA) -#include +#define EXYNOS_DEV_ADDR_START 0x20000000 +#define EXYNOS_DEV_ADDR_SIZE 0x40000000 -static inline int __exynos_iommu_create_mapping(struct exynos_drm_private *priv, - unsigned long start, unsigned long size) +static void *iommu_dma_create_mapping(struct exynos_drm_private *priv, + unsigned long start, unsigned long size) { struct iommu_domain *domain; int ret; domain = iommu_domain_alloc(priv->dma_dev->bus); if (!domain) - return -ENOMEM; + return ERR_PTR(-ENOMEM); ret = iommu_get_dma_cookie(domain); if (ret) @@ -74,43 +54,20 @@ static inline int __exynos_iommu_create_mapping(struct exynos_drm_private *priv, if (ret) goto put_cookie; - priv->mapping = domain; - return 0; + return domain; put_cookie: iommu_put_dma_cookie(domain); free_domain: iommu_domain_free(domain); - return ret; + return ERR_PTR(ret); } -static inline void __exynos_iommu_release_mapping(struct exynos_drm_private *priv) +static inline void iommu_dma_release_mapping(struct iommu_domain *domain) { - struct iommu_domain *domain = priv->mapping; - iommu_put_dma_cookie(domain); iommu_domain_free(domain); - priv->mapping = NULL; -} - -static inline int __exynos_iommu_attach(struct exynos_drm_private *priv, - struct device *dev) -{ - struct iommu_domain *domain = priv->mapping; - - return iommu_attach_device(domain, dev); -} - -static inline void __exynos_iommu_detach(struct exynos_drm_private *priv, - struct device *dev) -{ - struct iommu_domain *domain = priv->mapping; - - iommu_detach_device(domain, dev); } -#else -#error Unsupported architecture and IOMMU/DMA-mapping glue code -#endif static inline int configure_dma_max_seg_size(struct device *dev) { @@ -138,8 +95,14 @@ int drm_create_iommu_mapping(struct drm_device *drm_dev) { struct exynos_drm_private *priv = drm_dev->dev_private; - return __exynos_iommu_create_mapping(priv, EXYNOS_DEV_ADDR_START, - EXYNOS_DEV_ADDR_SIZE); + if (IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)) + priv->mapping = arm_iommu_create_mapping(&platform_bus_type, + EXYNOS_DEV_ADDR_START, EXYNOS_DEV_ADDR_SIZE); + else if (IS_ENABLED(CONFIG_IOMMU_DMA)) + priv->mapping = iommu_dma_create_mapping(priv, + EXYNOS_DEV_ADDR_START, EXYNOS_DEV_ADDR_SIZE); + + return IS_ERR(priv->mapping); } /* @@ -151,7 +114,12 @@ void drm_release_iommu_mapping(struct drm_device *drm_dev) { struct exynos_drm_private *priv = drm_dev->dev_private; - __exynos_iommu_release_mapping(priv); + if (IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)) + arm_iommu_release_mapping(priv->mapping); + else if (IS_ENABLED(CONFIG_IOMMU_DMA)) + iommu_dma_release_mapping(priv->mapping); + + priv->mapping = NULL; } /* @@ -179,7 +147,15 @@ int drm_iommu_attach_device(struct drm_device *drm_dev, if (ret) return ret; - ret = __exynos_iommu_attach(priv, subdrv_dev); + if (IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)) { + if (to_dma_iommu_mapping(subdrv_dev)) + arm_iommu_detach_device(subdrv_dev); + + ret = arm_iommu_attach_device(subdrv_dev, priv->mapping); + } else if (IS_ENABLED(CONFIG_IOMMU_DMA)) { + ret = iommu_attach_device(priv->mapping, subdrv_dev); + } + if (ret) clear_dma_max_seg_size(subdrv_dev); @@ -200,6 +176,10 @@ void drm_iommu_detach_device(struct drm_device *drm_dev, { struct exynos_drm_private *priv = drm_dev->dev_private; - __exynos_iommu_detach(priv, subdrv_dev); + if (IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)) + arm_iommu_detach_device(subdrv_dev); + else if (IS_ENABLED(CONFIG_IOMMU_DMA)) + iommu_detach_device(priv->mapping, subdrv_dev); + clear_dma_max_seg_size(subdrv_dev); }