All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rodrigo Vivi <rodrigo.vivi@intel.com>
To: Alan Previn <alan.previn.teres.alexis@intel.com>
Cc: igt-dev@lists.freedesktop.org
Subject: Re: [igt-dev] [PATCH i-g-t 04/17] Add basic PXP testing of buffer and context alloc
Date: Wed, 2 Jun 2021 16:23:35 -0400	[thread overview]
Message-ID: <YLfox8RJtwE2JNYw@intel.com> (raw)
In-Reply-To: <20210518103344.2264397-5-alan.previn.teres.alexis@intel.com>

On Tue, May 18, 2021 at 03:33:31AM -0700, Alan Previn wrote:
> Test PXP capability support as well as the allocation of protected
> buffers and protected contexts.
> 
> Signed-off-by: Alan Previn <alan.previn.teres.alexis@intel.com>
> ---
>  tests/i915/gem_pxp.c | 353 +++++++++++++++++++++++++++++++++++++++++++
>  tests/meson.build    |   1 +
>  2 files changed, 354 insertions(+)
>  create mode 100644 tests/i915/gem_pxp.c

I'm not sure gem_pxp is the best name for this. Specially when we start
adding display cases.

Could we go with pxp.c only?

anyway, the content is great.

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

> 
> diff --git a/tests/i915/gem_pxp.c b/tests/i915/gem_pxp.c
> new file mode 100644
> index 00000000..8779dddc
> --- /dev/null
> +++ b/tests/i915/gem_pxp.c
> @@ -0,0 +1,353 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2021 Intel Corporation
> + */
> +
> +#include "igt.h"
> +#include "i915/gem.h"
> +
> +IGT_TEST_DESCRIPTION("Test PXP that manages protected content through arbitrated HW-PXP-session");
> +/* Note: PXP = "Protected Xe Path" */
> +
> +static bool is_pxp_hw_supported(int i915)
> +{
> +	uint32_t devid = intel_get_drm_devid(i915);
> +
> +	if (IS_TIGERLAKE(devid) || IS_ROCKETLAKE(devid) || IS_ALDERLAKE_S(devid))
> +		return true;
> +
> +	return false;
> +}
> +
> +static int create_bo_ext(int i915, uint32_t size, bool protected_is_true, uint32_t *bo_out)
> +{
> +	int ret;
> +
> +	struct drm_i915_gem_create_ext_protected_content protected_ext = {
> +		.base = { .name = I915_GEM_CREATE_EXT_PROTECTED_CONTENT },
> +		.flags = 0,
> +	};
> +
> +	struct drm_i915_gem_create_ext create_ext = {
> +		.size = size,
> +		.extensions = 0,
> +	};
> +
> +	if (protected_is_true)
> +		create_ext.extensions = (uintptr_t)&protected_ext;
> +
> +	ret = igt_ioctl(i915, DRM_IOCTL_I915_GEM_CREATE_EXT, &create_ext);
> +	if (!ret)
> +		*bo_out = create_ext.handle;
> +
> +	return ret;
> +}
> +
> +static void test_bo_alloc_pxp_nohw(int i915)
> +{
> +	int ret;
> +	uint32_t bo;
> +
> +	ret = create_bo_ext(i915, 4096, false, &bo);
> +	igt_assert_eq(ret, 0);
> +	gem_close(i915, bo);
> +
> +	ret = create_bo_ext(i915, 4096, true, &bo);
> +	igt_assert_eq(ret, -ENODEV);
> +	igt_assert_eq(bo, 0);
> +}
> +
> +static void test_bo_alloc_pxp_off(int i915)
> +{
> +	int ret;
> +	uint32_t bo;
> +
> +	ret = create_bo_ext(i915, 4096, false, &bo);
> +	igt_assert_eq(ret, 0);
> +	gem_close(i915, bo);
> +}
> +
> +static void test_bo_alloc_pxp_on(int i915)
> +{
> +	int ret;
> +	uint32_t bo;
> +
> +	ret = create_bo_ext(i915, 4096, true, &bo);
> +	igt_assert_eq(ret, 0);
> +	gem_close(i915, bo);
> +}
> +
> +static int create_ctx_with_params(int i915, bool with_protected_param, bool protected_is_true,
> +				  bool with_recoverable_param, bool recoverable_is_true,
> +				  uint32_t *ctx_out)
> +{
> +	int ret;
> +
> +	struct drm_i915_gem_context_create_ext_setparam p_prot = {
> +		.base = {
> +			.name = I915_CONTEXT_CREATE_EXT_SETPARAM,
> +			.next_extension = 0,
> +		},
> +		.param = {
> +			.param = I915_CONTEXT_PARAM_PROTECTED_CONTENT,
> +			.value = 0,
> +		}
> +	};
> +	struct drm_i915_gem_context_create_ext_setparam p_norecover = {
> +		.base = {
> +			.name = I915_CONTEXT_CREATE_EXT_SETPARAM,
> +			.next_extension = 0,
> +		},
> +		.param = {
> +			.param = I915_CONTEXT_PARAM_RECOVERABLE,
> +			.value = 0,
> +		}
> +	};
> +	struct drm_i915_gem_context_create_ext create = {
> +		.flags = I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS,
> +		.extensions = 0,
> +	};
> +
> +	p_prot.param.value = protected_is_true;
> +	p_norecover.param.value = recoverable_is_true;
> +
> +	if (with_protected_param && with_recoverable_param) {
> +		create.extensions = to_user_pointer(&(p_norecover.base));
> +		p_norecover.base.next_extension = to_user_pointer(&(p_prot.base));
> +	} else if (!with_protected_param && with_recoverable_param) {
> +		create.extensions = to_user_pointer(&(p_norecover.base));
> +		p_norecover.base.next_extension = 0;
> +	} else if (with_protected_param && !with_recoverable_param) {
> +		create.extensions = to_user_pointer(&(p_prot.base));
> +		p_prot.base.next_extension = 0;
> +	} else if (!with_protected_param && !with_recoverable_param) {
> +		create.flags = 0;
> +	}
> +
> +	ret = __gem_ctx_create_ext(i915, &create);
> +	if (!ret)
> +		*ctx_out = create.ctx_id;
> +
> +	return ret;
> +}
> +
> +#define CHANGE_PARAM_PROTECTED 0x0001
> +#define CHANGE_PARAM_RECOVERY 0x0002
> +
> +static int modify_ctx_param(int i915, uint32_t ctx_id, uint32_t param_mask, bool param_value)
> +{
> +	int ret;
> +
> +	struct drm_i915_gem_context_param ctx_param = {
> +		.ctx_id = ctx_id,
> +		.param = 0,
> +		.value = 0,
> +	};
> +
> +	if (param_mask == CHANGE_PARAM_PROTECTED) {
> +		ctx_param.param = I915_CONTEXT_PARAM_PROTECTED_CONTENT;
> +		ctx_param.value = (int)param_value;
> +	} else if (param_mask == CHANGE_PARAM_RECOVERY) {
> +		ctx_param.param = I915_CONTEXT_PARAM_RECOVERABLE;
> +		ctx_param.value = (int)param_value;
> +	}
> +
> +	ret = igt_ioctl(i915, DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &ctx_param);
> +
> +	return ret;
> +}
> +
> +static int get_ctx_protected_param(int i915, uint32_t ctx_id)
> +{
> +	int ret;
> +
> +	struct drm_i915_gem_context_param ctx_param = {
> +		.ctx_id = ctx_id,
> +		.param = I915_CONTEXT_PARAM_PROTECTED_CONTENT,
> +	};
> +
> +	ret = igt_ioctl(i915, DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM, &ctx_param);
> +	igt_assert_eq(ret, 0);
> +
> +	return ctx_param.value;
> +}
> +
> +static int get_ctx_recovery_param(int i915, uint32_t ctx_id)
> +{
> +	int ret;
> +
> +	struct drm_i915_gem_context_param ctx_param = {
> +		.ctx_id = ctx_id,
> +		.param = I915_CONTEXT_PARAM_RECOVERABLE,
> +	};
> +
> +	ret = igt_ioctl(i915, DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM, &ctx_param);
> +	igt_assert_eq(ret, 0);
> +
> +	return ctx_param.value;
> +}
> +
> +static void test_ctx_alloc_pxp_nohw(int i915)
> +{
> +	uint32_t ctx;
> +
> +	igt_assert_eq(create_ctx_with_params(i915, true, true, true, false, &ctx), -ENODEV);
> +	igt_assert_eq(create_ctx_with_params(i915, true, false, true, false, &ctx), 0);
> +	igt_assert_eq(get_ctx_protected_param(i915, ctx), 0);
> +	igt_assert_eq(get_ctx_recovery_param(i915, ctx), 0);
> +	gem_context_destroy(i915, ctx);
> +}
> +
> +static void test_ctx_alloc_recover_off_protect_off(int i915)
> +{
> +	uint32_t ctx;
> +
> +	igt_assert_eq(create_ctx_with_params(i915, true, false, true, false, &ctx), 0);
> +	igt_assert_eq(get_ctx_protected_param(i915, ctx), 0);
> +	igt_assert_eq(get_ctx_recovery_param(i915, ctx), 0);
> +	gem_context_destroy(i915, ctx);
> +}
> +
> +static void test_ctx_alloc_recover_off_protect_on(int i915)
> +{
> +	uint32_t ctx;
> +
> +	igt_assert_eq(create_ctx_with_params(i915, true, true, true, false, &ctx), 0);
> +	igt_assert_eq(get_ctx_protected_param(i915, ctx), 1);
> +	igt_assert_eq(get_ctx_recovery_param(i915, ctx), 0);
> +	gem_context_destroy(i915, ctx);
> +}
> +
> +static void test_ctx_alloc_recover_on_protect_off(int i915)
> +{
> +	uint32_t ctx;
> +
> +	igt_assert_eq(create_ctx_with_params(i915, true, false, true, true, &ctx), 0);
> +	igt_assert_eq(get_ctx_protected_param(i915, ctx), 0);
> +	igt_assert_eq(get_ctx_recovery_param(i915, ctx), 1);
> +	gem_context_destroy(i915, ctx);
> +}
> +
> +static void test_ctx_alloc_recover_on_protect_on(int i915)
> +{
> +	uint32_t ctx;
> +
> +	igt_assert_eq(create_ctx_with_params(i915, true, true, true, true, &ctx), -EPERM);
> +	igt_assert_eq(create_ctx_with_params(i915, true, true, false, false, &ctx), -EPERM);
> +}
> +
> +static void test_ctx_mod_recover_off_to_on(int i915)
> +{
> +	uint32_t ctx;
> +
> +	igt_assert_eq(create_ctx_with_params(i915, true, true, true, false, &ctx), 0);
> +	igt_assert_eq(get_ctx_protected_param(i915, ctx), 1);
> +	igt_assert_eq(get_ctx_recovery_param(i915, ctx), 0);
> +	igt_assert_eq(modify_ctx_param(i915, ctx, CHANGE_PARAM_RECOVERY, true), -EPERM);
> +	igt_assert_eq(get_ctx_recovery_param(i915, ctx), 0);
> +	gem_context_destroy(i915, ctx);
> +}
> +
> +static void test_ctx_mod_protected_on_to_off(int i915)
> +{
> +	uint32_t ctx;
> +
> +	igt_assert_eq(create_ctx_with_params(i915, true, true, true, false, &ctx), 0);
> +	igt_assert_eq(get_ctx_protected_param(i915, ctx), 1);
> +	igt_assert_eq(get_ctx_recovery_param(i915, ctx), 0);
> +	igt_assert_eq(modify_ctx_param(i915, ctx, CHANGE_PARAM_PROTECTED, false), -EPERM);
> +	igt_assert_eq(get_ctx_protected_param(i915, ctx), 1);
> +	igt_assert_eq(get_ctx_recovery_param(i915, ctx), 0);
> +	gem_context_destroy(i915, ctx);
> +}
> +
> +static void test_ctx_mod_protected_to_all_invalid(int i915)
> +{
> +	uint32_t ctx;
> +
> +	igt_assert_eq(create_ctx_with_params(i915, true, true, true, false, &ctx), 0);
> +	igt_assert_eq(get_ctx_protected_param(i915, ctx), 1);
> +	igt_assert_eq(get_ctx_recovery_param(i915, ctx), 0);
> +	igt_assert_eq(modify_ctx_param(i915, ctx, CHANGE_PARAM_RECOVERY, true), -EPERM);
> +	igt_assert_eq(modify_ctx_param(i915, ctx, CHANGE_PARAM_PROTECTED, false), -EPERM);
> +	igt_assert_eq(get_ctx_protected_param(i915, ctx), 1);
> +	igt_assert_eq(get_ctx_recovery_param(i915, ctx), 0);
> +	gem_context_destroy(i915, ctx);
> +}
> +
> +static void test_ctx_mod_regular_to_all_valid(int i915)
> +{
> +	uint32_t ctx;
> +
> +	igt_assert_eq(create_ctx_with_params(i915, false, false, false, false, &ctx), 0);
> +	igt_assert_eq(get_ctx_protected_param(i915, ctx), 0);
> +	igt_assert_eq(get_ctx_recovery_param(i915, ctx), 1);
> +	igt_assert_eq(modify_ctx_param(i915, ctx, CHANGE_PARAM_RECOVERY, false), 0);
> +	igt_assert_eq(modify_ctx_param(i915, ctx, CHANGE_PARAM_PROTECTED, true), -EPERM);
> +	igt_assert_eq(get_ctx_protected_param(i915, ctx), 0);
> +	igt_assert_eq(get_ctx_recovery_param(i915, ctx), 0);
> +	gem_context_destroy(i915, ctx);
> +}
> +
> +igt_main
> +{
> +	int i915 = -1;
> +	bool pxp_supported = false;
> +
> +	igt_fixture
> +	{
> +		i915 = drm_open_driver(DRIVER_INTEL);
> +		igt_require(i915);
> +		igt_require_gem(i915);
> +		pxp_supported = is_pxp_hw_supported(i915);
> +	}
> +
> +	igt_subtest_group {
> +		igt_fixture {
> +			igt_require((pxp_supported == 0));
> +		}
> +
> +		igt_describe("Verify protected buffer on unsupported hw:");
> +		igt_subtest("hw-rejects-pxp-buffer")
> +			test_bo_alloc_pxp_nohw(i915);
> +		igt_describe("Verify protected context on unsupported hw:");
> +		igt_subtest("hw-rejects-pxp-context")
> +			test_ctx_alloc_pxp_nohw(i915);
> +	}
> +
> +	igt_subtest_group {
> +		igt_fixture {
> +			igt_require(pxp_supported);
> +		}
> +
> +		igt_describe("Verify protected buffer on supported hw:");
> +		igt_subtest("create-regular-buffer")
> +			test_bo_alloc_pxp_off(i915);
> +		igt_subtest("create-protected-buffer")
> +			test_bo_alloc_pxp_on(i915);
> +
> +		igt_describe("Verify protected context on supported hw:");
> +		igt_subtest("create-regular-context-1")
> +			test_ctx_alloc_recover_off_protect_off(i915);
> +		igt_subtest("create-regular-context-2")
> +			test_ctx_alloc_recover_on_protect_off(i915);
> +		igt_subtest("fail-invalid-protected-context")
> +			test_ctx_alloc_recover_on_protect_on(i915);
> +		igt_subtest("create-valid-protected-context")
> +			test_ctx_alloc_recover_off_protect_on(i915);
> +
> +		igt_describe("Verify protected context integrity:");
> +		igt_subtest("reject-modify-context-protection-on")
> +			test_ctx_mod_regular_to_all_valid(i915);
> +		igt_subtest("reject-modify-context-protection-off-1")
> +			test_ctx_mod_recover_off_to_on(i915);
> +		igt_subtest("reject-modify-context-protection-off-2")
> +			test_ctx_mod_protected_on_to_off(i915);
> +		igt_subtest("reject-modify-context-protection-off-3")
> +			test_ctx_mod_protected_to_all_invalid(i915);
> +	}
> +
> +	igt_fixture {
> +		close(i915);
> +	}
> +}
> diff --git a/tests/meson.build b/tests/meson.build
> index 19cc4ebe..e0bff4d1 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -187,6 +187,7 @@ i915_progs = [
>  	'gem_pread_after_blit',
>  	'gem_pwrite',
>  	'gem_pwrite_snooped',
> +	'gem_pxp',
>  	'gem_read_read_speed',
>  	'gem_readwrite',
>  	'gem_reg_read',
> -- 
> 2.25.1
> 
> _______________________________________________
> igt-dev mailing list
> igt-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

  reply	other threads:[~2021-06-02 20:23 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-18 10:33 [igt-dev] [PATCH i-g-t 00/17] Introduce PXP Test Alan Previn
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 01/17] Sync i915_drm.h UAPI from kernel Alan Previn
2021-06-02 20:07   ` Rodrigo Vivi
2021-06-03  0:15     ` Teres Alexis, Alan Previn
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 02/17] Add PXP UAPI support in i915_drm.h Alan Previn
2021-06-02 20:10   ` Rodrigo Vivi
2021-06-03  0:50     ` Teres Alexis, Alan Previn
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 03/17] Update IOCTL wrapper with DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT Alan Previn
2021-06-02 20:10   ` Rodrigo Vivi
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 04/17] Add basic PXP testing of buffer and context alloc Alan Previn
2021-06-02 20:23   ` Rodrigo Vivi [this message]
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 05/17] Perform a regular 3d copy as a control checkpoint Alan Previn
2021-06-02 21:37   ` Rodrigo Vivi
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 06/17] Add PXP attribute support in batchbuffer and buffer_ops libs Alan Previn
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 07/17] Add MI_SET_APPID instruction definition Alan Previn
2021-06-02 21:40   ` Rodrigo Vivi
2021-06-03  0:54     ` Teres Alexis, Alan Previn
2021-06-03 15:06       ` Rodrigo Vivi
2021-06-03  8:52   ` Michal Wajdeczko
2021-06-03 15:22     ` Teres Alexis, Alan Previn
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 08/17] Enable protected session cmd in gen12_render_copyfunc Alan Previn
2021-06-04 13:16   ` Rodrigo Vivi
2021-06-10 17:36     ` Teres Alexis, Alan Previn
2021-06-10 19:55       ` Rodrigo Vivi
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 09/17] Add subtest to copy raw source to protected dest Alan Previn
2021-06-04 13:22   ` Rodrigo Vivi
2021-06-05  1:30     ` Teres Alexis, Alan Previn
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 10/17] Add test where both src and dest are protected Alan Previn
2021-06-04 13:31   ` Rodrigo Vivi
2021-06-05  1:38     ` Teres Alexis, Alan Previn
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 11/17] Verify PXP teardown occurred through suspend-resume Alan Previn
2021-06-03 21:40   ` Rodrigo Vivi
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 12/17] Verify execbuf fails with stale PXP context after teardown Alan Previn
2021-06-04 13:38   ` Rodrigo Vivi
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 13/17] Verify execbuf fails with stale PXP buffer " Alan Previn
2021-06-03 21:41   ` Rodrigo Vivi
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 14/17] Verify execbuf ok with stale prot-buff and regular context Alan Previn
2021-06-04 13:56   ` Rodrigo Vivi
2021-06-05  0:27     ` Teres Alexis, Alan Previn
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 15/17] Ensure RESET_STATS reports invalidated protected context Alan Previn
2021-06-03 21:43   ` Rodrigo Vivi
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 16/17] Verify protected surfaces are dma buffer sharable Alan Previn
2021-06-04 14:18   ` Rodrigo Vivi
2021-06-05  0:45     ` Teres Alexis, Alan Previn
2021-05-18 10:33 ` [igt-dev] [PATCH i-g-t 17/17] tests/i915_pxp: CRC validation for display tests Alan Previn
2021-06-04 14:40   ` Rodrigo Vivi
2021-06-05  1:07     ` Teres Alexis, Alan Previn
2021-06-10 13:00       ` Shankar, Uma
2021-06-10 14:17         ` Rodrigo Vivi
2021-05-18 11:30 ` [igt-dev] ✓ Fi.CI.BAT: success for Introduce PXP Test (rev5) Patchwork
2021-05-18 18:19 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
2021-06-02 21:44   ` Rodrigo Vivi
2021-06-03 18:09     ` Teres Alexis, Alan Previn
2021-06-03 18:13       ` Rodrigo Vivi
  -- strict thread matches above, loose matches on Subject: below --
2021-05-15 23:01 [igt-dev] [PATCH i-g-t 00/17] Introduce PXP Test Alan Previn
2021-05-15 23:01 ` [igt-dev] [PATCH i-g-t 04/17] Add basic PXP testing of buffer and context alloc Alan Previn
2021-05-17  3:10   ` Dixit, Ashutosh
2021-05-17 10:26   ` Petri Latvala
2021-05-17 14:42     ` Dixit, Ashutosh
2021-05-17 14:50       ` Petri Latvala
2021-05-17 16:34         ` Teres Alexis, Alan Previn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YLfox8RJtwE2JNYw@intel.com \
    --to=rodrigo.vivi@intel.com \
    --cc=alan.previn.teres.alexis@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.