[PATCH] drm/amdgpu: Fix uvd firmware version information for vega20
Alex Deucher
alexdeucher at gmail.com
Thu Jun 14 16:41:35 UTC 2018
On Thu, Jun 14, 2018 at 12:36 PM, James Zhu <jamesz at amd.com> wrote:
> +Peter
>
>
>
> On 2018-06-14 11:51 AM, Leo Liu wrote:
>>
>>
>>
>> On 06/14/2018 11:29 AM, Alex Deucher wrote:
>>>
>>> The uvd version information was not set correctly for vega20.
>>> Rearrange the logic to set it correctly and fix the warnings
>>> as a result.
>>>
>>> Fixes: 7b3c773f405 (drm/amdgpu/vg20:support new UVD FW version naming
>>> convention)
>>> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
>>> ---
>>>
>>> I'm not sure if this is exactly how we want to expose the new firmware
>>> versioning
>>> to userspace, but it's better than random stack data.
>>
>> The encode team like to have the origin number which they put to FW, back
>> to user space for chip beyond RV and Vega20.
>>
>>>
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 43
>>> +++++++++++++++++++--------------
>>> 1 file changed, 25 insertions(+), 18 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>> index 630e273c16ce..dde0c4383014 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
>>> @@ -127,7 +127,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
>>> unsigned long bo_size;
>>> const char *fw_name;
>>> const struct common_firmware_header *hdr;
>>> - unsigned version_major, version_minor, family_id;
>>> + unsigned family_id;
>>> int i, j, r;
>>> INIT_DELAYED_WORK(&adev->uvd.inst->idle_work,
>>> amdgpu_uvd_idle_work_handler);
>>> @@ -210,10 +210,31 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
>>> family_id = le32_to_cpu(hdr->ucode_version) & 0xff;
>>> if (adev->asic_type < CHIP_VEGA20) {
>>> + unsigned version_major, version_minor;
>>> +
>>> version_major = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xff;
>>> version_minor = (le32_to_cpu(hdr->ucode_version) >> 8) & 0xff;
>>> DRM_INFO("Found UVD firmware Version: %hu.%hu Family ID:
>>> %hu\n",
>>> version_major, version_minor, family_id);
>>> +
>>> + /*
>>> + * Limit the number of UVD handles depending on microcode major
>>> + * and minor versions. The firmware version which has 40 UVD
>>> + * instances support is 1.80. So all subsequent versions should
>>> + * also have the same support.
>>> + */
>>> + if ((version_major > 0x01) ||
>>> + ((version_major == 0x01) && (version_minor >= 0x50)))
>>> + adev->uvd.max_handles = AMDGPU_MAX_UVD_HANDLES;
>>> +
>>> + adev->uvd.fw_version = ((version_major << 24) | (version_minor
>>> << 16) |
>>> + (family_id << 8));
>>> +
>>> + if ((adev->asic_type == CHIP_POLARIS10 ||
>>> + adev->asic_type == CHIP_POLARIS11) &&
>>> + (adev->uvd.fw_version < FW_1_66_16))
>>> + DRM_ERROR("POLARIS10/11 UVD firmware version %hu.%hu is too
>>> old.\n",
>>> + version_major, version_minor);
>>> } else {
>>> unsigned int enc_major, enc_minor, dec_minor;
>>> @@ -222,26 +243,12 @@ int amdgpu_uvd_sw_init(struct amdgpu_device
>>> *adev)
>>> enc_major = (le32_to_cpu(hdr->ucode_version) >> 30) & 0x3;
>>> DRM_INFO("Found UVD firmware ENC: %hu.%hu DEC: .%hu Family ID:
>>> %hu\n",
>>> enc_major, enc_minor, dec_minor, family_id);
>>> - }
>>> - /*
>>> - * Limit the number of UVD handles depending on microcode major
>>> - * and minor versions. The firmware version which has 40 UVD
>>> - * instances support is 1.80. So all subsequent versions should
>>> - * also have the same support.
>>> - */
>>> - if (adev->asic_type >= CHIP_VEGA20 || (version_major > 0x01) ||
>>> - ((version_major == 0x01) && (version_minor >= 0x50)))
>>> adev->uvd.max_handles = AMDGPU_MAX_UVD_HANDLES;
>>> - adev->uvd.fw_version = ((version_major << 24) | (version_minor <<
>>> 16) |
>>> - (family_id << 8));
>>> -
>>> - if ((adev->asic_type == CHIP_POLARIS10 ||
>>> - adev->asic_type == CHIP_POLARIS11) &&
>>> - (adev->uvd.fw_version < FW_1_66_16))
>>> - DRM_ERROR("POLARIS10/11 UVD firmware version %hu.%hu is too
>>> old.\n",
>>> - version_major, version_minor);
>>> + adev->uvd.fw_version = ((enc_major << 24) | (enc_minor << 16) |
>>> + (dec_minor << 8) | (family_id << 0));
>>
>> It should be:
>>
>> adev->uvd.fw_version = hdr->ucode_version;
>
> Hi Peter, Does user space need the whole ucode_version or just fields with
> enc/dec/familyID? James
We also export this info via debugfs for debugging to query what
firmware versions are loaded on each engine on the GPU.
Alex
>>
>>
>> With that fixed the patch is:
>>
>> Reviewed-by: Leo Liu <leo.liu at amd.com>
>>
>>
>> Regards,
>> Leo
>>
>>
>>> + }
>>> bo_size = AMDGPU_UVD_STACK_SIZE + AMDGPU_UVD_HEAP_SIZE
>>> + AMDGPU_UVD_SESSION_SIZE * adev->uvd.max_handles;
>>
>>
>> _______________________________________________
>> 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