[PATCH 1/1] drm/amd/amdgpu: get maximum and used UVD handles (v3)
Nath, Arindam
Arindam.Nath at amd.com
Thu Dec 15 11:47:11 UTC 2016
>-----Original Message-----
>From: Emil Velikov [mailto:emil.l.velikov at gmail.com]
>Sent: Thursday, December 15, 2016 5:01 PM
>To: Nath, Arindam
>Cc: David Airlie; Deucher, Alexander; amd-gfx mailing list; ML dri-devel;
>Koenig, Christian
>Subject: Re: [PATCH 1/1] drm/amd/amdgpu: get maximum and used UVD
>handles (v3)
>
>On 15 December 2016 at 07:30, Nath, Arindam <Arindam.Nath at amd.com>
>wrote:
>>>-----Original Message-----
>>>From: Emil Velikov [mailto:emil.l.velikov at gmail.com]
>>>Sent: Wednesday, December 14, 2016 9:26 PM
>>>To: Nath, Arindam
>>>Cc: David Airlie; Deucher, Alexander; amd-gfx mailing list; ML dri-devel;
>>>Koenig, Christian
>>>Subject: Re: [PATCH 1/1] drm/amd/amdgpu: get maximum and used UVD
>>>handles (v3)
>>>
>>>On 12 December 2016 at 18:49, <arindam.nath at amd.com> wrote:
>>>> From: Arindam Nath <arindam.nath at amd.com>
>>>>
>>>> Change History
>>>> --------------
>>>>
>>>> v3: changes suggested by Christian
>>>> - Add a check for UVD IP block using AMDGPU_HW_IP_UVD
>>>> query type.
>>>> - Add a check for asic_type to be less than
>>>> CHIP_POLARIS10 since starting Polaris, we support
>>>> unlimited UVD instances.
>>>> - Add kerneldoc style comment for
>>>> amdgpu_uvd_used_handles().
>>>>
>>>> v2: as suggested by Christian
>>>> - Add a new query AMDGPU_INFO_NUM_HANDLES
>>>> - Create a helper function to return the number
>>>> of currently used UVD handles.
>>>> - Modify the logic to count the number of used
>>>> UVD handles since handles can be freed in
>>>> non-linear fashion.
>>>>
>>>> v1:
>>>> - User might want to query the maximum number of UVD
>>>> instances supported by firmware. In addition to that,
>>>> if there are multiple applications using UVD handles
>>>> at the same time, he might also want to query the
>>>> currently used number of handles.
>>>>
>>>> For this we add two variables max_handles and
>>>> used_handles inside drm_amdgpu_info_hw_ip. So now
>>>> an application (or libdrm) can use AMDGPU_INFO IOCTL
>>>> with AMDGPU_INFO_HW_IP_INFO query type to get these
>>>> values.
>>>>
>>>> Signed-off-by: Arindam Nath <arindam.nath at amd.com>
>>>> Reviewed-by: Christian König <christian.koenig at amd.com>
>>>> ---
>>>> drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 21
>>>+++++++++++++++++++++
>>>> drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 25
>>>+++++++++++++++++++++++++
>>>> drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h | 1 +
>>>> include/uapi/drm/amdgpu_drm.h | 9 +++++++++
>>>> 4 files changed, 56 insertions(+)
>>>>
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>>>b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>>>> index 174eb59..3273d8c 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>>>> @@ -570,6 +570,27 @@ static int amdgpu_info_ioctl(struct drm_device
>>>*dev, void *data, struct drm_file
>>>> return -EINVAL;
>>>> }
>>>> }
>>>> + case AMDGPU_INFO_NUM_HANDLES: {
>>>> + struct drm_amdgpu_info_num_handles handle;
>>>> +
>>>> + switch (info->query_hw_ip.type) {
>>>> + case AMDGPU_HW_IP_UVD:
>>>> + /* Starting Polaris, we support unlimited UVD handles */
>>>> + if (adev->asic_type < CHIP_POLARIS10) {
>>>> + handle.uvd_max_handles = adev->uvd.max_handles;
>>>> + handle.uvd_used_handles =
>>>amdgpu_uvd_used_handles(adev);
>>>> +
>>>> + return copy_to_user(out, &handle,
>>>> + min((size_t)size, sizeof(handle))) ? -EFAULT : 0;
>>>> + } else {
>>>> + return -EINVAL;
>>>Using EINVAL doesn't seem right here. As per man 3 ioctl
>>>
>>> EINVAL The request or arg argument is not valid for this device.
>>>
>>>A bit further down you can see the one you want.
>>>
>>> ENODEV The fildes argument refers to a valid STREAMS device, but
>>>the corresponding device driver does not support the ioctl() function.
>>
>> Emil, ENODEV would mean the driver does not support ioctl() itself. But in
>our case ioctl() is supported.
>>
>> Since we extract the query type from arg passed to ioctl(), and it is this
>query AMDGPU_INFO_NUM_HANDLES which is not supported by driver (for
>> Polaris), doesn’t returning EINVAL make more sense here?
>>
>Unless I'm reading the code incorrectly - CHIP_POLARIS10 and older do
>not have support the query. Thus ENODEV is the one you want to use.
>Furthermore EINVAL is (mostly) used to indicate incorrect input
>(failed input validation) which userspace uses to check if kernel is
>too old/does not support X.
Actually, the code says only asics older than CHIP_POLARIS10 support the query, beyond it doesn’t.
>
>If in doubt I recommend checking how other drivers are handling
>things. From memory at least i915 uses the above.
I will check how other drivers handle this.
Thanks,
Arindam
>
>Thanks
>Emil
More information about the dri-devel
mailing list