diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1612-drm-amdgpu-add-new-ras-workflow-control-flags.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/1612-drm-amdgpu-add-new-ras-workflow-control-flags.patch | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1612-drm-amdgpu-add-new-ras-workflow-control-flags.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1612-drm-amdgpu-add-new-ras-workflow-control-flags.patch new file mode 100644 index 00000000..7c510ff3 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1612-drm-amdgpu-add-new-ras-workflow-control-flags.patch @@ -0,0 +1,127 @@ +From d87f5d13ea90dce1acc5aa8c727d0aa8c131852d Mon Sep 17 00:00:00 2001 +From: xinhui pan <xinhui.pan@amd.com> +Date: Mon, 11 Mar 2019 15:23:00 +0800 +Subject: [PATCH 1612/2940] 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: xinhui pan <xinhui.pan@amd.com> +Reviewed-by: Evan Quan <evan.quan@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 3 ++ + drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 34 +++++++++++++++++++++- + drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h | 3 ++ + 3 files changed, 39 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +index c9aed77f5ef4..ff6c00085616 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +@@ -2756,6 +2756,9 @@ int amdgpu_device_init(struct amdgpu_device *adev, + goto failed; + } + ++ /* must succeed. */ ++ amdgpu_ras_post_init(adev); ++ + return 0; + + failed: +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[] = { + #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) + { +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h +index 2b6077762b91..7a35316baab0 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h +@@ -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); + +-- +2.17.1 + |