[PATCH] drm/amdgpu: Fix GPU reset error.
Alex Deucher
alexdeucher at gmail.com
Wed Mar 4 21:54:50 UTC 2020
On Wed, Mar 4, 2020 at 4:45 PM Andrey Grodzovsky
<andrey.grodzovsky at amd.com> wrote:
>
> Problem:
> During GU reset PSP's sysfs was being wrongly reinitialized
> during call to amdgpu_device_ip_late_init which was failing
> with duplicate error.
> Fix:
> Move psp_sysfs_init to psp_sw_init to avoid this. Add guards
> in sysfs file's read and write hooks agains premature call
> if PSP is not finished initialization.
>
> Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky at amd.com>
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 28 +++++++++++++++++-----------
> 1 file changed, 17 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> index 3836acc..6d9b05e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> @@ -117,16 +117,6 @@ static int psp_early_init(void *handle)
> return 0;
> }
>
> -static int psp_late_init(void *handle)
> -{
> - struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> -
> - if (adev->asic_type == CHIP_NAVI10)
> - return psp_sysfs_init(adev);
> -
> - return 0;
> -}
> -
> static int psp_sw_init(void *handle)
> {
> struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> @@ -150,6 +140,13 @@ static int psp_sw_init(void *handle)
> return ret;
> }
>
> + if (adev->asic_type == CHIP_NAVI10) {
> + ret= psp_sysfs_init(adev);
> + if (ret) {
> + return ret;
> + }
> + }
> +
> return 0;
> }
>
> @@ -1843,6 +1840,11 @@ static ssize_t psp_usbc_pd_fw_sysfs_read(struct device *dev,
> uint32_t fw_ver;
> int ret;
>
> + if (!adev->ip_blocks[AMD_IP_BLOCK_TYPE_PSP].status.late_initialized) {
> + DRM_INFO("PSP block is not ready yet.");
> + return -EBUSY;
> + }
> +
> mutex_lock(&adev->psp.mutex);
> ret = psp_read_usbc_pd_fw(&adev->psp, &fw_ver);
> mutex_unlock(&adev->psp.mutex);
> @@ -1868,6 +1870,10 @@ static ssize_t psp_usbc_pd_fw_sysfs_write(struct device *dev,
> char fw_name[100];
> const struct firmware *usbc_pd_fw;
>
> + if (!adev->ip_blocks[AMD_IP_BLOCK_TYPE_PSP].status.late_initialized) {
> + DRM_INFO("PSP block is not ready yet.");
> + return -EBUSY;
> + }
>
> snprintf(fw_name, sizeof(fw_name), "amdgpu/%s", buf);
> ret = request_firmware(&usbc_pd_fw, fw_name, adev->dev);
> @@ -1919,7 +1925,7 @@ static DEVICE_ATTR(usbc_pd_fw, S_IRUGO | S_IWUSR,
> const struct amd_ip_funcs psp_ip_funcs = {
> .name = "psp",
> .early_init = psp_early_init,
> - .late_init = psp_late_init,
> + .late_init = NULL,
> .sw_init = psp_sw_init,
> .sw_fini = psp_sw_fini,
> .hw_init = psp_hw_init,
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list