From patchwork Thu May 3 23:47:20 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 10382445 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BE76360159 for ; Sat, 5 May 2018 20:18:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AD00D28AB5 for ; Sat, 5 May 2018 20:18:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A197328AFB; Sat, 5 May 2018 20:18:29 +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.1 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED, T_DKIM_INVALID 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 30FA428AB5 for ; Sat, 5 May 2018 20:18:29 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 01D436E364; Sat, 5 May 2018 20:10:14 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-lf0-x244.google.com (mail-lf0-x244.google.com [IPv6:2a00:1450:4010:c07::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4CAC26E2B0 for ; Thu, 3 May 2018 23:52:10 +0000 (UTC) Received: by mail-lf0-x244.google.com with SMTP id v85-v6so28416514lfa.13 for ; Thu, 03 May 2018 16:52: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:in-reply-to:references; bh=VbdeM4Tv2Z8zr0fcrY174tfHjQ+S2otiHRFF4gyXPXQ=; b=OB8/N+I8BfJ+KGQPMXsYbArW6DChNZPPhxLprFV1RritxmFK3qMiEtQWIj+yl9az/c 0snjY/YBIHJhMfqGEnP8BvGA1xq+SqUrjzCYp59m8BXIuvDnBC9RPXuroTmVar8HE9Yx WPlEU2VCrFTpIIGSlsJHO59q+mOboewdCv91fCDA9GSelsOyMwckxEKBANq08Yf6qF8/ jKu3Ci9s3Xrrlo+xM6kVDDn9/f5n/6GygI4PNm+Z0wvVa67O+XF4C0D3vL7i0v180r1p /3AxJ3WlRvzSjzjsrkUMATpybXfR4k9dH4bIXU6nglU7/QGqjD3DbUZ/vbh2TzB/xnE1 ooHQ== 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=VbdeM4Tv2Z8zr0fcrY174tfHjQ+S2otiHRFF4gyXPXQ=; b=Nja/lsDuHbiFecbwOhcVdcdu830gi0hkdRFQlYfBSFkAQj4tHeqlcWQGecLrVdvfEn 7ghdvJnfybjMfZ9OQbECxXmKUO9hLfZmAL8lCzEnr5InO5CgYS3RpQV/7Fl11KvRcGkr ryhoRm2ykWWDaz/mgIzCizoFZDyZEhYL9p9Fzi2Bz501QgxkUqD5NDmG+kmZzeIpD/AC bTgWWdRhER8KKOBKUIpA8BinrYUidaiqX/rQGTiS42HRGCGs8gcJ9Cmuj+Metl4ZcDYy Rmon0HPQeolP9julqiybt3DWzMi4vfWgk9TTo+836I5TsT85ng3mpeFrmRYbxqPyrWrQ mSjA== X-Gm-Message-State: ALQs6tDFKset3e+Qdt+SyIfXYHZnRIP4tM7GoFsQFSvsaR2HWqGGPJed D6+8VCbPkRLb2bXr7+e9hCU= X-Google-Smtp-Source: AB8JxZriSuAzFP5+r7DWqapTbzMd9WWDup17ma5j2RZd9lxf0h/tapCTSySnsRgx6n2LWqeOEoR23w== X-Received: by 2002:a2e:958e:: with SMTP id w14-v6mr5800258ljh.75.1525391528833; Thu, 03 May 2018 16:52:08 -0700 (PDT) Received: from localhost.localdomain (ppp109-252-91-130.pppoe.spdop.ru. [109.252.91.130]) by smtp.gmail.com with ESMTPSA id m6-v6sm3077153lfb.61.2018.05.03.16.52.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 May 2018 16:52:08 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding Subject: [PATCH v1 2/5] drm/tegra: gr2d: Add IOMMU support Date: Fri, 4 May 2018 02:47:20 +0300 Message-Id: <20180503234723.4368-3-digetx@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180503234723.4368-1-digetx@gmail.com> References: <20180503234723.4368-1-digetx@gmail.com> X-Mailman-Approved-At: Sat, 05 May 2018 20:07:53 +0000 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-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Attach GR2D to the display IOMMU group in order to provide GR2D access to BO's IOVA. Signed-off-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/gr2d.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/tegra/gr2d.c b/drivers/gpu/drm/tegra/gr2d.c index 9a8ea93016a9..8eb530a85dd0 100644 --- a/drivers/gpu/drm/tegra/gr2d.c +++ b/drivers/gpu/drm/tegra/gr2d.c @@ -7,12 +7,14 @@ */ #include +#include #include "drm.h" #include "gem.h" #include "gr2d.h" struct gr2d { + struct iommu_group *group; struct tegra_drm_client client; struct host1x_channel *channel; struct clk *clk; @@ -30,7 +32,9 @@ 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; gr2d->channel = host1x_channel_request(client->dev); if (!gr2d->channel) @@ -42,23 +46,46 @@ static int gr2d_init(struct host1x_client *client) return -ENOMEM; } - return tegra_drm_register_client(dev->dev_private, drm); + 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); + host1x_syncpt_free(client->syncpts[0]); + host1x_channel_put(gr2d->channel); + iommu_group_put(gr2d->group); + return err; + } + } + } + + return tegra_drm_register_client(tegra, drm); } static int gr2d_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 gr2d *gr2d = to_gr2d(drm); int err; - err = tegra_drm_unregister_client(dev->dev_private, drm); + err = tegra_drm_unregister_client(tegra, drm); if (err < 0) return err; 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; }