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

Christian König christian.koenig at amd.com
Thu Dec 12 15:58:18 UTC 2019


Am 12.12.19 um 16:57 schrieb Leo Liu:
>
> 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.

Keep in mind that you don't need to fully clone the code.

You probably can still call the common VCN helper code quite a bit.

Christian.

>
> 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