Blame tests/amdgpu/security_tests.c

Packit Service 103f6b
/*
Packit Service 103f6b
 * Copyright 2019 Advanced Micro Devices, Inc.
Packit Service 103f6b
 *
Packit Service 103f6b
 * Permission is hereby granted, free of charge, to any person obtaining a
Packit Service 103f6b
 * copy of this software and associated documentation files (the "Software"),
Packit Service 103f6b
 * to deal in the Software without restriction, including without limitation
Packit Service 103f6b
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
Packit Service 103f6b
 * and/or sell copies of the Software, and to permit persons to whom the
Packit Service 103f6b
 * Software is furnished to do so, subject to the following conditions:
Packit Service 103f6b
 *
Packit Service 103f6b
 * The above copyright notice and this permission notice shall be included in
Packit Service 103f6b
 * all copies or substantial portions of the Software.
Packit Service 103f6b
 *
Packit Service 103f6b
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit Service 103f6b
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit Service 103f6b
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
Packit Service 103f6b
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
Packit Service 103f6b
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Packit Service 103f6b
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Packit Service 103f6b
 * OTHER DEALINGS IN THE SOFTWARE.
Packit Service 103f6b
 *
Packit Service 103f6b
 */
Packit Service 103f6b
Packit Service 103f6b
#include "CUnit/Basic.h"
Packit Service 103f6b
Packit Service 103f6b
#include "amdgpu_test.h"
Packit Service 103f6b
#include "amdgpu_drm.h"
Packit Service 103f6b
#include "amdgpu_internal.h"
Packit Service 103f6b
Packit Service 103f6b
#include <string.h>
Packit Service 103f6b
#include <unistd.h>
Packit Service 103f6b
#include <endian.h>
Packit Service 103f6b
#include <strings.h>
Packit Service 103f6b
#include <xf86drm.h>
Packit Service 103f6b
Packit Service 103f6b
static amdgpu_device_handle device_handle;
Packit Service 103f6b
static uint32_t major_version;
Packit Service 103f6b
static uint32_t minor_version;
Packit Service 103f6b
Packit Service 103f6b
static struct drm_amdgpu_info_hw_ip  sdma_info;
Packit Service 103f6b
Packit Service 103f6b
#ifndef ARRAY_SIZE
Packit Service 103f6b
#define ARRAY_SIZE(_Arr)  (sizeof(_Arr)/sizeof((_Arr)[0]))
Packit Service 103f6b
#endif
Packit Service 103f6b
Packit Service 103f6b
Packit Service 103f6b
/* --------------------- Secure bounce test ------------------------ *
Packit Service 103f6b
 *
Packit Service 103f6b
 * The secure bounce test tests that we can evict a TMZ buffer,
Packit Service 103f6b
 * and page it back in, via a bounce buffer, as it encryption/decryption
Packit Service 103f6b
 * depends on its physical address, and have the same data, i.e. data
Packit Service 103f6b
 * integrity is preserved.
Packit Service 103f6b
 *
Packit Service 103f6b
 * The steps are as follows (from Christian K.):
Packit Service 103f6b
 *
Packit Service 103f6b
 * Buffer A which is TMZ protected and filled by the CPU with a
Packit Service 103f6b
 * certain pattern. That the GPU is reading only random nonsense from
Packit Service 103f6b
 * that pattern is irrelevant for the test.
Packit Service 103f6b
 *
Packit Service 103f6b
 * This buffer A is then secure copied into buffer B which is also
Packit Service 103f6b
 * TMZ protected.
Packit Service 103f6b
 *
Packit Service 103f6b
 * Buffer B is moved around, from VRAM to GTT, GTT to SYSTEM,
Packit Service 103f6b
 * etc.
Packit Service 103f6b
 *
Packit Service 103f6b
 * Then, we use another secure copy of buffer B back to buffer A.
Packit Service 103f6b
 *
Packit Service 103f6b
 * And lastly we check with the CPU the pattern.
Packit Service 103f6b
 *
Packit Service 103f6b
 * Assuming that we don't have memory contention and buffer A stayed
Packit Service 103f6b
 * at the same place, we should still see the same pattern when read
Packit Service 103f6b
 * by the CPU.
Packit Service 103f6b
 *
Packit Service 103f6b
 * If we don't see the same pattern then something in the buffer
Packit Service 103f6b
 * migration code is not working as expected.
Packit Service 103f6b
 */
