From patchwork Wed Jan 23 09:39:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 1029816 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="H6AnJVcJ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43l0cw2GxQz9s9G for ; Wed, 23 Jan 2019 20:40:00 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727064AbfAWJkA (ORCPT ); Wed, 23 Jan 2019 04:40:00 -0500 Received: from mail-wm1-f68.google.com ([209.85.128.68]:33004 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726207AbfAWJj7 (ORCPT ); Wed, 23 Jan 2019 04:39:59 -0500 Received: by mail-wm1-f68.google.com with SMTP id r24so10513245wmh.0 for ; Wed, 23 Jan 2019 01:39:58 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=BvPmDgG4ulHqAQ+1bGKSPFPNzolLo9NaU9Nj+6RSRPw=; b=H6AnJVcJj5OcaX/wVT6jicj4bAzA5VTzioS+QBdGjVVAxYG9T0Yu0HFQKwrHUdJnU4 is5ExlsfJLkwnaTQDrdbefsYiCT4wX7lCa2HboXJBU96ksuwUj9rq5k2AXlOU2AEgy+q 4UHoUYrgn8vQobn4gmfZcT7xC2uVMwpJZmFnIfYzbQghoH9I7QqCGUDklnIFFUzztLIh xSb2S9Ka7W/FTrVbtGbvvWpupHObF2qt8pVDbHr5mUDpNzNWkPlwkhRCQxTp+X7o4e4Q u+W0wnHAaH1qlUe5Efry8qVKRfJDoOa5pVjLdyZn6QKHgm/XUGeqyzAIzSkgXKblYMKn QqYg== 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:mime-version:content-transfer-encoding; bh=BvPmDgG4ulHqAQ+1bGKSPFPNzolLo9NaU9Nj+6RSRPw=; b=W15t8eOGg+iu7p4kO6d875T3s1zaM1CHECxk/82xbtY4yW643dm+WuQXUK3CKczeAl yS6wRbh1wH5fnmFeukN0y9MpvsmvdlmRPvWadhztfYD6yOeH3zERLSl/dA+mtcGulW2d 4nJZrIAZ4BgzdX5pBSLziYkBjXAhpPrlVmtur3LaA/+qjpY0OUi9qZTx25821Hy6kgAL JpmmCALtl9n6inMc5BlTRdZfQjzmCnsruRX7Sx3FAQXTgfOKjY6Ux2yG8S19b2V/qu57 Xe9+NjW6mb6ClXjIll1K3TIw00Kz3XllZ65efgBruUTjr9IYXDIfIidFqe3sQOz5H9Fn eE7w== X-Gm-Message-State: AJcUukd6ME4ZlTzCnL6podERxbub0wi6HGKwKqczk8a64TrSEK4IEmEv OfrXDnAXa+l8UzTJunk+ym8= X-Google-Smtp-Source: ALg8bN5dd0S89GxPjnP24X/L/oxhR3dlkFeIvwqOLvP56+O+POOEamWNxAtMvljc+6zZRSSs63LXvA== X-Received: by 2002:a1c:1688:: with SMTP id 130mr1891566wmw.86.1548236397934; Wed, 23 Jan 2019 01:39:57 -0800 (PST) Received: from localhost (pD9E51040.dip0.t-ipconnect.de. [217.229.16.64]) by smtp.gmail.com with ESMTPSA id y13sm80982074wrn.73.2019.01.23.01.39.57 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 23 Jan 2019 01:39:57 -0800 (PST) From: Thierry Reding To: Thierry Reding Cc: Mikko Perttunen , Dmitry Osipenko , dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org Subject: [PATCH 3/5] drm/tegra: Setup shared IOMMU domain after initialization Date: Wed, 23 Jan 2019 10:39:49 +0100 Message-Id: <20190123093951.24908-4-thierry.reding@gmail.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190123093951.24908-1-thierry.reding@gmail.com> References: <20190123093951.24908-1-thierry.reding@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Thierry Reding Move initialization of the shared IOMMU domain after the host1x device has been initialized. At this point all the Tegra DRM clients have been attached to the shared IOMMU domain. This is important because Tegra186 and later use an ARM SMMU, for which the driver defers setting up the geometry for a domain until a device is attached to it. This is to ensure that the domain is properly set up for a specific ARM SMMU instance, which is unknown at allocation time. Signed-off-by: Thierry Reding Reviewed-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/drm.c | 54 ++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c index 61dcbd218ffc..271c7a5fc954 100644 --- a/drivers/gpu/drm/tegra/drm.c +++ b/drivers/gpu/drm/tegra/drm.c @@ -92,10 +92,6 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags) return -ENOMEM; if (iommu_present(&platform_bus_type)) { - u64 carveout_start, carveout_end, gem_start, gem_end; - struct iommu_domain_geometry *geometry; - unsigned long order; - tegra->domain = iommu_domain_alloc(&platform_bus_type); if (!tegra->domain) { err = -ENOMEM; @@ -105,27 +101,6 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags) err = iova_cache_get(); if (err < 0) goto domain; - - geometry = &tegra->domain->geometry; - gem_start = geometry->aperture_start; - gem_end = geometry->aperture_end - CARVEOUT_SZ; - carveout_start = gem_end + 1; - carveout_end = geometry->aperture_end; - - order = __ffs(tegra->domain->pgsize_bitmap); - init_iova_domain(&tegra->carveout.domain, 1UL << order, - carveout_start >> order); - - tegra->carveout.shift = iova_shift(&tegra->carveout.domain); - tegra->carveout.limit = carveout_end >> tegra->carveout.shift; - - drm_mm_init(&tegra->mm, gem_start, gem_end - gem_start + 1); - mutex_init(&tegra->mm_lock); - - DRM_DEBUG("IOMMU apertures:\n"); - DRM_DEBUG(" GEM: %#llx-%#llx\n", gem_start, gem_end); - DRM_DEBUG(" Carveout: %#llx-%#llx\n", carveout_start, - carveout_end); } mutex_init(&tegra->clients_lock); @@ -159,6 +134,35 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags) if (err < 0) goto fbdev; + if (tegra->domain) { + u64 carveout_start, carveout_end, gem_start, gem_end; + dma_addr_t start, end; + unsigned long order; + + start = tegra->domain->geometry.aperture_start; + end = tegra->domain->geometry.aperture_end; + + gem_start = start; + gem_end = end - CARVEOUT_SZ; + carveout_start = gem_end + 1; + carveout_end = end; + + order = __ffs(tegra->domain->pgsize_bitmap); + init_iova_domain(&tegra->carveout.domain, 1UL << order, + carveout_start >> order); + + tegra->carveout.shift = iova_shift(&tegra->carveout.domain); + tegra->carveout.limit = carveout_end >> tegra->carveout.shift; + + drm_mm_init(&tegra->mm, gem_start, gem_end - gem_start + 1); + mutex_init(&tegra->mm_lock); + + DRM_DEBUG("IOMMU apertures:\n"); + DRM_DEBUG(" GEM: %#llx-%#llx\n", gem_start, gem_end); + DRM_DEBUG(" Carveout: %#llx-%#llx\n", carveout_start, + carveout_end); + } + if (tegra->hub) { err = tegra_display_hub_prepare(tegra->hub); if (err < 0)