Hi Christian, The problem I encountered is that amdgpu_test throws segment fault on a platform with 1 iGPU + 4 dGPU. The root cause is that 'drm_count' returned by drmGetDevices() is 5 which exceeds MAX_CARDS_SUPPORTED, so I decided to make it more flexible to get the actual number of drm devices. Setting MAX_CARDS_SUPPORTED to 128 is fine to solve my problem but is it a bit large for traversal? Regards, Xiaojie On 04/19/2018 07:06 PM, Christian König wrote: > Wouldn't it be simpler to just set MAX_CARDS_SUPPORTED to 128? > > Regards, > Christian. > > Am 19.04.2018 um 12:12 schrieb Xiaojie Yuan: >> Change-Id: I36764951bebbcbf06cf84dd43ee946a34ec7b100 >> Signed-off-by: Xiaojie Yuan <Xiaojie.Yuan at amd.com> >> --- >>  tests/amdgpu/amdgpu_test.c | 44 ++++++++++++++++++++++++++++---------- >>  tests/amdgpu/amdgpu_test.h | 7 +----- >>  2 files changed, 34 insertions(+), 17 deletions(-) >> >> diff --git a/tests/amdgpu/amdgpu_test.c b/tests/amdgpu/amdgpu_test.c >> index 96fcd687..f7ac4ab4 100644 >> --- a/tests/amdgpu/amdgpu_test.c >> +++ b/tests/amdgpu/amdgpu_test.c >> @@ -61,7 +61,8 @@ >>   * Open handles for amdgpu devices >>   * >>   */ >> -int drm_amdgpu[MAX_CARDS_SUPPORTED]; >> +int *drm_amdgpu; >> +size_t num_drm_devices; >>   /** Open render node to test */ >>  int open_render_node = 0;   /* By default run most tests on >> primary node */ >> @@ -238,16 +239,16 @@ static const char options[]  = "hlrps:t:b:d:f"; >>   */ >>  static int amdgpu_open_devices(int open_render_node) >>  { >> -   drmDevicePtr devices[MAX_CARDS_SUPPORTED]; >> +   drmDevicePtr *devices; >>      int i; >>      int drm_node; >>      int amd_index = 0; >>      int drm_count; >> +   int drm_count2; >>      int fd; >>      drmVersionPtr version; >>  -   drm_count = drmGetDevices2(0, devices, MAX_CARDS_SUPPORTED); >> - >> +   drm_count = drmGetDevices2(0, NULL, 0); >>      if (drm_count < 0) { >>          fprintf(stderr, >>              "drmGetDevices2() returned an error %d\n", >> @@ -255,6 +256,27 @@ static int amdgpu_open_devices(int >> open_render_node) >>          return 0; >>      } >>  +   devices = calloc(drm_count, sizeof(drmDevicePtr)); >> +   if (!devices) { >> +       goto end; >> +   } >> + >> +   drm_amdgpu = calloc(drm_count, sizeof(int)); >> +   if (!drm_amdgpu) { >> +       goto end; >> +   } >> + >> +   for (i = 0; i < drm_count; i++) >> +       drm_amdgpu[i] = -1; >> + >> +   drm_count2 = drmGetDevices2(0, devices, drm_count); >> +   if (drm_count2 != drm_count) { >> +       fprintf(stderr, "number of drm devices changed"); >> +       goto end; >> +   } >> + >> +   num_drm_devices = drm_count; >> + >>      for (i = 0; i < drm_count; i++) { >>          /* If this is not PCI device, skip*/ >>          if (devices[i]->bustype != DRM_BUS_PCI) >> @@ -302,7 +324,9 @@ static int amdgpu_open_devices(int open_render_node) >>          amd_index++; >>      } >>  +end: >>      drmFreeDevices(devices, drm_count); >> +   free(devices); >>      return amd_index; >>  } >>  @@ -311,9 +335,11 @@ static int amdgpu_open_devices(int >> open_render_node) >>  static void amdgpu_close_devices() >>  { >>      int i; >> -   for (i = 0; i < MAX_CARDS_SUPPORTED; i++) >> +   for (i = 0; i < num_drm_devices; i++) >>          if (drm_amdgpu[i] >=0) >>              close(drm_amdgpu[i]); >> + >> +   free(drm_amdgpu); >>  } >>   /* Print AMD devices information */ >> @@ -339,7 +365,7 @@ static void amdgpu_print_devices() >>       /* Display information of AMD devices */ >>      printf("Devices:\n"); >> -   for (i = 0; i < MAX_CARDS_SUPPORTED && drm_amdgpu[i] >=0; i++) >> +   for (i = 0; i < num_drm_devices && drm_amdgpu[i] >=0; i++) >>          if (drmGetDevice2(drm_amdgpu[i], >>              DRM_DEVICE_GET_PCI_REVISION, >>              &device) == 0) { >> @@ -377,7 +403,7 @@ static int amdgpu_find_device(uint8_t bus, >> uint16_t dev) >>      int i; >>      drmDevicePtr device; >>  -   for (i = 0; i < MAX_CARDS_SUPPORTED && drm_amdgpu[i] >= 0; i++) { >> +   for (i = 0; i < num_drm_devices && drm_amdgpu[i] >= 0; i++) { >>          if (drmGetDevice2(drm_amdgpu[i], >>              DRM_DEVICE_GET_PCI_REVISION, >>              &device) == 0) { >> @@ -456,10 +482,6 @@ int main(int argc, char **argv) >>      int display_list = 0; >>      int force_run = 0; >>  -   for (i = 0; i < MAX_CARDS_SUPPORTED; i++) >> -       drm_amdgpu[i] = -1; >> - >> - >>      /* Parse command line string */ >>      opterr = 0;       /* Do not print error messages from getopt */ >>      while ((c = getopt(argc, argv, options)) != -1) { >> diff --git a/tests/amdgpu/amdgpu_test.h b/tests/amdgpu/amdgpu_test.h >> index 62875736..8a604fe4 100644 >> --- a/tests/amdgpu/amdgpu_test.h >> +++ b/tests/amdgpu/amdgpu_test.h >> @@ -27,13 +27,8 @@ >>  #include "amdgpu.h" >>  #include "amdgpu_drm.h" >>  -/** >> - * Define max. number of card in system which we are able to handle >> - */ >> -#define MAX_CARDS_SUPPORTED    4 >> - >>  /* Forward reference for array to keep "drm" handles */ >> -extern int drm_amdgpu[MAX_CARDS_SUPPORTED]; >> +extern int *drm_amdgpu; >>   /* Global variables */ >>  extern int open_render_node; >