[PATCH] drm/amdgpu: add JPEG check to VCN idle handler and begin use

Leo Liu leo.liu at amd.com
Thu Dec 12 15:57:04 UTC 2019


On 2019-12-12 3:18 a.m., Christian König wrote:
> Am 11.12.19 um 20:48 schrieb Leo Liu:
>> Since it's only needed with VCN1.0 when HW has no its
>> own JPEG HW IP block
>
> Wouldn't it be simpler/cleaner to just define a 
> vcn_v1_0_ring_begin_use() and vcn_v1_0_idle_work_handler() instead?

Yeah, this way should be cleaner, even though the changes got bigger, 
the new set will be sent shortly.

Thanks,

Leo



>
> Regards,
> Christian.
>
>>
>> Signed-off-by: Leo Liu <leo.liu at amd.com>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 29 +++++++++++++++----------
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h |  2 ++
>>   2 files changed, 20 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>> index 428cfd58b37d..95ac721f2de0 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
>> @@ -186,6 +186,9 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
>>           }
>>       }
>>   +    adev->vcn.has_jpeg_block = 
>> (amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_JPEG)) ?
>> +        true : false;
>> +
>>       return 0;
>>   }
>>   @@ -306,15 +309,17 @@ static void 
>> amdgpu_vcn_idle_work_handler(struct work_struct *work)
>>               else
>>                   new_state.fw_based = VCN_DPG_STATE__UNPAUSE;
>>   -            if 
>> (amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec))
>> -                new_state.jpeg = VCN_DPG_STATE__PAUSE;
>> -            else
>> -                new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
>> -
>> +            if (!adev->vcn.has_jpeg_block) {
>> +                if 
>> (amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec))
>> +                    new_state.jpeg = VCN_DPG_STATE__PAUSE;
>> +                else
>> +                    new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
>> +            }
>>               adev->vcn.pause_dpg_mode(adev, &new_state);
>>           }
>>   -        fence[j] += 
>> amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec);
>> +        if (!adev->vcn.has_jpeg_block)
>> +            fence[j] += 
>> amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec);
>>           fence[j] += 
>> amdgpu_fence_count_emitted(&adev->vcn.inst[j].ring_dec);
>>           fences += fence[j];
>>       }
>> @@ -358,14 +363,16 @@ void amdgpu_vcn_ring_begin_use(struct 
>> amdgpu_ring *ring)
>>           else
>>               new_state.fw_based = VCN_DPG_STATE__UNPAUSE;
>>   -        if 
>> (amdgpu_fence_count_emitted(&adev->jpeg.inst[ring->me].ring_dec))
>> -            new_state.jpeg = VCN_DPG_STATE__PAUSE;
>> -        else
>> -            new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
>> +        if (!adev->vcn.has_jpeg_block) {
>> +            if 
>> (amdgpu_fence_count_emitted(&adev->jpeg.inst[ring->me].ring_dec))
>> +                new_state.jpeg = VCN_DPG_STATE__PAUSE;
>> +            else
>> +                new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
>> +        }
>>             if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC)
>>               new_state.fw_based = VCN_DPG_STATE__PAUSE;
>> -        else if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_JPEG)
>> +        else if (!adev->vcn.has_jpeg_block && ring->funcs->type == 
>> AMDGPU_RING_TYPE_VCN_JPEG)
>>               new_state.jpeg = VCN_DPG_STATE__PAUSE;
>>             adev->vcn.pause_dpg_mode(adev, &new_state);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
>> index 402a5046b985..9a2381d006c6 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
>> @@ -192,6 +192,8 @@ struct amdgpu_vcn {
>>       unsigned    harvest_config;
>>       int (*pause_dpg_mode)(struct amdgpu_device *adev,
>>           struct dpg_pause_state *new_state);
>> +
>> +    bool has_jpeg_block;
>>   };
>>     int amdgpu_vcn_sw_init(struct amdgpu_device *adev);
>


More information about the amd-gfx mailing list