From: Candice Li <[email protected]>

Add psp_init_rl_microcode() to request amdgpu/%s_rl.bin and populate
psp->rl using the existing v1.0 PSP firmware header parsing.

Wire it up for psp v15_0_8.

Signed-off-by: Candice Li <[email protected]>
Reviewed-by: Hawking Zhang <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c  | 20 ++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h  |  4 ++++
 drivers/gpu/drm/amd/amdgpu/psp_v15_0_8.c |  5 +++++
 3 files changed, 29 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index d7d6623b51da6..2a0ab763f59ac 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -4025,6 +4025,26 @@ int psp_init_toc_microcode(struct psp_context *psp, 
const char *chip_name)
        return err;
 }
 
+int psp_init_rl_microcode(struct psp_context *psp, const char *chip_name)
+{
+       int err;
+
+       err = amdgpu_ucode_request(psp->adev, &psp->rl_fw, 
AMDGPU_UCODE_REQUIRED,
+                                  "amdgpu/%s_rl.bin", chip_name);
+       if (err)
+               goto out;
+
+       err = parse_psp_v1_bin_descriptor(&psp->rl,
+                   (const struct psp_firmware_header_v1_0 *)psp->rl_fw->data);
+       if (err)
+               goto out;
+
+       return 0;
+out:
+       amdgpu_ucode_release(&psp->rl_fw);
+       return err;
+}
+
 static int parse_psp_v2_bin_descriptor(struct psp_context *psp,
                                   const struct psp_fw_bin_desc *desc,
                                   const struct psp_firmware_header_v2_0 
*sos_hdr)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
index 4047706c1ce22..ea3658e2be6dd 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
@@ -425,6 +425,9 @@ struct psp_context {
        /* cap firmware */
        const struct firmware           *cap_fw;
 
+       /* rl firmware */
+       const struct firmware           *rl_fw;
+
        /* fence buffer */
        struct amdgpu_bo                *fence_buf_bo;
        uint64_t                        fence_buf_mc_addr;
@@ -656,5 +659,6 @@ void amdgpu_psp_debugfs_init(struct amdgpu_device *adev);
 int amdgpu_psp_get_fw_type(struct amdgpu_firmware_info *ucode,
                           enum psp_gfx_fw_type *type);
 int psp_set_mmhub_eco_sec_level(struct amdgpu_device *adev);
+int psp_init_rl_microcode(struct psp_context *psp, const char *chip_name);
 
 #endif
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v15_0_8.c 
b/drivers/gpu/drm/amd/amdgpu/psp_v15_0_8.c
index ec20cd5eb7552..57a079e3f356e 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v15_0_8.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v15_0_8.c
@@ -33,6 +33,7 @@
 
 MODULE_FIRMWARE("amdgpu/psp_15_0_8_toc.bin");
 MODULE_FIRMWARE("amdgpu/psp_15_0_8_toc_1.bin");
+MODULE_FIRMWARE("amdgpu/psp_15_0_8_rl.bin");
 
 static int psp_v15_0_8_init_microcode(struct psp_context *psp)
 {
@@ -46,6 +47,10 @@ static int psp_v15_0_8_init_microcode(struct psp_context 
*psp)
        if (err)
                return err;
 
+       err = psp_init_rl_microcode(psp, ucode_prefix);
+       if (err)
+               return err;
+
        return 0;
 }
 
-- 
2.55.0

Reply via email to