drm/amd: Parse both v1 and v2 TA microcode headers using same function
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / amdgpu / psp_v10_0.c
index 9de46fa..f14fcfb 100644 (file)
@@ -48,9 +48,8 @@ static int psp_v10_0_init_microcode(struct psp_context *psp)
 {
        struct amdgpu_device *adev = psp->adev;
        const char *chip_name;
-       char fw_name[30];
+       char ucode_prefix[30];
        int err = 0;
-       const struct ta_firmware_header_v1_0 *ta_hdr;
        DRM_DEBUG("\n");
 
        switch (adev->asic_type) {
@@ -64,66 +63,13 @@ static int psp_v10_0_init_microcode(struct psp_context *psp)
                break;
        default: BUG();
        }
+       amdgpu_ucode_ip_version_decode(adev, MP0_HWIP, ucode_prefix, sizeof(ucode_prefix));
 
-       err = psp_init_asd_microcode(psp, chip_name);
+       err = psp_init_asd_microcode(psp, ucode_prefix);
        if (err)
-               goto out;
-
-       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name);
-       err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev);
-       if (err) {
-               release_firmware(adev->psp.ta_fw);
-               adev->psp.ta_fw = NULL;
-               dev_info(adev->dev,
-                        "psp v10.0: Failed to load firmware \"%s\"\n",
-                        fw_name);
-       } else {
-               err = amdgpu_ucode_validate(adev->psp.ta_fw);
-               if (err)
-                       goto out2;
-
-               ta_hdr = (const struct ta_firmware_header_v1_0 *)
-                                adev->psp.ta_fw->data;
-               adev->psp.hdcp_context.context.bin_desc.fw_version =
-                       le32_to_cpu(ta_hdr->hdcp.fw_version);
-               adev->psp.hdcp_context.context.bin_desc.size_bytes =
-                       le32_to_cpu(ta_hdr->hdcp.size_bytes);
-               adev->psp.hdcp_context.context.bin_desc.start_addr =
-                       (uint8_t *)ta_hdr +
-                       le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes);
-
-               adev->psp.dtm_context.context.bin_desc.fw_version =
-                       le32_to_cpu(ta_hdr->dtm.fw_version);
-               adev->psp.dtm_context.context.bin_desc.size_bytes =
-                       le32_to_cpu(ta_hdr->dtm.size_bytes);
-               adev->psp.dtm_context.context.bin_desc.start_addr =
-                       (uint8_t *)adev->psp.hdcp_context.context.bin_desc.start_addr +
-                       le32_to_cpu(ta_hdr->dtm.offset_bytes);
-
-               adev->psp.securedisplay_context.context.bin_desc.fw_version =
-                       le32_to_cpu(ta_hdr->securedisplay.fw_version);
-               adev->psp.securedisplay_context.context.bin_desc.size_bytes =
-                       le32_to_cpu(ta_hdr->securedisplay.size_bytes);
-               adev->psp.securedisplay_context.context.bin_desc.start_addr =
-                       (uint8_t *)adev->psp.hdcp_context.context.bin_desc.start_addr +
-                       le32_to_cpu(ta_hdr->securedisplay.offset_bytes);
-
-               adev->psp.ta_fw_version = le32_to_cpu(ta_hdr->header.ucode_version);
-       }
-
-       return 0;
-
-out2:
-       release_firmware(adev->psp.ta_fw);
-       adev->psp.ta_fw = NULL;
-out:
-       if (err) {
-               dev_err(adev->dev,
-                       "psp v10.0: Failed to load firmware \"%s\"\n",
-                       fw_name);
-       }
+               return err;
 
-       return err;
+       return psp_init_ta_microcode(psp, ucode_prefix);
 }
 
 static int psp_v10_0_ring_create(struct psp_context *psp,