Disable ecc by default

Signed-off-by: Junwei Zhang <jerry.zh...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c |  3 ++
 drivers/gpu/drm/amd/amdgpu/psp_v3_1.c   | 60 +++++++++++++++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/psp_v3_1.h   |  2 ++
 3 files changed, 65 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index b04cc80..ec433b9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -52,6 +52,8 @@ static int psp_sw_init(void *handle)
        switch (adev->asic_type) {
        case CHIP_VEGA10:
                psp->init_microcode = psp_v3_1_init_microcode;
+               psp->bootloader_is_sos_running = 
psp_v3_1_bootloader_is_sos_running;
+               psp->bootloader_set_ecc_mode = psp_v3_1_bootloader_set_ecc_mode;
                psp->bootloader_load_sysdrv = psp_v3_1_bootloader_load_sysdrv;
                psp->bootloader_load_sos = psp_v3_1_bootloader_load_sos;
                psp->prep_cmd_buf = psp_v3_1_prep_cmd_buf;
@@ -61,6 +63,7 @@ static int psp_sw_init(void *handle)
                psp->cmd_submit = psp_v3_1_cmd_submit;
                psp->compare_sram_data = psp_v3_1_compare_sram_data;
                psp->smu_reload_quirk = psp_v3_1_smu_reload_quirk;
+               psp->config.ecc_mode = PSP_ECC_MODE__NONE;
                break;
        case CHIP_RAVEN:
 #if 0
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c 
b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
index f93a66e..0a51dde 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
@@ -162,6 +162,66 @@ int psp_v3_1_init_microcode(struct psp_context *psp)
        return err;
 }
 
+bool psp_v3_1_bootloader_is_sos_running(struct psp_context *psp)
+{
+       struct amdgpu_device *adev = psp->adev;
+
+       if (RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81) != 0)
+               return true;
+       else
+               return false;
+}
+
+int psp_v3_1_bootloader_set_ecc_mode(struct psp_context *psp)
+{
+       int ret = 0;
+       uint32_t sol_reg;
+       struct amdgpu_device *adev = psp->adev;
+       uint32_t psp_gfxdrv_command_reg = 0;
+
+       /* Workaround: check bootloader version and skip old one */
+       sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81);
+       if (sol_reg < 0xB0C00)
+               return ret;
+
+       switch (psp->config.ecc_mode)
+       {
+               case PSP_ECC_MODE__NONE:
+                       break;
+               case PSP_ECC_MODE__OFF:
+                       psp_gfxdrv_command_reg = PSP_BL__NO_ECC;
+                       break;
+               case PSP_ECC_MODE__ON:
+                       psp_gfxdrv_command_reg = PSP_BL__FULL_ECC;
+                       break;
+               case PSP_ECC_MODE__PARTIALON:
+                       psp_gfxdrv_command_reg = PSP_BL__PARTIAL_ECC;
+                       break;
+               default:
+                       break;
+       }
+
+       if (psp_gfxdrv_command_reg == 0)
+               return ret;
+
+       /* Wait for bootloader to signify that is ready having bit 31 of 
C2PMSG_35 set to 1 */
+       ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
+                          0x80000000, 0x80000000, false);
+       if (ret)
+               return ret;
+
+       WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_35, psp_gfxdrv_command_reg);
+
+       /* There might be handshake issue with hardware which needs delay */
+       mdelay(20);
+
+       /* Wait for bootloader to signify that is ready having bit 31 of 
C2PMSG_35 set to 1 */
+       ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35),
+                          0x80000000, 0x80000000, false);
+
+       return ret;
+}
+
 int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp)
 {
        int ret;
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.h 
b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.h
index 9dcd0b2..3e52b5d 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.h
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.h
@@ -34,6 +34,8 @@
 
 extern int psp_v3_1_init_microcode(struct psp_context *psp);
 extern int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp);
+extern bool psp_v3_1_bootloader_is_sos_running(struct psp_context *psp);
+extern int psp_v3_1_bootloader_set_ecc_mode(struct psp_context *psp);
 extern int psp_v3_1_bootloader_load_sos(struct psp_context *psp);
 extern int psp_v3_1_prep_cmd_buf(struct amdgpu_firmware_info *ucode,
                                 struct psp_gfx_cmd_resp *cmd);
-- 
1.9.1

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

Reply via email to