summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
diff options
context:
space:
mode:
authoryipechai <YiPeng.Chai@amd.com>2022-01-30 17:03:32 +0800
committerAlex Deucher <alexander.deucher@amd.com>2022-02-14 15:08:40 -0500
commitbdb3489cfca16815e9a737359e9e90a4af5d0ff3 (patch)
tree47d9a52a063e953fe2cf39046e86ba248fe129b8 /drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
parent22b1df28c009aaf78e77b20a9cc8d8bf98e698c8 (diff)
drm/amdgpu: Optimize xxx_ras_late_init/xxx_ras_late_fini for each ras block
1. Define amdgpu_ras_block_late_init to create sysfs nodes and interrupt handles. 2. Define amdgpu_ras_block_late_fini to remove sysfs nodes and interrupt handles. 3. Replace ras block variable members in struct amdgpu_ras_block_object with struct ras_common_if, which can make it easy to associate each ras block instance with each ras block functional interface. 4. Add .ras_cb to struct amdgpu_ras_block_object. 5. Change each ras block to fit for the changement of struct amdgpu_ras_block_object. Signed-off-by: yipechai <YiPeng.Chai@amd.com> Reviewed-by: Tao Zhou <tao.zhou1@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
index a9c133a09be5..877b0e023648 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
@@ -877,7 +877,7 @@ static int amdgpu_ras_block_match_default(struct amdgpu_ras_block_object *block_
if (!block_obj)
return -EINVAL;
- if (block_obj->block == block)
+ if (block_obj->ras_comm.block == block)
return 0;
return -EINVAL;
@@ -2457,6 +2457,23 @@ interrupt:
return r;
}
+int amdgpu_ras_block_late_init(struct amdgpu_device *adev,
+ struct ras_common_if *ras_block)
+{
+ char sysfs_name[32];
+ struct ras_ih_if ih_info;
+ struct ras_fs_if fs_info;
+ struct amdgpu_ras_block_object *obj;
+
+ obj = container_of(ras_block, struct amdgpu_ras_block_object, ras_comm);
+ ih_info.cb = obj->ras_cb;
+ ih_info.head = *ras_block;
+ snprintf(sysfs_name, sizeof(sysfs_name), "%s_err_count", ras_block->name);
+ fs_info.sysfs_name = (const char *)sysfs_name;
+ fs_info.head = *ras_block;
+ return amdgpu_ras_late_init(adev, ras_block, &fs_info, &ih_info);
+}
+
/* helper function to remove ras fs node and interrupt handler */
void amdgpu_ras_late_fini(struct amdgpu_device *adev,
struct ras_common_if *ras_block,
@@ -2470,6 +2487,22 @@ void amdgpu_ras_late_fini(struct amdgpu_device *adev,
amdgpu_ras_interrupt_remove_handler(adev, ih_info);
}
+void amdgpu_ras_block_late_fini(struct amdgpu_device *adev,
+ struct ras_common_if *ras_block)
+{
+ struct ras_ih_if ih_info;
+ struct amdgpu_ras_block_object *obj;
+
+ if (!ras_block)
+ return;
+
+ obj = container_of(ras_block, struct amdgpu_ras_block_object, ras_comm);
+ ih_info.head = *ras_block;
+ ih_info.cb = obj->ras_cb;
+
+ amdgpu_ras_late_fini(adev, ras_block, &ih_info);
+}
+
/* do some init work after IP late init as dependence.
* and it runs in resume/gpu reset/booting up cases.
*/