drm/amdgpu: add checking for sos version
authorHuang Rui <ray.huang@amd.com>
Sat, 12 May 2018 04:31:12 +0000 (12:31 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 13 Jun 2018 18:45:20 +0000 (13:45 -0500)
The sos ucode version will be changed to align with the value of
mmMP0_SMN_C2PMSG_58. Then we add a checking for this. Meanwhile, we have to be
compatibility backwards. So it adds serveral recent legacy versions as the white
list for the version checking.

Signed-off-by: Huang Rui <ray.huang@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/psp_v3_1.c

index 0c768e388ace5f9f8fc70c500ef09e20ccae9743..727071fee6f64d9148076b1bb1916bf4136b223c 100644 (file)
@@ -47,6 +47,8 @@ MODULE_FIRMWARE("amdgpu/vega20_asd.bin");
 
 #define smnMP1_FIRMWARE_FLAGS 0x3010028
 
+static uint32_t sos_old_versions[] = {1517616, 1510592, 1448594, 1446554};
+
 static int
 psp_v3_1_get_fw_type(struct amdgpu_firmware_info *ucode, enum psp_gfx_fw_type *type)
 {
@@ -210,12 +212,31 @@ static int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp)
        return ret;
 }
 
+static bool psp_v3_1_match_version(struct amdgpu_device *adev, uint32_t ver)
+{
+       int i;
+
+       if (ver == adev->psp.sos_fw_version)
+               return true;
+
+       /*
+        * Double check if the latest four legacy versions.
+        * If yes, it is still the right version.
+        */
+       for (i = 0; i < sizeof(sos_old_versions) / sizeof(uint32_t); i++) {
+               if (sos_old_versions[i] == adev->psp.sos_fw_version)
+                       return true;
+       }
+
+       return false;
+}
+
 static int psp_v3_1_bootloader_load_sos(struct psp_context *psp)
 {
        int ret;
        unsigned int psp_gfxdrv_command_reg = 0;
        struct amdgpu_device *adev = psp->adev;
-       uint32_t sol_reg;
+       uint32_t sol_reg, ver;
 
        /* Check sOS sign of life register to confirm sys driver and sOS
         * are already been loaded.
@@ -248,6 +269,10 @@ static int psp_v3_1_bootloader_load_sos(struct psp_context *psp)
                           RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81),
                           0, true);
 
+       ver = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58);
+       if (!psp_v3_1_match_version(adev, ver))
+               DRM_WARN("SOS version doesn't match\n");
+
        return ret;
 }