From patchwork Mon Jul 29 16:54:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Welty, Brian" X-Patchwork-Id: 11064227 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0A91113A4 for ; Mon, 29 Jul 2019 16:54:52 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EE60426E3A for ; Mon, 29 Jul 2019 16:54:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E2E1428780; Mon, 29 Jul 2019 16:54:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 297182873C for ; Mon, 29 Jul 2019 16:54:51 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 4559F89C07; Mon, 29 Jul 2019 16:54:42 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4016389C07; Mon, 29 Jul 2019 16:54:39 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Jul 2019 09:54:38 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,323,1559545200"; d="scan'208";a="176478858" Received: from nperf12.hd.intel.com ([10.127.88.161]) by orsmga006.jf.intel.com with ESMTP; 29 Jul 2019 09:54:38 -0700 From: Brian Welty To: dri-devel@lists.freedesktop.org, Daniel Vetter , intel-gfx@lists.freedesktop.org Subject: [RFC PATCH 3/3] drm/i915: Update intel_memory_region to use nested drm_mem_region Date: Mon, 29 Jul 2019 12:54:57 -0400 Message-Id: <20190729165457.18500-4-brian.welty@intel.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190729165457.18500-1-brian.welty@intel.com> References: <20190729165457.18500-1-brian.welty@intel.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Some fields are deleted from intel_memory_region in favor of instead using the new nested drm_mem_region structure. Note, this is based upon unmerged i915 series [1] in order to show how i915 might begin to integrate the proposed drm_mem_region. [1] https://lists.freedesktop.org/archives/intel-gfx/2019-June/203649.html Signed-off-by: Brian Welty --- drivers/gpu/drm/i915/gem/i915_gem_object.c | 2 +- drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 2 +- drivers/gpu/drm/i915/i915_gem_gtt.c | 10 +++---- drivers/gpu/drm/i915/i915_gpu_error.c | 2 +- drivers/gpu/drm/i915/i915_query.c | 2 +- drivers/gpu/drm/i915/intel_memory_region.c | 10 ++++--- drivers/gpu/drm/i915/intel_memory_region.h | 19 ++++---------- drivers/gpu/drm/i915/intel_region_lmem.c | 26 +++++++++---------- .../drm/i915/selftests/intel_memory_region.c | 8 +++--- 9 files changed, 37 insertions(+), 44 deletions(-) diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c index 73d2d72adc19..7e56fd89a972 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c @@ -606,7 +606,7 @@ static int i915_gem_object_region_select(struct drm_i915_private *dev_priv, ret = i915_gem_object_migrate(obj, ce, id); if (!ret) { if (MEMORY_TYPE_FROM_REGION(region) == - INTEL_LMEM) { + DRM_MEM_VRAM) { /* * TODO: this should be part of get_pages(), * when async get_pages arrives diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c index d24f34443c4c..ac18e73665d4 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c @@ -53,7 +53,7 @@ static int shmem_get_pages(struct drm_i915_gem_object *obj) * If there's no chance of allocating enough pages for the whole * object, bail early. */ - if (obj->base.size > resource_size(&mem->region)) + if (obj->base.size > mem->region.size) return -ENOMEM; st = kmalloc(sizeof(*st), GFP_KERNEL); diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 2288a55f27f1..f4adc7e397ff 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c @@ -2737,20 +2737,20 @@ int i915_gem_init_memory_regions(struct drm_i915_private *i915) for (i = 0; i < ARRAY_SIZE(intel_region_map); i++) { struct intel_memory_region *mem = NULL; - u32 type; + u8 type; if (!HAS_REGION(i915, BIT(i))) continue; type = MEMORY_TYPE_FROM_REGION(intel_region_map[i]); switch (type) { - case INTEL_SMEM: + case DRM_MEM_SYSTEM: mem = i915_gem_shmem_setup(i915); break; - case INTEL_STOLEN: + case DRM_MEM_STOLEN: mem = i915_gem_stolen_setup(i915); break; - case INTEL_LMEM: + case DRM_MEM_VRAM: mem = i915_gem_setup_fake_lmem(i915); break; } @@ -2762,7 +2762,7 @@ int i915_gem_init_memory_regions(struct drm_i915_private *i915) } mem->id = intel_region_map[i]; - mem->type = type; + mem->region.type = type; mem->instance = MEMORY_INSTANCE_FROM_REGION(intel_region_map[i]); i915->regions[i] = mem; diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 9feb597f2b01..908691c3aadb 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c @@ -1048,7 +1048,7 @@ i915_error_object_create(struct drm_i915_private *i915, struct intel_memory_region *mem = vma->obj->memory_region; for_each_sgt_dma(dma, iter, vma->pages) { - s = io_mapping_map_atomic_wc(&mem->iomap, dma); + s = io_mapping_map_atomic_wc(&mem->region.iomap, dma); ret = compress_page(compress, s, dst); io_mapping_unmap_atomic(s); diff --git a/drivers/gpu/drm/i915/i915_query.c b/drivers/gpu/drm/i915/i915_query.c index 21c4c2592d6c..d16b4a6688e8 100644 --- a/drivers/gpu/drm/i915/i915_query.c +++ b/drivers/gpu/drm/i915/i915_query.c @@ -184,7 +184,7 @@ static int query_memregion_info(struct drm_i915_private *dev_priv, continue; info.id = region->id; - info.size = resource_size(®ion->region); + info.size = region->region.size; if (__copy_to_user(info_ptr, &info, sizeof(info))) return -EFAULT; diff --git a/drivers/gpu/drm/i915/intel_memory_region.c b/drivers/gpu/drm/i915/intel_memory_region.c index ab57b94b27a9..dcf077c23a72 100644 --- a/drivers/gpu/drm/i915/intel_memory_region.c +++ b/drivers/gpu/drm/i915/intel_memory_region.c @@ -200,7 +200,7 @@ i915_memory_region_get_pages_buddy(struct drm_i915_gem_object *obj) int i915_memory_region_init_buddy(struct intel_memory_region *mem) { - return i915_buddy_init(&mem->mm, resource_size(&mem->region), + return i915_buddy_init(&mem->mm, mem->region.size, mem->min_page_size); } @@ -285,10 +285,12 @@ intel_memory_region_create(struct drm_i915_private *i915, return ERR_PTR(-ENOMEM); mem->i915 = i915; - mem->region = (struct resource)DEFINE_RES_MEM(start, size); - mem->io_start = io_start; - mem->min_page_size = min_page_size; mem->ops = ops; + /* FIXME drm_mem_region_init? */ + mem->region.start = start; + mem->region.size = size; + mem->region.io_start = io_start; + mem->min_page_size = min_page_size; mutex_init(&mem->obj_lock); INIT_LIST_HEAD(&mem->objects); diff --git a/drivers/gpu/drm/i915/intel_memory_region.h b/drivers/gpu/drm/i915/intel_memory_region.h index 4960096ec30f..fc00d43f07a7 100644 --- a/drivers/gpu/drm/i915/intel_memory_region.h +++ b/drivers/gpu/drm/i915/intel_memory_region.h @@ -19,14 +19,8 @@ struct intel_memory_region; struct sg_table; /** - * Base memory type + * Define supported memory regions */ -enum intel_memory_type { - INTEL_SMEM = 0, - INTEL_LMEM, - INTEL_STOLEN, -}; - enum intel_region_id { INTEL_MEMORY_SMEM = 0, INTEL_MEMORY_LMEM, @@ -47,9 +41,9 @@ enum intel_region_id { * Memory regions encoded as type | instance */ static const u32 intel_region_map[] = { - [INTEL_MEMORY_SMEM] = BIT(INTEL_SMEM + INTEL_MEMORY_TYPE_SHIFT) | BIT(0), - [INTEL_MEMORY_LMEM] = BIT(INTEL_LMEM + INTEL_MEMORY_TYPE_SHIFT) | BIT(0), - [INTEL_MEMORY_STOLEN] = BIT(INTEL_STOLEN + INTEL_MEMORY_TYPE_SHIFT) | BIT(0), + [INTEL_MEMORY_SMEM] = BIT(DRM_MEM_SYSTEM + INTEL_MEMORY_TYPE_SHIFT) | BIT(0), + [INTEL_MEMORY_LMEM] = BIT(DRM_MEM_VRAM + INTEL_MEMORY_TYPE_SHIFT) | BIT(0), + [INTEL_MEMORY_STOLEN] = BIT(DRM_MEM_STOLEN + INTEL_MEMORY_TYPE_SHIFT) | BIT(0), }; struct intel_memory_region_ops { @@ -69,8 +63,7 @@ struct intel_memory_region { const struct intel_memory_region_ops *ops; - struct io_mapping iomap; - struct resource region; + struct drm_mem_region region; /* For faking for lmem */ struct drm_mm_node fake_mappable; @@ -78,10 +71,8 @@ struct intel_memory_region { struct i915_buddy_mm mm; struct mutex mm_lock; - resource_size_t io_start; resource_size_t min_page_size; - unsigned int type; unsigned int instance; unsigned int id; diff --git a/drivers/gpu/drm/i915/intel_region_lmem.c b/drivers/gpu/drm/i915/intel_region_lmem.c index afde9be72a12..6f0ce0314b98 100644 --- a/drivers/gpu/drm/i915/intel_region_lmem.c +++ b/drivers/gpu/drm/i915/intel_region_lmem.c @@ -250,7 +250,7 @@ static int i915_gem_init_fake_lmem_bar(struct intel_memory_region *mem) int ret; mem->fake_mappable.start = 0; - mem->fake_mappable.size = resource_size(&mem->region); + mem->fake_mappable.size = mem->region.size; mem->fake_mappable.color = I915_COLOR_UNEVICTABLE; ret = drm_mm_reserve_node(&ggtt->vm.mm, &mem->fake_mappable); @@ -277,7 +277,7 @@ static void region_lmem_release(struct intel_memory_region *mem) { i915_gem_relase_fake_lmem_bar(mem); - io_mapping_fini(&mem->iomap); + io_mapping_fini(&mem->region.iomap); i915_memory_region_release_buddy(mem); } @@ -294,14 +294,14 @@ region_lmem_init(struct intel_memory_region *mem) } } - if (!io_mapping_init_wc(&mem->iomap, - mem->io_start, - resource_size(&mem->region))) + if (!io_mapping_init_wc(&mem->region.iomap, + mem->region.io_start, + mem->region.size)) return -EIO; ret = i915_memory_region_init_buddy(mem); if (ret) - io_mapping_fini(&mem->iomap); + io_mapping_fini(&mem->region.iomap); return ret; } @@ -321,7 +321,7 @@ void __iomem *i915_gem_object_lmem_io_map_page(struct drm_i915_gem_object *obj, offset = i915_gem_object_get_dma_address(obj, n); offset -= intel_graphics_fake_lmem_res.start; - return io_mapping_map_atomic_wc(&obj->memory_region->iomap, offset); + return io_mapping_map_atomic_wc(&obj->memory_region->region.iomap, offset); } void __iomem *i915_gem_object_lmem_io_map(struct drm_i915_gem_object *obj, @@ -335,7 +335,7 @@ void __iomem *i915_gem_object_lmem_io_map(struct drm_i915_gem_object *obj, offset = i915_gem_object_get_dma_address(obj, n); offset -= intel_graphics_fake_lmem_res.start; - return io_mapping_map_wc(&obj->memory_region->iomap, offset, size); + return io_mapping_map_wc(&obj->memory_region->region.iomap, offset, size); } resource_size_t i915_gem_object_lmem_io_offset(struct drm_i915_gem_object *obj, @@ -352,14 +352,14 @@ resource_size_t i915_gem_object_lmem_io_offset(struct drm_i915_gem_object *obj, daddr = i915_gem_object_get_dma_address(obj, n); daddr -= intel_graphics_fake_lmem_res.start; - return mem->io_start + daddr; + return mem->region.io_start + daddr; } bool i915_gem_object_is_lmem(struct drm_i915_gem_object *obj) { - struct intel_memory_region *region = obj->memory_region; + struct intel_memory_region *mem = obj->memory_region; - return region && region->type == INTEL_LMEM; + return mem && mem->region.type == DRM_MEM_VRAM; } struct drm_i915_gem_object * @@ -395,9 +395,9 @@ i915_gem_setup_fake_lmem(struct drm_i915_private *i915) io_start, ®ion_lmem_ops); if (!IS_ERR(mem)) { - DRM_INFO("Intel graphics fake LMEM: %pR\n", &mem->region); + DRM_INFO("Intel graphics fake LMEM: %pR\n", mem); DRM_INFO("Intel graphics fake LMEM IO start: %llx\n", - (u64)mem->io_start); + (u64)mem->region.io_start); } return mem; diff --git a/drivers/gpu/drm/i915/selftests/intel_memory_region.c b/drivers/gpu/drm/i915/selftests/intel_memory_region.c index 9793f548a71a..1496f47a794a 100644 --- a/drivers/gpu/drm/i915/selftests/intel_memory_region.c +++ b/drivers/gpu/drm/i915/selftests/intel_memory_region.c @@ -32,7 +32,7 @@ static void close_objects(struct list_head *objects) static int igt_mock_fill(void *arg) { struct intel_memory_region *mem = arg; - resource_size_t total = resource_size(&mem->region); + resource_size_t total = mem->region.size; resource_size_t page_size; resource_size_t rem; unsigned long max_pages; @@ -98,7 +98,7 @@ static int igt_frag_region(struct intel_memory_region *mem, int err = 0; target = mem->mm.min_size; - total = resource_size(&mem->region); + total = mem->region.size; n_objects = total / target; while (n_objects--) { @@ -152,7 +152,7 @@ static int igt_mock_evict(void *arg) if (err) return err; - total = resource_size(&mem->region); + total = mem->region.size; target = mem->mm.min_size; while (target <= total / 2) { @@ -198,7 +198,7 @@ static int igt_mock_continuous(void *arg) if (err) return err; - total = resource_size(&mem->region); + total = mem->region.size; target = total / 2; /*