[igt-dev] [PATCH i-g-t] tests/i915/gem_huc_copy: Enable a HuC copy test

Antonio Argenziano antonio.argenziano at intel.com
Fri Dec 20 22:11:01 UTC 2019



On 19/12/19 15:50, Robert M. Fosha wrote:
> From: Sally Qi <feng.qi at intel.com>
> 
> This test case loads the HuC copy firmware to copy the content of
> the source buffer to the destination buffer.
> 
> v2: (Tony Ye)
>   * Restructured some functions and files.
>   * Defined the copy buffer size as 4K explicitly as the HuC Copy kernel
>     always copy 4K bytes from src buffer to dst buffer.
> 
> v3: (Feng Qi, Antonio Argenziano, Tony Ye)
>   * Restructured some functions as igt requested, exclude libdrm function call.
>   * Remove huc function wrappers
>   * Random initialize source input buffer
> 
> Signed-off-by: Sally Qi <feng.qi at intel.com>
> Signed-off-by: Tony Ye <tony.ye at intel.com>

LGTM but, I can't really comment on HuC stuff and possibly I am a bit 
out of the loop of the latest IGT code base.

Acked-by: Antonio Argenziano <antonio.argenziano at intel.com>

(Ofc fix the autotools build first ;))

> ---
>   lib/Makefile.sources      |   2 +
>   lib/huc_copy.c            | 109 +++++++++++++++++++++++++++++++++++++
>   lib/huc_copy.h            |  51 ++++++++++++++++++
>   lib/intel_batchbuffer.c   |  20 +++++++
>   lib/intel_batchbuffer.h   |  19 +++++++
>   lib/meson.build           |   1 +
>   tests/Makefile.sources    |   3 ++
>   tests/i915/gem_huc_copy.c | 111 ++++++++++++++++++++++++++++++++++++++
>   tests/meson.build         |   1 +
>   9 files changed, 317 insertions(+)
>   create mode 100644 lib/huc_copy.c
>   create mode 100644 lib/huc_copy.h
>   create mode 100644 tests/i915/gem_huc_copy.c
> 
> diff --git a/lib/Makefile.sources b/lib/Makefile.sources
> index 5dd3962e..e9e132c1 100644
> --- a/lib/Makefile.sources
> +++ b/lib/Makefile.sources
> @@ -78,6 +78,8 @@ lib_source_list =	 	\
>   	ioctl_wrappers.h	\
>   	media_fill.c		\
>   	media_fill.h            \
> +	huc_copy.c		\
> +	huc_copy.h		\
>   	media_spin.h		\
>   	media_spin.c		\
>   	gpgpu_fill.h		\
> diff --git a/lib/huc_copy.c b/lib/huc_copy.c
> new file mode 100644
> index 00000000..32541157
> --- /dev/null
> +++ b/lib/huc_copy.c
> @@ -0,0 +1,109 @@
> +/*
> + * Copyright © 2019 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + */
> +
> +#include <i915_drm.h>
> +#include "huc_copy.h"
> +
> +static void
> +gen9_emit_huc_virtual_addr_state(struct drm_i915_gem_exec_object2 *src,
> +		struct drm_i915_gem_exec_object2 *dst,
> +		struct drm_i915_gem_relocation_entry *reloc_src,
> +		struct drm_i915_gem_relocation_entry *reloc_dst,
> +		uint32_t *buf,
> +		int *i)
> +{
> +	buf[(*i)++] = HUC_VIRTUAL_ADDR_STATE;
> +
> +	for (int j = 0; j < HUC_VIRTUAL_ADDR_REGION_NUM; j++) {
> +		if (j == HUC_VIRTUAL_ADDR_REGION_SRC) {
> +			buf[(*i)++] = src->offset;
> +
> +			reloc_src->target_handle = src->handle;
> +			reloc_src->delta = 0;
> +			reloc_src->offset = (*i - 1) * sizeof(buf[0]);
> +			reloc_src->read_domains = 0;
> +			reloc_src->write_domain = 0;
> +		} else if (j == HUC_VIRTUAL_ADDR_REGION_DST) {
> +			buf[(*i)++] = dst->offset;
> +
> +			reloc_dst->target_handle = dst->handle;
> +			reloc_dst->delta = 0;
> +			reloc_dst->offset = (*i - 1) * sizeof(buf[0]);
> +			reloc_dst->read_domains = 0;
> +			reloc_dst->write_domain = I915_GEM_DOMAIN_RENDER;
> +		} else {
> +			buf[(*i)++] = 0;
> +		}
> +		buf[(*i)++] = 0;
> +		buf[(*i)++] = 0;
> +	}
> +}
> +
> +void
> +gen9_huc_copyfunc(int fd,
> +		struct drm_i915_gem_exec_object2 *src,
> +		struct drm_i915_gem_exec_object2 *dst,
> +		struct drm_i915_gem_exec_object2 *exec)
> +{
> +	struct drm_i915_gem_relocation_entry reloc[2];
> +	struct drm_i915_gem_execbuffer2 execbuf;
> +	int i = 0;
> +	uint32_t buf[63];
> +
> +	/* load huc kernel */
> +	buf[i++] = HUC_IMEM_STATE;
> +	buf[i++] = 0;
> +	buf[i++] = 0;
> +	buf[i++] = 0;
> +	buf[i++] = 0x3;
> +
> +	buf[i++] = MFX_WAIT;
> +	buf[i++] = MFX_WAIT;
> +
> +	buf[i++] = HUC_PIPE_MODE_SELECT;
> +	buf[i++] = 0;
> +	buf[i++] = 0;
> +
> +	buf[i++] = MFX_WAIT;
> +
> +	memset(reloc, 0, sizeof(reloc));
> +	gen9_emit_huc_virtual_addr_state(src, dst, &reloc[0], &reloc[1], buf, &i);
> +
> +	buf[i++] = HUC_START;
> +	buf[i++] = 1;
> +
> +	buf[i++] = MI_BATCH_BUFFER_END;
> +
> +	gem_write(fd, exec->handle, 0, buf, sizeof(buf));
> +	exec->relocation_count = 2;
> +	exec->relocs_ptr = to_user_pointer(reloc);
> +
> +	memset(&execbuf, 0, sizeof(execbuf));
> +	execbuf.buffers_ptr = to_user_pointer(src);
> +	execbuf.buffer_count = 3;
> +	execbuf.flags = I915_EXEC_BSD;
> +
> +	gem_execbuf(fd, &execbuf);
> +	gem_close(fd, exec->handle);
> +}
> diff --git a/lib/huc_copy.h b/lib/huc_copy.h
> new file mode 100644
> index 00000000..c435f6cb
> --- /dev/null
> +++ b/lib/huc_copy.h
> @@ -0,0 +1,51 @@
> +/*
> + * Copyright © 2019 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + */
> +
> +#ifndef HUC_COPY_H
> +#define HUC_COPY_H
> +
> +#include <stdint.h>
> +#include <string.h>
> +#include "ioctl_wrappers.h"
> +#include "intel_reg.h"
> +
> +#define PARALLEL_VIDEO_PIPE		(0x3<<29)
> +#define MFX_WAIT			(PARALLEL_VIDEO_PIPE|(0x1<<27)|(0x1<<8))
> +
> +#define HUC_IMEM_STATE			(PARALLEL_VIDEO_PIPE|(0x2<<27)|(0xb<<23)|(0x1<<16)|0x3)
> +#define HUC_PIPE_MODE_SELECT		(PARALLEL_VIDEO_PIPE|(0x2<<27)|(0xb<<23)|0x1)
> +#define HUC_START			(PARALLEL_VIDEO_PIPE|(0x2<<27)|(0xb<<23)|(0x21<<16))
> +#define HUC_VIRTUAL_ADDR_STATE		(PARALLEL_VIDEO_PIPE|(0x2<<27)|(0xb<<23)|(0x4<<16)|0x2f)
> +
> +#define HUC_VIRTUAL_ADDR_REGION_NUM	16
> +#define HUC_VIRTUAL_ADDR_REGION_SRC	0
> +#define HUC_VIRTUAL_ADDR_REGION_DST	14
> +
> +void
> +gen9_huc_copyfunc(int fd,
> +		struct drm_i915_gem_exec_object2 *src,
> +		struct drm_i915_gem_exec_object2 *dst,
> +		struct drm_i915_gem_exec_object2 *exec);
> +
> +#endif /* HUC_COPY_H */
> diff --git a/lib/intel_batchbuffer.c b/lib/intel_batchbuffer.c
> index 51aae4dc..d8cb9df3 100644
> --- a/lib/intel_batchbuffer.c
> +++ b/lib/intel_batchbuffer.c
> @@ -43,6 +43,7 @@
>   #include "ioctl_wrappers.h"
>   #include "media_spin.h"
>   #include "gpgpu_fill.h"
> +#include "huc_copy.h"
>   
>   #include <i915_drm.h>
>   
> @@ -942,3 +943,22 @@ igt_media_spinfunc_t igt_get_media_spinfunc(int devid)
>   
>   	return spin;
>   }
> +
> +/**
> + * igt_get_huc_copyfunc:
> + * @devid: pci device id
> + *
> + * Returns:
> + *
> + * The platform-specific huc copy function pointer for the device specified
> + * with @devid. Will return NULL when no media spin function is implemented.
> + */
> +igt_huc_copyfunc_t igt_get_huc_copyfunc(int devid)
> +{
> +	igt_huc_copyfunc_t copy = NULL;
> +
> +	if (IS_GEN12(devid) || IS_GEN11(devid) || IS_GEN9(devid))
> +		copy = gen9_huc_copyfunc;
> +
> +	return copy;
> +}
> diff --git a/lib/intel_batchbuffer.h b/lib/intel_batchbuffer.h
> index 37e3affe..5af585ed 100644
> --- a/lib/intel_batchbuffer.h
> +++ b/lib/intel_batchbuffer.h
> @@ -388,4 +388,23 @@ typedef void (*igt_media_spinfunc_t)(struct intel_batchbuffer *batch,
>   
>   igt_media_spinfunc_t igt_get_media_spinfunc(int devid);
>   
> +/**
> + * igt_huc_copyfunc_t:
> + * @fd: drm fd
> + * @src: source drm buffer
> + * @dst: destination drm buffer
> + * @exec: execution drm buffer
> + *
> + * This is the type of the per-platform huc copy functions.
> + *
> + * The huc copy function emits a batchbuffer to the VDBOX engine to
> + * invoke the HuC Copy kernel to copy 4K bytes from the source buffer
> + * to the destination buffer.
> + */
> +typedef void (*igt_huc_copyfunc_t)(int fd,
> +		struct drm_i915_gem_exec_object2 *src,
> +		struct drm_i915_gem_exec_object2 *dst,
> +		struct drm_i915_gem_exec_object2 *exec);
> +
> +igt_huc_copyfunc_t	igt_get_huc_copyfunc(int devid);
>   #endif
> diff --git a/lib/meson.build b/lib/meson.build
> index 57eb7d93..3d720683 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -1,5 +1,6 @@
>   lib_sources = [
>   	'drmtest.c',
> +	'huc_copy.c',
>   	'i915/gem_context.c',
>   	'i915/gem_engine_topology.c',
>   	'i915/gem_scheduler.c',
> diff --git a/tests/Makefile.sources b/tests/Makefile.sources
> index 806eb02d..8ba97bac 100644
> --- a/tests/Makefile.sources
> +++ b/tests/Makefile.sources
> @@ -313,6 +313,9 @@ gem_media_fill_SOURCES = i915/gem_media_fill.c
>   TESTS_progs += gem_media_vme
>   gem_media_vme_SOURCES = i915/gem_media_vme.c
>   
> +TESTS_progs += gem_huc_copy
> +gem_media_vme_SOURCES = i915/gem_huc_copy.c
> +
>   TESTS_progs += gem_mmap
>   gem_mmap_SOURCES = i915/gem_mmap.c
>   
> diff --git a/tests/i915/gem_huc_copy.c b/tests/i915/gem_huc_copy.c
> new file mode 100644
> index 00000000..f8da115d
> --- /dev/null
> +++ b/tests/i915/gem_huc_copy.c
> @@ -0,0 +1,111 @@
> +/*
> + * Copyright © 2019 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + */
> +#include "igt.h"
> +#include <stdbool.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <sys/ioctl.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <fcntl.h>
> +#include <inttypes.h>
> +#include <errno.h>
> +#include <sys/stat.h>
> +#include <sys/time.h>
> +#include "drm.h"
> +
> +IGT_TEST_DESCRIPTION("A very simple workload for the HuC.");
> +
> +#define HUC_COPY_DATA_BUF_SIZE	4096
> +
> +static void
> +compare_huc_copy_result(int drm_fd, uint32_t src_handle, uint32_t dst_handle)
> +{
> +	char src_output[HUC_COPY_DATA_BUF_SIZE];
> +	char dst_output[HUC_COPY_DATA_BUF_SIZE];
> +
> +	gem_read(drm_fd, src_handle, 0, src_output, HUC_COPY_DATA_BUF_SIZE);
> +	gem_read(drm_fd, dst_handle, 0, dst_output, HUC_COPY_DATA_BUF_SIZE);
> +
> +	for (int i = 0; i < HUC_COPY_DATA_BUF_SIZE; i++) {
> +		igt_assert_f(src_output[i] == dst_output[i],
> +				"Huc Copy failed!\n");
> +	}
> +}
> +
> +static bool
> +check_huc_status(int fd)
> +{
> +	int val = 0;
> +	struct drm_i915_getparam pg;
> +
> +	pg.param = I915_PARAM_HUC_STATUS;
> +	pg.value = &val;
> +	if (ioctl(fd, DRM_IOCTL_I915_GETPARAM, &pg) == 0) {
> +		return !!val;
> +	} else {
> +		return 0;
> +	}
> +}
> +
> +igt_main
> +{
> +	int drm_fd = -1;
> +	uint32_t devid;
> +	igt_huc_copyfunc_t huc_copy;
> +
> +	igt_fixture {
> +		drm_fd = drm_open_driver(DRIVER_INTEL);
> +		igt_require_gem(drm_fd);
> +		devid = intel_get_drm_devid(drm_fd);
> +		huc_copy = igt_get_huc_copyfunc(devid);
> +		igt_require_f(huc_copy, "no huc_copy function\n");
> +		igt_assert_f(check_huc_status(drm_fd) == true,
> +			"HuC is not successfully loaded!\n");
> +	}
> +
> +	igt_subtest_f("huc-copy") {
> +		char inputs[HUC_COPY_DATA_BUF_SIZE];
> +		struct drm_i915_gem_exec_object2 obj[3];
> +
> +		/* Initialize src buffer randomly */
> +		srand(time(NULL));
> +		for (int i = 0; i < HUC_COPY_DATA_BUF_SIZE; i++) {
> +			inputs[i] = (char) (rand() % 256);
> +		}
> +
> +		memset(obj, 0, sizeof(obj));
> +		obj[0].handle = gem_create(drm_fd, HUC_COPY_DATA_BUF_SIZE);
> +		obj[1].handle = gem_create(drm_fd, HUC_COPY_DATA_BUF_SIZE);
> +		obj[2].handle = gem_create(drm_fd, 4096);
> +
> +		gem_write(drm_fd, obj[0].handle, 0, inputs, HUC_COPY_DATA_BUF_SIZE);
> +
> +		huc_copy(drm_fd, &obj[0], &obj[1], &obj[2]);
> +		compare_huc_copy_result(drm_fd, obj[0].handle, obj[1].handle);
> +	}
> +
> +	igt_fixture {
> +		close(drm_fd);
> +	}
> +}
> diff --git a/tests/meson.build b/tests/meson.build
> index 570de545..0545b612 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -165,6 +165,7 @@ i915_progs = [
>   	'gem_gtt_cpu_tlb',
>   	'gem_gtt_hog',
>   	'gem_gtt_speed',
> +	'gem_huc_copy',
>   	'gem_largeobject',
>   	'gem_linear_blits',
>   	'gem_lut_handle',
> 


More information about the igt-dev mailing list