[PATCH V2] drm/amdgpu: Move common initialization operations of each ras block to one function
Zhou1, Tao
Tao.Zhou1 at amd.com
Tue Mar 8 07:00:41 UTC 2022
[AMD Official Use Only]
> -----Original Message-----
> From: Chai, Thomas <YiPeng.Chai at amd.com>
> Sent: Monday, March 7, 2022 4:43 PM
> To: amd-gfx at lists.freedesktop.org
> Cc: Chai, Thomas <YiPeng.Chai at amd.com>; Zhang, Hawking
> <Hawking.Zhang at amd.com>; Zhou1, Tao <Tao.Zhou1 at amd.com>; Clements,
> John <John.Clements at amd.com>; Chai, Thomas <YiPeng.Chai at amd.com>
> Subject: [PATCH V2] drm/amdgpu: Move common initialization operations of
> each ras block to one function
>
> Define amdgpu_ras_sw_init function to initialize all ras blocks.
>
> V2: Modify error debugging information.
>
> Signed-off-by: yipechai <YiPeng.Chai at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 6 +
> drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 2 -
> drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 143 ++++++++++++++++++++-
> drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h | 1 +
> drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 21 ---
> drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c | 16 ---
> drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 28 ----
> drivers/gpu/drm/amd/amdgpu/mca_v3_0.c | 6 -
> drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 17 ---
> 9 files changed, 148 insertions(+), 92 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 6113ddc765a7..0c83eb69dad5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -2402,6 +2402,12 @@ static int amdgpu_device_ip_init(struct
> amdgpu_device *adev)
> }
> }
>
> + r = amdgpu_ras_sw_init(adev);
> + if (r) {
> + DRM_ERROR("amdgpu_ras_sw_init failed (%d).\n", r);
> + goto init_failed;
> + }
> +
> if (amdgpu_sriov_vf(adev))
> amdgpu_virt_init_data_exchange(adev);
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> index ab75e189bc0b..544241f357b2 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> @@ -440,8 +440,6 @@ int amdgpu_gmc_ras_early_init(struct amdgpu_device
> *adev) {
> if (!adev->gmc.xgmi.connected_to_cpu) {
> adev->gmc.xgmi.ras = &xgmi_ras;
> - amdgpu_ras_register_ras_block(adev, &adev->gmc.xgmi.ras-
> >ras_block);
> - adev->gmc.xgmi.ras_if = &adev->gmc.xgmi.ras-
> >ras_block.ras_comm;
> }
>
> return 0;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
> index d3875618ebf5..89075ab9e82e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
> @@ -2299,8 +2299,6 @@ int amdgpu_ras_init(struct amdgpu_device *adev)
> case CHIP_ALDEBARAN:
> if (!adev->gmc.xgmi.connected_to_cpu) {
> adev->nbio.ras = &nbio_v7_4_ras;
> - amdgpu_ras_register_ras_block(adev, &adev-
> >nbio.ras->ras_block);
> - adev->nbio.ras_if = &adev->nbio.ras-
> >ras_block.ras_comm;
> }
> break;
> default:
> @@ -2533,6 +2531,147 @@ void amdgpu_ras_suspend(struct amdgpu_device
> *adev)
> amdgpu_ras_disable_all_features(adev, 1); }
>
> +int amdgpu_ras_sw_init(struct amdgpu_device *adev) {
> + int err = 0;
> +
> + if (!amdgpu_ras_asic_supported(adev))
> + return 0;
> +
> + if (adev->nbio.ras) {
> + err = amdgpu_ras_register_ras_block(adev, &adev->nbio.ras-
> >ras_block);
> + if (err) {
> + dev_err(adev->dev, "Failed to register nbio ras
> block!\n");
> + return err;
> + }
> + adev->nbio.ras_if = &adev->nbio.ras->ras_block.ras_comm;
> + }
> +
> + if (adev->gmc.xgmi.ras) {
> + err = amdgpu_ras_register_ras_block(adev, &adev-
> >gmc.xgmi.ras->ras_block);
> + if (err) {
> + dev_err(adev->dev, "Failed to register xgmi ras
> block!\n");
> + return err;
> + }
> + adev->gmc.xgmi.ras_if = &adev->gmc.xgmi.ras-
> >ras_block.ras_comm;
> + }
> +
> + if (adev->gfx.ras) {
> + err = amdgpu_ras_register_ras_block(adev, &adev->gfx.ras-
> >ras_block);
> + if (err) {
> + dev_err(adev->dev, "Failed to register gfx ras block!\n");
> + return err;
> + }
> +
> + strcpy(adev->gfx.ras->ras_block.ras_comm.name, "gfx");
> + adev->gfx.ras->ras_block.ras_comm.block =
> AMDGPU_RAS_BLOCK__GFX;
> + adev->gfx.ras->ras_block.ras_comm.type =
> AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
> + adev->gfx.ras_if = &adev->gfx.ras->ras_block.ras_comm;
> +
> + /* If not define special ras_late_init function, use gfx default
> ras_late_init */
> + if (!adev->gfx.ras->ras_block.ras_late_init)
> + adev->gfx.ras->ras_block.ras_late_init =
> amdgpu_gfx_ras_late_init;
> +
> + /* If not defined special ras_cb function, use default ras_cb */
> + if (!adev->gfx.ras->ras_block.ras_cb)
> + adev->gfx.ras->ras_block.ras_cb =
> amdgpu_gfx_process_ras_data_cb;
> + }
> +
> + if (adev->umc.ras) {
> + err = amdgpu_ras_register_ras_block(adev, &adev->umc.ras-
> >ras_block);
> + if (err) {
> + dev_err(adev->dev, "Failed to register umc ras
> block!\n");
> + return err;
> + }
> +
> + strcpy(adev->umc.ras->ras_block.ras_comm.name, "umc");
> + adev->umc.ras->ras_block.ras_comm.block =
> AMDGPU_RAS_BLOCK__UMC;
> + adev->umc.ras->ras_block.ras_comm.type =
> AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
> + adev->umc.ras_if = &adev->umc.ras->ras_block.ras_comm;
> +
> + /* If don't define special ras_late_init function, use default
> ras_late_init */
> + if (!adev->umc.ras->ras_block.ras_late_init)
> + adev->umc.ras->ras_block.ras_late_init =
> amdgpu_umc_ras_late_init;
> +
> + /* If not defined special ras_cb function, use default ras_cb */
> + if (!adev->umc.ras->ras_block.ras_cb)
> + adev->umc.ras->ras_block.ras_cb =
> amdgpu_umc_process_ras_data_cb;
> + }
> +
> + if (adev->mmhub.ras) {
> + err = amdgpu_ras_register_ras_block(adev, &adev-
> >mmhub.ras->ras_block);
> + if (err) {
> + dev_err(adev->dev, "Failed to register mmhub ras
> block!\n");
> + return err;
> + }
> +
> + strcpy(adev->mmhub.ras->ras_block.ras_comm.name,
> "mmhub");
> + adev->mmhub.ras->ras_block.ras_comm.block =
> AMDGPU_RAS_BLOCK__MMHUB;
> + adev->mmhub.ras->ras_block.ras_comm.type =
> AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
> + adev->mmhub.ras_if = &adev->mmhub.ras-
> >ras_block.ras_comm;
> + }
> +
> + if (adev->hdp.ras) {
> + err = amdgpu_ras_register_ras_block(adev, &adev->hdp.ras-
> >ras_block);
> + if (err) {
> + dev_err(adev->dev, "Failed to register hdp ras
> block!\n");
> + return err;
> + }
> +
> + adev->hdp.ras_if = &adev->hdp.ras->ras_block.ras_comm;
> + }
> +
> + if (adev->mca.mp0.ras) {
> + err = amdgpu_ras_register_ras_block(adev, &adev-
> >mca.mp0.ras->ras_block);
> + if (err) {
> + dev_err(adev->dev, "Failed to register mca mp0 ras
> block!\n");
> + return err;
> + }
> + adev->mca.mp0.ras_if = &adev->mca.mp0.ras-
> >ras_block.ras_comm;
> + }
> +
> + if (adev->mca.mp1.ras) {
> + err = amdgpu_ras_register_ras_block(adev, &adev-
> >mca.mp1.ras->ras_block);
> + if (err) {
> + dev_err(adev->dev, "Failed to register mca mp1 ras
> block!\n");
> + return err;
> + }
> + adev->mca.mp1.ras_if = &adev->mca.mp1.ras-
> >ras_block.ras_comm;
> + }
> +
> + if (adev->mca.mpio.ras) {
> + err = amdgpu_ras_register_ras_block(adev, &adev-
> >mca.mpio.ras->ras_block);
> + if (err) {
> + dev_err(adev->dev, "Failed to register mca mpio ras
> block!\n");
> + return err;
> + }
> + adev->mca.mpio.ras_if = &adev->mca.mpio.ras-
> >ras_block.ras_comm;
> + }
> +
> + if (adev->sdma.ras) {
> + err = amdgpu_ras_register_ras_block(adev, &adev->sdma.ras-
> >ras_block);
> + if (err) {
> + dev_err(adev->dev, "Failed to register sdma ras
[Tao]: do we need to unregister ras_block and deinitialize ras_if for previous RAS blocks?
> block!\n");
> + return err;
> + }
> +
> + strcpy(adev->sdma.ras->ras_block.ras_comm.name, "sdma");
> + adev->sdma.ras->ras_block.ras_comm.block =
> AMDGPU_RAS_BLOCK__SDMA;
> + adev->sdma.ras->ras_block.ras_comm.type =
> AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
> + adev->sdma.ras_if = &adev->sdma.ras->ras_block.ras_comm;
> +
> + /* If don't define special ras_late_init function, use default
> ras_late_init */
> + if (!adev->sdma.ras->ras_block.ras_late_init)
> + adev->sdma.ras->ras_block.ras_late_init =
> amdgpu_sdma_ras_late_init;
> +
> + /* If not defined special ras_cb function, use default ras_cb */
> + if (!adev->sdma.ras->ras_block.ras_cb)
> + adev->sdma.ras->ras_block.ras_cb =
> amdgpu_sdma_process_ras_data_cb;
> + }
> +
> + return 0;
> +}
> +
> int amdgpu_ras_late_init(struct amdgpu_device *adev) {
> struct amdgpu_ras_block_list *node, *tmp; diff --git
> a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
> index 7cddaad90d6d..fc5ed6c47443 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
> @@ -595,6 +595,7 @@ amdgpu_ras_error_to_ta(enum
> amdgpu_ras_error_type error) {
>
> /* called in ip_init and ip_fini */
> int amdgpu_ras_init(struct amdgpu_device *adev);
> +int amdgpu_ras_sw_init(struct amdgpu_device *adev);
> int amdgpu_ras_late_init(struct amdgpu_device *adev); int
> amdgpu_ras_fini(struct amdgpu_device *adev); int amdgpu_ras_pre_fini(struct
> amdgpu_device *adev); diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> index 8def7f630d4c..e26fc2ae98e1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> @@ -2188,27 +2188,6 @@ static int gfx_v9_0_gpu_early_init(struct
> amdgpu_device *adev)
> break;
> }
>
> - if (adev->gfx.ras) {
> - err = amdgpu_ras_register_ras_block(adev, &adev->gfx.ras-
> >ras_block);
> - if (err) {
> - DRM_ERROR("Failed to register gfx ras block!\n");
> - return err;
> - }
> -
> - strcpy(adev->gfx.ras->ras_block.ras_comm.name, "gfx");
> - adev->gfx.ras->ras_block.ras_comm.block =
> AMDGPU_RAS_BLOCK__GFX;
> - adev->gfx.ras->ras_block.ras_comm.type =
> AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
> - adev->gfx.ras_if = &adev->gfx.ras->ras_block.ras_comm;
> -
> - /* If not define special ras_late_init function, use gfx default
> ras_late_init */
> - if (!adev->gfx.ras->ras_block.ras_late_init)
> - adev->gfx.ras->ras_block.ras_late_init =
> amdgpu_gfx_ras_late_init;
> -
> - /* If not defined special ras_cb function, use default ras_cb */
> - if (!adev->gfx.ras->ras_block.ras_cb)
> - adev->gfx.ras->ras_block.ras_cb =
> amdgpu_gfx_process_ras_data_cb;
> - }
> -
> adev->gfx.config.gb_addr_config = gb_addr_config;
>
> adev->gfx.config.gb_addr_config_fields.num_pipes = 1 << diff --git
> a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> index d9353bb99314..5046be86702f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> @@ -669,22 +669,6 @@ static void gmc_v10_0_set_umc_funcs(struct
> amdgpu_device *adev)
> default:
> break;
> }
> - if (adev->umc.ras) {
> - amdgpu_ras_register_ras_block(adev, &adev->umc.ras-
> >ras_block);
> -
> - strcpy(adev->umc.ras->ras_block.ras_comm.name, "umc");
> - adev->umc.ras->ras_block.ras_comm.block =
> AMDGPU_RAS_BLOCK__UMC;
> - adev->umc.ras->ras_block.ras_comm.type =
> AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
> - adev->umc.ras_if = &adev->umc.ras->ras_block.ras_comm;
> -
> - /* If don't define special ras_late_init function, use default
> ras_late_init */
> - if (!adev->umc.ras->ras_block.ras_late_init)
> - adev->umc.ras->ras_block.ras_late_init =
> amdgpu_umc_ras_late_init;
> -
> - /* If not defined special ras_cb function, use default ras_cb */
> - if (!adev->umc.ras->ras_block.ras_cb)
> - adev->umc.ras->ras_block.ras_cb =
> amdgpu_umc_process_ras_data_cb;
> - }
> }
>
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> index 4c3483fbe613..8f6aefb9be08 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> @@ -1228,23 +1228,6 @@ static void gmc_v9_0_set_umc_funcs(struct
> amdgpu_device *adev)
> default:
> break;
> }
> -
> - if (adev->umc.ras) {
> - amdgpu_ras_register_ras_block(adev, &adev->umc.ras-
> >ras_block);
> -
> - strcpy(adev->umc.ras->ras_block.ras_comm.name, "umc");
> - adev->umc.ras->ras_block.ras_comm.block =
> AMDGPU_RAS_BLOCK__UMC;
> - adev->umc.ras->ras_block.ras_comm.type =
> AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
> - adev->umc.ras_if = &adev->umc.ras->ras_block.ras_comm;
> -
> - /* If don't define special ras_late_init function, use default
> ras_late_init */
> - if (!adev->umc.ras->ras_block.ras_late_init)
> - adev->umc.ras->ras_block.ras_late_init =
> amdgpu_umc_ras_late_init;
> -
> - /* If not defined special ras_cb function, use default ras_cb */
> - if (!adev->umc.ras->ras_block.ras_cb)
> - adev->umc.ras->ras_block.ras_cb =
> amdgpu_umc_process_ras_data_cb;
> - }
> }
>
> static void gmc_v9_0_set_mmhub_funcs(struct amdgpu_device *adev) @@ -
> 1278,15 +1261,6 @@ static void gmc_v9_0_set_mmhub_ras_funcs(struct
> amdgpu_device *adev)
> /* mmhub ras is not available */
> break;
> }
> -
> - if (adev->mmhub.ras) {
> - amdgpu_ras_register_ras_block(adev, &adev->mmhub.ras-
> >ras_block);
> -
> - strcpy(adev->mmhub.ras->ras_block.ras_comm.name,
> "mmhub");
> - adev->mmhub.ras->ras_block.ras_comm.block =
> AMDGPU_RAS_BLOCK__MMHUB;
> - adev->mmhub.ras->ras_block.ras_comm.type =
> AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
> - adev->mmhub.ras_if = &adev->mmhub.ras-
> >ras_block.ras_comm;
> - }
> }
>
> static void gmc_v9_0_set_gfxhub_funcs(struct amdgpu_device *adev) @@ -
> 1297,8 +1271,6 @@ static void gmc_v9_0_set_gfxhub_funcs(struct
> amdgpu_device *adev) static void gmc_v9_0_set_hdp_ras_funcs(struct
> amdgpu_device *adev) {
> adev->hdp.ras = &hdp_v4_0_ras;
> - amdgpu_ras_register_ras_block(adev, &adev->hdp.ras->ras_block);
> - adev->hdp.ras_if = &adev->hdp.ras->ras_block.ras_comm;
> }
>
> static void gmc_v9_0_set_mca_funcs(struct amdgpu_device *adev) diff --git
> a/drivers/gpu/drm/amd/amdgpu/mca_v3_0.c
> b/drivers/gpu/drm/amd/amdgpu/mca_v3_0.c
> index d4bd7d1d2649..3d2b974f6e0f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/mca_v3_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/mca_v3_0.c
> @@ -129,12 +129,6 @@ static void mca_v3_0_init(struct amdgpu_device *adev)
> mca->mp0.ras = &mca_v3_0_mp0_ras;
> mca->mp1.ras = &mca_v3_0_mp1_ras;
> mca->mpio.ras = &mca_v3_0_mpio_ras;
> - amdgpu_ras_register_ras_block(adev, &mca->mp0.ras->ras_block);
> - amdgpu_ras_register_ras_block(adev, &mca->mp1.ras->ras_block);
> - amdgpu_ras_register_ras_block(adev, &mca->mpio.ras->ras_block);
> - mca->mp0.ras_if = &mca->mp0.ras->ras_block.ras_comm;
> - mca->mp1.ras_if = &mca->mp1.ras->ras_block.ras_comm;
> - mca->mpio.ras_if = &mca->mpio.ras->ras_block.ras_comm;
> }
>
> const struct amdgpu_mca_funcs mca_v3_0_funcs = { diff --git
> a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> index 01b385568c14..fe61fcd22f18 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> @@ -2809,23 +2809,6 @@ static void sdma_v4_0_set_ras_funcs(struct
> amdgpu_device *adev)
> default:
> break;
> }
> -
> - if (adev->sdma.ras) {
> - amdgpu_ras_register_ras_block(adev, &adev->sdma.ras-
> >ras_block);
> -
> - strcpy(adev->sdma.ras->ras_block.ras_comm.name, "sdma");
> - adev->sdma.ras->ras_block.ras_comm.block =
> AMDGPU_RAS_BLOCK__SDMA;
> - adev->sdma.ras->ras_block.ras_comm.type =
> AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
> - adev->sdma.ras_if = &adev->sdma.ras->ras_block.ras_comm;
> -
> - /* If don't define special ras_late_init function, use default
> ras_late_init */
> - if (!adev->sdma.ras->ras_block.ras_late_init)
> - adev->sdma.ras->ras_block.ras_late_init =
> amdgpu_sdma_ras_late_init;
> -
> - /* If not defined special ras_cb function, use default ras_cb */
> - if (!adev->sdma.ras->ras_block.ras_cb)
> - adev->sdma.ras->ras_block.ras_cb =
> amdgpu_sdma_process_ras_data_cb;
> - }
> }
>
> const struct amdgpu_ip_block_version sdma_v4_0_ip_block = {
> --
> 2.25.1
More information about the amd-gfx
mailing list