Add multiple-instance dpg sram mode support for vcn2.5

Signed-off-by: James Zhu <james....@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 27 +++++++++++++--------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h | 12 ++++++------
 drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c   |  8 ++++----
 3 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 99df693..ca62d99 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -165,15 +165,15 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
                        dev_err(adev->dev, "(%d) failed to allocate vcn bo\n", 
r);
                        return r;
                }
-       }
 
-       if (adev->vcn.indirect_sram) {
-               r = amdgpu_bo_create_kernel(adev, 64 * 2 * 4, PAGE_SIZE,
-                           AMDGPU_GEM_DOMAIN_VRAM, &adev->vcn.dpg_sram_bo,
-                           &adev->vcn.dpg_sram_gpu_addr, 
&adev->vcn.dpg_sram_cpu_addr);
-               if (r) {
-                       dev_err(adev->dev, "(%d) failed to allocate DPG bo\n", 
r);
-                       return r;
+               if (adev->vcn.indirect_sram) {
+                       r = amdgpu_bo_create_kernel(adev, 64 * 2 * 4, PAGE_SIZE,
+                                       AMDGPU_GEM_DOMAIN_VRAM, 
&adev->vcn.inst[i].dpg_sram_bo,
+                                       &adev->vcn.inst[i].dpg_sram_gpu_addr, 
&adev->vcn.inst[i].dpg_sram_cpu_addr);
+                       if (r) {
+                               dev_err(adev->dev, "VCN %d (%d) failed to 
allocate DPG bo\n", i, r);
+                               return r;
+                       }
                }
        }
 
@@ -186,15 +186,14 @@ int amdgpu_vcn_sw_fini(struct amdgpu_device *adev)
 
        cancel_delayed_work_sync(&adev->vcn.idle_work);
 
-       if (adev->vcn.indirect_sram) {
-               amdgpu_bo_free_kernel(&adev->vcn.dpg_sram_bo,
-                                     &adev->vcn.dpg_sram_gpu_addr,
-                                     (void **)&adev->vcn.dpg_sram_cpu_addr);
-       }
-
        for (j = 0; j < adev->vcn.num_vcn_inst; ++j) {
                if (adev->vcn.harvest_config & (1 << j))
                        continue;
+               if (adev->vcn.indirect_sram) {
+                       amdgpu_bo_free_kernel(&adev->vcn.inst[i].dpg_sram_bo,
+                                                 
&adev->vcn.inst[i].dpg_sram_gpu_addr,
+                                                 (void 
**)&adev->vcn.inst[i].dpg_sram_cpu_addr);
+               }
                kvfree(adev->vcn.inst[j].saved_bo);
 
                amdgpu_bo_free_kernel(&adev->vcn.inst[j].vcpu_bo,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
index d3d75ec..34ff75c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
@@ -122,8 +122,8 @@
                                 mask_en << UVD_DPG_LMA_CTL__MASK_EN__SHIFT |   
                \
                                 offset << 
UVD_DPG_LMA_CTL__READ_WRITE_ADDR__SHIFT));           \
                } else {                                                        
                \
-                       *adev->vcn.dpg_sram_curr_addr++ = offset;               
                \
-                       *adev->vcn.dpg_sram_curr_addr++ = value;                
                \
+                       *adev->vcn.inst->dpg_sram_curr_addr++ = offset;         
                        \
+                       *adev->vcn.inst->dpg_sram_curr_addr++ = value;          
                \
                }                                                               
                \
        } while (0)
 
@@ -191,6 +191,10 @@ struct amdgpu_vcn_inst {
        struct amdgpu_ring      ring_enc[AMDGPU_VCN_MAX_ENC_RINGS];
        struct amdgpu_irq_src   irq;
        struct amdgpu_vcn_reg   external;
+       struct amdgpu_bo        *dpg_sram_bo;
+       void                    *dpg_sram_cpu_addr;
+       uint64_t                dpg_sram_gpu_addr;
+       uint32_t                *dpg_sram_curr_addr;
 };
 
 struct amdgpu_vcn {
@@ -202,10 +206,6 @@ struct amdgpu_vcn {
        struct dpg_pause_state pause_state;
 
        bool                    indirect_sram;
-       struct amdgpu_bo        *dpg_sram_bo;
-       void                    *dpg_sram_cpu_addr;
-       uint64_t                dpg_sram_gpu_addr;
-       uint32_t                *dpg_sram_curr_addr;
 
        uint8_t num_vcn_inst;
        struct amdgpu_vcn_inst   inst[AMDGPU_MAX_VCN_INSTANCES];
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
index dcdc7ad..553710f 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
@@ -759,7 +759,7 @@ static int vcn_v2_0_start_dpg_mode(struct amdgpu_device 
*adev, bool indirect)
        WREG32_SOC15(UVD, 0, mmUVD_POWER_STATUS, tmp);
 
        if (indirect)
-               adev->vcn.dpg_sram_curr_addr = 
(uint32_t*)adev->vcn.dpg_sram_cpu_addr;
+               adev->vcn.inst->dpg_sram_curr_addr = 
(uint32_t*)adev->vcn.inst->dpg_sram_cpu_addr;
 
        /* enable clock gating */
        vcn_v2_0_clock_gating_dpg_mode(adev, 0, indirect);
@@ -833,9 +833,9 @@ static int vcn_v2_0_start_dpg_mode(struct amdgpu_device 
*adev, bool indirect)
                UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect);
 
        if (indirect)
-               psp_update_vcn_sram(adev, 0, adev->vcn.dpg_sram_gpu_addr,
-                                   
(uint32_t)((uintptr_t)adev->vcn.dpg_sram_curr_addr -
-                                              
(uintptr_t)adev->vcn.dpg_sram_cpu_addr));
+               psp_update_vcn_sram(adev, 0, adev->vcn.inst->dpg_sram_gpu_addr,
+                                   
(uint32_t)((uintptr_t)adev->vcn.inst->dpg_sram_curr_addr -
+                                              
(uintptr_t)adev->vcn.inst->dpg_sram_cpu_addr));
 
        /* force RBC into idle state */
        rb_bufsz = order_base_2(ring->ring_size);
-- 
2.7.4

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to