drm/amdgpu: add new ras workflow control flags
authorxinhui pan <xinhui.pan@amd.com>
Mon, 11 Mar 2019 07:23:00 +0000 (15:23 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 19 Mar 2019 20:36:52 +0000 (15:36 -0500)
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: xinhui pan <xinhui.pan@amd.com>
Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h

index 8b3978a..69d74c0 100644 (file)
@@ -2707,6 +2707,9 @@ fence_driver_init:
                goto failed;
        }
 
+       /* must succeed. */
+       amdgpu_ras_post_init(adev);
+
        return 0;
 
 failed:
index 10ce40d..238b46c 100644 (file)
@@ -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 @@ recovery_out:
        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)
 {
index 2b60777..7a35316 100644 (file)
@@ -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);