Commit 1f06e7f3 authored by Tao Zhou's avatar Tao Zhou Committed by Alex Deucher
Browse files

drm/amdgpu: split ras_eeprom_init into init and check functions



Init function is for ras table header read and check function is
responsible for the validation of the header. Call them in different
stages.

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 ea5d4934
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -3015,9 +3015,20 @@ static int amdgpu_ras_load_bad_pages(struct amdgpu_device *adev)
				control->rec_type = AMDGPU_RAS_EEPROM_REC_MCA;
		}

		ret = amdgpu_ras_eeprom_check(control);
		if (ret)
			goto out;

		/* HW not usable */
		if (amdgpu_ras_is_rma(adev)) {
			ret = -EHWPOISON;
			goto out;
		}

		ret = amdgpu_ras_add_bad_pages(adev, bps, control->ras_num_recs, true);
	}

out:
	kfree(bps);
	return ret;
}
@@ -3408,10 +3419,6 @@ int amdgpu_ras_init_badpage_info(struct amdgpu_device *adev)
	if (ret)
		return ret;

	/* HW not usable */
	if (amdgpu_ras_is_rma(adev))
		return -EHWPOISON;

	if (!adev->umc.ras || !adev->umc.ras->convert_ras_err_addr)
		control->rec_type = AMDGPU_RAS_EEPROM_REC_PA;

+20 −0
Original line number Diff line number Diff line
@@ -1382,6 +1382,26 @@ int amdgpu_ras_eeprom_init(struct amdgpu_ras_eeprom_control *control)
	}
	control->ras_fri = RAS_OFFSET_TO_INDEX(control, hdr->first_rec_offset);

	return res < 0 ? res : 0;
}

int amdgpu_ras_eeprom_check(struct amdgpu_ras_eeprom_control *control)
{
	struct amdgpu_device *adev = to_amdgpu_device(control);
	struct amdgpu_ras_eeprom_table_header *hdr = &control->tbl_hdr;
	struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);
	int res;

	if (!__is_ras_eeprom_supported(adev))
		return 0;

	/* Verify i2c adapter is initialized */
	if (!adev->pm.ras_eeprom_i2c_bus || !adev->pm.ras_eeprom_i2c_bus->algo)
		return -ENOENT;

	if (!__get_eeprom_i2c_addr(adev, control))
		return -EINVAL;

	if (hdr->header == RAS_TABLE_HDR_VAL) {
		DRM_DEBUG_DRIVER("Found existing EEPROM table with %d records",
				 control->ras_num_recs);
+2 −0
Original line number Diff line number Diff line
@@ -159,6 +159,8 @@ uint32_t amdgpu_ras_eeprom_max_record_count(struct amdgpu_ras_eeprom_control *co

void amdgpu_ras_debugfs_set_ret_size(struct amdgpu_ras_eeprom_control *control);

int amdgpu_ras_eeprom_check(struct amdgpu_ras_eeprom_control *control);

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