Commit f6cdcbd2 authored by Gangliang Xie's avatar Gangliang Xie Committed by Alex Deucher
Browse files

drm/amdgpu: add function to check if pmfw eeprom is supported



add function to check if pmfw is supported, skip eeprom
check and recover when pmfw eeprom is supported

Signed-off-by: default avatarGangliang Xie <ganglxie@amd.com>
Reviewed-by: default avatarTao Zhou <tao.zhou1@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent f5346a17
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -3767,6 +3767,8 @@ int amdgpu_ras_init_badpage_info(struct amdgpu_device *adev)
		return 0;

	control = &con->eeprom_control;
	con->ras_smu_drv = amdgpu_dpm_get_ras_smu_driver(adev);

	ret = amdgpu_ras_eeprom_init(control);
	control->is_eeprom_valid = !ret;

+44 −2
Original line number Diff line number Diff line
@@ -1546,7 +1546,8 @@ void amdgpu_ras_eeprom_check_and_recover(struct amdgpu_device *adev)
	struct amdgpu_ras_eeprom_control *control;
	int res;

	if (!__is_ras_eeprom_supported(adev) || !ras)
	if (!__is_ras_eeprom_supported(adev) || !ras ||
	    amdgpu_ras_smu_eeprom_supported(adev))
		return;
	control = &ras->eeprom_control;
	if (!control->is_eeprom_valid)
@@ -1567,3 +1568,44 @@ void amdgpu_ras_eeprom_check_and_recover(struct amdgpu_device *adev)
	}
	return;
}

static const struct ras_smu_drv *amdgpu_ras_get_smu_ras_drv(struct amdgpu_device *adev)
{
	struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);

	if (!ras)
		return NULL;

	return ras->ras_smu_drv;
}

static uint64_t amdgpu_ras_smu_get_feature_flags(struct amdgpu_device *adev)
{
	const struct ras_smu_drv *ras_smu_drv = amdgpu_ras_get_smu_ras_drv(adev);
	uint64_t flags = 0ULL;

	if (!ras_smu_drv)
		goto out;

	if (ras_smu_drv->ras_smu_feature_flags)
		ras_smu_drv->ras_smu_feature_flags(adev, &flags);

out:
	return flags;
}

bool amdgpu_ras_smu_eeprom_supported(struct amdgpu_device *adev)
{
	const struct ras_smu_drv *smu_ras_drv = amdgpu_ras_get_smu_ras_drv(adev);
	uint64_t flags = 0ULL;

	if (!__is_ras_eeprom_supported(adev) || !smu_ras_drv)
		return false;

	if (!smu_ras_drv->smu_eeprom_funcs)
		return false;

	flags = amdgpu_ras_smu_get_feature_flags(adev);

	return !!(flags & RAS_SMU_FEATURE_BIT__RAS_EEPROM);
}
+2 −0
Original line number Diff line number Diff line
@@ -163,6 +163,8 @@ int amdgpu_ras_eeprom_check(struct amdgpu_ras_eeprom_control *control);

void amdgpu_ras_eeprom_check_and_recover(struct amdgpu_device *adev);

bool amdgpu_ras_smu_eeprom_supported(struct amdgpu_device *adev);

extern const struct file_operations amdgpu_ras_debugfs_eeprom_size_ops;
extern const struct file_operations amdgpu_ras_debugfs_eeprom_table_ops;