drm/amdgpu: add PSP KDB loading support for Arcturus
authorJohn Clements <John.Clements@amd.com>
Mon, 22 Jul 2019 10:06:58 +0000 (18:06 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 2 Aug 2019 15:30:39 +0000 (10:30 -0500)
Add support for the arcturus specific psp metadata to the
amdgpu firmware and properly parse it when loading it.

Signed-off-by: John Clements <john.clements@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
drivers/gpu/drm/amd/amdgpu/psp_v11_0.c

index df5ebf72a9795db221c52b65ceeff7730d916560..9e974ce26378e1bb3f4b36875102b4e3d0e57a4c 100644 (file)
@@ -269,6 +269,16 @@ void amdgpu_ucode_print_psp_hdr(const struct common_firmware_header *hdr)
                        DRM_DEBUG("kdb_size_bytes: %u\n",
                                  le32_to_cpu(psp_hdr_v1_1->kdb_size_bytes));
                }
+               if (version_minor == 2) {
+                       const struct psp_firmware_header_v1_2 *psp_hdr_v1_2 =
+                               container_of(psp_hdr, struct psp_firmware_header_v1_2, v1_0);
+                       DRM_DEBUG("kdb_header_version: %u\n",
+                                 le32_to_cpu(psp_hdr_v1_2->kdb_header_version));
+                       DRM_DEBUG("kdb_offset_bytes: %u\n",
+                                 le32_to_cpu(psp_hdr_v1_2->kdb_offset_bytes));
+                       DRM_DEBUG("kdb_size_bytes: %u\n",
+                                 le32_to_cpu(psp_hdr_v1_2->kdb_size_bytes));
+               }
        } else {
                DRM_ERROR("Unknown PSP ucode version: %u.%u\n",
                          version_major, version_minor);
index 2be106e81eda9b63362cb03e48b7f58e7449e3b5..4f1b167a9394a60aba6e821dbae87f792a9c90a8 100644 (file)
@@ -90,6 +90,15 @@ struct psp_firmware_header_v1_1 {
        uint32_t kdb_size_bytes;
 };
 
+/* version_major=1, version_minor=2 */
+struct psp_firmware_header_v1_2 {
+       struct psp_firmware_header_v1_0 v1_0;
+       uint32_t reserve[3];
+       uint32_t kdb_header_version;
+       uint32_t kdb_offset_bytes;
+       uint32_t kdb_size_bytes;
+};
+
 /* version_major=1, version_minor=0 */
 struct ta_firmware_header_v1_0 {
        struct common_firmware_header header;
index 40f19718c5158cf1185dc2cb908b8a7e81aa53d6..38956e41718b336356e8987ad5f09fe8a60d9b74 100644 (file)
@@ -64,6 +64,7 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
        int err = 0;
        const struct psp_firmware_header_v1_0 *sos_hdr;
        const struct psp_firmware_header_v1_1 *sos_hdr_v1_1;
+       const struct psp_firmware_header_v1_2 *sos_hdr_v1_2;
        const struct psp_firmware_header_v1_0 *asd_hdr;
        const struct ta_firmware_header_v1_0 *ta_hdr;
 
@@ -79,6 +80,9 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
        case CHIP_NAVI14:
                chip_name = "navi14";
                break;
+       case CHIP_ARCTURUS:
+               chip_name = "arcturus";
+               break;
        default:
                BUG();
        }
@@ -114,6 +118,12 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
                        adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr +
                                        le32_to_cpu(sos_hdr_v1_1->kdb_offset_bytes);
                }
+               if (sos_hdr->header.header_version_minor == 2) {
+                       sos_hdr_v1_2 = (const struct psp_firmware_header_v1_2 *)adev->psp.sos_fw->data;
+                       adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_2->kdb_size_bytes);
+                       adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr +
+                                                   le32_to_cpu(sos_hdr_v1_2->kdb_offset_bytes);
+               }
                break;
        default:
                dev_err(adev->dev,