mirror of
				https://github.com/tiagovignatti/intel-gpu-tools.git
				synced 2025-11-03 19:47:15 +00:00 
			
		
		
		
	lib: Refactor common detection of missed interrupts
As we have the same function in a few places to read the debugfs/i915_ring_missed_irq file, move it to the core. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
		
							parent
							
								
									e0ee36141e
								
							
						
					
					
						commit
						5b675f7b2f
					
				
							
								
								
									
										32
									
								
								lib/igt_gt.c
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								lib/igt_gt.c
									
									
									
									
									
								
							@ -501,3 +501,35 @@ void igt_clflush_range(void *addr, int size)
 | 
			
		||||
		asm volatile("clflush %0" : "+m" (*(volatile char *)p));
 | 
			
		||||
	asm volatile("mfence" ::: "memory");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * intel_detect_and_clear_missed_irq:
 | 
			
		||||
 * @fd: open i915 drm file descriptor, used to quiesce the gpu
 | 
			
		||||
 *
 | 
			
		||||
 * This functions idles the GPU and then queries whether there has
 | 
			
		||||
 * been a missed interrupt reported by the driver. Afterwards it
 | 
			
		||||
 * clears the missed interrupt flag, in order to disable the timer
 | 
			
		||||
 * fallback for the next test.
 | 
			
		||||
 */
 | 
			
		||||
