|
32 | 32 | #include "vcn/vcn_4_0_3_sh_mask.h" |
33 | 33 | #include "ivsrcid/vcn/irqsrcs_vcn_4_0.h" |
34 | 34 |
|
| 35 | +#define NORMALIZE_JPEG_REG_OFFSET(offset) \ |
| 36 | + (offset & 0x1FFFF) |
| 37 | + |
35 | 38 | enum jpeg_engin_status { |
36 | 39 | UVD_PGFSM_STATUS__UVDJ_PWR_ON = 0, |
37 | 40 | UVD_PGFSM_STATUS__UVDJ_PWR_OFF = 2, |
@@ -621,6 +624,13 @@ static uint64_t jpeg_v4_0_3_dec_ring_get_wptr(struct amdgpu_ring *ring) |
621 | 624 | ring->pipe ? (0x40 * ring->pipe - 0xc80) : 0); |
622 | 625 | } |
623 | 626 |
|
| 627 | +static void jpeg_v4_0_3_ring_emit_hdp_flush(struct amdgpu_ring *ring) |
| 628 | +{ |
| 629 | + /* JPEG engine access for HDP flush doesn't work when RRMT is enabled. |
| 630 | + * This is a workaround to avoid any HDP flush through JPEG ring. |
| 631 | + */ |
| 632 | +} |
| 633 | + |
624 | 634 | /** |
625 | 635 | * jpeg_v4_0_3_dec_ring_set_wptr - set write pointer |
626 | 636 | * |
@@ -817,7 +827,13 @@ void jpeg_v4_0_3_dec_ring_emit_ib(struct amdgpu_ring *ring, |
817 | 827 | void jpeg_v4_0_3_dec_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg, |
818 | 828 | uint32_t val, uint32_t mask) |
819 | 829 | { |
820 | | - 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); |
821 | 837 |
|
822 | 838 | amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_RB_COND_RD_TIMER_INTERNAL_OFFSET, |
823 | 839 | 0, 0, PACKETJ_TYPE0)); |
@@ -858,7 +874,13 @@ void jpeg_v4_0_3_dec_ring_emit_vm_flush(struct amdgpu_ring *ring, |
858 | 874 |
|
859 | 875 | void jpeg_v4_0_3_dec_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t val) |
860 | 876 | { |
861 | | - 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); |
862 | 884 |
|
863 | 885 | amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET, |
864 | 886 | 0, 0, PACKETJ_TYPE0)); |
@@ -1072,6 +1094,7 @@ static const struct amdgpu_ring_funcs jpeg_v4_0_3_dec_ring_vm_funcs = { |
1072 | 1094 | .emit_ib = jpeg_v4_0_3_dec_ring_emit_ib, |
1073 | 1095 | .emit_fence = jpeg_v4_0_3_dec_ring_emit_fence, |
1074 | 1096 | .emit_vm_flush = jpeg_v4_0_3_dec_ring_emit_vm_flush, |
| 1097 | + .emit_hdp_flush = jpeg_v4_0_3_ring_emit_hdp_flush, |
1075 | 1098 | .test_ring = amdgpu_jpeg_dec_ring_test_ring, |
1076 | 1099 | .test_ib = amdgpu_jpeg_dec_ring_test_ib, |
1077 | 1100 | .insert_nop = jpeg_v4_0_3_dec_ring_nop, |
|
0 commit comments