Skip to content

Commit 6728f55

Browse files
Jane Jianalexdeucher
authored andcommitted
drm/amdgpu/vcn: Use offsets local to VCN/JPEG in VF
For VCN/JPEG 4.0.3, use only the local addressing scheme. - Mask bit higher than AID0 range v2 remain the case for mmhub use master XCC Signed-off-by: Jane Jian <[email protected]> Reviewed-by: Lijo Lazar <[email protected]> Signed-off-by: Alex Deucher <[email protected]> (cherry picked from commit caaf576)
1 parent 485432d commit 6728f55

File tree

2 files changed

+60
-5
lines changed

2 files changed

+60
-5
lines changed

drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
#include "vcn/vcn_4_0_3_sh_mask.h"
3333
#include "ivsrcid/vcn/irqsrcs_vcn_4_0.h"
3434

35+
#define NORMALIZE_JPEG_REG_OFFSET(offset) \
36+
(offset & 0x1FFFF)
37+
3538
enum jpeg_engin_status {
3639
UVD_PGFSM_STATUS__UVDJ_PWR_ON = 0,
3740
UVD_PGFSM_STATUS__UVDJ_PWR_OFF = 2,
@@ -824,7 +827,13 @@ void jpeg_v4_0_3_dec_ring_emit_ib(struct amdgpu_ring *ring,
824827
void jpeg_v4_0_3_dec_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg,
825828
uint32_t val, uint32_t mask)
826829
{
827-
uint32_t reg_offset = (reg << 2);
830+
uint32_t reg_offset;
831+
832+
/* For VF, only local offsets should be used */
833+
if (amdgpu_sriov_vf(ring->adev))
834+
reg = NORMALIZE_JPEG_REG_OFFSET(reg);
835+
836+
reg_offset = (reg << 2);
828837

829838
amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_RB_COND_RD_TIMER_INTERNAL_OFFSET,
830839
0, 0, PACKETJ_TYPE0));
@@ -865,7 +874,13 @@ void jpeg_v4_0_3_dec_ring_emit_vm_flush(struct amdgpu_ring *ring,
865874

866875
void jpeg_v4_0_3_dec_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t val)
867876
{
868-
uint32_t reg_offset = (reg << 2);
877+
uint32_t reg_offset;
878+
879+
/* For VF, only local offsets should be used */
880+
if (amdgpu_sriov_vf(ring->adev))
881+
reg = NORMALIZE_JPEG_REG_OFFSET(reg);
882+
883+
reg_offset = (reg << 2);
869884

870885
amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET,
871886
0, 0, PACKETJ_TYPE0));

drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@
4545
#define VCN_VID_SOC_ADDRESS_2_0 0x1fb00
4646
#define VCN1_VID_SOC_ADDRESS_3_0 0x48300
4747

48+
#define NORMALIZE_VCN_REG_OFFSET(offset) \
49+
(offset & 0x1FFFF)
50+
4851
static int vcn_v4_0_3_start_sriov(struct amdgpu_device *adev);
4952
static void vcn_v4_0_3_set_unified_ring_funcs(struct amdgpu_device *adev);
5053
static void vcn_v4_0_3_set_irq_funcs(struct amdgpu_device *adev);
@@ -1375,6 +1378,43 @@ static uint64_t vcn_v4_0_3_unified_ring_get_wptr(struct amdgpu_ring *ring)
13751378
regUVD_RB_WPTR);
13761379
}
13771380

1381+
static void vcn_v4_0_3_enc_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg,
1382+
uint32_t val, uint32_t mask)
1383+
{
1384+
/* For VF, only local offsets should be used */
1385+
if (amdgpu_sriov_vf(ring->adev))
1386+
reg = NORMALIZE_VCN_REG_OFFSET(reg);
1387+
1388+
amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WAIT);
1389+
amdgpu_ring_write(ring, reg << 2);
1390+
amdgpu_ring_write(ring, mask);
1391+
amdgpu_ring_write(ring, val);
1392+
}
1393+
1394+
static void vcn_v4_0_3_enc_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t val)
1395+
{
1396+
/* For VF, only local offsets should be used */
1397+
if (amdgpu_sriov_vf(ring->adev))
1398+
reg = NORMALIZE_VCN_REG_OFFSET(reg);
1399+
1400+
amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WRITE);
1401+
amdgpu_ring_write(ring, reg << 2);
1402+
amdgpu_ring_write(ring, val);
1403+
}
1404+
1405+
static void vcn_v4_0_3_enc_ring_emit_vm_flush(struct amdgpu_ring *ring,
1406+
unsigned int vmid, uint64_t pd_addr)
1407+
{
1408+
struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->vm_hub];
1409+
1410+
pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr);
1411+
1412+
/* wait for reg writes */
1413+
vcn_v4_0_3_enc_ring_emit_reg_wait(ring, hub->ctx0_ptb_addr_lo32 +
1414+
vmid * hub->ctx_addr_distance,
1415+
lower_32_bits(pd_addr), 0xffffffff);
1416+
}
1417+
13781418
static void vcn_v4_0_3_ring_emit_hdp_flush(struct amdgpu_ring *ring)
13791419
{
13801420
/* VCN engine access for HDP flush doesn't work when RRMT is enabled.
@@ -1421,7 +1461,7 @@ static const struct amdgpu_ring_funcs vcn_v4_0_3_unified_ring_vm_funcs = {
14211461
.emit_ib_size = 5, /* vcn_v2_0_enc_ring_emit_ib */
14221462
.emit_ib = vcn_v2_0_enc_ring_emit_ib,
14231463
.emit_fence = vcn_v2_0_enc_ring_emit_fence,
1424-
.emit_vm_flush = vcn_v2_0_enc_ring_emit_vm_flush,
1464+
.emit_vm_flush = vcn_v4_0_3_enc_ring_emit_vm_flush,
14251465
.emit_hdp_flush = vcn_v4_0_3_ring_emit_hdp_flush,
14261466
.test_ring = amdgpu_vcn_enc_ring_test_ring,
14271467
.test_ib = amdgpu_vcn_unified_ring_test_ib,
@@ -1430,8 +1470,8 @@ static const struct amdgpu_ring_funcs vcn_v4_0_3_unified_ring_vm_funcs = {
14301470
.pad_ib = amdgpu_ring_generic_pad_ib,
14311471
.begin_use = amdgpu_vcn_ring_begin_use,
14321472
.end_use = amdgpu_vcn_ring_end_use,
1433-
.emit_wreg = vcn_v2_0_enc_ring_emit_wreg,
1434-
.emit_reg_wait = vcn_v2_0_enc_ring_emit_reg_wait,
1473+
.emit_wreg = vcn_v4_0_3_enc_ring_emit_wreg,
1474+
.emit_reg_wait = vcn_v4_0_3_enc_ring_emit_reg_wait,
14351475
.emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper,
14361476
};
14371477

0 commit comments

Comments
 (0)