[PATCH 2/2] drm/amdgpu: Use offsets local to VCN in VF
Christian König
ckoenig.leichtzumerken at gmail.com
Tue Mar 5 09:18:10 UTC 2024
Am 05.03.24 um 10:03 schrieb Lazar, Lijo:
>
> On 3/5/2024 2:24 PM, Christian König wrote:
>>
>> Am 05.03.24 um 07:40 schrieb Lijo Lazar:
>>> For VCN 4.0.3, use only the local addressing scheme while in VF
>>> mode. This includes addressing scheme used for HUB offsets.
>>>
>>> Signed-off-by: Lijo Lazar <lijo.lazar at amd.com>
>>> ---
>>> drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c | 20 +++++++++++++++++++-
>>> 1 file changed, 19 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
>>> b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
>>> index 7b5ad13b618e..a27f3f260aab 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
>>> @@ -1381,6 +1381,24 @@ static uint64_t
>>> vcn_v4_0_3_unified_ring_get_wptr(struct amdgpu_ring *ring)
>>> regUVD_RB_WPTR);
>>> }
>>> +static void vcn_v4_0_3_enc_ring_emit_vm_flush(struct amdgpu_ring
>>> *ring,
>>> + unsigned int vmid, uint64_t pd_addr)
>>> +{
>>> + struct amdgpu_vmhub *hub;
>>> +
>>> + /* For VF, only local offsets should be used */
>>> + if (amdgpu_sriov_vf(ring->adev))
>>> + ring->vm_hub = AMDGPU_MMHUB0(0);
>> That is clearly a no-go since the vm_hub must be statically and can't be
>> changed here.
>>
> After HUB allocation, the only usage of this hub pointer is to calculate
> use the right offset. We still want VCN to use the right hub, only thing
> is register offsets in MMHUB(0) are equal to 'local offsets'.
The vm_hub is a static setup describing how the engine works. You
basically just insert an illegal value here to fix your register offset
calculation.
That is absolutely *not* something you can do.
What exactly is the requirement?
Regards,
Christian.
>
> Thanks,
> Lijo
>
>> Regards,
>> Christian.
>>
>>> + hub = &ring->adev->vmhub[ring->vm_hub];
>>> +
>>> + pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr);
>>> +
>>> + /* wait for reg writes */
>>> + vcn_v2_0_enc_ring_emit_reg_wait(ring, hub->ctx0_ptb_addr_lo32 +
>>> + vmid * hub->ctx_addr_distance,
>>> + lower_32_bits(pd_addr), 0xffffffff);
>>> +}
>>> +
>>> static void vcn_v4_0_3_ring_emit_hdp_flush(struct amdgpu_ring *ring)
>>> {
>>> /* VCN engine access for HDP flush doesn't work when RRMT is
>>> enabled.
>>> @@ -1443,7 +1461,7 @@ static const struct amdgpu_ring_funcs
>>> vcn_v4_0_3_unified_ring_vm_funcs = {
>>> .emit_ib_size = 5, /* vcn_v2_0_enc_ring_emit_ib */
>>> .emit_ib = vcn_v2_0_enc_ring_emit_ib,
>>> .emit_fence = vcn_v2_0_enc_ring_emit_fence,
>>> - .emit_vm_flush = vcn_v2_0_enc_ring_emit_vm_flush,
>>> + .emit_vm_flush = vcn_v4_0_3_enc_ring_emit_vm_flush,
>>> .emit_hdp_flush = vcn_v4_0_3_ring_emit_hdp_flush,
>>> .test_ring = amdgpu_vcn_enc_ring_test_ring,
>>> .test_ib = amdgpu_vcn_unified_ring_test_ib,
More information about the amd-gfx
mailing list