Commit 90f88cdd authored by Andrey Grodzovsky's avatar Andrey Grodzovsky Committed by Alex Deucher

drm/amdgpu: Fix GPU reset error.

Problem:
During GU reset PSP's sysfs was being wrongly reinitilized
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 hook agains premature call
if PSP is not finished initialization.
Signed-off-by: default avatarAndrey Grodzovsky <andrey.grodzovsky@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 5e208eb6
...@@ -117,16 +117,6 @@ static int psp_early_init(void *handle) ...@@ -117,16 +117,6 @@ static int psp_early_init(void *handle)
return 0; 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) static int psp_sw_init(void *handle)
{ {
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
...@@ -150,6 +140,13 @@ static int psp_sw_init(void *handle) ...@@ -150,6 +140,13 @@ static int psp_sw_init(void *handle)
return ret; return ret;
} }
if (adev->asic_type == CHIP_NAVI10) {
ret= psp_sysfs_init(adev);
if (ret) {
return ret;
}
}
return 0; return 0;
} }
...@@ -1843,6 +1840,11 @@ static ssize_t psp_usbc_pd_fw_sysfs_read(struct device *dev, ...@@ -1843,6 +1840,11 @@ static ssize_t psp_usbc_pd_fw_sysfs_read(struct device *dev,
uint32_t fw_ver; uint32_t fw_ver;
int ret; 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); mutex_lock(&adev->psp.mutex);
ret = psp_read_usbc_pd_fw(&adev->psp, &fw_ver); ret = psp_read_usbc_pd_fw(&adev->psp, &fw_ver);
mutex_unlock(&adev->psp.mutex); mutex_unlock(&adev->psp.mutex);
...@@ -1868,6 +1870,10 @@ static ssize_t psp_usbc_pd_fw_sysfs_write(struct device *dev, ...@@ -1868,6 +1870,10 @@ static ssize_t psp_usbc_pd_fw_sysfs_write(struct device *dev,
char fw_name[100]; char fw_name[100];
const struct firmware *usbc_pd_fw; 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); snprintf(fw_name, sizeof(fw_name), "amdgpu/%s", buf);
ret = request_firmware(&usbc_pd_fw, fw_name, adev->dev); ret = request_firmware(&usbc_pd_fw, fw_name, adev->dev);
...@@ -1919,7 +1925,7 @@ static DEVICE_ATTR(usbc_pd_fw, S_IRUGO | S_IWUSR, ...@@ -1919,7 +1925,7 @@ static DEVICE_ATTR(usbc_pd_fw, S_IRUGO | S_IWUSR,
const struct amd_ip_funcs psp_ip_funcs = { const struct amd_ip_funcs psp_ip_funcs = {
.name = "psp", .name = "psp",
.early_init = psp_early_init, .early_init = psp_early_init,
.late_init = psp_late_init, .late_init = NULL,
.sw_init = psp_sw_init, .sw_init = psp_sw_init,
.sw_fini = psp_sw_fini, .sw_fini = psp_sw_fini,
.hw_init = psp_hw_init, .hw_init = psp_hw_init,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment