Commit bdb3489c authored by yipechai's avatar yipechai Committed by Alex Deucher
Browse files

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: default avataryipechai <YiPeng.Chai@amd.com>
Reviewed-by: default avatarTao Zhou <tao.zhou1@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 22b1df28
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -83,14 +83,15 @@ int amdgpu_mca_ras_late_init(struct amdgpu_device *adev,
		.sysfs_name = sysfs_name,
	};

	snprintf(sysfs_name, sizeof(sysfs_name), "%s_err_count", mca_dev->ras->ras_block.name);
	snprintf(sysfs_name, sizeof(sysfs_name), "%s_err_count",
		mca_dev->ras->ras_block.ras_comm.name);

	if (!mca_dev->ras_if) {
		mca_dev->ras_if = kmalloc(sizeof(struct ras_common_if), GFP_KERNEL);
		if (!mca_dev->ras_if)
			return -ENOMEM;
		mca_dev->ras_if->block = mca_dev->ras->ras_block.block;
		mca_dev->ras_if->sub_block_index = mca_dev->ras->ras_block.sub_block_index;
		mca_dev->ras_if->block = mca_dev->ras->ras_block.ras_comm.block;
		mca_dev->ras_if->sub_block_index = mca_dev->ras->ras_block.ras_comm.sub_block_index;
		mca_dev->ras_if->type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
	}
	ih_info.head = fs_info.head = *mca_dev->ras_if;
+34 −1
Original line number Diff line number Diff line
@@ -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 @@ int amdgpu_ras_late_init(struct amdgpu_device *adev,
	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.
 */
+9 −6
Original line number Diff line number Diff line
@@ -486,17 +486,13 @@ struct ras_debug_if {
};

struct amdgpu_ras_block_object {
	/* block name */
	char name[32];

	enum amdgpu_ras_block block;

	uint32_t sub_block_index;
	struct ras_common_if  ras_comm;

	int (*ras_block_match)(struct amdgpu_ras_block_object *block_obj,
				enum amdgpu_ras_block block, uint32_t sub_block_index);
	int (*ras_late_init)(struct amdgpu_device *adev, void *ras_info);
	void (*ras_fini)(struct amdgpu_device *adev);
	ras_ih_cb ras_cb;
	const struct amdgpu_ras_block_hw_ops *hw_ops;
};

@@ -605,10 +601,17 @@ int amdgpu_ras_late_init(struct amdgpu_device *adev,
			 struct ras_common_if *ras_block,
			 struct ras_fs_if *fs_info,
			 struct ras_ih_if *ih_info);

int amdgpu_ras_block_late_init(struct amdgpu_device *adev,
			struct ras_common_if *ras_block);

void amdgpu_ras_late_fini(struct amdgpu_device *adev,
			  struct ras_common_if *ras_block,
			  struct ras_ih_if *ih_info);

void amdgpu_ras_block_late_fini(struct amdgpu_device *adev,
			  struct ras_common_if *ras_block);

int amdgpu_ras_feature_enable(struct amdgpu_device *adev,
		struct ras_common_if *head, bool enable);

+4 −2
Original line number Diff line number Diff line
@@ -981,8 +981,10 @@ struct amdgpu_ras_block_hw_ops xgmi_ras_hw_ops = {

struct amdgpu_xgmi_ras xgmi_ras = {
	.ras_block = {
		.ras_comm = {
			.name = "xgmi",
			.block = AMDGPU_RAS_BLOCK__XGMI_WAFL,
		},
		.hw_ops = &xgmi_ras_hw_ops,
		.ras_late_init = amdgpu_xgmi_ras_late_init,
		.ras_fini = amdgpu_xgmi_ras_fini,
+2 −2
Original line number Diff line number Diff line
@@ -2195,8 +2195,8 @@ static int gfx_v9_0_gpu_early_init(struct amdgpu_device *adev)
			return err;
		}

		strcpy(adev->gfx.ras->ras_block.name,"gfx");
		adev->gfx.ras->ras_block.block = AMDGPU_RAS_BLOCK__GFX;
		strcpy(adev->gfx.ras->ras_block.ras_comm.name, "gfx");
		adev->gfx.ras->ras_block.ras_comm.block = AMDGPU_RAS_BLOCK__GFX;

		/* If not define special ras_late_init function, use gfx default ras_late_init */
		if (!adev->gfx.ras->ras_block.ras_late_init)
Loading