[PATCH libdrm] amdgpu: dynamically detect number of drm devices

Christian K├Ânig ckoenig.leichtzumerken at gmail.com
Thu Apr 19 11:06:28 UTC 2018


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;



More information about the amd-gfx mailing list