[igt-dev] [PATCH i-g-t] lib/igt_fb: Create AMD YUV buffers with AMD GEM IOCTL

Li, Sun peng (Leo) Sunpeng.Li at amd.com
Tue Apr 9 13:32:55 UTC 2019



On 2019-04-02 1:45 p.m., Nicholas Kazlauskas wrote:
> The kmstest_dumb_create API isn't suitable for creating multi-planar
> buffers since it tries to calculate the size based on the first plane's
> pitch only.
> 
> AMDGPU requires that the luma pitch be aligned to 256 for YUV buffers
> which results in crashes on kms_plane at pixel-format-pipe-*-planes tests
> when using kmstest_dumb_create since the buffer returned is smaller than
> needed (16384 size returned, 24576 size required).
> 
> Create and map the buffer with the correct size by using the AMD helpers
> introduced by this patch: igt_amd_create_bo and igt_amd_mmap_bo.
> 
> Cc: Harry Wentland <harry.wentland at amd.com>
> Cc: Leo Li <sunpeng.li at amd.com>

Reviewed-by: Leo Li <sunpeng.li at amd.com>

Thanks,
Leo

> Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>
> ---
>   lib/Makefile.sources |  2 ++
>   lib/igt_amd.c        | 56 ++++++++++++++++++++++++++++++++++++++++++++
>   lib/igt_amd.h        | 31 ++++++++++++++++++++++++
>   lib/igt_fb.c         |  9 ++++++-
>   lib/meson.build      |  1 +
>   5 files changed, 98 insertions(+), 1 deletion(-)
>   create mode 100644 lib/igt_amd.c
>   create mode 100644 lib/igt_amd.h
> 
> diff --git a/lib/Makefile.sources b/lib/Makefile.sources
> index e00347f9..a1d25351 100644
> --- a/lib/Makefile.sources
> +++ b/lib/Makefile.sources
> @@ -115,6 +115,8 @@ lib_source_list =	 	\
>   	igt_v3d.h		\
>   	igt_vc4.c		\
>   	igt_vc4.h		\
> +	igt_amd.c		\
> +	igt_amd.h		\
>   	$(NULL)
>   
>   .PHONY: version.h.tmp
> diff --git a/lib/igt_amd.c b/lib/igt_amd.c
> new file mode 100644
> index 00000000..abd3ad96
> --- /dev/null
> +++ b/lib/igt_amd.c
> @@ -0,0 +1,56 @@
> +/*
> + * Copyright 2019 Advanced Micro Devices, Inc.
> + *
> + * 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 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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_amd.h"
> +#include "igt.h"
> +#include <amdgpu_drm.h>
> +
> +uint32_t igt_amd_create_bo(int fd, uint64_t size)
> +{
> +	union drm_amdgpu_gem_create create;
> +
> +	memset(&create, 0, sizeof(create));
> +	create.in.bo_size = size;
> +	create.in.alignment = 256;
> +	create.in.domains = AMDGPU_GEM_DOMAIN_VRAM;
> +	create.in.domain_flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED
> +				 | AMDGPU_GEM_CREATE_VRAM_CLEARED;
> +
> +	do_ioctl(fd, DRM_IOCTL_AMDGPU_GEM_CREATE, &create);
> +	igt_assert(create.out.handle);
> +
> +	return create.out.handle;
> +}
> +
> +void *igt_amd_mmap_bo(int fd, uint32_t handle, uint64_t size, int prot)
> +{
> +	union drm_amdgpu_gem_mmap map;
> +	void *ptr;
> +
> +	memset(&map, 0, sizeof(map));
> +	map.in.handle = handle;
> +
> +	do_ioctl(fd, DRM_IOCTL_AMDGPU_GEM_MMAP, &map);
> +
> +	ptr = mmap(0, size, prot, MAP_SHARED, fd, map.out.addr_ptr);
> +	return ptr == MAP_FAILED ? NULL : ptr;
> +}
> diff --git a/lib/igt_amd.h b/lib/igt_amd.h
> new file mode 100644
> index 00000000..f63d26f4
> --- /dev/null
> +++ b/lib/igt_amd.h
> @@ -0,0 +1,31 @@
> +/*
> + * Copyright 2019 Advanced Micro Devices, Inc.
> + *
> + * 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 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 IGT_AMD_H
> +#define IGT_AMD_H
> +
> +#include <stdint.h>
> +
> +uint32_t igt_amd_create_bo(int fd, uint64_t size);
> +void *igt_amd_mmap_bo(int fd, uint32_t handle, uint64_t size, int prot);
> +
> +#endif /* IGT_AMD_H */
> diff --git a/lib/igt_fb.c b/lib/igt_fb.c
> index 6adf4222..f5c9a9f1 100644
> --- a/lib/igt_fb.c
> +++ b/lib/igt_fb.c
> @@ -38,6 +38,7 @@
>   #include "igt_kms.h"
>   #include "igt_matrix.h"
>   #include "igt_vc4.h"
> +#include "igt_amd.h"
>   #include "igt_x86.h"
>   #include "ioctl_wrappers.h"
>   #include "intel_batchbuffer.h"
> @@ -763,7 +764,8 @@ static int create_bo_for_fb(struct igt_fb *fb)
>   	 * them, so we need to make sure to use a device BO then.
>   	 */
>   	if (fb->modifier || fb->size || fb->strides[0] ||
> -	    (is_i915_device(fd) && igt_format_is_yuv(fb->drm_format)))
> +	    (is_i915_device(fd) && igt_format_is_yuv(fb->drm_format)) ||
> +	    (is_amdgpu_device(fd) && igt_format_is_yuv(fb->drm_format)))
>   		device_bo = true;
>   
>   	/* Sets offets and stride if necessary. */
> @@ -787,6 +789,8 @@ static int create_bo_for_fb(struct igt_fb *fb)
>   			if (fb->modifier == DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED)
>   				igt_vc4_set_tiling(fd, fb->gem_handle,
>   						   fb->modifier);
> +		} else if (is_amdgpu_device(fd)) {
> +			fb->gem_handle = igt_amd_create_bo(fd, fb->size);
>   		} else {
>   			igt_assert(false);
>   		}
> @@ -1832,6 +1836,9 @@ static void *map_bo(int fd, struct igt_fb *fb)
>   	else if (is_vc4_device(fd))
>   		ptr = igt_vc4_mmap_bo(fd, fb->gem_handle, fb->size,
>   				      PROT_READ | PROT_WRITE);
> +	else if (is_amdgpu_device(fd))
> +		ptr = igt_amd_mmap_bo(fd, fb->gem_handle, fb->size,
> +				      PROT_READ | PROT_WRITE);
>   	else
>   		igt_assert(false);
>   
> diff --git a/lib/meson.build b/lib/meson.build
> index 89de06e6..a8462933 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -54,6 +54,7 @@ lib_sources = [
>   	'igt_v3d.c',
>   	'igt_vc4.c',
>   	'igt_psr.c',
> +	'igt_amd.c'
>   ]
>   
>   lib_deps = [
> 


More information about the igt-dev mailing list