diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c index 10ce40d2c040..238b46c304cc 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | |||
@@ -118,6 +118,11 @@ const char *ras_block_string[] = { | |||
118 | #define ras_err_str(i) (ras_error_string[ffs(i)]) | 118 | #define ras_err_str(i) (ras_error_string[ffs(i)]) |
119 | #define ras_block_str(i) (ras_block_string[i]) | 119 | #define ras_block_str(i) (ras_block_string[i]) |
120 | 120 | ||
121 | enum amdgpu_ras_flags { | ||
122 | AMDGPU_RAS_FLAG_INIT_BY_VBIOS = 1, | ||
123 | }; | ||
124 | #define RAS_DEFAULT_FLAGS (AMDGPU_RAS_FLAG_INIT_BY_VBIOS) | ||
125 | |||
121 | static void amdgpu_ras_self_test(struct amdgpu_device *adev) | 126 | static void amdgpu_ras_self_test(struct amdgpu_device *adev) |
122 | { | 127 | { |
123 | /* TODO */ | 128 | /* TODO */ |
@@ -1387,13 +1392,16 @@ int amdgpu_ras_init(struct amdgpu_device *adev) | |||
1387 | &con->supported); | 1392 | &con->supported); |
1388 | con->features = 0; | 1393 | con->features = 0; |
1389 | INIT_LIST_HEAD(&con->head); | 1394 | INIT_LIST_HEAD(&con->head); |
1395 | /* Might need get this flag from vbios. */ | ||
1396 | con->flags = RAS_DEFAULT_FLAGS; | ||
1390 | 1397 | ||
1391 | if (amdgpu_ras_recovery_init(adev)) | 1398 | if (amdgpu_ras_recovery_init(adev)) |
1392 | goto recovery_out; | 1399 | goto recovery_out; |
1393 | 1400 | ||
1394 | amdgpu_ras_mask &= AMDGPU_RAS_BLOCK_MASK; | 1401 | amdgpu_ras_mask &= AMDGPU_RAS_BLOCK_MASK; |
1395 | 1402 | ||
1396 | amdgpu_ras_enable_all_features(adev, 1); | 1403 | if (con->flags & AMDGPU_RAS_FLAG_INIT_BY_VBIOS) |
1404 | amdgpu_ras_enable_all_features(adev, 1); | ||
1397 | 1405 | ||
1398 | if (amdgpu_ras_fs_init(adev)) | 1406 | if (amdgpu_ras_fs_init(adev)) |
1399 | goto fs_out; | 1407 | goto fs_out; |
@@ -1413,6 +1421,30 @@ recovery_out: | |||
1413 | return -EINVAL; | 1421 | return -EINVAL; |
1414 | } | 1422 | } |
1415 | 1423 | ||
1424 | /* do some init work after IP late init as dependence */ | ||
1425 | void amdgpu_ras_post_init(struct amdgpu_device *adev) | ||
1426 | { | ||
1427 | struct amdgpu_ras *con = amdgpu_ras_get_context(adev); | ||
1428 | struct ras_manager *obj, *tmp; | ||
1429 | |||
1430 | if (!con) | ||
1431 | return; | ||
1432 | |||
1433 | /* We enable ras on all hw_supported block, but as boot parameter might | ||
1434 | * disable some of them and one or more IP has not implemented yet. | ||
1435 | * So we disable them on behalf. | ||
1436 | */ | ||
1437 | if (con->flags & AMDGPU_RAS_FLAG_INIT_BY_VBIOS) { | ||
1438 | list_for_each_entry_safe(obj, tmp, &con->head, node) { | ||
1439 | if (!amdgpu_ras_is_supported(adev, obj->head.block)) { | ||
1440 | amdgpu_ras_feature_enable(adev, &obj->head, 0); | ||
1441 | /* there should be no any reference. */ | ||
1442 | WARN_ON(alive_obj(obj)); | ||
1443 | } | ||
1444 | }; | ||
1445 | } | ||
1446 | } | ||
1447 | |||
1416 | /* do some fini work before IP fini as dependence */ | 1448 | /* do some fini work before IP fini as dependence */ |
1417 | int amdgpu_ras_pre_fini(struct amdgpu_device *adev) | 1449 | int amdgpu_ras_pre_fini(struct amdgpu_device *adev) |
1418 | { | 1450 | { |