Commit 2206daa1 authored by Tao Zhou's avatar Tao Zhou Committed by Alex Deucher
Browse files

drm/amdgpu: add a flag to indicate UMC channel index version



v1 (legacy way): store channel index within a UMC instance in eeprom
v2: store global channel index in eeprom

V2: only save the flag on eeprom, clear it after saving.

Signed-off-by: default avatarTao Zhou <tao.zhou1@amd.com>
Reviewed-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 71a0e963
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -841,7 +841,7 @@ int amdgpu_ras_eeprom_append(struct amdgpu_ras_eeprom_control *control,
			     const u32 num)
{
	struct amdgpu_device *adev = to_amdgpu_device(control);
	int res;
	int res, i;

	if (!__is_ras_eeprom_supported(adev))
		return 0;
@@ -855,6 +855,10 @@ int amdgpu_ras_eeprom_append(struct amdgpu_ras_eeprom_control *control,
		return -EINVAL;
	}

	/* set the new channel index flag */
	for (i = 0; i < num; i++)
		record[i].retired_page |= UMC_CHANNEL_IDX_V2;

	mutex_lock(&control->ras_tbl_mutex);

	res = amdgpu_ras_eeprom_append_table(control, record, num);
@@ -864,6 +868,11 @@ int amdgpu_ras_eeprom_append(struct amdgpu_ras_eeprom_control *control,
		amdgpu_ras_debugfs_set_ret_size(control);

	mutex_unlock(&control->ras_tbl_mutex);

	/* clear channel index flag, the flag is only saved on eeprom */
	for (i = 0; i < num; i++)
		record[i].retired_page &= ~UMC_CHANNEL_IDX_V2;

	return res;
}

+16 −0
Original line number Diff line number Diff line
@@ -54,6 +54,22 @@

/* Page retirement tag */
#define UMC_ECC_NEW_DETECTED_TAG       0x1
/*
 * a flag to indicate v2 of channel index stored in eeprom
 *
 * v1 (legacy way): store channel index within a umc instance in eeprom
 *    range in UMC v12: 0 ~ 7
 * v2: store global channel index in eeprom
 *    range in UMC v12: 0 ~ 127
 *
 * NOTE: it's better to store it in eeprom_table_record.mem_channel,
 * but there is only 8 bits in mem_channel, and the channel number may
 * increase in the future, we decide to save it in
 * eeprom_table_record.retired_page. retired_page is useless in v2,
 * we depend on eeprom_table_record.address instead of retired_page in v2.
 * Only 48 bits are saved on eeprom, use bit 47 here.
 */
#define UMC_CHANNEL_IDX_V2	BIT_ULL(47)

typedef int (*umc_func)(struct amdgpu_device *adev, uint32_t node_inst,
			uint32_t umc_inst, uint32_t ch_inst, void *data);