Skip to content

Commit

Permalink
drm/amdgpu: add a flag to indicate UMC channel index version
Browse files Browse the repository at this point in the history
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: Tao Zhou <tao.zhou1@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
  • Loading branch information
Tao Zhou authored and Alex Deucher committed Dec 10, 2024
1 parent 71a0e96 commit 2206daa
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 1 deletion.
11 changes: 10 additions & 1 deletion drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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;
}

Expand Down
16 changes: 16 additions & 0 deletions drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 2206daa

Please sign in to comment.