mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-12 10:26:12 +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("clflush %0" : "+m" (*(volatile char *)p));
|
||||||
asm volatile("mfence" ::: "memory");
|
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);
|
int igt_setup_clflush(void);
|
||||||
void igt_clflush_range(void *addr, int size);
|
void igt_clflush_range(void *addr, int size);
|
||||||
|
|
||||||
|
unsigned intel_detect_and_clear_missed_interrupts(int fd);
|
||||||
|
|
||||||
#endif /* IGT_GT_H */
|
#endif /* IGT_GT_H */
|
||||||
|
@ -755,26 +755,6 @@ static struct igt_hang_ring rcs_hang(void)
|
|||||||
return igt_hang_ring(fd, I915_EXEC_RENDER);
|
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,
|
static void do_basic0(struct buffers *buffers,
|
||||||
do_copy do_copy_func,
|
do_copy do_copy_func,
|
||||||
do_hang do_hang_func)
|
do_hang do_hang_func)
|
||||||
@ -1135,7 +1115,7 @@ static void run_single(struct buffers *buffers,
|
|||||||
do_hang do_hang_func)
|
do_hang do_hang_func)
|
||||||
{
|
{
|
||||||
do_test_func(buffers, do_copy_func, 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,
|
static void run_interruptible(struct buffers *buffers,
|
||||||
@ -1146,7 +1126,7 @@ static void run_interruptible(struct buffers *buffers,
|
|||||||
for (pass = 0; pass < 10; pass++)
|
for (pass = 0; pass < 10; pass++)
|
||||||
do_test_func(buffers, do_copy_func, do_hang_func);
|
do_test_func(buffers, do_copy_func, do_hang_func);
|
||||||
pass = 0;
|
pass = 0;
|
||||||
check_gpu();
|
igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __run_forked(struct buffers *buffers,
|
static void __run_forked(struct buffers *buffers,
|
||||||
@ -1177,7 +1157,7 @@ static void __run_forked(struct buffers *buffers,
|
|||||||
}
|
}
|
||||||
|
|
||||||
igt_waitchildren();
|
igt_waitchildren();
|
||||||
check_gpu();
|
igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
|
||||||
|
|
||||||
num_buffers = old_num_buffers;
|
num_buffers = old_num_buffers;
|
||||||
}
|
}
|
||||||
@ -1473,6 +1453,7 @@ igt_main
|
|||||||
|
|
||||||
igt_fixture {
|
igt_fixture {
|
||||||
fd = drm_open_driver(DRIVER_INTEL);
|
fd = drm_open_driver(DRIVER_INTEL);
|
||||||
|
intel_detect_and_clear_missed_interrupts(fd);
|
||||||
devid = intel_get_drm_devid(fd);
|
devid = intel_get_drm_devid(fd);
|
||||||
gen = intel_gen(devid);
|
gen = intel_gen(devid);
|
||||||
rendercopy = igt_get_render_copyfunc(devid);
|
rendercopy = igt_get_render_copyfunc(devid);
|
||||||
|
@ -91,39 +91,16 @@ sync_loop(int fd)
|
|||||||
gem_close(fd, object[0].handle);
|
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
|
igt_simple_main
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
fd = drm_open_driver(DRIVER_INTEL);
|
fd = drm_open_driver(DRIVER_INTEL);
|
||||||
igt_require(gem_get_num_rings(fd) > 1);
|
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);
|
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);
|
close(fd);
|
||||||
}
|
}
|
||||||
|
@ -33,29 +33,6 @@ IGT_TEST_DESCRIPTION("Basic check of ring<->ring write synchronisation.");
|
|||||||
* Extremely efficient at catching missed irqs
|
* 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 double gettime(void)
|
||||||
{
|
{
|
||||||
static clockid_t clock = -1;
|
static clockid_t clock = -1;
|
||||||
@ -105,7 +82,7 @@ sync_ring(int fd, int ring, unsigned flags)
|
|||||||
double start, elapsed;
|
double start, elapsed;
|
||||||
unsigned long cycles;
|
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));
|
memset(&object, 0, sizeof(object));
|
||||||
object.handle = gem_create(fd, 4096);
|
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);
|
igt_info("Completed %ld cycles: %.3f us\n", cycles, elapsed*1e6/cycles);
|
||||||
|
|
||||||
gem_close(fd, object.handle);
|
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
|
igt_main
|
||||||
|
Loading…
x
Reference in New Issue
Block a user