RE: [PATCH 2/4] drm/amdgpu: Add bootloader status check

2023-08-11 Thread Chen, Guchun
[Public]

> -Original Message-
> From: amd-gfx  On Behalf Of Lijo
> Lazar
> Sent: Friday, August 11, 2023 1:18 PM
> To: amd-gfx@lists.freedesktop.org
> Cc: Deucher, Alexander ; Ma, Le
> ; Kamal, Asad ; Zhang, Hawking
> 
> Subject: [PATCH 2/4] drm/amdgpu: Add bootloader status check
>
> Add a function to wait till bootloader has reached steady state.
>
> Signed-off-by: Lijo Lazar 
> Reviewed-by: Hawking Zhang 
> Reviewed-by: Asad Kamal 
> Tested-by: Asad Kamal 
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 17 ++---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c| 11 +++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h|  3 +++
>  3 files changed, 28 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 6809bf7dae57..9061d79cd387 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -885,13 +885,20 @@ static void amdgpu_block_invalid_wreg(struct
> amdgpu_device *adev,
>   */
>  static int amdgpu_device_asic_init(struct amdgpu_device *adev)  {
> + int ret;
> +
>   amdgpu_asic_pre_asic_init(adev);
>
>   if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3) ||
> - adev->ip_versions[GC_HWIP][0] >= IP_VERSION(11, 0, 0))
> - return amdgpu_atomfirmware_asic_init(adev, true);
> - else
> + adev->ip_versions[GC_HWIP][0] >= IP_VERSION(11, 0, 0)) {
> + amdgpu_psp_wait_for_bootloader(adev);
> + ret = amdgpu_atomfirmware_asic_init(adev, true);
> + return ret;

'return amdgpu_atomfirmware_asic_init(adev, true);' may be more simple. Then 
you can drop variable 'ret'.

Regards,
Guchun

> + } else {
>   return amdgpu_atom_asic_init(adev-
> >mode_info.atom_context);
> + }
> +
> + return 0;
>  }
>
>  /**
> @@ -4702,6 +4709,9 @@ int amdgpu_device_mode1_reset(struct
> amdgpu_device *adev)
>   dev_err(adev->dev, "GPU mode1 reset failed\n");
>
>   amdgpu_device_load_pci_state(adev->pdev);
> + ret = amdgpu_psp_wait_for_bootloader(adev);
> + if (ret)
> + return ret;
>
>   /* wait for asic to come out of reset */
>   for (i = 0; i < adev->usec_timeout; i++) { @@ -4713,6 +4723,7 @@ int
> amdgpu_device_mode1_reset(struct amdgpu_device *adev)
>   }
>
>   amdgpu_atombios_scratch_regs_engine_hung(adev, false);
> +
>   return ret;
>  }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> index 8fdca54bb8a1..429ef212c1f2 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> @@ -2078,6 +2078,17 @@ int psp_securedisplay_invoke(struct psp_context
> *psp, uint32_t ta_cmd_id)  }
>  /* SECUREDISPLAY end */
>
> +int amdgpu_psp_wait_for_bootloader(struct amdgpu_device *adev) {
> + struct psp_context *psp = >psp;
> + int ret = 0;
> +
> + if (!amdgpu_sriov_vf(adev) && psp->funcs && psp->funcs-
> >wait_for_bootloader != NULL)
> + ret = psp->funcs->wait_for_bootloader(psp);
> +
> + return ret;
> +}
> +
>  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 3384eb94fde0..3e67ed63e638 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
> @@ -109,6 +109,7 @@ enum psp_reg_prog_id {
>
>  struct psp_funcs {
>   int (*init_microcode)(struct psp_context *psp);
> + int (*wait_for_bootloader)(struct psp_context *psp);
>   int (*bootloader_load_kdb)(struct psp_context *psp);
>   int (*bootloader_load_spl)(struct psp_context *psp);
>   int (*bootloader_load_sysdrv)(struct psp_context *psp); @@ -533,4
> +534,6 @@ int psp_spatial_partition(struct psp_context *psp, int mode);
>
>  int is_psp_fw_valid(struct psp_bin_desc bin);
>
> +int amdgpu_psp_wait_for_bootloader(struct amdgpu_device *adev);
> +
>  #endif
> --
> 2.25.1



[PATCH 2/4] drm/amdgpu: Add bootloader status check

2023-08-10 Thread Lijo Lazar
Add a function to wait till bootloader has reached steady state.

Signed-off-by: Lijo Lazar 
Reviewed-by: Hawking Zhang 
Reviewed-by: Asad Kamal 
Tested-by: Asad Kamal 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 17 ++---
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c| 11 +++
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h|  3 +++
 3 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 6809bf7dae57..9061d79cd387 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -885,13 +885,20 @@ static void amdgpu_block_invalid_wreg(struct 
amdgpu_device *adev,
  */
 static int amdgpu_device_asic_init(struct amdgpu_device *adev)
 {
+   int ret;
+
amdgpu_asic_pre_asic_init(adev);
 
if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3) ||
-   adev->ip_versions[GC_HWIP][0] >= IP_VERSION(11, 0, 0))
-   return amdgpu_atomfirmware_asic_init(adev, true);
-   else
+   adev->ip_versions[GC_HWIP][0] >= IP_VERSION(11, 0, 0)) {
+   amdgpu_psp_wait_for_bootloader(adev);
+   ret = amdgpu_atomfirmware_asic_init(adev, true);
+   return ret;
+   } else {
return amdgpu_atom_asic_init(adev->mode_info.atom_context);
+   }
+
+   return 0;
 }
 
 /**
@@ -4702,6 +4709,9 @@ int amdgpu_device_mode1_reset(struct amdgpu_device *adev)
dev_err(adev->dev, "GPU mode1 reset failed\n");
 
amdgpu_device_load_pci_state(adev->pdev);
+   ret = amdgpu_psp_wait_for_bootloader(adev);
+   if (ret)
+   return ret;
 
/* wait for asic to come out of reset */
for (i = 0; i < adev->usec_timeout; i++) {
@@ -4713,6 +4723,7 @@ int amdgpu_device_mode1_reset(struct amdgpu_device *adev)
}
 