unsigned intel_detect_and_clear_missed_interrupts(int fd)
 | 
			
		||||
{
 | 
			
		||||
	unsigned missed = 0;
 | 
			
		||||
	FILE *file;
 | 
			
		||||
 | 
			
		||||
	gem_quiescent_gpu(fd);
 | 
			
		||||
 | 
			
		||||
	file = igt_debugfs_fopen("i915_ring_missed_irq", "r");
 | 
			
		||||
	if (file) {
 | 
			
		||||
		igt_assert(fscanf(file, "%x", &missed) == 1);
 | 
			
		||||
		fclose(file);
 | 
			
		||||
	}
 | 
			
		||||
	if (missed) {
 | 
			
		||||
		file = igt_debugfs_fopen("i915_ring_missed_irq", "w");
 | 
			
		||||
		if (file) {
 | 
			
		||||
			fwrite("0\n", 1, 2, file);
 | 
			
		||||
			fclose(file);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return missed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -89,4 +89,6 @@ enum stop_ring_flags igt_get_stop_rings(void);
 | 
			
		||||
int igt_setup_clflush(void);
 | 
			
		||||
void igt_clflush_range(void *addr, int size);
 | 
			
		||||
 | 
			
		||||
unsigned intel_detect_and_clear_missed_interrupts(int fd);
 | 
			
		||||
 | 
			
		||||
#endif /* IGT_GT_H */
 | 
			
		||||
 | 
			
		||||
@ -755,26 +755,6 @@ static struct igt_hang_ring rcs_hang(void)
 | 
			
		||||
	return igt_hang_ring(fd, I915_EXEC_RENDER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void check_gpu(void)
 | 
			
		||||
{
 | 
			
		||||
	unsigned missed_irq = 0;
 | 
			
		||||
	FILE *file;
 | 
			
		||||
 | 
			
		||||
	gem_quiescent_gpu(fd);
 | 
			
		||||
 | 
			
		||||
	file = igt_debugfs_fopen("i915_ring_missed_irq", "r");
 | 
			
		||||
	if (file) {
 | 
			
		||||
		fscanf(file, "%x", &missed_irq);
 | 
			
		||||
		fclose(file);
 | 
			
		||||
	}
 | 
			
		||||
	file = igt_debugfs_fopen("i915_ring_missed_irq", "w");
 | 
			
		||||
	if (file) {
 | 
			
		||||
		fwrite("0\n", 1, 2, file);
 | 
			
		||||
		fclose(file);
 | 
			
		||||
	}
 | 
			
		||||
	igt_assert_eq(missed_irq, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void do_basic0(struct buffers *buffers,
 | 
			
		||||
		      do_copy do_copy_func,
 | 
			
		||||
		      do_hang do_hang_func)
 | 
			
		||||
@ -1135,7 +1115,7 @@ static void run_single(struct buffers *buffers,
 | 
			
		||||
		       do_hang do_hang_func)
 | 
			
		||||
{
 | 
			
		||||
	do_test_func(buffers, do_copy_func, do_hang_func);
 | 
			
		||||
	check_gpu();
 | 
			
		||||
	igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void run_interruptible(struct buffers *buffers,
 | 
			
		||||
@ -1146,7 +1126,7 @@ static void run_interruptible(struct buffers *buffers,
 | 
			
		||||
	for (pass = 0; pass < 10; pass++)
 | 
			
		||||
		do_test_func(buffers, do_copy_func, do_hang_func);
 | 
			
		||||
	pass = 0;
 | 
			
		||||
	check_gpu();
 | 
			
		||||
	igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __run_forked(struct buffers *buffers,
 | 
			
		||||
@ -1177,7 +1157,7 @@ static void __run_forked(struct buffers *buffers,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	igt_waitchildren();
 | 
			
		||||
	check_gpu();
 | 
			
		||||
	igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
 | 
			
		||||
 | 
			
		||||
	num_buffers = old_num_buffers;
 | 
			
		||||
}
 | 
			
		||||
@ -1473,6 +1453,7 @@ igt_main
 | 
			
		||||
 | 
			
		||||
	igt_fixture {
 | 
			
		||||
		fd = drm_open_driver(DRIVER_INTEL);
 | 
			
		||||
		intel_detect_and_clear_missed_interrupts(fd);
 | 
			
		||||
		devid = intel_get_drm_devid(fd);
 | 
			
		||||
		gen = intel_gen(devid);
 | 
			
		||||
		rendercopy = igt_get_render_copyfunc(devid);
 | 
			
		||||
 | 
			
		||||
@ -91,39 +91,16 @@ sync_loop(int fd)
 | 
			
		||||
	gem_close(fd, object[0].handle);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned intel_detect_and_clear_missed_irq(int fd)
 | 
			
		||||
{
 | 
			
		||||
	unsigned missed = 0;
 | 
			
		||||
	FILE *file;
 | 
			
		||||
 | 
			
		||||
	gem_quiescent_gpu(fd);
 | 
			
		||||
 | 
			
		||||
	file = igt_debugfs_fopen("i915_ring_missed_irq", "r");
 | 
			
		||||
	if (file) {
 | 
			
		||||
		igt_assert(fscanf(file, "%x", &missed) == 1);
 | 
			
		||||
		fclose(file);
 | 
			
		||||
	}
 | 
			
		||||
	if (missed) {
 | 
			
		||||
		file = igt_debugfs_fopen("i915_ring_missed_irq", "w");
 | 
			
		||||
		if (file) {
 | 
			
		||||
			fwrite("0\n", 1, 2, file);
 | 
			
		||||
			fclose(file);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return missed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
igt_simple_main
 | 
			
		||||
{
 | 
			
		||||
	int fd;
 | 
			
		||||
 | 
			
		||||
	fd = drm_open_driver(DRIVER_INTEL);
 | 
			
		||||
	igt_require(gem_get_num_rings(fd) > 1);
 | 
			
		||||
	intel_detect_and_clear_missed_irq(fd); /* clear before we begin */
 | 
			
		||||
	intel_detect_and_clear_missed_interrupts(fd);
 | 
			
		||||
 | 
			
		||||
	sync_loop(fd);
 | 
			
		||||
 | 
			
		||||
	igt_assert_eq(intel_detect_and_clear_missed_irq(fd), 0);
 | 
			
		||||
	igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
 | 
			
		||||
	close(fd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -33,29 +33,6 @@ IGT_TEST_DESCRIPTION("Basic check of ring<->ring write synchronisation.");
 | 
			
		||||
 * Extremely efficient at catching missed irqs
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static unsigned intel_detect_and_clear_missed_irq(int fd)
 | 
			
		||||
{
 | 
			
		||||
	unsigned missed = 0;
 | 
			
		||||
	FILE *file;
 | 
			
		||||
 | 
			
		||||
	gem_quiescent_gpu(fd);
 | 
			
		||||
 | 
			
		||||
	file = igt_debugfs_fopen("i915_ring_missed_irq", "r");
 | 
			
		||||
	if (file) {
 | 
			
		||||
		igt_assert(fscanf(file, "%x", &missed) == 1);
 | 
			
		||||
		fclose(file);
 | 
			
		||||
	}
 | 
			
		||||
	if (missed) {
 | 
			
		||||
		file = igt_debugfs_fopen("i915_ring_missed_irq", "w");
 | 
			
		||||
		if (file) {
 | 
			
		||||
			fwrite("0\n", 1, 2, file);
 | 
			
		||||
			fclose(file);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return missed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static double gettime(void)
 | 
			
		||||
{
 | 
			
		||||
	static clockid_t clock = -1;
 | 
			
		||||
@ -105,7 +82,7 @@ sync_ring(int fd, int ring, unsigned flags)
 | 
			
		||||
	double start, elapsed;
 | 
			
		||||
	unsigned long cycles;
 | 
			
		||||
 | 
			
		||||
	intel_detect_and_clear_missed_irq(fd); /* clear before we begin */
 | 
			
		||||
	intel_detect_and_clear_missed_interrupts(fd);
 | 
			
		||||
 | 
			
		||||
	memset(&object, 0, sizeof(object));
 | 
			
		||||
	object.handle = gem_create(fd, 4096);
 | 
			
		||||
@ -130,7 +107,7 @@ sync_ring(int fd, int ring, unsigned flags)
 | 
			
		||||
	igt_info("Completed %ld cycles: %.3f us\n", cycles, elapsed*1e6/cycles);
 | 
			
		||||
 | 
			
		||||
	gem_close(fd, object.handle);
 | 
			
		||||
	igt_assert_eq(intel_detect_and_clear_missed_irq(fd), 0);
 | 
			
		||||
	igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
igt_main
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user