[PATCH 09/10] drm/amdgpu: Add interface for TOS reload cases
Alex Deucher
alexdeucher at gmail.com
Mon Sep 9 21:38:11 UTC 2024
On Mon, Sep 2, 2024 at 3:34 AM Lijo Lazar <lijo.lazar at amd.com> 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 at amd.com>
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> 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
>
More information about the amd-gfx
mailing list