File: amd_jpeg_queue.c

package info (click to toggle)
intel-gpu-tools 2.2-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 63,368 kB
  • sloc: xml: 781,458; ansic: 360,567; python: 8,336; yacc: 2,781; perl: 1,196; sh: 1,177; lex: 487; asm: 227; lisp: 35; makefile: 30
file content (115 lines) | stat: -rw-r--r-- 3,183 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// SPDX-License-Identifier: MIT
// Copyright 2025 Advanced Micro Devices, Inc.

#include "lib/amdgpu/amd_jpeg_shared.h"
#include "lib/amdgpu/amd_ip_blocks.h"

static bool
is_queue_tests_enable(amdgpu_device_handle device_handle,
		struct mmd_shared_context *context, struct pci_addr *pci)
{
	bool ret = is_jpeg_tests_enable(device_handle, context);

	if (!ret)
		return false;

	if (!is_reset_enable(AMD_IP_VCN_JPEG, AMDGPU_RESET_TYPE_PER_QUEUE, pci)) {
		igt_info("The ASIC does NOT support jpeg queue reset\n");
		return false;
	} else if (context->vcn_ip_version_major < 4) {
		igt_info("The vcn ip does NOT support jpeg queue reset\n");
		return false;
	}

	return ret;
}

static int
jpeg_queue_decode(amdgpu_device_handle device_handle,
		struct mmd_shared_context *shared_context, int err)
{
	struct amdgpu_mmd_bo dec_buf;
	int size, ret;
	uint32_t idx;
	struct mmd_context acontext = {0};
	struct mmd_context *context = &acontext;
	int64_t dec_buf_addr;

	ret = mmd_context_init(device_handle, context);
	if (ret) {
		igt_info("mmd_context_init fail!\n");
		return ret;
	}

	size = 32 * 1024; /* 8K bitstream + 24K output */
	context->num_resources = 0;
	alloc_resource(device_handle, &dec_buf, size, AMDGPU_GEM_DOMAIN_VRAM);
	context->resources[context->num_resources++] = dec_buf.handle;
	context->resources[context->num_resources++] = context->ib_handle;
	ret = amdgpu_bo_cpu_map(dec_buf.handle, (void **)&dec_buf.ptr);
	if (ret) {
		igt_info("amdgpu_bo_cpu_map map dec_buf fail!\n");
		goto err_handle;
	}
	memcpy(dec_buf.ptr, jpeg_bitstream, sizeof(jpeg_bitstream));

	idx = 0;
	dec_buf_addr = dec_buf.addr;
	if (err == INVALID_DECODER_BITSTREAM_BUFFER)
		dec_buf_addr = 0xdead;

	send_cmd_bitstream_direct(context, dec_buf_addr, &idx);
	send_cmd_target_direct(context, dec_buf_addr + (size / 4), &idx);

	amdgpu_bo_cpu_unmap(dec_buf.handle);
	submit(device_handle, context, idx, AMDGPU_HW_IP_VCN_JPEG);

	/*
	 * For job timeout test case, submit job will return error,
	 * here needn't return error.
	 */
	ret = 0;

err_handle:
	free_resource(&dec_buf);
	mmd_context_clean(device_handle, context);
	return ret;
}

igt_main
{
	amdgpu_device_handle device;
	struct mmd_shared_context shared_context = {};
	int fd = -1;
	uint32_t major, minor;
	int err;
	struct pci_addr pci;

	igt_fixture {
		fd = drm_open_driver(DRIVER_AMDGPU);
		err = amdgpu_device_initialize(fd, &major, &minor, &device);
		igt_require(err == 0);
		igt_info("Initialized amdgpu, driver version %d.%d\n",
			 major, minor);
		err = mmd_shared_context_init(device, &shared_context);
		igt_require(err == 0);

		igt_skip_on(get_pci_addr_from_fd(fd, &pci));
		igt_info("PCI Address: domain %04x, bus %02x, device %02x, function %02x\n",
				pci.domain, pci.bus, pci.device, pci.function);
		igt_skip_on(!is_queue_tests_enable(device, &shared_context, &pci));
		shared_context.ip_type = AMD_IP_VCN_JPEG;
	}

	igt_describe("Test whether jpeg queue");
	igt_subtest("jpeg-decoder-queue-reset") {
		err = (int)INVALID_DECODER_BITSTREAM_BUFFER;
		mm_queue_test_helper(device, &shared_context, jpeg_queue_decode, err, &pci);
	}

	igt_fixture {
		amdgpu_device_deinitialize(device);
		drm_close_driver(fd);
	}

}