drm/amdgpu/vcn: set the priority for each encode ring
VCN has multiple rings. Set the proper priority level for each encode ring while initializing. Signed-off-by: Satyajit Sahu <satyajit.sahu@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
080e613c74
commit
0ad29a4eb1
@ -949,3 +949,17 @@ error:
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
enum amdgpu_ring_priority_level amdgpu_vcn_get_enc_ring_prio(int ring)
|
||||
{
|
||||
switch(ring) {
|
||||
case 0:
|
||||
return AMDGPU_RING_PRIO_0;
|
||||
case 1:
|
||||
return AMDGPU_RING_PRIO_1;
|
||||
case 2:
|
||||
return AMDGPU_RING_PRIO_2;
|
||||
default:
|
||||
return AMDGPU_RING_PRIO_0;
|
||||
}
|
||||
}
|
||||
|
@ -308,4 +308,6 @@ int amdgpu_vcn_dec_sw_ring_test_ib(struct amdgpu_ring *ring, long timeout);
|
||||
int amdgpu_vcn_enc_ring_test_ring(struct amdgpu_ring *ring);
|
||||
int amdgpu_vcn_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout);
|
||||
|
||||
enum amdgpu_ring_priority_level amdgpu_vcn_get_enc_ring_prio(int ring);
|
||||
|
||||
#endif
|
||||
|
@ -145,10 +145,12 @@ static int vcn_v1_0_sw_init(void *handle)
|
||||
SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP);
|
||||
|
||||
for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
|
||||
enum amdgpu_ring_priority_level hw_prio = amdgpu_vcn_get_enc_ring_prio(i);
|
||||
|
||||
ring = &adev->vcn.inst->ring_enc[i];
|
||||
sprintf(ring->name, "vcn_enc%d", i);
|
||||
r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0,
|
||||
AMDGPU_RING_PRIO_DEFAULT, NULL);
|
||||
hw_prio, NULL);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
@ -159,6 +159,8 @@ static int vcn_v2_0_sw_init(void *handle)
|
||||
adev->vcn.inst->external.nop = SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP);
|
||||
|
||||
for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
|
||||
enum amdgpu_ring_priority_level hw_prio = amdgpu_vcn_get_enc_ring_prio(i);
|
||||
|
||||
ring = &adev->vcn.inst->ring_enc[i];
|
||||
ring->use_doorbell = true;
|
||||
if (!amdgpu_sriov_vf(adev))
|
||||
@ -167,7 +169,7 @@ static int vcn_v2_0_sw_init(void *handle)
|
||||
ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 1 + i;
|
||||
sprintf(ring->name, "vcn_enc%d", i);
|
||||
r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0,
|
||||
AMDGPU_RING_PRIO_DEFAULT, NULL);
|
||||
hw_prio, NULL);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
@ -194,6 +194,8 @@ static int vcn_v2_5_sw_init(void *handle)
|
||||
return r;
|
||||
|
||||
for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
|
||||
enum amdgpu_ring_priority_level hw_prio = amdgpu_vcn_get_enc_ring_prio(i);
|
||||
|
||||
ring = &adev->vcn.inst[j].ring_enc[i];
|
||||
ring->use_doorbell = true;
|
||||
|
||||
@ -203,7 +205,7 @@ static int vcn_v2_5_sw_init(void *handle)
|
||||
sprintf(ring->name, "vcn_enc_%d.%d", j, i);
|
||||
r = amdgpu_ring_init(adev, ring, 512,
|
||||
&adev->vcn.inst[j].irq, 0,
|
||||
AMDGPU_RING_PRIO_DEFAULT, NULL);
|
||||
hw_prio, NULL);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
@ -224,6 +224,8 @@ static int vcn_v3_0_sw_init(void *handle)
|
||||
return r;
|
||||
|
||||
for (j = 0; j < adev->vcn.num_enc_rings; ++j) {
|
||||
enum amdgpu_ring_priority_level hw_prio = amdgpu_vcn_get_enc_ring_prio(j);
|
||||
|
||||
/* VCN ENC TRAP */
|
||||
r = amdgpu_irq_add_id(adev, amdgpu_ih_clientid_vcns[i],
|
||||
j + VCN_2_0__SRCID__UVD_ENC_GENERAL_PURPOSE, &adev->vcn.inst[i].irq);
|
||||
@ -239,8 +241,7 @@ static int vcn_v3_0_sw_init(void *handle)
|
||||
}
|
||||
sprintf(ring->name, "vcn_enc_%d.%d", i, j);
|
||||
r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst[i].irq, 0,
|
||||
AMDGPU_RING_PRIO_DEFAULT,
|
||||
&adev->vcn.inst[i].sched_score);
|
||||
hw_prio, &adev->vcn.inst[i].sched_score);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
Reference in New Issue
Block a user