xref: /aosp_15_r20/external/igt-gpu-tools/tests/i915/gem_hang.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2009 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker  * Software.
14*d83cc019SAndroid Build Coastguard Worker  *
15*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker  *
23*d83cc019SAndroid Build Coastguard Worker  * Authors:
24*d83cc019SAndroid Build Coastguard Worker  *    Eric Anholt <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker  *    Jesse Barnes <[email protected]> (based on gem_bad_blit.c)
26*d83cc019SAndroid Build Coastguard Worker  *
27*d83cc019SAndroid Build Coastguard Worker  */
28*d83cc019SAndroid Build Coastguard Worker 
29*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
30*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
31*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
32*d83cc019SAndroid Build Coastguard Worker #include <string.h>
33*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
34*d83cc019SAndroid Build Coastguard Worker #include <inttypes.h>
35*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
36*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
37*d83cc019SAndroid Build Coastguard Worker #include <sys/time.h>
38*d83cc019SAndroid Build Coastguard Worker #include "drm.h"
39*d83cc019SAndroid Build Coastguard Worker #include "intel_bufmgr.h"
40*d83cc019SAndroid Build Coastguard Worker 
41*d83cc019SAndroid Build Coastguard Worker static drm_intel_bufmgr *bufmgr;
42*d83cc019SAndroid Build Coastguard Worker struct intel_batchbuffer *batch;
43*d83cc019SAndroid Build Coastguard Worker static int bad_pipe;
44*d83cc019SAndroid Build Coastguard Worker 
45*d83cc019SAndroid Build Coastguard Worker static void
gpu_hang(void)46*d83cc019SAndroid Build Coastguard Worker gpu_hang(void)
47*d83cc019SAndroid Build Coastguard Worker {
48*d83cc019SAndroid Build Coastguard Worker 	int cmd;
49*d83cc019SAndroid Build Coastguard Worker 
50*d83cc019SAndroid Build Coastguard Worker 	cmd = bad_pipe ? MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW :
51*d83cc019SAndroid Build Coastguard Worker 		MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
52*d83cc019SAndroid Build Coastguard Worker 
53*d83cc019SAndroid Build Coastguard Worker 	BEGIN_BATCH(6, 0);
54*d83cc019SAndroid Build Coastguard Worker 	/* The documentation says that the LOAD_SCAN_LINES command
55*d83cc019SAndroid Build Coastguard Worker 	 * always comes in pairs. Don't ask me why. */
56*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | (bad_pipe << 20));
57*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH((0 << 16) | 2048);
58*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | (bad_pipe << 20));
59*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH((0 << 16) | 2048);
60*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(MI_WAIT_FOR_EVENT | cmd);
61*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(MI_NOOP);
62*d83cc019SAndroid Build Coastguard Worker 	ADVANCE_BATCH();
63*d83cc019SAndroid Build Coastguard Worker 
64*d83cc019SAndroid Build Coastguard Worker 	intel_batchbuffer_flush(batch);
65*d83cc019SAndroid Build Coastguard Worker }
66*d83cc019SAndroid Build Coastguard Worker 
opt_handler(int opt,int opt_index,void * data)67*d83cc019SAndroid Build Coastguard Worker static int opt_handler(int opt, int opt_index, void *data)
68*d83cc019SAndroid Build Coastguard Worker {
69*d83cc019SAndroid Build Coastguard Worker 	switch (opt) {
70*d83cc019SAndroid Build Coastguard Worker 	case 'p':
71*d83cc019SAndroid Build Coastguard Worker 		bad_pipe = atoi(optarg);
72*d83cc019SAndroid Build Coastguard Worker 		break;
73*d83cc019SAndroid Build Coastguard Worker 	default:
74*d83cc019SAndroid Build Coastguard Worker 		return IGT_OPT_HANDLER_ERROR;
75*d83cc019SAndroid Build Coastguard Worker 	}
76*d83cc019SAndroid Build Coastguard Worker 
77*d83cc019SAndroid Build Coastguard Worker 	return IGT_OPT_HANDLER_SUCCESS;
78*d83cc019SAndroid Build Coastguard Worker }
79*d83cc019SAndroid Build Coastguard Worker 
80*d83cc019SAndroid Build Coastguard Worker const char *help_str = "  -p\tDisabled pipe number\n";
81*d83cc019SAndroid Build Coastguard Worker 
82*d83cc019SAndroid Build Coastguard Worker igt_simple_main_args("p:", NULL, help_str, opt_handler, NULL)
83*d83cc019SAndroid Build Coastguard Worker {
84*d83cc019SAndroid Build Coastguard Worker 	int fd;
85*d83cc019SAndroid Build Coastguard Worker 
86*d83cc019SAndroid Build Coastguard Worker 	fd = drm_open_driver(DRIVER_INTEL);
87*d83cc019SAndroid Build Coastguard Worker 
88*d83cc019SAndroid Build Coastguard Worker 	bufmgr = drm_intel_bufmgr_gem_init(fd, 4096);
89*d83cc019SAndroid Build Coastguard Worker 	drm_intel_bufmgr_gem_enable_reuse(bufmgr);
90*d83cc019SAndroid Build Coastguard Worker 	batch = intel_batchbuffer_alloc(bufmgr, intel_get_drm_devid(fd));
91*d83cc019SAndroid Build Coastguard Worker 
92*d83cc019SAndroid Build Coastguard Worker 	gpu_hang();
93*d83cc019SAndroid Build Coastguard Worker 
94*d83cc019SAndroid Build Coastguard Worker 	intel_batchbuffer_free(batch);
95*d83cc019SAndroid Build Coastguard Worker 	drm_intel_bufmgr_destroy(bufmgr);
96*d83cc019SAndroid Build Coastguard Worker 
97*d83cc019SAndroid Build Coastguard Worker 	close(fd);
98*d83cc019SAndroid Build Coastguard Worker }
99