From patchwork Fri Feb 1 13:28:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 1034768 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="eNrTu+l1"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43rdH04N2Dz9sDX for ; Sat, 2 Feb 2019 00:29:00 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727925AbfBAN3A (ORCPT ); Fri, 1 Feb 2019 08:29:00 -0500 Received: from mail-wr1-f68.google.com ([209.85.221.68]:39127 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727823AbfBAN27 (ORCPT ); Fri, 1 Feb 2019 08:28:59 -0500 Received: by mail-wr1-f68.google.com with SMTP id t27so7091020wra.6 for ; Fri, 01 Feb 2019 05:28: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=xAKKOZF9oFirutnoZo4VmTh+czKnVpJM7PY4292UHtM=; b=eNrTu+l16OKZw3TseoUebvRhhLzlbuktmz2RP3pBSTs9n9o0PbNsVLrYOn2flt4mmT bA+tazHXR/yzLBz9xcAduJnNRiW09kjMJjxoDRKsMJboobTQ3PT9qGMoaJWEKC/6GpsD 8ZpIg4wIALOyerm5dp0YNre2pvcWxJAfGEz4cGU9JTkD9BNI2cVtnIZtaMHWvnsbRB4M NSu8+RkvQBVJQ1dUFCSS1KbyJcEnJLavb5N5J9gVq2W8Y/K4/Jd02SFBF4MzyPYaivYJ qmrzsqqizD1AjsHOijKBv+IYdXgLw5BLYCQB3xzqp/cq50o8sHhpMcQin8Btzg+kNwsd A6LA== 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=xAKKOZF9oFirutnoZo4VmTh+czKnVpJM7PY4292UHtM=; b=qh9l30juyhu/5LgaiE9mJNrz3uOAvKP3SpAV3wAFcYcujHT5W5Kr6bD9DeP770Z7+5 +LG/XSa0YKfLLq5R9EE84Y9IIeo7vWC+Pm3y+6KqTjiUBR6Q6ag6OGC5xg1DzDSKlIsV dEe8sFkLgxcD6Eo1QaoS5hl6dLDrym+K6QTA7xvX2djLRSj1D3UeS64AY2thUsmsyCBs 2AcVtnu3Cgs9NguZxqbzjbPgjm8ufZPE809QsYPMnKvnFQJqfMud9U9ssNKzg6FlDpJU MeQ/3hrLN/Yd0YCqlS9XSlI1Ei7TyLasffy6oD4p7y9EQ1cgGS/ym2BRiIqZFSaNl350 fHyw== X-Gm-Message-State: AJcUukfb67PdqyzKrFSyFn4pJIytyq9CWYbwjjf/xDXyrsHiHZIelvH8 Njfz5GgMZzdOnWJ5SnEIGt0= X-Google-Smtp-Source: ALg8bN7nRefhzWjim24cDe6FiyFLz9iv3f9FSQO4+fQ6nJn5MdZVEDO8lKApUOEYnIAjExx/pQz+GA== X-Received: by 2002:a5d:5111:: with SMTP id s17mr37572842wrt.43.1549027738011; Fri, 01 Feb 2019 05:28:58 -0800 (PST) Received: from localhost (pD9E51040.dip0.t-ipconnect.de. [217.229.16.64]) by smtp.gmail.com with ESMTPSA id t5sm1983466wmg.43.2019.02.01.05.28.57 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 01 Feb 2019 05:28: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 v3 12/16] drm/tegra: Setup shared IOMMU domain after initialization Date: Fri, 1 Feb 2019 14:28:33 +0100 Message-Id: <20190201132837.12327-13-thierry.reding@gmail.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190201132837.12327-1-thierry.reding@gmail.com> References: <20190201132837.12327-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. Reviewed-by: Dmitry Osipenko Signed-off-by: Thierry Reding Reviewed-by: Dmitry Osipenko Tested-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)