From: Feifei Xu <[email protected]>

In psp 14.0.7, mes and sdma GFX_FW_TYPE have been changed.

Define a psp common function: psp_get_fw_type().
Hide the GFX_FW_TYPE Changes in each ip's psp->funcs_get_fw_type callback.
(like psp_v14_0_7_get_fw_type()).
If no GFX_FW_TYPE change, reuse the amdgpu_psp_get_fw_type().

Signed-off-by: Feifei Xu <[email protected]>
Reviewed-by: Hawking Zhang <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c  |   5 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h  |   8 ++
 drivers/gpu/drm/amd/amdgpu/psp_v14_0_7.c | 140 +++++++++++++++++++++++
 3 files changed, 150 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index b17004c190d90..2d4bd4f2f9b93 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -2620,7 +2620,7 @@ static int psp_hw_start(struct psp_context *psp)
        return 0;
 }
 
-static int psp_get_fw_type(struct amdgpu_firmware_info *ucode,
+int amdgpu_psp_get_fw_type(struct amdgpu_firmware_info *ucode,
                           enum psp_gfx_fw_type *type)
 {
        switch (ucode->ucode_id) {
@@ -2908,10 +2908,9 @@ static int psp_prep_load_ip_fw_cmd_buf(struct 
psp_context *psp,
        cmd->cmd.cmd_load_ip_fw.fw_phy_addr_hi = upper_32_bits(fw_mem_mc_addr);
        cmd->cmd.cmd_load_ip_fw.fw_size = ucode->ucode_size;
 
-       ret = psp_get_fw_type(ucode, &cmd->cmd.cmd_load_ip_fw.fw_type);
+       ret = psp_get_fw_type(psp, ucode, &cmd->cmd.cmd_load_ip_fw.fw_type);
        if (ret)
                dev_err(psp->adev->dev, "Unknown firmware type\n");
-
        return ret;
 }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
index 2733a7bf4ad6e..e8457715cc140 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
@@ -172,6 +172,8 @@ struct psp_funcs {
        bool (*is_reload_needed)(struct psp_context *psp);
        int (*reg_program_no_ring)(struct psp_context *psp, uint32_t val,
                                   enum psp_reg_prog_id id);
+       int (*get_fw_type)(struct amdgpu_firmware_info *ucode,
+                       enum psp_gfx_fw_type *type);
 };
 
 struct ta_funcs {
@@ -524,6 +526,10 @@ struct amdgpu_psp_funcs {
        ((psp)->funcs->reg_program_no_ring ? \
        (psp)->funcs->reg_program_no_ring((psp), val, id) : -EINVAL)
 
+#define psp_get_fw_type(psp, ucode, type) \
+       ((psp)->funcs->get_fw_type ? \
+       (psp)->funcs->get_fw_type(ucode, type):amdgpu_psp_get_fw_type(ucode, 
type))
+
 extern const struct amd_ip_funcs psp_ip_funcs;
 
 extern const struct amdgpu_ip_block_version psp_v3_1_ip_block;
@@ -622,6 +628,8 @@ bool amdgpu_psp_tos_reload_needed(struct amdgpu_device 
*adev);
 int amdgpu_psp_reg_program_no_ring(struct psp_context *psp, uint32_t val,
                                   enum psp_reg_prog_id id);
 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);
 
 
 #endif
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v14_0_7.c 
b/drivers/gpu/drm/amd/amdgpu/psp_v14_0_7.c
index a13fd866000a8..27e74c340330e 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v14_0_7.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v14_0_7.c
@@ -186,6 +186,145 @@ static void psp_v14_0_7_ring_set_wptr(struct psp_context 
*psp, uint32_t value)
        } else
                WREG32_SOC15(MP0, 0, regMPASP_SMN_C2PMSG_67, value);
 }
+ 
+static int psp_v14_0_7_get_fw_type(struct amdgpu_firmware_info *ucode,
+                          enum psp_gfx_fw_type *type)
+{
+       switch (ucode->ucode_id) {
+       case AMDGPU_UCODE_ID_CAP:
+               *type = GFX_FW_TYPE_CAP;
+               break;
+       case AMDGPU_UCODE_ID_SDMA0:
+               *type = GFX_FW_TYPE_SDMA0;
+               break;
+       case AMDGPU_UCODE_ID_SDMA1:
+               *type = GFX_FW_TYPE_SDMA1;
+               break;
+       case AMDGPU_UCODE_ID_SDMA2:
+               *type = GFX_FW_TYPE_SDMA2;
+               break;
+       case AMDGPU_UCODE_ID_SDMA3:
+               *type = GFX_FW_TYPE_SDMA3;
+               break;
+       case AMDGPU_UCODE_ID_SDMA4:
+               *type = GFX_FW_TYPE_SDMA4;
+               break;
+       case AMDGPU_UCODE_ID_SDMA5:
+               *type = GFX_FW_TYPE_SDMA5;
+               break;
+       case AMDGPU_UCODE_ID_SDMA6:
+               *type = GFX_FW_TYPE_SDMA6;
+               break;
+       case AMDGPU_UCODE_ID_SDMA7:
+               *type = GFX_FW_TYPE_SDMA7;
+               break;
+       case AMDGPU_UCODE_ID_CP_MES:
+               *type = GFX_FW_TYPE_RS64_MES;
+               break;
+       case AMDGPU_UCODE_ID_CP_MES_DATA:
+               *type = GFX_FW_TYPE_RS64_MES_STACK;
+               break;
+       case AMDGPU_UCODE_ID_CP_MES1:
+               *type = GFX_FW_TYPE_RS64_KIQ;
+               break;
+       case AMDGPU_UCODE_ID_CP_MES1_DATA:
+               *type = GFX_FW_TYPE_RS64_KIQ_STACK;
+               break;
+       case AMDGPU_UCODE_ID_RLC_P:
+               *type = GFX_FW_TYPE_RLC_P;
+               break;
+       case AMDGPU_UCODE_ID_RLC_V:
+               *type = GFX_FW_TYPE_RLC_V;
+               break;
+       case AMDGPU_UCODE_ID_RLC_G:
+               *type = GFX_FW_TYPE_RLC_G;
+               break;
+       case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL:
+               *type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_CNTL;
+               break;
+       case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM:
+               *type = GFX_FW_TYPE_RLC_RESTORE_LIST_GPM_MEM;
+               break;
+       case AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM:
+               *type = GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_MEM;
+               break;
+       case AMDGPU_UCODE_ID_RLC_IRAM:
+               *type = GFX_FW_TYPE_RLC_IRAM;
+               break;
+       case AMDGPU_UCODE_ID_RLC_DRAM:
+               *type = GFX_FW_TYPE_RLC_DRAM_BOOT;
+               break;
+       case AMDGPU_UCODE_ID_RLC_IRAM_1:
+               *type = GFX_FW_TYPE_RLX6_UCODE_CORE1;
+               break;
+       case AMDGPU_UCODE_ID_RLC_DRAM_1:
+               *type = GFX_FW_TYPE_RLX6_DRAM_BOOT_CORE1;
+               break;
+       case AMDGPU_UCODE_ID_SMC:
+               *type = GFX_FW_TYPE_SMU;
+               break;
+       case AMDGPU_UCODE_ID_PPTABLE:
+               *type = GFX_FW_TYPE_PPTABLE;
+               break;
+       case AMDGPU_UCODE_ID_VCN:
+               *type = GFX_FW_TYPE_VCN;
+               break;
+       case AMDGPU_UCODE_ID_VCN1:
+               *type = GFX_FW_TYPE_VCN1;
+               break;
+       case AMDGPU_UCODE_ID_VCN0_RAM:
+               *type = GFX_FW_TYPE_VCN0_RAM;
+               break;
+       case AMDGPU_UCODE_ID_VCN1_RAM:
+               *type = GFX_FW_TYPE_VCN1_RAM;
+               break;
+       case AMDGPU_UCODE_ID_SDMA_UCODE_TH0:
+       case AMDGPU_UCODE_ID_SDMA_RS64:
+               *type = GFX_FW_TYPE_SDMA0;
+               break;
+       case AMDGPU_UCODE_ID_SDMA_UCODE_TH1:
+               *type = GFX_FW_TYPE_SDMA_UCODE_TH1;
+               break;
+       case AMDGPU_UCODE_ID_IMU_I:
+               *type = GFX_FW_TYPE_IMU_I;
+               break;
+       case AMDGPU_UCODE_ID_IMU_D:
+               *type = GFX_FW_TYPE_IMU_D;
+               break;
+       case AMDGPU_UCODE_ID_CP_RS64_MEC:
+               *type = GFX_FW_TYPE_RS64_MEC;
+               break;
+       case AMDGPU_UCODE_ID_CP_RS64_MEC_P0_STACK:
+               *type = GFX_FW_TYPE_RS64_MEC_P0_STACK;
+               break;
+       case AMDGPU_UCODE_ID_CP_RS64_MEC_P1_STACK:
+               *type = GFX_FW_TYPE_RS64_MEC_P1_STACK;
+               break;
+       case AMDGPU_UCODE_ID_CP_RS64_MEC_P2_STACK:
+               *type = GFX_FW_TYPE_RS64_MEC_P2_STACK;
+               break;
+       case AMDGPU_UCODE_ID_CP_RS64_MEC_P3_STACK:
+               *type = GFX_FW_TYPE_RS64_MEC_P3_STACK;
+               break;
+       case AMDGPU_UCODE_ID_UMSCH_MM_UCODE:
+               *type = GFX_FW_TYPE_UMSCH_UCODE;
+               break;
+       case AMDGPU_UCODE_ID_UMSCH_MM_DATA:
+               *type = GFX_FW_TYPE_UMSCH_DATA;
+               break;
+       case AMDGPU_UCODE_ID_UMSCH_MM_CMD_BUFFER:
+               *type = GFX_FW_TYPE_UMSCH_CMD_BUFFER;
+               break;
+       case AMDGPU_UCODE_ID_P2S_TABLE:
+               *type = GFX_FW_TYPE_P2S_TABLE;
+               break;
+       case AMDGPU_UCODE_ID_MAXIMUM:
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
 
 static const struct psp_funcs psp_v14_0_7_funcs = {
        .init_microcode = psp_v14_0_7_init_microcode,
@@ -194,6 +333,7 @@ static const struct psp_funcs psp_v14_0_7_funcs = {
        .ring_destroy = psp_v14_0_7_ring_destroy,
        .ring_get_wptr = psp_v14_0_7_ring_get_wptr,
        .ring_set_wptr = psp_v14_0_7_ring_set_wptr,
+       .get_fw_type = psp_v14_0_7_get_fw_type,
 };
 
 void psp_v14_0_7_set_psp_funcs(struct psp_context *psp)
-- 
2.51.0

Reply via email to