drm/amdgpu: Add interface for TOS reload cases
Add interface to check if a different TOS needs to be loaded than the one which is which is already active on the SOC. Presently the interface is restricted to specific variants of PSPv13.0. Signed-off-by: Lijo Lazar <lijo.lazar@amd.com> Reviewed-by: Feifei Xu <Feifei.Xu@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Acked-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@amd.com> Tested-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
c4f00312c1
commit
0ff3822613
3 changed files with 40 additions and 0 deletions
|
@ -2266,6 +2266,19 @@ bool amdgpu_psp_get_ras_capability(struct psp_context *psp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool amdgpu_psp_tos_reload_needed(struct amdgpu_device *adev)
|
||||||
|
{
|
||||||
|
struct psp_context *psp = &adev->psp;
|
||||||
|
|
||||||
|
if (amdgpu_sriov_vf(adev))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (psp->funcs && psp->funcs->is_reload_needed)
|
||||||
|
return psp->funcs->is_reload_needed(psp);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static int psp_hw_start(struct psp_context *psp)
|
static int psp_hw_start(struct psp_context *psp)
|
||||||
{
|
{
|
||||||
struct amdgpu_device *adev = psp->adev;
|
struct amdgpu_device *adev = psp->adev;
|
||||||
|
|
|
@ -139,6 +139,7 @@ struct psp_funcs {
|
||||||
int (*fatal_error_recovery_quirk)(struct psp_context *psp);
|
int (*fatal_error_recovery_quirk)(struct psp_context *psp);
|
||||||
bool (*get_ras_capability)(struct psp_context *psp);
|
bool (*get_ras_capability)(struct psp_context *psp);
|
||||||
bool (*is_aux_sos_load_required)(struct psp_context *psp);
|
bool (*is_aux_sos_load_required)(struct psp_context *psp);
|
||||||
|
bool (*is_reload_needed)(struct psp_context *psp);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ta_funcs {
|
struct ta_funcs {
|
||||||
|
@ -560,5 +561,6 @@ bool amdgpu_psp_get_ras_capability(struct psp_context *psp);
|
||||||
|
|
||||||
int psp_config_sq_perfmon(struct psp_context *psp, uint32_t xcp_id,
|
int psp_config_sq_perfmon(struct psp_context *psp, uint32_t xcp_id,
|
||||||
bool core_override_enable, bool reg_override_enable, bool perfmon_override_enable);
|
bool core_override_enable, bool reg_override_enable, bool perfmon_override_enable);
|
||||||
|
bool amdgpu_psp_tos_reload_needed(struct amdgpu_device *adev);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -823,6 +823,30 @@ static bool psp_v13_0_is_aux_sos_load_required(struct psp_context *psp)
|
||||||
return (pmfw_ver < 0x557300);
|
return (pmfw_ver < 0x557300);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool psp_v13_0_is_reload_needed(struct psp_context *psp)
|
||||||
|
{
|
||||||
|
uint32_t ucode_ver;
|
||||||
|
|
||||||
|
if (!psp_v13_0_is_sos_alive(psp))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* Restrict reload support only to specific IP versions */
|
||||||
|
switch (amdgpu_ip_version(psp->adev, MP0_HWIP, 0)) {
|
||||||
|
case IP_VERSION(13, 0, 2):
|
||||||
|
case IP_VERSION(13, 0, 6):
|
||||||
|
case IP_VERSION(13, 0, 14):
|
||||||
|
/* TOS version read from microcode header */
|
||||||
|
ucode_ver = psp->sos.fw_version;
|
||||||
|
/* Read TOS version from hardware */
|
||||||
|
psp_v13_0_init_sos_version(psp);
|
||||||
|
return (ucode_ver != psp->sos.fw_version);
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct psp_funcs psp_v13_0_funcs = {
|
static const struct psp_funcs psp_v13_0_funcs = {
|
||||||
.init_microcode = psp_v13_0_init_microcode,
|
.init_microcode = psp_v13_0_init_microcode,
|
||||||
.wait_for_bootloader = psp_v13_0_wait_for_bootloader_steady_state,
|
.wait_for_bootloader = psp_v13_0_wait_for_bootloader_steady_state,
|
||||||
|
@ -847,6 +871,7 @@ static const struct psp_funcs psp_v13_0_funcs = {
|
||||||
.fatal_error_recovery_quirk = psp_v13_0_fatal_error_recovery_quirk,
|
.fatal_error_recovery_quirk = psp_v13_0_fatal_error_recovery_quirk,
|
||||||
.get_ras_capability = psp_v13_0_get_ras_capability,
|
.get_ras_capability = psp_v13_0_get_ras_capability,
|
||||||
.is_aux_sos_load_required = psp_v13_0_is_aux_sos_load_required,
|
.is_aux_sos_load_required = psp_v13_0_is_aux_sos_load_required,
|
||||||
|
.is_reload_needed = psp_v13_0_is_reload_needed,
|
||||||
};
|
};
|
||||||
|
|
||||||
void psp_v13_0_set_psp_funcs(struct psp_context *psp)
|
void psp_v13_0_set_psp_funcs(struct psp_context *psp)
|
||||||
|
|
Loading…
Add table
Reference in a new issue