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: 908377 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="OB8/N+I8"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40cX5G74X2z9s1d for ; Fri, 4 May 2018 09:52:50 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751195AbeECXwM (ORCPT ); Thu, 3 May 2018 19:52:12 -0400 Received: from mail-lf0-f68.google.com ([209.85.215.68]:38677 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751234AbeECXwK (ORCPT ); Thu, 3 May 2018 19:52:10 -0400 Received: by mail-lf0-f68.google.com with SMTP id f18-v6so2808752lfc.5; Thu, 03 May 2018 16:52:09 -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=YWU2M0D7Bi1hpbeTo4WUm8fpeVxXyjmojftbNgNJ5ucSumYMirnagDLQWcgVPpsa6j KSTTU9QK0sU2zteRs1uLjRqkfcAAR3e3qXn6yLsT85/HYXSX6C1dfbsb2p4ROVNzikaq GkIE+ORHTKeF41yrQaSkUu9ropHVc6Goavv0SXv8WGXlI2Bo2bV52jDkSJ+4ZmXk52yZ eCYo7miRBnAddvyLVRLt6mAPKvO1SNlW9XUYoAxib/FAHH2naag2clK9gneOfOorSbOE BhnpBCwtzNFo4N6f0WQNImxED7kC0yqOFmO9YU10D1Dbj19Wt2qUGzFsSIf2wjG+9OMx PHSQ== X-Gm-Message-State: ALQs6tBnd0+mA31mbPDWN1I/BqXVhpieWY8UudAU9NunCaZQlVspQIMZ +QWfDTkpl+Y270/B1c0deO3FICrJ 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 Cc: dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org 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> Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org 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; }