[PATCH 2/2] drm/amdgpu: load sos binary properly on the basis of pmfw version

Zhang, Hawking Hawking.Zhang at amd.com
Thu Sep 12 14:33:57 UTC 2024


[AMD Official Use Only - AMD Internal Distribution Only]

Series is

Reviewed-by: Hawking Zhang <Hawking.Zhang at amd.com>

Regards,
Hawking

-----Original Message-----
From: Ma, Le <Le.Ma at amd.com>
Sent: Thursday, September 12, 2024 18:02
To: amd-gfx at lists.freedesktop.org
Cc: Zhang, Hawking <Hawking.Zhang at amd.com>; Deucher, Alexander <Alexander.Deucher at amd.com>; Ma, Le <Le.Ma at amd.com>; Lazar, Lijo <Lijo.Lazar at amd.com>
Subject: [PATCH 2/2] drm/amdgpu: load sos binary properly on the basis of pmfw version

To be compatible with legacy IFWI, driver needs to carry legacy tOS and query pmfw version to load them accordingly.

Add psp_firmware_header_v2_1 to handle the combined sos binary.

Double the sos count limit for the case of aux sos fw packed.

v2: pass the correct fw_bin_desc to parse_sos_bin_descriptor

Signed-off-by: Le Ma <le.ma at amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar at amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c   | 29 ++++++++++++++++++-----
 drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h | 11 ++++++++-
 2 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index 189574d53ebd..f702f3391c2b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -3425,9 +3425,11 @@ int psp_init_sos_microcode(struct psp_context *psp, const char *chip_name)
        const struct psp_firmware_header_v1_2 *sos_hdr_v1_2;
        const struct psp_firmware_header_v1_3 *sos_hdr_v1_3;
        const struct psp_firmware_header_v2_0 *sos_hdr_v2_0;
-       int err = 0;
+       const struct psp_firmware_header_v2_1 *sos_hdr_v2_1;
+       int fw_index, fw_bin_count, start_index = 0;
+       const struct psp_fw_bin_desc *fw_bin;
        uint8_t *ucode_array_start_addr;
-       int fw_index = 0;
+       int err = 0;

        err = amdgpu_ucode_request(adev, &adev->psp.sos_fw, "amdgpu/%s_sos.bin", chip_name);
        if (err)
@@ -3478,15 +3480,30 @@ int psp_init_sos_microcode(struct psp_context *psp, const char *chip_name)
        case 2:
                sos_hdr_v2_0 = (const struct psp_firmware_header_v2_0 *)adev->psp.sos_fw->data;

-               if (le32_to_cpu(sos_hdr_v2_0->psp_fw_bin_count) >= UCODE_MAX_PSP_PACKAGING) {
+               fw_bin_count = le32_to_cpu(sos_hdr_v2_0->psp_fw_bin_count);
+
+               if (fw_bin_count >= UCODE_MAX_PSP_PACKAGING) {
                        dev_err(adev->dev, "packed SOS count exceeds maximum limit\n");
                        err = -EINVAL;
                        goto out;
                }

-               for (fw_index = 0; fw_index < le32_to_cpu(sos_hdr_v2_0->psp_fw_bin_count); fw_index++) {
-                       err = parse_sos_bin_descriptor(psp,
-                                                      &sos_hdr_v2_0->psp_fw_bin[fw_index],
+               if (sos_hdr_v2_0->header.header_version_minor == 1) {
+                       sos_hdr_v2_1 = (const struct psp_firmware_header_v2_1
+*)adev->psp.sos_fw->data;
+
+                       fw_bin = sos_hdr_v2_1->psp_fw_bin;
+
+                       if (psp_is_aux_sos_load_required(psp))
+                               start_index = le32_to_cpu(sos_hdr_v2_1->psp_aux_fw_bin_index);
+                       else
+                               fw_bin_count -= le32_to_cpu(sos_hdr_v2_1->psp_aux_fw_bin_index);
+
+               } else {
+                       fw_bin = sos_hdr_v2_0->psp_fw_bin;
+               }
+
+               for (fw_index = start_index; fw_index < fw_bin_count; fw_index++) {
+                       err = parse_sos_bin_descriptor(psp, fw_bin + fw_index,
                                                       sos_hdr_v2_0);
                        if (err)
                                goto out;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
index 5bc37acd3981..36b14c1b94b6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
@@ -136,6 +136,14 @@ struct psp_firmware_header_v2_0 {
        struct psp_fw_bin_desc psp_fw_bin[];
 };

+/* version_major=2, version_minor=1 */
+struct psp_firmware_header_v2_1 {
+       struct common_firmware_header header;
+       uint32_t psp_fw_bin_count;
+       uint32_t psp_aux_fw_bin_index;
+       struct psp_fw_bin_desc psp_fw_bin[];
+};
+
 /* version_major=1, version_minor=0 */
 struct ta_firmware_header_v1_0 {
        struct common_firmware_header header;
@@ -426,6 +434,7 @@ union amdgpu_firmware_header {
        struct psp_firmware_header_v1_1 psp_v1_1;
        struct psp_firmware_header_v1_3 psp_v1_3;
        struct psp_firmware_header_v2_0 psp_v2_0;
+       struct psp_firmware_header_v2_0 psp_v2_1;
        struct ta_firmware_header_v1_0 ta;
        struct ta_firmware_header_v2_0 ta_v2_0;
        struct gfx_firmware_header_v1_0 gfx;
@@ -447,7 +456,7 @@ union amdgpu_firmware_header {
        uint8_t raw[0x100];
 };

-#define UCODE_MAX_PSP_PACKAGING ((sizeof(union amdgpu_firmware_header) - sizeof(struct common_firmware_header) - 4) / sizeof(struct psp_fw_bin_desc))
+#define UCODE_MAX_PSP_PACKAGING ((sizeof(union amdgpu_firmware_header)
+- sizeof(struct common_firmware_header) - 4) / sizeof(struct
+psp_fw_bin_desc)) * 2

 /*
  * fw loading support
--
2.43.2



More information about the amd-gfx mailing list