From: Boyuan Zhang <[email protected]>

Add vcn_v3_0_mc_resume_dpg_mode to resume memory controller in DPG mode for 
VCN3.0

V2: Separate from previous patch-0002, and update description.

Signed-off-by: Boyuan Zhang <[email protected]>
Reviewed-by: James Zhu <[email protected]>
Reviewed-by: Alex Deucher <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c | 89 +++++++++++++++++++++++++++
 1 file changed, 89 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index b0fc589ac88f..86db36537371 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -378,6 +378,95 @@ static void vcn_v3_0_mc_resume(struct amdgpu_device *adev, 
int inst)
        WREG32_SOC15(VCN, inst, mmUVD_VCPU_CACHE_SIZE2, 
AMDGPU_VCN_CONTEXT_SIZE);
 }
 
+static void vcn_v3_0_mc_resume_dpg_mode(struct amdgpu_device *adev, int 
inst_idx, bool indirect)
+{
+       uint32_t size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.fw->size + 4);
+       uint32_t offset;
+
+       /* cache window 0: fw */
+       if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
+               if (!indirect) {
+                       WREG32_SOC15_DPG_MODE_2_0(inst_idx, 
SOC15_DPG_MODE_OFFSET_2_0(
+                               VCN, inst_idx, 
mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
+                               (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + 
inst_idx].tmr_mc_addr_lo), 0, indirect);
+                       WREG32_SOC15_DPG_MODE_2_0(inst_idx, 
SOC15_DPG_MODE_OFFSET_2_0(
+                               VCN, inst_idx, 
mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
+                               (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + 
inst_idx].tmr_mc_addr_hi), 0, indirect);
+                       WREG32_SOC15_DPG_MODE_2_0(inst_idx, 
SOC15_DPG_MODE_OFFSET_2_0(
+                               VCN, inst_idx, mmUVD_VCPU_CACHE_OFFSET0), 0, 0, 
indirect);
+               } else {
+                       WREG32_SOC15_DPG_MODE_2_0(inst_idx, 
SOC15_DPG_MODE_OFFSET_2_0(
+                               VCN, inst_idx, 
mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), 0, 0, indirect);
+                       WREG32_SOC15_DPG_MODE_2_0(inst_idx, 
SOC15_DPG_MODE_OFFSET_2_0(
+                               VCN, inst_idx, 
mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), 0, 0, indirect);
+                       WREG32_SOC15_DPG_MODE_2_0(inst_idx, 
SOC15_DPG_MODE_OFFSET_2_0(
+                               VCN, inst_idx, mmUVD_VCPU_CACHE_OFFSET0), 0, 0, 
indirect);
+               }
+               offset = 0;
+       } else {
+               WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
+                       lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr), 0, 
indirect);
+               WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
+                       upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr), 0, 
indirect);
+               offset = size;
+               WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_VCPU_CACHE_OFFSET0),
+                       AMDGPU_UVD_FIRMWARE_OFFSET >> 3, 0, indirect);
+       }
+
+       if (!indirect)
+               WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_VCPU_CACHE_SIZE0), size, 0, 
indirect);
+       else
+               WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_VCPU_CACHE_SIZE0), 0, 0, indirect);
+
+       /* cache window 1: stack */
+       if (!indirect) {
+               WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW),
+                       lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr + 
offset), 0, indirect);
+               WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH),
+                       upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr + 
offset), 0, indirect);
+               WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_VCPU_CACHE_OFFSET1), 0, 0, 
indirect);
+       } else {
+               WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW), 0, 
0, indirect);
+               WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH), 
0, 0, indirect);
+               WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_VCPU_CACHE_OFFSET1), 0, 0, 
indirect);
+       }
+       WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_VCPU_CACHE_SIZE1), 
AMDGPU_VCN_STACK_SIZE, 0, indirect);
+
+       /* cache window 2: context */
+       WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW),
+                       lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr + 
offset + AMDGPU_VCN_STACK_SIZE), 0, indirect);
+       WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH),
+                       upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr + 
offset + AMDGPU_VCN_STACK_SIZE), 0, indirect);
+       WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_VCPU_CACHE_OFFSET2), 0, 0, 
indirect);
+       WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_VCPU_CACHE_SIZE2), 
AMDGPU_VCN_CONTEXT_SIZE, 0, indirect);
+
+       /* non-cache window */
+       WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_LMI_VCPU_NC0_64BIT_BAR_LOW), 0, 0, 
indirect);
+       WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH), 0, 
0, indirect);
+       WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_VCPU_NONCACHE_OFFSET0), 0, 0, 
indirect);
+       WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
+                       VCN, inst_idx, mmUVD_VCPU_NONCACHE_SIZE0), 0, 0, 
indirect);
+}
+
 static void vcn_v3_0_disable_static_power_gating(struct amdgpu_device *adev, 
int inst)
 {
        uint32_t data = 0;
-- 
2.25.4

_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to