This patch
 1. Requests PSP to set UVD and JPEG SEC LVL reg incase of
    fw_load_type is PSP_LOAD.
 2. Set UVD and JPEG SEC LVL incase of backdoor loading and
    non-secure-direct loading type.
 3. To support this, PSP implementing new cmd id :
    GFX_CMD_ID_SET_MMHUB_ECO_SEC_LEVEL, vcn/jpeg will call
    this cmd to set sec lvl.

This will help to resolve jpeg/vcn ring/ib timeout while
accessing mmhub.

Signed-off-by: Suresh Guttula <[email protected]>
Reviewed-by: McRae Geoffrey<[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c       | 27 ++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h       |  1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v5_3_0.c      | 29 +++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/jpeg_v5_3_0.h      |  2 ++
 drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h       |  1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c       | 31 +++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.h       |  2 ++
 .../include/asic_reg/vcn/vcn_5_0_0_offset.h   |  2 ++
 .../include/asic_reg/vcn/vcn_5_3_0_offset.h   |  2 ++
 9 files changed, 97 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index a36cbfc1f6f1..64281553c6d7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -1222,6 +1222,33 @@ int psp_memory_partition(struct psp_context *psp, int 
mode)
        return ret;
 }
 
+int psp_set_mmhub_eco_sec_level(struct amdgpu_device *adev)
+{
+       int ret;
+       struct psp_context *psp = &adev->psp;
+       struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp);
+
+       cmd->cmd_id = GFX_CMD_ID_SET_MMHUB_ECO_SEC_LEVEL;
+
+       ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
+       if (ret) {
+               dev_err(psp->adev->dev,
+                       "PSP request failed to set mmuhub eco sec level with 
ret=%d\n", ret);
+               release_psp_cmd_buf(psp);
+               return ret;
+       }
+
+       if (cmd->resp.status) {
+               dev_err(psp->adev->dev,
+                       "MMHUB ECO SEC LEVEL command 0x%x failed, PSP response 
status: 0x%X\n",
+                               cmd->cmd_id, cmd->resp.status);
+               ret = -EIO;
+       }
+       release_psp_cmd_buf(psp);
+
+       return ret;
+}
+
 static int psp_ptl_fmt_verify(struct psp_context *psp, enum amdgpu_ptl_fmt fmt,
                                                 uint32_t *ptl_fmt)
 {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
index 2d838b1b2b11..3d7744d60fac 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
@@ -656,5 +656,6 @@ int amdgpu_psp_reg_program_no_ring(struct psp_context *psp, 
uint32_t val,
 void amdgpu_psp_debugfs_init(struct amdgpu_device *adev);
 int amdgpu_psp_get_fw_type(struct amdgpu_firmware_info *ucode,
                           enum psp_gfx_fw_type *type);
+int psp_set_mmhub_eco_sec_level(struct amdgpu_device *adev);
 
 #endif
diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_3_0.c 
b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_3_0.c
index 66d4c487eee5..9468b4541b5d 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_3_0.c
@@ -399,6 +399,30 @@ static void jpeg_v5_3_0_stop_dpg_mode(struct amdgpu_device 
*adev, int inst_idx)
        WREG32_SOC15(JPEG, inst_idx, regUVD_JPEG_POWER_STATUS, reg_data);
 }
 
+/**
+ * jpeg_v5_3_0_set_mmhub_eco_sec_level - set jpeg sec lvl reg
+ *
+ * @adev: amdgpu_device pointer
+ *
+ * Set jpeg sec lvl based on load type
+ */
+static int jpeg_v5_3_0_set_mmhub_eco_sec_level(struct amdgpu_device *adev)
+{
+       int r = 0;
+
+       if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
+               //Request to PSP to program JPEG secure lvl register
+               r = psp_set_mmhub_eco_sec_level(adev);
+       } else {
+               //Program UVD_JMC_JPEG_SECURE_LVL register
+               //During brinrup phase or backdoor loading case, updating 
register here
+               //to avoid dependency on PSP
+               WREG32_SOC15(JPEG, 0, regUVD_JMC_JPEG_SECURE_LVL, 
vcnipUVD_JMC_JPEG_SECURE_LVL);
+       }
+
+       return r;
+}
+
 /**
  * jpeg_v5_3_0_start - start JPEG block
  *
@@ -424,6 +448,11 @@ static int jpeg_v5_3_0_start(struct amdgpu_device *adev)
        if (r)
                return r;
 
+       /* program JPEG secure lvl register */
+       r = jpeg_v5_3_0_set_mmhub_eco_sec_level(adev);
+       if (r)
+               return r;
+
        /* JPEG disable CGC */
        jpeg_v5_3_0_disable_clock_gating(adev);
 
diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_3_0.h 
b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_3_0.h
index c1e7537d0f18..ef6376f3a79b 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_3_0.h
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_3_0.h
@@ -30,6 +30,8 @@
 #define vcnipUVD_NO_OP                                     0x0029
 #define vcnipJPEG_DEC_GFX10_ADDR_CONFIG                    0x404A
 
