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;