From: John Clements <john.cleme...@amd.com>

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.cleme...@amd.com>
Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | 10 ++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h |  9 +++++++++
 drivers/gpu/drm/amd/amdgpu/psp_v11_0.c    | 10 ++++++++++
 3 files changed, 29 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
index 1ec696858d78..21fe00eef30e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
@@ -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);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
index 2be106e81eda..4f1b167a9394 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
@@ -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;
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c 
b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
index c93062d91bb6..b141959116b6 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
@@ -62,6 +62,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;
 
@@ -77,6 +78,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();
        }
@@ -112,6 +116,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,
-- 
2.20.1

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

Reply via email to