amdgpu_atombios_scratch_regs_engine_hung(adev, false);
+
return ret;
 }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index 8fdca54bb8a1..429ef212c1f2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -2078,6 +2078,17 @@ int psp_securedisplay_invoke(struct psp_context *psp, 
uint32_t ta_cmd_id)
 }
 /* SECUREDISPLAY end */
 
+int amdgpu_psp_wait_for_bootloader(struct amdgpu_device *adev)
+{
+   struct psp_context *psp = >psp;
+   int ret = 0;
+
+   if (!amdgpu_sriov_vf(adev) && psp->funcs && 
psp->funcs->wait_for_bootloader != NULL)
+   ret = psp->funcs->wait_for_bootloader(psp);
+
+   return ret;
+}
+
 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 3384eb94fde0..3e67ed63e638 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
@@ -109,6 +109,7 @@ enum psp_reg_prog_id {
 
 struct psp_funcs {
int (*init_microcode)(struct psp_context *psp);
+   int (*wait_for_bootloader)(struct psp_context *psp);
int (*bootloader_load_kdb)(struct psp_context *psp);
int (*bootloader_load_spl)(struct psp_context *psp);
int (*bootloader_load_sysdrv)(struct psp_context *psp);
@@ -533,4 +534,6 @@ int psp_spatial_partition(struct psp_context *psp, int 
mode);
 
 int is_psp_fw_valid(struct psp_bin_desc bin);
 
+int amdgpu_psp_wait_for_bootloader(struct amdgpu_device *adev);
+
 #endif
-- 
2.25.1