From patchwork Fri May 4 13:37:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 908722 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="VPUu6EVv"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40ctNS4ZnVz9rvt for ; Fri, 4 May 2018 23:37:12 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751172AbeEDNhL (ORCPT ); Fri, 4 May 2018 09:37:11 -0400 Received: from mail-wr0-f193.google.com ([209.85.128.193]:39900 "EHLO mail-wr0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751114AbeEDNhK (ORCPT ); Fri, 4 May 2018 09:37:10 -0400 Received: by mail-wr0-f193.google.com with SMTP id q3-v6so21120844wrj.6 for ; Fri, 04 May 2018 06:37:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=caZjCrQRBDdM/1nwzAYWO+QpIY6+2SV3E0+b+5EJYLk=; b=VPUu6EVvK730mMy7zDeP32dqwRWwAXXezWlPYG7FhrEGK0t4xnPj+l2mHHgmeoyMbe fNmPlkLbARBav6dk02icO+6MIuk9O5uR3AfioeNHmH7gRTV5q7eByrMjK0cpzXwaykjz AAdEU8wmm6pkNkhRfDK55US5bnAcAqv8PK2NiC0k6I+NlOT8G3dyz/6SSujQfsInU6h7 0k0LivwbALdg/VP7gagfX3kXPeXesuauRr+SoTBrXJv4Oko46L02bKTCYmHACWu9c+Dr uN92rmBp9oSiUgCE/WddwZ7z+3QQRm5WjlqXAJEa07pIaeJn5WW1cph8M3g9AI2KOj6w 8umQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=caZjCrQRBDdM/1nwzAYWO+QpIY6+2SV3E0+b+5EJYLk=; b=r2rXEMGeZwX8OEGXh6zUuDtIgPts2m272u7nxmowY5Xkg6vJe4T3XYE8cwVgzweULF iPcS2adrqXATzMRntAxruwlGZQW7KhFYuZAeyYT+KlWeEI/GF0yCsrS2RUWnBZZMjqcR H/Y5rPQMbQbRs+asyGsOQon+vwGk5IXac9ulqdteq79Lvkx3BV4QBb6c3DOxqRPHpGLB UrHp3xITcuCT08swd0bYLobd6mbPACgL+nt+/v1DG8zlZdfjKfC8mJHoMwIa793tUVJl JOj8rddYQCQSIF8VUGSOOFeC7nwVzMpFAjbE9IY07LTzfMJp3RYrhOTk7Dr03iRILYrm 0y3A== X-Gm-Message-State: ALQs6tCQaK+igmvGaaWubimUPYYTcW4zWATN76igGUsZtc4p4hqqaWeB qCAtXZ1QTNREfEZjY93kkSw= X-Google-Smtp-Source: AB8JxZrjB7yo7MFw6aDc7yiwCHhFLZYPOq0Erd2ZXJ1xy5m/kOi+dBzce3ffhWV4ITG8xEgNt3WT1Q== X-Received: by 2002:adf:9444:: with SMTP id 62-v6mr20836919wrq.264.1525441029710; Fri, 04 May 2018 06:37:09 -0700 (PDT) Received: from localhost (p200300E41F041C0032947E635CB49D15.dip0.t-ipconnect.de. [2003:e4:1f04:1c00:3294:7e63:5cb4:9d15]) by smtp.gmail.com with ESMTPSA id z18-v6sm21338002wrc.36.2018.05.04.06.37.08 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 04 May 2018 06:37:09 -0700 (PDT) From: Thierry Reding To: Thierry Reding Cc: Dmitry Osipenko , linux-tegra@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: [PATCH 1/4] drm/tegra: dc: Free syncpoint on errors Date: Fri, 4 May 2018 15:37:04 +0200 Message-Id: <20180504133707.22451-1-thierry.reding@gmail.com> X-Mailer: git-send-email 2.17.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Thierry Reding If an error happens during display controller initialization, the host1x syncpoint previously requested would be leaked. Properly clean up the syncpoint along with the other resources. Signed-off-by: Thierry Reding Reviewed-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/dc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index f20648f58e49..c843f11043db 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c @@ -1925,6 +1925,8 @@ static int tegra_dc_init(struct host1x_client *client) iommu_group_put(dc->group); } + host1x_syncpt_free(dc->syncpt); + return err; } From patchwork Fri May 4 13:37:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 908723 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="YsSWKu7V"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40ctNT4FLYz9s3Z for ; Fri, 4 May 2018 23:37:13 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751278AbeEDNhN (ORCPT ); Fri, 4 May 2018 09:37:13 -0400 Received: from mail-wr0-f195.google.com ([209.85.128.195]:40252 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751114AbeEDNhM (ORCPT ); Fri, 4 May 2018 09:37:12 -0400 Received: by mail-wr0-f195.google.com with SMTP id v60-v6so21130014wrc.7 for ; Fri, 04 May 2018 06:37:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=AaztEHFoua1YK5uEuI2uMS3uuUXQ2mvEFJX9k2N5OSI=; b=YsSWKu7VjuSz7/CWmdt8pRjs952IM05piVPgt8kVBF6wThrK/kSuwHFZJPDI1dsubd CIHKk37d0njrwnKJWHjVIpqglhKOthbfiMiqVzKxgrhNvm5ZuxVqXD0YDdI4mQU33G33 olnyrP1MwkD/qtP6W8oX5EeaNRvXykJAUrukQPIvTHYuZ08jemqihzSfh9+tJOOYkoLU yFfzC4gtHPNKMcP388tMxJ2KvSngmzww79GmQTtbjLjTiNEDt3GiwcN/jXmMOUY7aIMk jk58RmqbseoP/M3ZqYewpEbdjH0Eo1x+K0+z3osYWADx+dqcxCqO9nmyQbPaBEX7PBgO RIqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=AaztEHFoua1YK5uEuI2uMS3uuUXQ2mvEFJX9k2N5OSI=; b=VsJyYsyf7EKsPmcg6Tsa6OvU2CklUZDSnhJExgLAsgRqhWM1valR9kpxugJwknem+6 f6VSSnI7X09YvjVytrgwrsRFqWev5cI1fQgyPjHI/netmPLDEspVXV7YTJ3OnrA9llh1 Oy3K3eTuUwQS7E0jmuafpPlE/9zRtnSiraAg8hXfRbgl4Yq5oAEqxkUCGmetPS3qUsQp DD9l2xa+SgDp+/OPeBWjxlhgmmavYuf5pVf/0HqUXZf/AkQWVogcNPSj1O6pGUtmTokB wQqXg4vnFU8Fuid070SzkCEGwGZAA3XC8TMRnN/bcQZBEMBnmfRZ8JFIARRSWs2pjmg7 lkZg== X-Gm-Message-State: ALQs6tDnjWFOtEEXPHepTL6vwJKJeJ3jJHskfGlZmJMYkEzb+Yp9r27f vny0kP09P3oNjwRA+tkK6+8= X-Google-Smtp-Source: AB8JxZpiNSTfprMP/6A7bJOL0GE4n5ORsVf4GI0izOX3YfuGQzyVkpO4iRsk/qcFzUI+JbY7HMei2A== X-Received: by 2002:adf:d0cb:: with SMTP id z11-v6mr19768234wrh.281.1525441031410; Fri, 04 May 2018 06:37:11 -0700 (PDT) Received: from localhost (p200300E41F041C0032947E635CB49D15.dip0.t-ipconnect.de. [2003:e4:1f04:1c00:3294:7e63:5cb4:9d15]) by smtp.gmail.com with ESMTPSA id 109-v6sm16708152wra.32.2018.05.04.06.37.10 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 04 May 2018 06:37:10 -0700 (PDT) From: Thierry Reding To: Thierry Reding Cc: Dmitry Osipenko , linux-tegra@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: [PATCH 2/4] drm/tegra: gr2d: Properly clean up resources Date: Fri, 4 May 2018 15:37:05 +0200 Message-Id: <20180504133707.22451-2-thierry.reding@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180504133707.22451-1-thierry.reding@gmail.com> References: <20180504133707.22451-1-thierry.reding@gmail.com> Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Thierry Reding Failure to register the Tegra DRM client would leak the resources. Move cleanup code to error unwinding gotos to fix that and share the cleanup code with the other error paths. Signed-off-by: Thierry Reding Reviewed-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/gr2d.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/tegra/gr2d.c b/drivers/gpu/drm/tegra/gr2d.c index 8eb530a85dd0..0b42e99da8ad 100644 --- a/drivers/gpu/drm/tegra/gr2d.c +++ b/drivers/gpu/drm/tegra/gr2d.c @@ -42,8 +42,9 @@ static int gr2d_init(struct host1x_client *client) client->syncpts[0] = host1x_syncpt_request(client, flags); if (!client->syncpts[0]) { - host1x_channel_put(gr2d->channel); - return -ENOMEM; + err = -ENOMEM; + dev_err(client->dev, "failed to request syncpoint: %d\n", err); + goto put; } if (tegra->domain) { @@ -55,15 +56,30 @@ static int gr2d_init(struct host1x_client *client) dev_err(client->dev, "failed to attach to domain: %d\n", err); - host1x_syncpt_free(client->syncpts[0]); - host1x_channel_put(gr2d->channel); iommu_group_put(gr2d->group); - return err; + goto free; } } } - return tegra_drm_register_client(tegra, drm); + err = tegra_drm_register_client(tegra, drm); + if (err < 0) { + dev_err(client->dev, "failed to register client: %d\n", err); + goto detach; + } + + return 0; + +detach: + if (gr2d->group) { + iommu_detach_group(tegra->domain, gr2d->group); + iommu_group_put(gr2d->group); + } +free: + host1x_syncpt_free(client->syncpts[0]); +put: + host1x_channel_put(gr2d->channel); + return err; } static int gr2d_exit(struct host1x_client *client) From patchwork Fri May 4 13:37:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 908724 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="TKpG/SKJ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40ctNW3FRYz9rvt for ; Fri, 4 May 2018 23:37:15 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751229AbeEDNhP (ORCPT ); Fri, 4 May 2018 09:37:15 -0400 Received: from mail-wr0-f193.google.com ([209.85.128.193]:36100 "EHLO mail-wr0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751114AbeEDNhO (ORCPT ); Fri, 4 May 2018 09:37:14 -0400 Received: by mail-wr0-f193.google.com with SMTP id f2-v6so9316702wrm.3 for ; Fri, 04 May 2018 06:37:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=BuCvP1R1yibhEqaAg25/eRS2ue5NPqqMfGjSb/GyIYY=; b=TKpG/SKJf5/NzkpcwOYNKfBpSJXeayjf2NUJ1fhg/MRfn5YXs+gAWfHs/0P3tyokEu bXIzGWrYnLocICKTljELQwbDVag76OqKjGDUdJmm7mFtM92Phazpe1nsehtiVUXsiwBy Gwzu0q9Vd4UV/0aFHe+4LV+4C0XUAIp7TmQSJwCfSKZQzklCvE12KU/kDAS1QutyGb1Y Dvr6C4Fm0RJ49xMYrp4x8oTPCwcw1pPPOyLk1WC5SA+ynFMyIQBfV09jxciMwHxjosYd 4F36oq0lvCR431vh+GoCYQRBUmRmCXwqzEseAD4LMCwD3OYV9ujphbbkSXRolu3BS337 rYUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=BuCvP1R1yibhEqaAg25/eRS2ue5NPqqMfGjSb/GyIYY=; b=d78Tm6bes6GE83kenuBC+kDBOiQ0bbMuMjgjMdAY4lRKq42p9UNnmhjlQcc3cr55xU Om1vkgU173uM8KSbxmW0v43ZdzIV+73EzTId0e2l86lZecqdbQUM+UOPePXDfdN4XH2q PWq4cRi7AXNNQ9iEZffdMl8wf1wiOowoKggamC2VzUkUQbI9YoKagMlIHUlx24nXZa21 v21lQMbQY5X3NZVszOT6gY+FEc/ZH8HX3yXDIOx/QVcvavYi86SO9FHau1kPkB2D0tnd NUEJ8O7jhl1WzGWtsp4MQtW2hzFdb3o/WOQEUsLVaCRn/y0WhGwj/AFAOHsTfHvdUYHX FmBA== X-Gm-Message-State: ALQs6tCVRR88QadQlVWNEVWNN65ChWm5osk/mhpgDClkKnD1m0DDeqP/ obB/FraZhZUR4Bl/fvU9szg= X-Google-Smtp-Source: AB8JxZqo7tAVRwQYddzVP+mUzceLX3nxlXiNyeWoENLWZdBDMeB+VCd+AUHiqmJmD7ASGMrm23FVkA== X-Received: by 2002:adf:83a2:: with SMTP id 31-v6mr21503042wre.19.1525441033247; Fri, 04 May 2018 06:37:13 -0700 (PDT) Received: from localhost (p200300E41F041C0032947E635CB49D15.dip0.t-ipconnect.de. [2003:e4:1f04:1c00:3294:7e63:5cb4:9d15]) by smtp.gmail.com with ESMTPSA id y42-v6sm21952682wry.21.2018.05.04.06.37.12 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 04 May 2018 06:37:12 -0700 (PDT) From: Thierry Reding To: Thierry Reding Cc: Dmitry Osipenko , linux-tegra@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: [PATCH 3/4] drm/tegra: gr3d: Properly clean up resources Date: Fri, 4 May 2018 15:37:06 +0200 Message-Id: <20180504133707.22451-3-thierry.reding@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180504133707.22451-1-thierry.reding@gmail.com> References: <20180504133707.22451-1-thierry.reding@gmail.com> Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Thierry Reding Failure to register the Tegra DRM client would leak the resources. Move cleanup code to error unwinding gotos to fix that and share the cleanup code with the other error paths. Signed-off-by: Thierry Reding Reviewed-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/gr3d.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/tegra/gr3d.c b/drivers/gpu/drm/tegra/gr3d.c index ce5120683091..e129f1afff33 100644 --- a/drivers/gpu/drm/tegra/gr3d.c +++ b/drivers/gpu/drm/tegra/gr3d.c @@ -52,8 +52,8 @@ static int gr3d_init(struct host1x_client *client) client->syncpts[0] = host1x_syncpt_request(client, flags); if (!client->syncpts[0]) { - host1x_channel_put(gr3d->channel); - return -ENOMEM; + err = -ENOMEM; + goto put; } if (tegra->domain) { @@ -65,15 +65,30 @@ static int gr3d_init(struct host1x_client *client) dev_err(client->dev, "failed to attach to domain: %d\n", err); - host1x_syncpt_free(client->syncpts[0]); - host1x_channel_put(gr3d->channel); iommu_group_put(gr3d->group); - return err; + goto free; } } } - return tegra_drm_register_client(dev->dev_private, drm); + err = tegra_drm_register_client(dev->dev_private, drm); + if (err < 0) { + dev_err(client->dev, "failed to register client: %d\n", err); + goto detach; + } + + return 0; + +detach: + if (gr3d->group) { + iommu_detach_group(tegra->domain, gr3d->group); + iommu_group_put(gr3d->group); + } +free: + host1x_syncpt_free(client->syncpts[0]); +put: + host1x_channel_put(gr3d->channel); + return err; } static int gr3d_exit(struct host1x_client *client) From patchwork Fri May 4 13:37:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 908725 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="n01FlU0+"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40ctNY29nfz9s3Z for ; Fri, 4 May 2018 23:37:17 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751277AbeEDNhQ (ORCPT ); Fri, 4 May 2018 09:37:16 -0400 Received: from mail-wr0-f196.google.com ([209.85.128.196]:34641 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751114AbeEDNhQ (ORCPT ); Fri, 4 May 2018 09:37:16 -0400 Received: by mail-wr0-f196.google.com with SMTP id p18-v6so21159845wrm.1 for ; Fri, 04 May 2018 06:37:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=p5el8ahHK7y9e6lwQeE8WOZf1nPxnV+qQUf/RmEv/bQ=; b=n01FlU0+c8qtXAji5b/CcxrH9x35lB6Yrdx5RXTXpCy8+Za/W7KSMxKSfpzawVBn/z eluorRcTm+VY8jYyRoPcC7IT6lMjpO16Nd0qUndsTnUbVkRkkSnvjvL8vqZqbnZRNjay 3aDun3/PMlo7div7R9GE5xgiUawkA59LAGbfzh3tucFdkJTOHOilvzNDppu/jEVwjvcK KNH7+08QHpM1cZkJlYcch93gofw/3HLkJam6DMAB4jaq/4b2uzRIYOm1Qb1hNtHKJE4z 08KxkRO6vbRqJQTNAe4n0Tq1aX57w8xKgokpn9hGmNXOnYQ8Ec2kovZQejjMb210yhY1 9kJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=p5el8ahHK7y9e6lwQeE8WOZf1nPxnV+qQUf/RmEv/bQ=; b=HpeA1P5+XGh3rwOSW2KjKm1DZNR5Qtiikp3rdBgnZ87efEWwlf2G6DhcxWZFSZ9LSl iP9iePr7XlACsHihckm2JmwA9+vP4McPCw+sMYSGBboy8XwS21P9YGrm45deo7w1sUhF yzTUpRkCl4h0qqJ05wovTFkKV4inUMvA4r0e4p79zz4tq+N0+IX0entZXRuRgBoga/Q3 wHIvkj9LhBLHX5rjhc+QPfVo/cI8jL8sdXThy8SNuH6Hc2iHfEROSPnB0Ay9wiORXHs3 w/Xo0sZklvvtyts2y3j/1CxDEdQg0JkuM1qvIbAQat00Yq+r7wu+cwLNA222X5bh2WyL 7uAg== X-Gm-Message-State: ALQs6tCxgen1ziK68oiEoozc3Y+jpwq2PKzhfldvT/otLGaAKc9RgZZ2 oWHh8b8W9HwEYeXaskARYBU= X-Google-Smtp-Source: AB8JxZo8SSvJGoBrODJgmRpm/9Yy588rtUKRHHXt4oQwXs2E0YzHqpuMFlmEmD/OKp0ej3DkAT6G0g== X-Received: by 2002:adf:86b2:: with SMTP id 47-v6mr21588102wrx.256.1525441034777; Fri, 04 May 2018 06:37:14 -0700 (PDT) Received: from localhost (p200300E41F041C0032947E635CB49D15.dip0.t-ipconnect.de. [2003:e4:1f04:1c00:3294:7e63:5cb4:9d15]) by smtp.gmail.com with ESMTPSA id 12-v6sm2790053wmn.27.2018.05.04.06.37.13 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 04 May 2018 06:37:14 -0700 (PDT) From: Thierry Reding To: Thierry Reding Cc: Dmitry Osipenko , linux-tegra@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: [PATCH 4/4] drm/tegra: Refactor IOMMU attach/detach Date: Fri, 4 May 2018 15:37:07 +0200 Message-Id: <20180504133707.22451-4-thierry.reding@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180504133707.22451-1-thierry.reding@gmail.com> References: <20180504133707.22451-1-thierry.reding@gmail.com> Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Thierry Reding Attaching to and detaching from an IOMMU uses the same code sequence in every driver, so factor it out into separate helpers. Signed-off-by: Thierry Reding Reviewed-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/dc.c | 42 ++++++------------------------------ drivers/gpu/drm/tegra/drm.c | 42 ++++++++++++++++++++++++++++++++++++ drivers/gpu/drm/tegra/drm.h | 4 ++++ drivers/gpu/drm/tegra/gr2d.c | 32 +++++++-------------------- drivers/gpu/drm/tegra/gr3d.c | 31 ++++++-------------------- 5 files changed, 68 insertions(+), 83 deletions(-) diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index c843f11043db..3e7ec3937346 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c @@ -1837,21 +1837,11 @@ static int tegra_dc_init(struct host1x_client *client) if (!dc->syncpt) dev_warn(dc->dev, "failed to allocate syncpoint\n"); - if (tegra->domain) { - dc->group = iommu_group_get(client->dev); - - if (dc->group && dc->group != tegra->group) { - err = iommu_attach_group(tegra->domain, dc->group); - if (err < 0) { - dev_err(dc->dev, - "failed to attach to domain: %d\n", - err); - iommu_group_put(dc->group); - return err; - } - - tegra->group = dc->group; - } + dc->group = host1x_client_iommu_attach(client, true); + if (IS_ERR(dc->group)) { + err = PTR_ERR(dc->group); + dev_err(client->dev, "failed to attach to domain: %d\n", err); + return err; } if (dc->soc->wgrps) @@ -1916,15 +1906,7 @@ static int tegra_dc_init(struct host1x_client *client) if (!IS_ERR(primary)) drm_plane_cleanup(primary); - if (dc->group) { - if (dc->group == tegra->group) { - iommu_detach_group(tegra->domain, dc->group); - tegra->group = NULL; - } - - iommu_group_put(dc->group); - } - + host1x_client_iommu_detach(client, dc->group); host1x_syncpt_free(dc->syncpt); return err; @@ -1932,9 +1914,7 @@ static int tegra_dc_init(struct host1x_client *client) static int tegra_dc_exit(struct host1x_client *client) { - struct drm_device *drm = dev_get_drvdata(client->parent); struct tegra_dc *dc = host1x_client_to_dc(client); - struct tegra_drm *tegra = drm->dev_private; int err; devm_free_irq(dc->dev, dc->irq, dc); @@ -1945,15 +1925,7 @@ static int tegra_dc_exit(struct host1x_client *client) return err; } - if (dc->group) { - if (dc->group == tegra->group) { - iommu_detach_group(tegra->domain, dc->group); - tegra->group = NULL; - } - - iommu_group_put(dc->group); - } - + host1x_client_iommu_detach(client, dc->group); host1x_syncpt_free(dc->syncpt); return 0; diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c index 7afe2f635f74..bc1008305e1e 100644 --- a/drivers/gpu/drm/tegra/drm.c +++ b/drivers/gpu/drm/tegra/drm.c @@ -1114,6 +1114,48 @@ int tegra_drm_unregister_client(struct tegra_drm *tegra, return 0; } +struct iommu_group *host1x_client_iommu_attach(struct host1x_client *client, + bool shared) +{ + struct drm_device *drm = dev_get_drvdata(client->parent); + struct tegra_drm *tegra = drm->dev_private; + struct iommu_group *group = NULL; + int err; + + if (tegra->domain) { + group = iommu_group_get(client->dev); + + if (group && (!shared || (shared && (group != tegra->group)))) { + err = iommu_attach_group(tegra->domain, group); + if (err < 0) { + iommu_group_put(group); + return ERR_PTR(err); + } + + if (shared && !tegra->group) + tegra->group = group; + } + } + + return group; +} + +void host1x_client_iommu_detach(struct host1x_client *client, + struct iommu_group *group) +{ + struct drm_device *drm = dev_get_drvdata(client->parent); + struct tegra_drm *tegra = drm->dev_private; + + if (group) { + if (group == tegra->group) { + iommu_detach_group(tegra->domain, group); + tegra->group = NULL; + } + + iommu_group_put(group); + } +} + void *tegra_drm_alloc(struct tegra_drm *tegra, size_t size, dma_addr_t *dma) { struct iova *alloc; diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h index 4f41aaec8530..fe263cf58f34 100644 --- a/drivers/gpu/drm/tegra/drm.h +++ b/drivers/gpu/drm/tegra/drm.h @@ -110,6 +110,10 @@ int tegra_drm_register_client(struct tegra_drm *tegra, struct tegra_drm_client *client); int tegra_drm_unregister_client(struct tegra_drm *tegra, struct tegra_drm_client *client); +struct iommu_group *host1x_client_iommu_attach(struct host1x_client *client, + bool shared); +void host1x_client_iommu_detach(struct host1x_client *client, + struct iommu_group *group); int tegra_drm_init(struct tegra_drm *tegra, struct drm_device *drm); int tegra_drm_exit(struct tegra_drm *tegra); diff --git a/drivers/gpu/drm/tegra/gr2d.c b/drivers/gpu/drm/tegra/gr2d.c index 0b42e99da8ad..2cd0f66c8aa9 100644 --- a/drivers/gpu/drm/tegra/gr2d.c +++ b/drivers/gpu/drm/tegra/gr2d.c @@ -32,7 +32,6 @@ static int gr2d_init(struct host1x_client *client) struct tegra_drm_client *drm = host1x_to_drm_client(client); struct drm_device *dev = dev_get_drvdata(client->parent); unsigned long flags = HOST1X_SYNCPT_HAS_BASE; - struct tegra_drm *tegra = dev->dev_private; struct gr2d *gr2d = to_gr2d(drm); int err; @@ -47,22 +46,14 @@ static int gr2d_init(struct host1x_client *client) goto put; } - if (tegra->domain) { - gr2d->group = iommu_group_get(client->dev); - - if (gr2d->group) { - err = iommu_attach_group(tegra->domain, gr2d->group); - if (err < 0) { - dev_err(client->dev, - "failed to attach to domain: %d\n", - err); - iommu_group_put(gr2d->group); - goto free; - } - } + gr2d->group = host1x_client_iommu_attach(client, false); + if (IS_ERR(gr2d->group)) { + err = PTR_ERR(gr2d->group); + dev_err(client->dev, "failed to attach to domain: %d\n", err); + goto free; } - err = tegra_drm_register_client(tegra, drm); + err = tegra_drm_register_client(dev->dev_private, drm); if (err < 0) { dev_err(client->dev, "failed to register client: %d\n", err); goto detach; @@ -71,10 +62,7 @@ static int gr2d_init(struct host1x_client *client) return 0; detach: - if (gr2d->group) { - iommu_detach_group(tegra->domain, gr2d->group); - iommu_group_put(gr2d->group); - } + host1x_client_iommu_detach(client, gr2d->group); free: host1x_syncpt_free(client->syncpts[0]); put: @@ -94,14 +82,10 @@ static int gr2d_exit(struct host1x_client *client) if (err < 0) return err; + host1x_client_iommu_detach(client, gr2d->group); host1x_syncpt_free(client->syncpts[0]); host1x_channel_put(gr2d->channel); - if (gr2d->group) { - iommu_detach_group(tegra->domain, gr2d->group); - iommu_group_put(gr2d->group); - } - return 0; } diff --git a/drivers/gpu/drm/tegra/gr3d.c b/drivers/gpu/drm/tegra/gr3d.c index e129f1afff33..98e3c67d0fb5 100644 --- a/drivers/gpu/drm/tegra/gr3d.c +++ b/drivers/gpu/drm/tegra/gr3d.c @@ -42,7 +42,6 @@ static int gr3d_init(struct host1x_client *client) struct tegra_drm_client *drm = host1x_to_drm_client(client); struct drm_device *dev = dev_get_drvdata(client->parent); unsigned long flags = HOST1X_SYNCPT_HAS_BASE; - struct tegra_drm *tegra = dev->dev_private; struct gr3d *gr3d = to_gr3d(drm); int err; @@ -56,19 +55,11 @@ static int gr3d_init(struct host1x_client *client) goto put; } - if (tegra->domain) { - gr3d->group = iommu_group_get(client->dev); - - if (gr3d->group) { - err = iommu_attach_group(tegra->domain, gr3d->group); - if (err < 0) { - dev_err(client->dev, - "failed to attach to domain: %d\n", - err); - iommu_group_put(gr3d->group); - goto free; - } - } + gr3d->group = host1x_client_iommu_attach(client, false); + if (IS_ERR(gr3d->group)) { + err = PTR_ERR(gr3d->group); + dev_err(client->dev, "failed to attach to domain: %d\n", err); + goto free; } err = tegra_drm_register_client(dev->dev_private, drm); @@ -80,10 +71,7 @@ static int gr3d_init(struct host1x_client *client) return 0; detach: - if (gr3d->group) { - iommu_detach_group(tegra->domain, gr3d->group); - iommu_group_put(gr3d->group); - } + host1x_client_iommu_detach(client, gr3d->group); free: host1x_syncpt_free(client->syncpts[0]); put: @@ -95,7 +83,6 @@ static int gr3d_exit(struct host1x_client *client) { struct tegra_drm_client *drm = host1x_to_drm_client(client); struct drm_device *dev = dev_get_drvdata(client->parent); - struct tegra_drm *tegra = dev->dev_private; struct gr3d *gr3d = to_gr3d(drm); int err; @@ -103,14 +90,10 @@ static int gr3d_exit(struct host1x_client *client) if (err < 0) return err; + host1x_client_iommu_detach(client, gr3d->group); host1x_syncpt_free(client->syncpts[0]); host1x_channel_put(gr3d->channel); - if (gr3d->group) { - iommu_detach_group(tegra->domain, gr3d->group); - iommu_group_put(gr3d->group); - } - return 0; }