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

Zhang, Jerry (Junwei) Jerry.Zhang at amd.com
Fri Apr 20 02:04:20 UTC 2018


On 04/20/2018 09:50 AM, Zhang, Jerry (Junwei) wrote:
> On 04/19/2018 07:06 PM, Christian König wrote:
>> Wouldn't it be simpler to just set MAX_CARDS_SUPPORTED to 128?
>
> Perhaps it's 64 for card number.
> Although CONTROL node is not used now, but only 64 slots are reserved for each
> type.
>
> otherwise, we may prepare a patch to update to 128.
> How do you think that?

On second thought, it will touch much code to clean CONTROL node.
In current stage, updating the number looks the best way.
But 64 seems reasonable for now.

Jerry

>
> Jerry
>
>>
>> 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;
>>
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list