Skip to content

Commit 6ff34fd

Browse files
John Clementsalexdeucher
authored andcommitted
drm/amdgpu: Added support for added psp driver binaries FW
Detect psp driver binaries packed into FW and try to load the FW Signed-off-by: John Clements <[email protected]> Reviewed-by: Hawking Zhang <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent f8e487c commit 6ff34fd

File tree

3 files changed

+70
-7
lines changed

3 files changed

+70
-7
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2158,7 +2158,34 @@ static int psp_hw_start(struct psp_context *psp)
21582158
(psp->funcs->bootloader_load_sysdrv != NULL)) {
21592159
ret = psp_bootloader_load_sysdrv(psp);
21602160
if (ret) {
2161-
DRM_ERROR("PSP load sysdrv failed!\n");
2161+
DRM_ERROR("PSP load sys drv failed!\n");
2162+
return ret;
2163+
}
2164+
}
2165+
2166+
if ((is_psp_fw_valid(psp->soc_drv)) &&
2167+
(psp->funcs->bootloader_load_soc_drv != NULL)) {
2168+
ret = psp_bootloader_load_soc_drv(psp);
2169+
if (ret) {
2170+
DRM_ERROR("PSP load soc drv failed!\n");
2171+
return ret;
2172+
}
2173+
}
2174+
2175+
if ((is_psp_fw_valid(psp->intf_drv)) &&
2176+
(psp->funcs->bootloader_load_intf_drv != NULL)) {
2177+
ret = psp_bootloader_load_intf_drv(psp);
2178+
if (ret) {
2179+
DRM_ERROR("PSP load intf drv failed!\n");
2180+
return ret;
2181+
}
2182+
}
2183+
2184+
if ((is_psp_fw_valid(psp->dbg_drv)) &&
2185+
(psp->funcs->bootloader_load_dbg_drv != NULL)) {
2186+
ret = psp_bootloader_load_dbg_drv(psp);
2187+
if (ret) {
2188+
DRM_ERROR("PSP load dbg drv failed!\n");
21622189
return ret;
21632190
}
21642191
}
@@ -3074,6 +3101,24 @@ static int parse_sos_bin_descriptor(struct psp_context *psp,
30743101
psp->rl.size_bytes = le32_to_cpu(desc->size_bytes);
30753102
psp->rl.start_addr = ucode_start_addr;
30763103
break;
3104+
case PSP_FW_TYPE_PSP_SOC_DRV:
3105+
psp->soc_drv.fw_version = le32_to_cpu(desc->fw_version);
3106+
psp->soc_drv.feature_version = le32_to_cpu(desc->fw_version);
3107+
psp->soc_drv.size_bytes = le32_to_cpu(desc->size_bytes);
3108+
psp->soc_drv.start_addr = ucode_start_addr;
3109+
break;
3110+
case PSP_FW_TYPE_PSP_INTF_DRV:
3111+
psp->intf_drv.fw_version = le32_to_cpu(desc->fw_version);
3112+
psp->intf_drv.feature_version = le32_to_cpu(desc->fw_version);
3113+
psp->intf_drv.size_bytes = le32_to_cpu(desc->size_bytes);
3114+
psp->intf_drv.start_addr = ucode_start_addr;
3115+
break;
3116+
case PSP_FW_TYPE_PSP_DBG_DRV:
3117+
psp->dbg_drv.fw_version = le32_to_cpu(desc->fw_version);
3118+
psp->dbg_drv.feature_version = le32_to_cpu(desc->fw_version);
3119+
psp->dbg_drv.size_bytes = le32_to_cpu(desc->size_bytes);
3120+
psp->dbg_drv.start_addr = ucode_start_addr;
3121+
break;
30773122
default:
30783123
dev_warn(psp->adev->dev, "Unsupported PSP FW type: %d\n", desc->fw_type);
30793124
break;

drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ enum psp_bootloader_cmd {
5454
PSP_BL__LOAD_SYSDRV = 0x10000,
5555
PSP_BL__LOAD_SOSDRV = 0x20000,
5656
PSP_BL__LOAD_KEY_DATABASE = 0x80000,
57+
PSP_BL__LOAD_SOCDRV = 0x90000,
58+
PSP_BL__LOAD_INTFDRV = 0xA0000,
59+
PSP_BL__LOAD_DBGDRV = 0xB0000,
5760
PSP_BL__DRAM_LONG_TRAIN = 0x100000,
5861
PSP_BL__DRAM_SHORT_TRAIN = 0x200000,
5962
PSP_BL__LOAD_TOS_SPL_TABLE = 0x10000000,
@@ -94,6 +97,9 @@ struct psp_funcs
9497
int (*bootloader_load_kdb)(struct psp_context *psp);
9598
int (*bootloader_load_spl)(struct psp_context *psp);
9699
int (*bootloader_load_sysdrv)(struct psp_context *psp);
100+
int (*bootloader_load_soc_drv)(struct psp_context *psp);
101+
int (*bootloader_load_intf_drv)(struct psp_context *psp);
102+
int (*bootloader_load_dbg_drv)(struct psp_context *psp);
97103
int (*bootloader_load_sos)(struct psp_context *psp);
98104
int (*ring_init)(struct psp_context *psp, enum psp_ring_type ring_type);
99105
int (*ring_create)(struct psp_context *psp,
@@ -306,12 +312,15 @@ struct psp_context
306312

307313
/* sos firmware */
308314
const struct firmware *sos_fw;
309-
struct psp_bin_desc sys;
310-
struct psp_bin_desc sos;
311-
struct psp_bin_desc toc;
312-
struct psp_bin_desc kdb;
313-
struct psp_bin_desc spl;
314-
struct psp_bin_desc rl;
315+
struct psp_bin_desc sys;
316+
struct psp_bin_desc sos;
317+
struct psp_bin_desc toc;
318+
struct psp_bin_desc kdb;
319+
struct psp_bin_desc spl;
320+
struct psp_bin_desc rl;
321+
struct psp_bin_desc soc_drv;
322+
struct psp_bin_desc intf_drv;
323+
struct psp_bin_desc dbg_drv;
315324

316325
/* tmr buffer */
317326
struct amdgpu_bo *tmr_bo;
@@ -401,6 +410,12 @@ struct amdgpu_psp_funcs {
401410
((psp)->funcs->bootloader_load_spl ? (psp)->funcs->bootloader_load_spl((psp)) : 0)
402411
#define psp_bootloader_load_sysdrv(psp) \
403412
((psp)->funcs->bootloader_load_sysdrv ? (psp)->funcs->bootloader_load_sysdrv((psp)) : 0)
413+
#define psp_bootloader_load_soc_drv(psp) \
414+
((psp)->funcs->bootloader_load_soc_drv ? (psp)->funcs->bootloader_load_soc_drv((psp)) : 0)
415+
#define psp_bootloader_load_intf_drv(psp) \
416+
((psp)->funcs->bootloader_load_intf_drv ? (psp)->funcs->bootloader_load_intf_drv((psp)) : 0)
417+
#define psp_bootloader_load_dbg_drv(psp) \
418+
((psp)->funcs->bootloader_load_dbg_drv ? (psp)->funcs->bootloader_load_dbg_drv((psp)) : 0)
404419
#define psp_bootloader_load_sos(psp) \
405420
((psp)->funcs->bootloader_load_sos ? (psp)->funcs->bootloader_load_sos((psp)) : 0)
406421
#define psp_smu_reload_quirk(psp) \

drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ enum psp_fw_type {
121121
PSP_FW_TYPE_PSP_TOC,
122122
PSP_FW_TYPE_PSP_SPL,
123123
PSP_FW_TYPE_PSP_RL,
124+
PSP_FW_TYPE_PSP_SOC_DRV,
125+
PSP_FW_TYPE_PSP_INTF_DRV,
126+
PSP_FW_TYPE_PSP_DBG_DRV,
124127
};
125128

126129
/* version_major=2, version_minor=0 */

0 commit comments

Comments
 (0)