Packit Service 103f6b
Packit Service 103f6b
#define SECURE_BOUNCE_TEST_STR    "secure bounce"
Packit Service 103f6b
#define SECURE_BOUNCE_FAILED_STR  SECURE_BOUNCE_TEST_STR " failed"
Packit Service 103f6b
Packit Service 103f6b
#define PRINT_ERROR(_Res)   fprintf(stderr, "%s:%d: %s (%d)\n",	\
Packit Service 103f6b
				    __func__, __LINE__, strerror(-(_Res)), _Res)
Packit Service 103f6b
Packit Service 103f6b
#define PACKET_LCOPY_SIZE         7
Packit Service 103f6b
#define PACKET_NOP_SIZE          12
Packit Service 103f6b
Packit Service 103f6b
struct sec_amdgpu_bo {
Packit Service 103f6b
	struct amdgpu_bo *bo;
Packit Service 103f6b
	struct amdgpu_va *va;
Packit Service 103f6b
};
Packit Service 103f6b
Packit Service 103f6b
struct command_ctx {
Packit Service 103f6b
	struct amdgpu_device    *dev;
Packit Service 103f6b
	struct amdgpu_cs_ib_info cs_ibinfo;
Packit Service 103f6b
	struct amdgpu_cs_request cs_req;
Packit Service 103f6b
	struct amdgpu_context   *context;
Packit Service 103f6b
	int ring_id;
Packit Service 103f6b
};
Packit Service 103f6b
Packit Service 103f6b
/**
Packit Service 103f6b
 * amdgpu_bo_alloc_map -- Allocate and map a buffer object (BO)
Packit Service 103f6b
 * @dev: The AMDGPU device this BO belongs to.
Packit Service 103f6b
 * @size: The size of the BO.
Packit Service 103f6b
 * @alignment: Alignment of the BO.
Packit Service 103f6b
 * @gem_domain: One of AMDGPU_GEM_DOMAIN_xyz.
Packit Service 103f6b
 * @alloc_flags: One of AMDGPU_GEM_CREATE_xyz.
Packit Service 103f6b
 * @sbo: the result
Packit Service 103f6b
 *
Packit Service 103f6b
 * Allocate a buffer object (BO) with the desired attributes
Packit Service 103f6b
 * as specified by the argument list and write out the result
Packit Service 103f6b
 * into @sbo.
Packit Service 103f6b
 *
Packit Service 103f6b
 * Return 0 on success and @sbo->bo and @sbo->va are set,
Packit Service 103f6b
 * or -errno on error.
Packit Service 103f6b
 */
Packit Service 103f6b
static int amdgpu_bo_alloc_map(struct amdgpu_device *dev,
Packit Service 103f6b
			       unsigned size,
Packit Service 103f6b
			       unsigned alignment,
Packit Service 103f6b
			       unsigned gem_domain,
Packit Service 103f6b
			       uint64_t alloc_flags,
Packit Service 103f6b
			       struct sec_amdgpu_bo *sbo)