+#define vcnipUVD_JMC_JPEG_SECURE_LVL                       0x22
+
 extern const struct amdgpu_ip_block_version jpeg_v5_3_0_ip_block;
 
 #endif /* __JPEG_V5_0_0_H__ */
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h 
b/drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h
index ac34bac3c839..ad618b78685f 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h
+++ b/drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h
@@ -110,6 +110,7 @@ enum psp_gfx_cmd_id
     GFX_CMD_ID_PERF_HW            = 0x0000004C,   /* performance monitor */
     GFX_CMD_ID_FB_FW_RESERV_ADDR  = 0x00000050,  /* Query FW reservation addr 
*/
     GFX_CMD_ID_FB_FW_RESERV_EXT_ADDR = 0x00000051,  /* Query FW reservation 
extended addr */
+    GFX_CMD_ID_SET_MMHUB_ECO_SEC_LEVEL = 0x0000005D,  /* Set MMHUB ECO sec 
lvls on VCN block */
 };
 
 /* PSP boot config sub-commands */
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
index 45580e9c4e0c..1318e731440b 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
@@ -795,6 +795,32 @@ static int vcn_v5_0_0_start_dpg_mode(struct 
amdgpu_vcn_inst *vinst,
        return 0;
 }
 
+/**
+ * vcn_v5_0_0_set_mmhub_eco_sec_level - set vcn sec lvl reg
+ *
+ * @adev: amdgpu_device pointer
+ *
+ * Set vcn sec lvl based on load type
+ */
+static int vcn_v5_0_0_set_mmhub_eco_sec_level(struct amdgpu_device *adev)
+{
+       int r = 0;
+
+       if (amdgpu_ip_version(adev, VCN_HWIP, 0) == IP_VERSION(5, 3, 0)) {
+               if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
+                       //Request to PSP to program VCN secure lvl register
+                       r = psp_set_mmhub_eco_sec_level(adev);
+               } else {
+                       //Program UVD_MC_VID_SECURE_LVL register
+                       //During brinrup phase or backdoor loading case, 
updating register here
+                       //to avoid dependency on PSP
+                       WREG32_SOC15(VCN, 0, regUVD_MC_VID_SECURE_LVL, 
UVD_MC_VID_SECURE_LVL);
+               }
+       }
+
+       return r;
+}
+
 /**
  * vcn_v5_0_0_start - VCN start
  *
@@ -819,6 +845,11 @@ static int vcn_v5_0_0_start(struct amdgpu_vcn_inst *vinst)
 
        fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr;
 
+       /* program VCN secure lvl register */
+       r = vcn_v5_0_0_set_mmhub_eco_sec_level(adev);
+       if (r)
+               return r;
+
        if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)
                return vcn_v5_0_0_start_dpg_mode(vinst, 
adev->vcn.inst[i].indirect_sram);
 
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.h 
b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.h
index 51bbccd4360f..9ae2bed990be 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.h
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.h
@@ -32,6 +32,8 @@
 #define VCN_VID_IP_ADDRESS                         0x0
 #define VCN_AON_IP_ADDRESS                         0x30000
 
+#define UVD_MC_VID_SECURE_LVL                      0x22222222
+
 extern const struct amdgpu_ip_block_version vcn_v5_0_0_ip_block;
 
 #endif /* __VCN_V5_0_0_H__ */
diff --git a/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_5_0_0_offset.h 
b/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_5_0_0_offset.h
index 72a118b2af69..a7e64e304ffa 100644
--- a/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_5_0_0_offset.h
+++ b/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_5_0_0_offset.h
@@ -1027,6 +1027,8 @@
 #define regCC_UVD_VCPU_ERR_INST_ADDR_LO_BASE_IDX                               
                         1
 #define regCC_UVD_VCPU_ERR_INST_ADDR_HI                                        
                         0x0035
 #define regCC_UVD_VCPU_ERR_INST_ADDR_HI_BASE_IDX                               
                         1
+#define regUVD_MC_VID_SECURE_LVL                                               
                         0x0037
+#define regUVD_MC_VID_SECURE_LVL_BASE_IDX                                      
                         1
 #define regUVD_LMI_MMSCH_NC_SPACE                                              
                         0x003d
 #define regUVD_LMI_MMSCH_NC_SPACE_BASE_IDX                                     
                         1
 #define regUVD_LMI_ATOMIC_SPACE                                                
                         0x003e
diff --git a/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_5_3_0_offset.h 
b/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_5_3_0_offset.h
index 1051a788c9d7..da5acac08ae9 100644
--- a/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_5_3_0_offset.h
+++ b/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_5_3_0_offset.h
@@ -162,6 +162,8 @@
 #define regCC_UVD_VCPU_ERR_INST_ADDR_LO_BASE_IDX                               
                         1
 #define regCC_UVD_VCPU_ERR_INST_ADDR_HI                                        
                         0x0035
 #define regCC_UVD_VCPU_ERR_INST_ADDR_HI_BASE_IDX                               
                         1
+#define regUVD_JMC_JPEG_SECURE_LVL                                             
                         0x0036
+#define regUVD_JMC_JPEG_SECURE_LVL_BASE_IDX                                    
                         1
 #define regUVD_LMI_MMSCH_NC_SPACE                                              
                         0x003d
 #define regUVD_LMI_MMSCH_NC_SPACE_BASE_IDX                                     
                         1
 #define regUVD_LMI_ATOMIC_SPACE                                                
                         0x003e
-- 
2.43.0

Reply via email to