From patchwork Wed May 13 12:07:57 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: ankitprasad.r.sharma@intel.com X-Patchwork-Id: 6396601 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 B2408BEEE5 for ; Wed, 13 May 2015 12:21:57 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B73EE203EB for ; Wed, 13 May 2015 12:21:56 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 6CAA2203ED for ; Wed, 13 May 2015 12:21:55 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 15BE57A00C; Wed, 13 May 2015 05:21:55 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTP id A4F3D7A00C for ; Wed, 13 May 2015 05:21:53 -0700 (PDT) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga101.jf.intel.com with ESMTP; 13 May 2015 05:21:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,420,1427785200"; d="scan'208";a="725256237" Received: from ankitprasad-desktop.iind.intel.com ([10.223.82.39]) by fmsmga002.fm.intel.com with ESMTP; 13 May 2015 05:21:52 -0700 From: ankitprasad.r.sharma@intel.com To: intel-gfx@lists.freedesktop.org Date: Wed, 13 May 2015 17:37:57 +0530 Message-Id: <1431518877-19583-3-git-send-email-ankitprasad.r.sharma@intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1431518877-19583-1-git-send-email-ankitprasad.r.sharma@intel.com> References: <1431518877-19583-1-git-send-email-ankitprasad.r.sharma@intel.com> Cc: Ankitprasad Sharma , akash.goel@intel.com, shashidhar.hiremath@intel.com Subject: [Intel-gfx] [PATCH 2/2] drm/i915: Extend GET_APERTURE ioctl to report size of the stolen region 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.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, 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 From: Ankitprasad Sharma This patch extends the GET_APERTURE ioctl to add support for getting total size and available size of the stolen region as well as single largest block available in the stolen region. Also adds debugfs support to retieve the size information of the stolen area. v2: respinned over Rodrigo's patch which extends the GET_APERTURE too. Used drm_mm to get the size information of the stolen region (Chris) Added debugfs support for testing (Ankit) Signed-off-by: Ankitprasad Sharma Tested-By: Intel Graphics QA PRTS (Patch Regression Test System Contact: shuang.he@intel.com) --- drivers/gpu/drm/i915/i915_debugfs.c | 6 ++++++ drivers/gpu/drm/i915/i915_drv.h | 3 +++ drivers/gpu/drm/i915/i915_gem.c | 7 +++++++ drivers/gpu/drm/i915/i915_gem_stolen.c | 35 ++++++++++++++++++++++++++++++++++ include/uapi/drm/i915_drm.h | 15 +++++++++++++++ 5 files changed, 66 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 70c6df2..8814205 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -521,6 +521,12 @@ static int i915_gem_aperture_info(struct seq_file *m, void *data) arg.fence_available_size); seq_printf(m, "Single largest fence available: %llu bytes\n", arg.fence_largest_size); + seq_printf(m, "Total size of the stolen region: %llu bytes\n", + arg.stolen_total_size); + seq_printf(m, "Available size of the stolen region: %llu bytes\n", + arg.stolen_available_size); + seq_printf(m, "Single largest area in the stolen region: %llu bytes\n", + arg.stolen_largest_size); return 0; } diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 21a2b1f..617136a 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -2950,6 +2950,9 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev, u32 stolen_offset, u32 gtt_offset, u32 size); +void i915_gem_stolen_size_info(struct drm_mm *mm, uint64_t *stolen_total, + uint64_t *stolen_free, + uint64_t *stolen_largest); /* i915_gem_shrinker.c */ unsigned long i915_gem_shrink(struct drm_i915_private *dev_priv, diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index fd964b0..a9f24d6 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -203,6 +203,7 @@ i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, struct list_head map_list; const u32 map_limit = dev_priv->gtt.mappable_end; size_t pinned, map_space, map_largest, fence_space, fence_largest; + uint64_t stolen_total, stolen_available, stolen_largest; u32 last, size; INIT_LIST_HEAD(&map_list); @@ -260,6 +261,9 @@ skip_first: fence_largest = size; fence_space += size; } + + i915_gem_stolen_size_info(&dev_priv->mm.stolen, &stolen_total, + &stolen_available, &stolen_largest); mutex_unlock(&dev->struct_mutex); args->aper_size = dev_priv->gtt.base.total; @@ -269,6 +273,9 @@ skip_first: args->map_total_size = dev_priv->gtt.mappable_end; args->fence_available_size = fence_space; args->fence_largest_size = fence_largest; + args->stolen_total_size = stolen_total; + args->stolen_available_size = stolen_available; + args->stolen_largest_size = stolen_largest; return 0; } diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c index 0a38d71..1fcb092 100644 --- a/drivers/gpu/drm/i915/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c @@ -650,3 +650,38 @@ err_out: drm_gem_object_unreference(&obj->base); return NULL; } + +void i915_gem_stolen_size_info(struct drm_mm *mm, uint64_t *stolen_total, + uint64_t *stolen_free, + uint64_t *stolen_largest) +{ + struct drm_mm_node *entry; + struct drm_mm_node *head_node = &mm->head_node; + uint64_t hole_size, hole_start, hole_end, largest_hole = 0; + uint64_t total_used = 0, total_free = 0; + + if (head_node->hole_follows) { + hole_start = drm_mm_hole_node_start(head_node); + hole_end = drm_mm_hole_node_end(head_node); + hole_size = hole_end - hole_start; + total_free += hole_size; + if (largest_hole < hole_size) + largest_hole = hole_size; + } + + drm_mm_for_each_node(entry, mm) { + total_used += entry->size; + if (entry->hole_follows) { + hole_start = drm_mm_hole_node_start(entry); + hole_end = drm_mm_hole_node_end(entry); + hole_size = hole_end - hole_start; + total_free += hole_size; + if (largest_hole < hole_size) + largest_hole = hole_size; + } + } + + *stolen_total = total_free + total_used; + *stolen_free = total_free; + *stolen_largest = largest_hole; +} diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h index ce22415..8fdd537 100644 --- a/include/uapi/drm/i915_drm.h +++ b/include/uapi/drm/i915_drm.h @@ -957,6 +957,21 @@ struct drm_i915_gem_get_aperture { * Single largest fenceable region, in bytes. */ __u64 fence_largest_size; + + /** + * Total space in the stolen region, in bytes + */ + __u64 stolen_total_size; + + /** + * Available space in the stolen region, in bytes + */ + __u64 stolen_available_size; + + /** + * Single largest block in stolen region, in bytes + */ + __u64 stolen_largest_size; }; struct drm_i915_get_pipe_from_crtc_id {