Commit 108c6a63 authored by xinhui pan's avatar xinhui pan Committed by Alex Deucher

drm/amdgpu: add new ras workflow control flags

add ras post init function.
Do some initialization after all IP have finished their late init.

Add new member flags which will control the ras work flow.
For now, vbios enable ras for us on boot. That might change in the
future.
So there should be a flag from vbios to tell us if ras is enabled or not
on boot. Looks like there is no such info now.

Other bits of the flags are reserved to control other parts of ras.
Signed-off-by: default avatarxinhui pan <xinhui.pan@amd.com>
Reviewed-by: default avatarEvan Quan <evan.quan@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 5d0f903f
......@@ -2707,6 +2707,9 @@ int amdgpu_device_init(struct amdgpu_device *adev,
goto failed;
}
/* must succeed. */
amdgpu_ras_post_init(adev);
return 0;
failed:
......
......@@ -118,6 +118,11 @@ const char *ras_block_string[] = {
#define ras_err_str(i) (ras_error_string[ffs(i)])
#define ras_block_str(i) (ras_block_string[i])
enum amdgpu_ras_flags {
AMDGPU_RAS_FLAG_INIT_BY_VBIOS = 1,
};
#define RAS_DEFAULT_FLAGS (AMDGPU_RAS_FLAG_INIT_BY_VBIOS)
static void amdgpu_ras_self_test(struct amdgpu_device *adev)
{
/* TODO */
......@@ -1387,13 +1392,16 @@ int amdgpu_ras_init(struct amdgpu_device *adev)
&con->supported);
con->features = 0;
INIT_LIST_HEAD(&con->head);
/* Might need get this flag from vbios. */
con->flags = RAS_DEFAULT_FLAGS;
if (amdgpu_ras_recovery_init(adev))
goto recovery_out;
amdgpu_ras_mask &= AMDGPU_RAS_BLOCK_MASK;
amdgpu_ras_enable_all_features(adev, 1);
if (con->flags & AMDGPU_RAS_FLAG_INIT_BY_VBIOS)
amdgpu_ras_enable_all_features(adev, 1);
if (amdgpu_ras_fs_init(adev))
goto fs_out;
......@@ -1413,6 +1421,30 @@ int amdgpu_ras_init(struct amdgpu_device *adev)
return -EINVAL;
}
/* do some init work after IP late init as dependence */
void amdgpu_ras_post_init(struct amdgpu_device *adev)
{
struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
struct ras_manager *obj, *tmp;
if (!con)
return;
/* We enable ras on all hw_supported block, but as boot parameter might
* disable some of them and one or more IP has not implemented yet.
* So we disable them on behalf.
*/
if (con->flags & AMDGPU_RAS_FLAG_INIT_BY_VBIOS) {
list_for_each_entry_safe(obj, tmp, &con->head, node) {
if (!amdgpu_ras_is_supported(adev, obj->head.block)) {
amdgpu_ras_feature_enable(adev, &obj->head, 0);
/* there should be no any reference. */
WARN_ON(alive_obj(obj));
}
};
}
}
/* do some fini work before IP fini as dependence */
int amdgpu_ras_pre_fini(struct amdgpu_device *adev)
{
......
......@@ -103,6 +103,8 @@ struct amdgpu_ras {
/* error handler data */
struct ras_err_handler_data *eh_data;
struct mutex recovery_lock;
uint32_t flags;
};
/* interfaces for IP */
......@@ -197,6 +199,7 @@ static inline int amdgpu_ras_reset_gpu(struct amdgpu_device *adev,
/* called in ip_init and ip_fini */
int amdgpu_ras_init(struct amdgpu_device *adev);
void amdgpu_ras_post_init(struct amdgpu_device *adev);
int amdgpu_ras_fini(struct amdgpu_device *adev);
int amdgpu_ras_pre_fini(struct amdgpu_device *adev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment