1*362cc001SDavid Matlack // SPDX-License-Identifier: GPL-2.0 2*362cc001SDavid Matlack #include "kvm_util.h" 3*362cc001SDavid Matlack #include "test_util.h" 4*362cc001SDavid Matlack #include "proc_util.h" 5*362cc001SDavid Matlack 6*362cc001SDavid Matlack static FILE *open_proc_interrupts(void) 7*362cc001SDavid Matlack { 8*362cc001SDavid Matlack FILE *fp; 9*362cc001SDavid Matlack 10*362cc001SDavid Matlack fp = fopen("/proc/interrupts", "r"); 11*362cc001SDavid Matlack TEST_ASSERT(fp, "fopen(/proc/interrupts) failed"); 12*362cc001SDavid Matlack 13*362cc001SDavid Matlack return fp; 14*362cc001SDavid Matlack } 15*362cc001SDavid Matlack 16*362cc001SDavid Matlack unsigned int vfio_msix_to_host_irq(const char *device_bdf, int msix) 17*362cc001SDavid Matlack { 18*362cc001SDavid Matlack char search_string[64]; 19*362cc001SDavid Matlack char line[4096]; 20*362cc001SDavid Matlack int irq = -1; 21*362cc001SDavid Matlack FILE *fp; 22*362cc001SDavid Matlack 23*362cc001SDavid Matlack fp = open_proc_interrupts(); 24*362cc001SDavid Matlack 25*362cc001SDavid Matlack snprintf(search_string, sizeof(search_string), "vfio-msix[%d]", msix); 26*362cc001SDavid Matlack 27*362cc001SDavid Matlack while (fgets(line, sizeof(line), fp)) { 28*362cc001SDavid Matlack if (strstr(line, device_bdf) && strstr(line, search_string)) { 29*362cc001SDavid Matlack TEST_ASSERT_EQ(1, sscanf(line, "%d:", &irq)); 30*362cc001SDavid Matlack break; 31*362cc001SDavid Matlack } 32*362cc001SDavid Matlack } 33*362cc001SDavid Matlack 34*362cc001SDavid Matlack fclose(fp); 35*362cc001SDavid Matlack 36*362cc001SDavid Matlack TEST_ASSERT(irq != -1, "Failed to locate IRQ for %s %s", device_bdf, 37*362cc001SDavid Matlack search_string); 38*362cc001SDavid Matlack return (unsigned int)irq; 39*362cc001SDavid Matlack } 40*362cc001SDavid Matlack 41