Verify the vender ID and driver name. Open all AMDGPU devices. Provide an option to open render node. Tested as root: PASS Tested as non-privileged user: All tests failed as expected Signed-off-by: Alex Xie <AlexBin.Xie at amd.com> --- tests/amdgpu/amdgpu_test.c | 144 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 121 insertions(+), 23 deletions(-) diff --git a/tests/amdgpu/amdgpu_test.c b/tests/amdgpu/amdgpu_test.c index 71f357c..e42ef9d 100644 --- a/tests/amdgpu/amdgpu_test.c +++ b/tests/amdgpu/amdgpu_test.c @@ -115,6 +115,119 @@ static const char usage[] = "Usage: %s [-hl] [<-s <suite id>> [-t <test id>]]\n" /** Specified options strings for getopt */ static const char options[] = "hls:t:"; +/* Open AMD devices. + * Return the number of AMD device openned. + */ +static int amdgpu_open_devices(int open_render_node) +{ + drmDevicePtr devices[MAX_CARDS_SUPPORTED]; + int ret; + int i; + int j; + int amd_index = 0; + int drm_count; + int fd; + char *device_name; + drmVersionPtr version; + + drm_count = drmGetDevices2(0, devices, MAX_CARDS_SUPPORTED); + + if (drm_count < 0) { + fprintf(stderr, + "drmGetDevices2() returned an error %d\n", + drm_count); + return 0; + } + + for (i = 0; i < drm_count; i++) { + /* If this is not AMD GPU vender ID, skip*/ + if (devices[i]->bustype == DRM_BUS_PCI) + if (devices[i]->deviceinfo.pci->vendor_id != 0x1002) + continue; + + for (j = 0; j < DRM_NODE_MAX; j++) { + if (devices[i]->available_nodes & 1 << j) { + fd = open( + devices[i]->nodes[j], + O_RDONLY | O_CLOEXEC, + 0); + if (fd < 0) continue; + } + + version = drmGetVersion(fd); + if (!version) { + fprintf(stderr, + "Warning: Cannot get version for %s." + "Error is %s\n", + devices[i]->nodes[j], + strerror(errno)); + close(fd); + break; + } + + if (strcmp(version->name, "amdgpu")) { + /* This is not AMDGPU driver, skip.*/ + drmFreeVersion(version); + close(fd); + break; + } + + drmFreeVersion(version); + + if (open_render_node) + device_name = drmGetRenderDeviceNameFromFd(fd); + else + device_name = drmGetPrimaryDeviceNameFromFd(fd); + + close(fd); + + drm_amdgpu[amd_index] = open(device_name, + O_RDWR | O_CLOEXEC); + + if (drm_amdgpu[amd_index] >= 0) + amd_index++; + + free(device_name); + + /* We have open this device. Go to next device.*/ + break; + } + } + + drmFreeDevices(devices, drm_count); +} + +/* Close AMD devices. + */ +static void amdgpu_close_devices() +{ + int i; + for (i = 0; i < MAX_CARDS_SUPPORTED; i++) + if (drm_amdgpu[i] >=0) + close(drm_amdgpu[i]); +} + +/* Print AMD devices information */ +static void amdgpu_print_devices() +{ + int i; + for (i = 0; i < MAX_CARDS_SUPPORTED; i++) + if (drm_amdgpu[i] >=0) { + /** Display version of DRM driver */ + drmVersionPtr retval = drmGetVersion(drm_amdgpu[0]); + + if (retval == NULL) { + perror("Cannot get version for AMDGPU device"); + exit(EXIT_FAILURE); + } + + printf("AMDGPU device #%d: " + "Name: [%s] : Date [%s] : Description [%s]\n", + i, retval->name, retval->date, retval->desc); + drmFreeVersion(retval); + } +} + /* The main() function for setting up and running the tests. * Returns a CUE_SUCCESS on successful running, another * CUnit error code on failure. @@ -163,35 +276,20 @@ int main(int argc, char **argv) } } - /* Try to open all possible radeon connections - * Right now: Open only the 0. - */ - printf("Try to open the card 0..\n"); - drm_amdgpu[0] = open("/dev/dri/card0", O_RDWR | O_CLOEXEC); + amdgpu_open_devices(0); if (drm_amdgpu[0] < 0) { - perror("Cannot open /dev/dri/card0\n"); - exit(EXIT_FAILURE); - } - - /** Display version of DRM driver */ - drmVersionPtr retval = drmGetVersion(drm_amdgpu[0]); - - if (retval == NULL) { - perror("Could not get information about DRM driver"); + perror("Cannot open AMDGPU device.\n"); exit(EXIT_FAILURE); } - printf("DRM Driver: Name: [%s] : Date [%s] : Description [%s]\n", - retval->name, retval->date, retval->desc); - - drmFreeVersion(retval); + amdgpu_print_devices(); /* Initialize test suites to run */ /* initialize the CUnit test registry */ if (CUE_SUCCESS != CU_initialize_registry()) { - close(drm_amdgpu[0]); + amdgpu_close_devices(); return CU_get_error(); } @@ -200,7 +298,7 @@ int main(int argc, char **argv) fprintf(stderr, "suite registration failed - %s\n", CU_get_error_msg()); CU_cleanup_registry(); - close(drm_amdgpu[0]); + amdgpu_close_devices(); exit(EXIT_FAILURE); } @@ -222,7 +320,7 @@ int main(int argc, char **argv) fprintf(stderr, "Invalid test id: %d\n", test_id); CU_cleanup_registry(); - close(drm_amdgpu[0]); + amdgpu_close_devices(); exit(EXIT_FAILURE); } } else @@ -231,13 +329,13 @@ int main(int argc, char **argv) fprintf(stderr, "Invalid suite id : %d\n", suite_id); CU_cleanup_registry(); - close(drm_amdgpu[0]); + amdgpu_close_devices(); exit(EXIT_FAILURE); } } else CU_basic_run_tests(); CU_cleanup_registry(); - close(drm_amdgpu[0]); + amdgpu_close_devices(); return CU_get_error(); } -- 2.7.4