some small nitpick... On 2017å¹´01æ??20æ?¥ 06:53, Alex Xie wrote: > 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); here needs return value; > +} > + > +/* 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); we'd better to check this function return value. Regards, David Zhou > > 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(); > }