From patchwork Mon Jan 11 10:45:20 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 8001421 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 22082BEEE5 for ; Mon, 11 Jan 2016 10:47:47 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 39C4E2028D for ; Mon, 11 Jan 2016 10:47:46 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 2116C20279 for ; Mon, 11 Jan 2016 10:47:45 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 961CF6E2DB; Mon, 11 Jan 2016 02:47:40 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by gabe.freedesktop.org (Postfix) with ESMTPS id 41F806E2D6 for ; Mon, 11 Jan 2016 02:47:25 -0800 (PST) Received: by mail-wm0-f68.google.com with SMTP id u188so25624541wmu.0 for ; Mon, 11 Jan 2016 02:47:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=PX/0KR72XoBxmuORqhPQjf0mJcf1ehor+Vo9OYMHgak=; b=h/xrTuixbEhquwbAtx53g0NHoKyTsZ9Q/6oY5kkgILf6olWfa5a0eqWtL0LX0tCcqG kny//+zN455DP74wKydykPWeiMlq3GlVhFHtpyWTPe1NIRirAAmC2uaiXO+Li2e6NPxe +Hg9kzNNCjn4+y01DVtVzB6HAnsKa4MizovXUBJTLHBQPE56EkgUCNL3tYF6yzvO9Ndq 2lKknCyINbjnfsR5qHMSROvr6flpObzExWl+dqKpbOxAEd1zHvW1rLk3IrVpToFLR41r COsXJo/4mO0yVGx6nSShamFHCGkxA1TlfwFqyTn0+1LGtXqCbzoyQPTityp1Rw8nSdkL v1cQ== X-Received: by 10.194.133.164 with SMTP id pd4mr2608094wjb.133.1452509244070; Mon, 11 Jan 2016 02:47:24 -0800 (PST) Received: from haswell.alporthouse.com ([78.156.65.138]) by smtp.gmail.com with ESMTPSA id t3sm118879383wjz.11.2016.01.11.02.47.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 11 Jan 2016 02:47:23 -0800 (PST) From: Chris Wilson To: intel-gfx@lists.freedesktop.org Date: Mon, 11 Jan 2016 10:45:20 +0000 Message-Id: <1452509174-16671-50-git-send-email-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.7.0.rc3 In-Reply-To: <1452509174-16671-1-git-send-email-chris@chris-wilson.co.uk> References: <1452503961-14837-1-git-send-email-chris@chris-wilson.co.uk> <1452509174-16671-1-git-send-email-chris@chris-wilson.co.uk> Subject: [Intel-gfx] [PATCH 136/190] drm/i915: Move ioremap_wc tracking onto VMA X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP By tracking the iomapping on the VMA itself, we can share that area between multiple users. Also by only revoking the iomapping upon unbinding from the mappable portion of the GGTT, we can keep that iomap across multiple invocations (e.g. execlists context pinning). Signed-off-by: Chris Wilson --- drivers/gpu/drm/i915/i915_gem.c | 5 +++++ drivers/gpu/drm/i915/i915_gem_gtt.c | 33 +++++++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_gem_gtt.h | 4 ++++ drivers/gpu/drm/i915/intel_fbdev.c | 8 +++----- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 0c4e8e1aeeff..5bb21b20c36a 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -2699,6 +2699,11 @@ int i915_vma_unbind(struct i915_vma *vma) if (ret) return ret; + if (vma->iomap) { + iounmap(vma->iomap); + vma->iomap = NULL; + } + vma->map_and_fenceable = false; } diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index b8af904ad12c..3fcf2fd73453 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c @@ -3575,3 +3575,36 @@ int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level, return 0; } + +void *i915_vma_iomap(struct drm_i915_private *dev_priv, + struct i915_vma *vma) +{ + if (WARN_ON(!vma->map_and_fenceable)) + return ERR_PTR(-ENODEV); + + GEM_BUG_ON(!vma->is_ggtt); + GEM_BUG_ON((vma->bound & GLOBAL_BIND) == 0); + + if (vma->iomap == NULL) { + u32 base = dev_priv->gtt.mappable_base + vma->node.start; + void *ptr; + + ptr = ioremap_wc(base, vma->size); + if (ptr == NULL) { + int ret; + + /* Too many areas already allocated? */ + ret = i915_gem_evict_vm(vma->vm, true); + if (ret) + return ERR_PTR(ret); + + ptr = ioremap_wc(base, vma->size); + if (ptr == NULL) + return ERR_PTR(-ENOMEM); + } + + vma->iomap = ptr; + } + + return vma->iomap; +} diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h index 6b0f557982d5..0e0570e13a68 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.h +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h @@ -181,6 +181,7 @@ struct i915_vma { struct drm_mm_node node; struct drm_i915_gem_object *obj; struct i915_address_space *vm; + void *iomap; u64 size; struct i915_gem_active last_read[I915_NUM_RINGS]; @@ -579,4 +580,7 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev); int __must_check i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj); void i915_gem_gtt_finish_object(struct drm_i915_gem_object *obj); + +void *i915_vma_iomap(struct drm_i915_private *dev_priv, + struct i915_vma *vma); #endif diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c index 7decbca25dbb..8e7c341951fd 100644 --- a/drivers/gpu/drm/i915/intel_fbdev.c +++ b/drivers/gpu/drm/i915/intel_fbdev.c @@ -248,12 +248,10 @@ static int intelfb_create(struct drm_fb_helper *helper, info->fix.smem_start = dev->mode_config.fb_base + vma->node.start; info->fix.smem_len = vma->node.size; - info->screen_base = - ioremap_wc(dev_priv->gtt.mappable_base + vma->node.start, - vma->node.size); - if (!info->screen_base) { + info->screen_base = i915_vma_iomap(dev_priv, vma); + if (IS_ERR(info->screen_base)) { DRM_ERROR("Failed to remap framebuffer into virtual memory\n"); - ret = -ENOSPC; + ret = PTR_ERR(info->screen_base); goto out_destroy_fbi; } info->screen_size = vma->node.size;