On Mon, Sep 2, 2024 at 3:34 AM Lijo Lazar <lijo.lazar@xxxxxxx> wrote: > > 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@xxxxxxx> Reviewed-by: Alex Deucher <alexander.deucher@xxxxxxx> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 13 +++++++++++++ > drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h | 3 +++ > drivers/gpu/drm/amd/amdgpu/psp_v13_0.c | 25 +++++++++++++++++++++++++ > 3 files changed, 41 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c > index 189574d53ebd..3623bea2b1e8 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c > @@ -2264,6 +2264,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) > { > struct amdgpu_device *adev = psp->adev; > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h > index 74a96516c913..23581c44e625 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h > @@ -138,6 +138,7 @@ struct psp_funcs { > int (*vbflash_stat)(struct psp_context *psp); > int (*fatal_error_recovery_quirk)(struct psp_context *psp); > bool (*get_ras_capability)(struct psp_context *psp); > + bool (*is_reload_needed)(struct psp_context *psp); > }; > > struct ta_funcs { > @@ -553,4 +554,6 @@ int is_psp_fw_valid(struct psp_bin_desc bin); > > int amdgpu_psp_wait_for_bootloader(struct amdgpu_device *adev); > bool amdgpu_psp_get_ras_capability(struct psp_context *psp); > +bool amdgpu_psp_tos_reload_needed(struct amdgpu_device *adev); > + > #endif > diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c > index 1251ee38a676..035e0ceda4c2 100644 > --- a/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c > @@ -807,6 +807,30 @@ static bool psp_v13_0_get_ras_capability(struct psp_context *psp) > } > } > > +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 = { > .init_microcode = psp_v13_0_init_microcode, > .wait_for_bootloader = psp_v13_0_wait_for_bootloader_steady_state, > @@ -830,6 +854,7 @@ static const struct psp_funcs psp_v13_0_funcs = { > .vbflash_stat = psp_v13_0_vbflash_status, > .fatal_error_recovery_quirk = psp_v13_0_fatal_error_recovery_quirk, > .get_ras_capability = psp_v13_0_get_ras_capability, > + .is_reload_needed = psp_v13_0_is_reload_needed, > }; > > void psp_v13_0_set_psp_funcs(struct psp_context *psp) > -- > 2.25.1 >