<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<p>Hi Emil,</p>
<p><br>
</p>
<p>Thanks for the comments.</p>
<p><br>
</p>
<p>Please see below.<br>
</p>
<p><br>
</p>
<p>Regards,</p>
<p>Alex Bin Xie<br>
</p>
<br>
<br>
<div style="color: rgb(0, 0, 0);">
<div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri, sans-serif" color="#000000"><b>From:</b> Emil Velikov <emil.l.velikov@gmail.com><br>
<b>Sent:</b> Friday, January 20, 2017 8:18 AM<br>
<b>To:</b> Xie, AlexBin<br>
<b>Cc:</b> amd-gfx mailing list<br>
<b>Subject:</b> Re: [PATCH libdrm 1/3] amdgpu: verify the tested device</font>
<div> </div>
</div>
</div>
<font size="2"><span style="font-size:10pt;">
<div class="PlainText">Hi Alex,<br>
<br>
Thanks for doing this. There's a few nitpicks on top of what David and<br>
Christian has spotted.<br>
<br>
On 19 January 2017 at 22:53, Alex Xie <AlexBin.Xie@amd.com> wrote:<br>
> Verify the vender ID and driver name.<br>
> Open all AMDGPU devices.<br>
> Provide an option to open render node.<br>
><br>
> Tested as root: PASS<br>
> Tested as non-privileged user:<br>
> All tests failed as expected<br>
><br>
> Signed-off-by: Alex Xie <AlexBin.Xie@amd.com><br>
> ---<br>
>  tests/amdgpu/amdgpu_test.c | 144 +++++++++++++++++++++++++++++++++++++--------<br>
>  1 file changed, 121 insertions(+), 23 deletions(-)<br>
><br>
> diff --git a/tests/amdgpu/amdgpu_test.c b/tests/amdgpu/amdgpu_test.c<br>
> index 71f357c..e42ef9d 100644<br>
> --- a/tests/amdgpu/amdgpu_test.c<br>
> +++ b/tests/amdgpu/amdgpu_test.c<br>
> @@ -115,6 +115,119 @@ static const char usage[] = "Usage: %s [-hl] [<-s <suite id>> [-t <test id>]]\n"<br>
>  /** Specified options strings for getopt */<br>
>  static const char options[]   = "hls:t:";<br>
><br>
> +/* Open AMD devices.<br>
> + * Return the number of AMD device openned.<br>
> + */<br>
> +static int amdgpu_open_devices(int open_render_node)<br>
> +{<br>
> +       drmDevicePtr devices[MAX_CARDS_SUPPORTED];<br>
> +       int ret;<br>
> +       int i;<br>
> +       int j;<br>
> +       int amd_index = 0;<br>
> +       int drm_count;<br>
> +       int fd;<br>
> +       char *device_name;<br>
> +       drmVersionPtr version;<br>
> +<br>
> +       drm_count = drmGetDevices2(0, devices, MAX_CARDS_SUPPORTED);<br>
> +<br>
> +       if (drm_count < 0) {<br>
> +               fprintf(stderr,<br>
> +                       "drmGetDevices2() returned an error %d\n",<br>
> +                       drm_count);<br>
> +               return 0;<br>
> +       }<br>
> +<br>
> +       for (i = 0; i < drm_count; i++) {<br>
> +               /* If this is not AMD GPU vender ID, skip*/<br>
> +               if (devices[i]->bustype == DRM_BUS_PCI)<br>
> +                       if (devices[i]->deviceinfo.pci->vendor_id != 0x1002)<br>
> +                               continue;<br>
> +<br>
> +               for (j = 0; j < DRM_NODE_MAX; j++) {<br>
> +                       if (devices[i]->available_nodes & 1 << j) {<br>
> +                               fd = open(<br>
> +                                       devices[i]->nodes[j],<br>
> +                                       O_RDONLY | O_CLOEXEC,<br>
> +                                       0);<br>
> +                               if (fd < 0) continue;<br>
> +                       }<br>
You don't need to iterate over all the available nodes. Just fetch the<br>
PRIMARY or RENDER based on open_render_node.<br>
Note that a device can be missing some node types (say RENDER) so make<br>
sure the available_nodes bitmask is set.<br>
<br>
[Alex Bin Xie]:<br>
That was my original design, but later I changed.<br>
I knew this work for the current xf86drm.c. But is the nodes[0]  always primary?<br>
I was afraid that this may be changed in future. I searched all drm tests. I did not see an example.<br>
<br>
So amdgpu_test will be the first to access nodes like:<font size="2"><span style="font-size:10pt;"><font size="2"> open(<span class="blob-code-inner">devices[i]->nodes[DRM_NODE_PRIMARY]</span>), for example.<br>
</font></span></font><br>
> +                       if (open_render_node)<br>
> +                               device_name = drmGetRenderDeviceNameFromFd(fd);<br>
> +                       else<br>
> +                               device_name = drmGetPrimaryDeviceNameFromFd(fd);<br>
> +<br>
> +                       close(fd);<br>
> +<br>
> +                       drm_amdgpu[amd_index] = open(device_name,<br>
> +                                                       O_RDWR | O_CLOEXEC);<br>
> +<br>
> +                       if (drm_amdgpu[amd_index] >= 0)<br>
> +                               amd_index++;<br>
> +<br>
> +                       free(device_name);<br>
> +<br>
With the above comment this becomes redundant.<br>
<br>
> +                       /* We have open this device. Go to next device.*/<br>
> +                       break;<br>
> +               }<br>
> +       }<br>
> +<br>
Here you want to initialise the remainder of drm_amdgpu[] (since<br>
drm_count can be less than MAX_CARDS_SUPPORTED) with -1.<br>
Otherwise you'll have fun experiences during close/print (below).<br>
<br>
<font size="2"><span style="font-size:10pt;">[Alex Bin Xie]:</span></font> This initialization is done in existing main<font size="2"><span style="font-size:10pt;">() function</span></font> (not introduced this patch).<br>
<br>
-Emil<br>
</div>
</span></font></div>
</div>
</body>
</html>