[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