From patchwork Wed May 26 13:00:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Auld X-Patchwork-Id: 12281635 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6086CC4708C for ; Wed, 26 May 2021 13:00:53 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2245A613D4 for ; Wed, 26 May 2021 13:00:53 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2245A613D4 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 554E66ED07; Wed, 26 May 2021 13:00:52 +0000 (UTC) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4AD416ED0E; Wed, 26 May 2021 13:00:49 +0000 (UTC) IronPort-SDR: eWBYzocwW8WQZ4XewrhoiAysCeg6DsV0FR0GXxy7SXU3CQaibdHfsowUAQt5+AAa02LSCdtJQ6 JzinRiFp7qBA== X-IronPort-AV: E=McAfee;i="6200,9189,9996"; a="182101761" X-IronPort-AV: E=Sophos;i="5.82,331,1613462400"; d="scan'208";a="182101761" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 May 2021 06:00:49 -0700 IronPort-SDR: +xrDMtWB3EGXzV2UW4GNw23YyrPwzOqBh7/lNEvDJ2By30QpDKbHzZ1DsYGM9Yb0hanQSxuAsV Z3shHY2+0Ybw== X-IronPort-AV: E=Sophos;i="5.82,331,1613462400"; d="scan'208";a="614942179" Received: from mschan-mobl1.amr.corp.intel.com (HELO mwauld-desk1.intel.com) ([10.212.100.144]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 May 2021 06:00:47 -0700 From: Matthew Auld To: igt-dev@lists.freedesktop.org Date: Wed, 26 May 2021 14:00:24 +0100 Message-Id: <20210526130025.249629-8-matthew.auld@intel.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: <20210526130025.249629-1-matthew.auld@intel.com> References: <20210526130025.249629-1-matthew.auld@intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH i-g-t v3 8/9] tests/i915/gem_create: exercise placements extension X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gfx@lists.freedesktop.org, Dominik Grzegorzek Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Add some explicit testcases for the create_ext placements extension. Signed-off-by: Matthew Auld Cc: Dominik Grzegorzek Cc: Joonas Lahtinen Acked-by: Petri Latvala --- tests/i915/gem_create.c | 188 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) diff --git a/tests/i915/gem_create.c b/tests/i915/gem_create.c index 8acc2f52..167d7d28 100644 --- a/tests/i915/gem_create.c +++ b/tests/i915/gem_create.c @@ -290,6 +290,184 @@ static void size_update(int fd) igt_assert_neq(create.size, size_initial_nonaligned); } +static void create_ext_placement_sanity_check(int fd) +{ + struct drm_i915_query_memory_regions *regions; + struct drm_i915_gem_create_ext_memory_regions setparam_region = { + .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS }, + }; + struct drm_i915_gem_memory_class_instance *uregions; + struct drm_i915_gem_memory_class_instance region_smem = { + .memory_class = I915_MEMORY_CLASS_SYSTEM, + .memory_instance = 0, + }; + struct drm_i915_gem_memory_class_instance region_invalid = { + .memory_class = -1, + .memory_instance = -1, + }; + uint64_t size; + uint32_t handle; + int i; + + regions = gem_get_query_memory_regions(fd); + igt_assert(regions); + igt_assert(regions->num_regions); + + /* + * extensions should be optional, giving us the normal gem_create + * behaviour. + */ + size = PAGE_SIZE; + igt_assert_eq(__gem_create_ext(fd, &size, &handle, 0), 0); + gem_close(fd, handle); + + /* Try some uncreative invalid combinations */ + setparam_region.regions = to_user_pointer(®ion_smem); + setparam_region.num_regions = 0; + size = PAGE_SIZE; + igt_assert_neq(__gem_create_ext(fd, &size, &handle, + &setparam_region.base), 0); + + setparam_region.regions = to_user_pointer(®ion_smem); + setparam_region.num_regions = regions->num_regions + 1; + size = PAGE_SIZE; + igt_assert_neq(__gem_create_ext(fd, &size, &handle, + &setparam_region.base), 0); + + setparam_region.regions = to_user_pointer(®ion_smem); + setparam_region.num_regions = -1; + size = PAGE_SIZE; + igt_assert_neq(__gem_create_ext(fd, &size, &handle, + &setparam_region.base), 0); + + setparam_region.regions = to_user_pointer(®ion_invalid); + setparam_region.num_regions = 1; + size = PAGE_SIZE; + igt_assert_neq(__gem_create_ext(fd, &size, &handle, + &setparam_region.base), 0); + + setparam_region.regions = to_user_pointer(®ion_invalid); + setparam_region.num_regions = 0; + size = PAGE_SIZE; + igt_assert_neq(__gem_create_ext(fd, &size, &handle, + &setparam_region.base), 0); + + uregions = calloc(regions->num_regions + 1, sizeof(uint32_t)); + + for (i = 0; i < regions->num_regions; i++) + uregions[i] = regions->regions[i].region; + + setparam_region.regions = to_user_pointer(uregions); + setparam_region.num_regions = regions->num_regions + 1; + size = PAGE_SIZE; + igt_assert_neq(__gem_create_ext(fd, &size, &handle, + &setparam_region.base), 0); + + if (regions->num_regions > 1) { + for (i = 0; i < regions->num_regions; i++) { + struct drm_i915_gem_memory_class_instance dups[] = { + regions->regions[i].region, + regions->regions[i].region, + }; + + setparam_region.regions = to_user_pointer(dups); + setparam_region.num_regions = 2; + size = PAGE_SIZE; + igt_assert_neq(__gem_create_ext(fd, &size, &handle, + &setparam_region.base), 0); + } + } + + uregions[rand() % regions->num_regions].memory_class = -1; + uregions[rand() % regions->num_regions].memory_instance = -1; + setparam_region.regions = to_user_pointer(uregions); + setparam_region.num_regions = regions->num_regions; + size = PAGE_SIZE; + igt_assert_neq(__gem_create_ext(fd, &size, &handle, + &setparam_region.base), 0); + + free(uregions); + + { + struct drm_i915_gem_create_ext_memory_regions setparam_region_next; + + setparam_region.regions = to_user_pointer(®ion_smem); + setparam_region.num_regions = 1; + + setparam_region_next = setparam_region; + setparam_region.base.next_extension = + to_user_pointer(&setparam_region_next); + + size = PAGE_SIZE; + igt_assert_neq(__gem_create_ext(fd, &size, &handle, + &setparam_region.base), 0); + setparam_region.base.next_extension = 0; + } + + free(regions); +} + +static void create_ext_placement_all(int fd) +{ + struct drm_i915_query_memory_regions *regions; + struct drm_i915_gem_create_ext_memory_regions setparam_region = { + .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS }, + }; + struct drm_i915_gem_memory_class_instance *uregions; + uint64_t size; + uint32_t handle; + int i; + + regions = gem_get_query_memory_regions(fd); + igt_assert(regions); + igt_assert(regions->num_regions); + + uregions = calloc(regions->num_regions, sizeof(*uregions)); + + for (i = 0; i < regions->num_regions; i++) + uregions[i] = regions->regions[i].region; + + setparam_region.regions = to_user_pointer(uregions); + setparam_region.num_regions = regions->num_regions; + + size = PAGE_SIZE; + igt_assert_eq(__gem_create_ext(fd, &size, &handle, + &setparam_region.base), 0); + gem_close(fd, handle); + free(uregions); + free(regions); +} + +static void create_ext_placement_each(int fd) +{ + struct drm_i915_query_memory_regions *regions; + struct drm_i915_gem_create_ext_memory_regions setparam_region = { + .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS }, + }; + int i; + + regions = gem_get_query_memory_regions(fd); + igt_assert(regions); + igt_assert(regions->num_regions); + + for (i = 0; i < regions->num_regions; i++) { + struct drm_i915_gem_memory_class_instance region = + regions->regions[i].region; + uint64_t size; + uint32_t handle; + + setparam_region.regions = to_user_pointer(®ion); + setparam_region.num_regions = 1; + + size = PAGE_SIZE; + igt_assert_eq(__gem_create_ext(fd, &size, &handle, + &setparam_region.base), 0); + gem_close(fd, handle); + } + + free(regions); +} + igt_main { int fd = -1; @@ -315,4 +493,14 @@ igt_main igt_subtest("busy-create") busy_create(fd, 30); + + igt_subtest("create-ext-placement-sanity-check") + create_ext_placement_sanity_check(fd); + + igt_subtest("create-ext-placement-each") + create_ext_placement_each(fd); + + igt_subtest("create-ext-placement-all") + create_ext_placement_all(fd); + }