Packit Service 103f6b
{
Packit Service 103f6b
	void *cpu;
Packit Service 103f6b
	uint64_t mc_addr;
Packit Service 103f6b
Packit Service 103f6b
	return amdgpu_bo_alloc_and_map_raw(dev,
Packit Service 103f6b
					   size,
Packit Service 103f6b
					   alignment,
Packit Service 103f6b
					   gem_domain,
Packit Service 103f6b
					   alloc_flags,
Packit Service 103f6b
					   0,
Packit Service 103f6b
					   &sbo->bo,
Packit Service 103f6b
					   &cpu, &mc_addr,
Packit Service 103f6b
					   &sbo->va);
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
static void amdgpu_bo_unmap_free(struct sec_amdgpu_bo *sbo,
Packit Service 103f6b
				 const uint64_t size)
Packit Service 103f6b
{
Packit Service 103f6b
	(void) amdgpu_bo_unmap_and_free(sbo->bo,
Packit Service 103f6b
					sbo->va,
Packit Service 103f6b
					sbo->va->address,
Packit Service 103f6b
					size);
Packit Service 103f6b
	sbo->bo = NULL;
Packit Service 103f6b
	sbo->va = NULL;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
static void amdgpu_sdma_lcopy(uint32_t *packet,
Packit Service 103f6b
			      const uint64_t dst,
Packit Service 103f6b
			      const uint64_t src,
Packit Service 103f6b
			      const uint32_t size,
Packit Service 103f6b
			      const int secure)
Packit Service 103f6b
{
Packit Service 103f6b
	/* Set the packet to Linear copy with TMZ set.
Packit Service 103f6b
	 */
Packit Service 103f6b
	packet[0] = htole32(secure << 18 | 1);
Packit Service 103f6b
	packet[1] = htole32(size-1);
Packit Service 103f6b
	packet[2] = htole32(0);
Packit Service 103f6b
	packet[3] = htole32((uint32_t)(src & 0xFFFFFFFFU));
Packit Service 103f6b
	packet[4] = htole32((uint32_t)(src >> 32));
Packit Service 103f6b
	packet[5] = htole32((uint32_t)(dst & 0xFFFFFFFFU));
Packit Service 103f6b
	packet[6] = htole32((uint32_t)(dst >> 32));
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
static void amdgpu_sdma_nop(uint32_t *packet, uint32_t nop_count)
Packit Service 103f6b
{
Packit Service 103f6b
	/* A packet of the desired number of NOPs.
Packit Service 103f6b
	 */
Packit Service 103f6b
	packet[0] = htole32(nop_count << 16);
Packit Service 103f6b
	for ( ; nop_count > 0; nop_count--)
Packit Service 103f6b
		packet[nop_count-1] = 0;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
/**
Packit Service 103f6b
 * amdgpu_bo_lcopy -- linear copy with TZM set, using sDMA
Packit Service 103f6b
 * @dev: AMDGPU device to which both buffer objects belong to
Packit Service 103f6b
 * @dst: destination buffer object
Packit Service 103f6b
 * @src: source buffer object
Packit Service 103f6b
 * @size: size of memory to move, in bytes.
Packit Service 103f6b
 * @secure: Set to 1 to perform secure copy, 0 for clear
Packit Service 103f6b
 *
Packit Service 103f6b
 * Issues and waits for completion of a Linear Copy with TMZ
Packit Service 103f6b
 * set, to the sDMA engine. @size should be a multiple of
Packit Service 103f6b
 * at least 16 bytes.
Packit Service 103f6b
 */
Packit Service 103f6b
static void amdgpu_bo_lcopy(struct command_ctx *ctx,
Packit Service 103f6b
			    struct sec_amdgpu_bo *dst,
Packit Service 103f6b
			    struct sec_amdgpu_bo *src,
Packit Service 103f6b
			    const uint32_t size,
Packit Service 103f6b
			    int secure)
Packit Service 103f6b
{
Packit Service 103f6b
	struct amdgpu_bo *bos[] = { dst->bo, src->bo };
Packit Service 103f6b
	uint32_t packet[PACKET_LCOPY_SIZE];
Packit Service 103f6b
Packit Service 103f6b
	amdgpu_sdma_lcopy(packet,
Packit Service 103f6b
			  dst->va->address,
Packit Service 103f6b
			  src->va->address,
Packit Service 103f6b
			  size, secure);
Packit Service 103f6b
	amdgpu_test_exec_cs_helper_raw(ctx->dev, ctx->context,
Packit Service 103f6b
				       AMDGPU_HW_IP_DMA, ctx->ring_id,
Packit Service 103f6b
				       ARRAY_SIZE(packet), packet,
Packit Service 103f6b
				       ARRAY_SIZE(bos), bos,
Packit Service 103f6b
				       &ctx->cs_ibinfo, &ctx->cs_req,
Packit Service 103f6b
				       secure == 1);
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
/**
Packit Service 103f6b
 * amdgpu_bo_move -- Evoke a move of the buffer object (BO)
Packit Service 103f6b
 * @dev: device to which this buffer object belongs to
Packit Service 103f6b
 * @bo: the buffer object to be moved
Packit Service 103f6b
 * @whereto: one of AMDGPU_GEM_DOMAIN_xyz
Packit Service 103f6b
 * @secure: set to 1 to submit secure IBs
Packit Service 103f6b
 *
Packit Service 103f6b
 * Evokes a move of the buffer object @bo to the GEM domain
Packit Service 103f6b
 * descibed by @whereto.
Packit Service 103f6b
 *
Packit Service 103f6b
 * Returns 0 on sucess; -errno on error.
Packit Service 103f6b
 */
Packit Service 103f6b
static int amdgpu_bo_move(struct command_ctx *ctx,
Packit Service 103f6b
			  struct amdgpu_bo *bo,
Packit Service 103f6b
			  uint64_t whereto,
Packit Service 103f6b
			  int secure)
Packit Service 103f6b
{
Packit Service 103f6b
	struct amdgpu_bo *bos[] = { bo };
Packit Service 103f6b
	struct drm_amdgpu_gem_op gop = {
Packit Service 103f6b
		.handle  = bo->handle,
Packit Service 103f6b
		.op      = AMDGPU_GEM_OP_SET_PLACEMENT,
Packit Service 103f6b
		.value   = whereto,
Packit Service 103f6b
	};
Packit Service 103f6b
	uint32_t packet[PACKET_NOP_SIZE];
Packit Service 103f6b
	int res;
Packit Service 103f6b
Packit Service 103f6b
	/* Change the buffer's placement.
Packit Service 103f6b
	 */
Packit Service 103f6b
	res = drmIoctl(ctx->dev->fd, DRM_IOCTL_AMDGPU_GEM_OP, &gop);
Packit Service 103f6b
	if (res)
Packit Service 103f6b
		return -errno;
Packit Service 103f6b
Packit Service 103f6b
	/* Now issue a NOP to actually evoke the MM to move
Packit Service 103f6b
	 * it to the desired location.
Packit Service 103f6b
	 */
Packit Service 103f6b
	amdgpu_sdma_nop(packet, PACKET_NOP_SIZE);
Packit Service 103f6b
	amdgpu_test_exec_cs_helper_raw(ctx->dev, ctx->context,
Packit Service 103f6b
				       AMDGPU_HW_IP_DMA, ctx->ring_id,
Packit Service 103f6b
				       ARRAY_SIZE(packet), packet,
Packit Service 103f6b
				       ARRAY_SIZE(bos), bos,
Packit Service 103f6b
				       &ctx->cs_ibinfo, &ctx->cs_req,
Packit Service 103f6b
				       secure == 1);
Packit Service 103f6b
	return 0;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
/* Safe, O Sec!
Packit Service 103f6b
 */
Packit Service 103f6b
static const uint8_t secure_pattern[] = { 0x5A, 0xFE, 0x05, 0xEC };
Packit Service 103f6b
Packit Service 103f6b
#define SECURE_BUFFER_SIZE       (4 * 1024 * sizeof(secure_pattern))
Packit Service 103f6b
Packit Service 103f6b
static void amdgpu_secure_bounce(void)
Packit Service 103f6b
{
Packit Service 103f6b
	struct sec_amdgpu_bo alice, bob;
Packit Service 103f6b
	struct command_ctx   sb_ctx;
Packit Service 103f6b
	long page_size;
Packit Service 103f6b
	uint8_t *pp;
Packit Service 103f6b
	int res;
Packit Service 103f6b
Packit Service 103f6b
	page_size = sysconf(_SC_PAGESIZE);
Packit Service 103f6b
Packit Service 103f6b
	memset(&sb_ctx, 0, sizeof(sb_ctx));
Packit Service 103f6b
	sb_ctx.dev = device_handle;
Packit Service 103f6b
	res = amdgpu_cs_ctx_create(sb_ctx.dev, &sb_ctx.context);
Packit Service 103f6b
	if (res) {
Packit Service 103f6b
		PRINT_ERROR(res);
Packit Service 103f6b
		CU_FAIL(SECURE_BOUNCE_FAILED_STR);
Packit Service 103f6b
		return;
Packit Service 103f6b
	}
Packit Service 103f6b
Packit Service 103f6b
	/* Use the first present ring.
Packit Service 103f6b
	 */
Packit Service 103f6b
	res = ffs(sdma_info.available_rings) - 1;
Packit Service 103f6b
	if (res == -1) {
Packit Service 103f6b
		PRINT_ERROR(-ENOENT);
Packit Service 103f6b
		CU_FAIL(SECURE_BOUNCE_FAILED_STR);
Packit Service 103f6b
		goto Out_free_ctx;
Packit Service 103f6b
	}
Packit Service 103f6b
	sb_ctx.ring_id = res;
Packit Service 103f6b
Packit Service 103f6b
	/* Allocate a buffer named Alice in VRAM.
Packit Service 103f6b
	 */
Packit Service 103f6b
	res = amdgpu_bo_alloc_map(device_handle,
Packit Service 103f6b
				  SECURE_BUFFER_SIZE,
Packit Service 103f6b
				  page_size,
Packit Service 103f6b
				  AMDGPU_GEM_DOMAIN_VRAM,
Packit Service 103f6b
				  AMDGPU_GEM_CREATE_ENCRYPTED,
Packit Service 103f6b
				  &alice);
Packit Service 103f6b
	if (res) {
Packit Service 103f6b
		PRINT_ERROR(res);
Packit Service 103f6b
		CU_FAIL(SECURE_BOUNCE_FAILED_STR);
Packit Service 103f6b
		return;
Packit Service 103f6b
	}
Packit Service 103f6b
Packit Service 103f6b
	/* Fill Alice with a pattern.
Packit Service 103f6b
	 */
Packit Service 103f6b
	for (pp = alice.bo->cpu_ptr;
Packit Service 103f6b
	     pp < (typeof(pp)) alice.bo->cpu_ptr + SECURE_BUFFER_SIZE;
Packit Service 103f6b
	     pp += sizeof(secure_pattern))
Packit Service 103f6b
		memcpy(pp, secure_pattern, sizeof(secure_pattern));
Packit Service 103f6b
Packit Service 103f6b
	/* Allocate a buffer named Bob in VRAM.
Packit Service 103f6b
	 */
Packit Service 103f6b
	res = amdgpu_bo_alloc_map(device_handle,
Packit Service 103f6b
				  SECURE_BUFFER_SIZE,
Packit Service 103f6b
				  page_size,
Packit Service 103f6b
				  AMDGPU_GEM_DOMAIN_VRAM,
Packit Service 103f6b
				  0 /* AMDGPU_GEM_CREATE_ENCRYPTED */,
Packit Service 103f6b
				  &bob;;
Packit Service 103f6b
	if (res) {
Packit Service 103f6b
		PRINT_ERROR(res);
Packit Service 103f6b
		CU_FAIL(SECURE_BOUNCE_FAILED_STR);
Packit Service 103f6b
		goto Out_free_Alice;
Packit Service 103f6b
	}
Packit Service 103f6b
Packit Service 103f6b
	/* sDMA clear copy from Alice to Bob.
Packit Service 103f6b
	 */
Packit Service 103f6b
	amdgpu_bo_lcopy(&sb_ctx, &bob, &alice, SECURE_BUFFER_SIZE, 0);
Packit Service 103f6b
Packit Service 103f6b
	/* Move Bob to the GTT domain.
Packit Service 103f6b
	 */
Packit Service 103f6b
	res = amdgpu_bo_move(&sb_ctx, bob.bo, AMDGPU_GEM_DOMAIN_GTT, 0);
Packit Service 103f6b
	if (res) {
Packit Service 103f6b
		PRINT_ERROR(res);
Packit Service 103f6b
		CU_FAIL(SECURE_BOUNCE_FAILED_STR);
Packit Service 103f6b
		goto Out_free_all;
Packit Service 103f6b
	}
Packit Service 103f6b
Packit Service 103f6b
	/* sDMA clear copy from Bob to Alice.
Packit Service 103f6b
	 */
Packit Service 103f6b
	amdgpu_bo_lcopy(&sb_ctx, &alice, &bob, SECURE_BUFFER_SIZE, 0);
Packit Service 103f6b
Packit Service 103f6b
	/* Verify the contents of Alice.
Packit Service 103f6b
	 */
Packit Service 103f6b
	for (pp = alice.bo->cpu_ptr;
Packit Service 103f6b
	     pp < (typeof(pp)) alice.bo->cpu_ptr + SECURE_BUFFER_SIZE;
Packit Service 103f6b
	     pp += sizeof(secure_pattern)) {
Packit Service 103f6b
		res = memcmp(pp, secure_pattern, sizeof(secure_pattern));
Packit Service 103f6b
		if (res) {
Packit Service 103f6b
			fprintf(stderr, SECURE_BOUNCE_FAILED_STR);
Packit Service 103f6b
			CU_FAIL(SECURE_BOUNCE_FAILED_STR);
Packit Service 103f6b
			break;
Packit Service 103f6b
		}
Packit Service 103f6b
	}
Packit Service 103f6b
Packit Service 103f6b
Out_free_all:
Packit Service 103f6b
	amdgpu_bo_unmap_free(&bob, SECURE_BUFFER_SIZE);
Packit Service 103f6b
Out_free_Alice:
Packit Service 103f6b
	amdgpu_bo_unmap_free(&alice, SECURE_BUFFER_SIZE);
Packit Service 103f6b
Out_free_ctx:
Packit Service 103f6b
	res = amdgpu_cs_ctx_free(sb_ctx.context);
Packit Service 103f6b
	CU_ASSERT_EQUAL(res, 0);
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
/* ----------------------------------------------------------------- */
Packit Service 103f6b
Packit Service 103f6b
static void amdgpu_security_alloc_buf_test(void)
Packit Service 103f6b
{
Packit Service 103f6b
	amdgpu_bo_handle bo;
Packit Service 103f6b
	amdgpu_va_handle va_handle;
Packit Service 103f6b
	uint64_t bo_mc;
Packit Service 103f6b
	int r;
Packit Service 103f6b
Packit Service 103f6b
	/* Test secure buffer allocation in VRAM */
Packit Service 103f6b
	bo = gpu_mem_alloc(device_handle, 4096, 4096,
Packit Service 103f6b
			   AMDGPU_GEM_DOMAIN_VRAM,
Packit Service 103f6b
			   AMDGPU_GEM_CREATE_ENCRYPTED,
Packit Service 103f6b
			   &bo_mc, &va_handle);
Packit Service 103f6b
Packit Service 103f6b
	r = gpu_mem_free(bo, va_handle, bo_mc, 4096);
Packit Service 103f6b
	CU_ASSERT_EQUAL(r, 0);
Packit Service 103f6b
Packit Service 103f6b
	/* Test secure buffer allocation in system memory */
Packit Service 103f6b
	bo = gpu_mem_alloc(device_handle, 4096, 4096,
Packit Service 103f6b
			   AMDGPU_GEM_DOMAIN_GTT,
Packit Service 103f6b
			   AMDGPU_GEM_CREATE_ENCRYPTED,
Packit Service 103f6b
			   &bo_mc, &va_handle);
Packit Service 103f6b
Packit Service 103f6b
	r = gpu_mem_free(bo, va_handle, bo_mc, 4096);
Packit Service 103f6b
	CU_ASSERT_EQUAL(r, 0);
Packit Service 103f6b
Packit Service 103f6b
	/* Test secure buffer allocation in invisible VRAM */
Packit Service 103f6b
	bo = gpu_mem_alloc(device_handle, 4096, 4096,
Packit Service 103f6b
			   AMDGPU_GEM_DOMAIN_GTT,
Packit Service 103f6b
			   AMDGPU_GEM_CREATE_ENCRYPTED |
Packit Service 103f6b
			   AMDGPU_GEM_CREATE_NO_CPU_ACCESS,
Packit Service 103f6b
			   &bo_mc, &va_handle);
Packit Service 103f6b
Packit Service 103f6b
	r = gpu_mem_free(bo, va_handle, bo_mc, 4096);
Packit Service 103f6b
	CU_ASSERT_EQUAL(r, 0);
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
static void amdgpu_security_gfx_submission_test(void)
Packit Service 103f6b
{
Packit Service 103f6b
	amdgpu_command_submission_write_linear_helper_with_secure(device_handle,
Packit Service 103f6b
								  AMDGPU_HW_IP_GFX,
Packit Service 103f6b
								  true);
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
static void amdgpu_security_sdma_submission_test(void)
Packit Service 103f6b
{
Packit Service 103f6b
	amdgpu_command_submission_write_linear_helper_with_secure(device_handle,
Packit Service 103f6b
								  AMDGPU_HW_IP_DMA,
Packit Service 103f6b
								  true);
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
/* ----------------------------------------------------------------- */
Packit Service 103f6b
Packit Service 103f6b
CU_TestInfo security_tests[] = {
Packit Service 103f6b
	{ "allocate secure buffer test",        amdgpu_security_alloc_buf_test },
Packit Service 103f6b
	{ "graphics secure command submission", amdgpu_security_gfx_submission_test },
Packit Service 103f6b
	{ "sDMA secure command submission",     amdgpu_security_sdma_submission_test },
Packit Service 103f6b
	{ SECURE_BOUNCE_TEST_STR,               amdgpu_secure_bounce },
Packit Service 103f6b
	CU_TEST_INFO_NULL,
Packit Service 103f6b
};
Packit Service 103f6b
Packit Service 103f6b
CU_BOOL suite_security_tests_enable(void)
Packit Service 103f6b
{
Packit Service 103f6b
	CU_BOOL enable = CU_TRUE;
Packit Service 103f6b
Packit Service 103f6b
	if (amdgpu_device_initialize(drm_amdgpu[0], &major_version,
Packit Service 103f6b
				     &minor_version, &device_handle))
Packit Service 103f6b
		return CU_FALSE;
Packit Service 103f6b
Packit Service 103f6b
	if (device_handle->info.family_id != AMDGPU_FAMILY_RV) {
Packit Service 103f6b
		printf("\n\nDon't support TMZ (trust memory zone), security suite disabled\n");
Packit Service 103f6b
		enable = CU_FALSE;
Packit Service 103f6b
	}
Packit Service 103f6b
Packit Service 103f6b
	if ((major_version < 3) ||
Packit Service 103f6b
		((major_version == 3) && (minor_version < 37))) {
Packit Service 103f6b
		printf("\n\nDon't support TMZ (trust memory zone), kernel DRM version (%d.%d)\n",
Packit Service 103f6b
			major_version, minor_version);
Packit Service 103f6b
		printf("is older, security suite disabled\n");
Packit Service 103f6b
		enable = CU_FALSE;
Packit Service 103f6b
	}
Packit Service 103f6b
Packit Service 103f6b
	if (amdgpu_device_deinitialize(device_handle))
Packit Service 103f6b
		return CU_FALSE;
Packit Service 103f6b
Packit Service 103f6b
	return enable;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
int suite_security_tests_init(void)
Packit Service 103f6b
{
Packit Service 103f6b
	int res;
Packit Service 103f6b
Packit Service 103f6b
	res = amdgpu_device_initialize(drm_amdgpu[0], &major_version,
Packit Service 103f6b
				       &minor_version, &device_handle);
Packit Service 103f6b
	if (res) {
Packit Service 103f6b
		PRINT_ERROR(res);
Packit Service 103f6b
		return CUE_SINIT_FAILED;
Packit Service 103f6b
	}
Packit Service 103f6b
Packit Service 103f6b
	res = amdgpu_query_hw_ip_info(device_handle,
Packit Service 103f6b
				      AMDGPU_HW_IP_DMA,
Packit Service 103f6b
				      0, &sdma_info);
Packit Service 103f6b
	if (res) {
Packit Service 103f6b
		PRINT_ERROR(res);
Packit Service 103f6b
		return CUE_SINIT_FAILED;
Packit Service 103f6b
	}
Packit Service 103f6b
Packit Service 103f6b
	return CUE_SUCCESS;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
int suite_security_tests_clean(void)
Packit Service 103f6b
{
Packit Service 103f6b
	int res;
Packit Service 103f6b
Packit Service 103f6b
	res = amdgpu_device_deinitialize(device_handle);
Packit Service 103f6b
	if (res)
Packit Service 103f6b
		return CUE_SCLEAN_FAILED;
Packit Service 103f6b
Packit Service 103f6b
	return CUE_SUCCESS;
Packit Service 103f6b
}