162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright 2018 Advanced Micro Devices, Inc.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
562306a36Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
662306a36Sopenharmony_ci * to deal in the Software without restriction, including without limitation
762306a36Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
862306a36Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
962306a36Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci * The above copyright notice and this permission notice shall be included in
1262306a36Sopenharmony_ci * all copies or substantial portions of the Software.
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1562306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1662306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1762306a36Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1862306a36Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1962306a36Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2062306a36Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE.
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci */
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#include <linux/firmware.h>
2562306a36Sopenharmony_ci#include "amdgpu.h"
2662306a36Sopenharmony_ci#include "amdgpu_sdma.h"
2762306a36Sopenharmony_ci#include "amdgpu_ras.h"
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define AMDGPU_CSA_SDMA_SIZE 64
3062306a36Sopenharmony_ci/* SDMA CSA reside in the 3rd page of CSA */
3162306a36Sopenharmony_ci#define AMDGPU_CSA_SDMA_OFFSET (4096 * 2)
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci/*
3462306a36Sopenharmony_ci * GPU SDMA IP block helpers function.
3562306a36Sopenharmony_ci */
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistruct amdgpu_sdma_instance *amdgpu_sdma_get_instance_from_ring(struct amdgpu_ring *ring)
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	struct amdgpu_device *adev = ring->adev;
4062306a36Sopenharmony_ci	int i;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	for (i = 0; i < adev->sdma.num_instances; i++)
4362306a36Sopenharmony_ci		if (ring == &adev->sdma.instance[i].ring ||
4462306a36Sopenharmony_ci		    ring == &adev->sdma.instance[i].page)
4562306a36Sopenharmony_ci			return &adev->sdma.instance[i];
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	return NULL;
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciint amdgpu_sdma_get_index_from_ring(struct amdgpu_ring *ring, uint32_t *index)
5162306a36Sopenharmony_ci{
5262306a36Sopenharmony_ci	struct amdgpu_device *adev = ring->adev;
5362306a36Sopenharmony_ci	int i;
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	for (i = 0; i < adev->sdma.num_instances; i++) {
5662306a36Sopenharmony_ci		if (ring == &adev->sdma.instance[i].ring ||
5762306a36Sopenharmony_ci			ring == &adev->sdma.instance[i].page) {
5862306a36Sopenharmony_ci			*index = i;
5962306a36Sopenharmony_ci			return 0;
6062306a36Sopenharmony_ci		}
6162306a36Sopenharmony_ci	}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	return -EINVAL;
6462306a36Sopenharmony_ci}
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ciuint64_t amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring,
6762306a36Sopenharmony_ci				     unsigned int vmid)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	struct amdgpu_device *adev = ring->adev;
7062306a36Sopenharmony_ci	uint64_t csa_mc_addr;
7162306a36Sopenharmony_ci	uint32_t index = 0;
7262306a36Sopenharmony_ci	int r;
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	/* don't enable OS preemption on SDMA under SRIOV */
7562306a36Sopenharmony_ci	if (amdgpu_sriov_vf(adev) || vmid == 0 || !adev->gfx.mcbp)
7662306a36Sopenharmony_ci		return 0;
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	if (ring->is_mes_queue) {
7962306a36Sopenharmony_ci		uint32_t offset = 0;
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci		offset = offsetof(struct amdgpu_mes_ctx_meta_data,
8262306a36Sopenharmony_ci				  sdma[ring->idx].sdma_meta_data);
8362306a36Sopenharmony_ci		csa_mc_addr = amdgpu_mes_ctx_get_offs_gpu_addr(ring, offset);
8462306a36Sopenharmony_ci	} else {
8562306a36Sopenharmony_ci		r = amdgpu_sdma_get_index_from_ring(ring, &index);
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci		if (r || index > 31)
8862306a36Sopenharmony_ci			csa_mc_addr = 0;
8962306a36Sopenharmony_ci		else
9062306a36Sopenharmony_ci			csa_mc_addr = amdgpu_csa_vaddr(adev) +
9162306a36Sopenharmony_ci				AMDGPU_CSA_SDMA_OFFSET +
9262306a36Sopenharmony_ci				index * AMDGPU_CSA_SDMA_SIZE;
9362306a36Sopenharmony_ci	}
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	return csa_mc_addr;
9662306a36Sopenharmony_ci}
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ciint amdgpu_sdma_ras_late_init(struct amdgpu_device *adev,
9962306a36Sopenharmony_ci			      struct ras_common_if *ras_block)
10062306a36Sopenharmony_ci{
10162306a36Sopenharmony_ci	int r, i;
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	r = amdgpu_ras_block_late_init(adev, ras_block);
10462306a36Sopenharmony_ci	if (r)
10562306a36Sopenharmony_ci		return r;
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	if (amdgpu_ras_is_supported(adev, ras_block->block)) {
10862306a36Sopenharmony_ci		for (i = 0; i < adev->sdma.num_instances; i++) {
10962306a36Sopenharmony_ci			r = amdgpu_irq_get(adev, &adev->sdma.ecc_irq,
11062306a36Sopenharmony_ci				AMDGPU_SDMA_IRQ_INSTANCE0 + i);
11162306a36Sopenharmony_ci			if (r)
11262306a36Sopenharmony_ci				goto late_fini;
11362306a36Sopenharmony_ci		}
11462306a36Sopenharmony_ci	}
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci	return 0;
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_cilate_fini:
11962306a36Sopenharmony_ci	amdgpu_ras_block_late_fini(adev, ras_block);
12062306a36Sopenharmony_ci	return r;
12162306a36Sopenharmony_ci}
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ciint amdgpu_sdma_process_ras_data_cb(struct amdgpu_device *adev,
12462306a36Sopenharmony_ci		void *err_data,
12562306a36Sopenharmony_ci		struct amdgpu_iv_entry *entry)
12662306a36Sopenharmony_ci{
12762306a36Sopenharmony_ci	kgd2kfd_set_sram_ecc_flag(adev->kfd.dev);
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci	if (amdgpu_sriov_vf(adev))
13062306a36Sopenharmony_ci		return AMDGPU_RAS_SUCCESS;
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci	amdgpu_ras_reset_gpu(adev);
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci	return AMDGPU_RAS_SUCCESS;
13562306a36Sopenharmony_ci}
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ciint amdgpu_sdma_process_ecc_irq(struct amdgpu_device *adev,
13862306a36Sopenharmony_ci				      struct amdgpu_irq_src *source,
13962306a36Sopenharmony_ci				      struct amdgpu_iv_entry *entry)
14062306a36Sopenharmony_ci{
14162306a36Sopenharmony_ci	struct ras_common_if *ras_if = adev->sdma.ras_if;
14262306a36Sopenharmony_ci	struct ras_dispatch_if ih_data = {
14362306a36Sopenharmony_ci		.entry = entry,
14462306a36Sopenharmony_ci	};
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci	if (!ras_if)
14762306a36Sopenharmony_ci		return 0;
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	ih_data.head = *ras_if;
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci	amdgpu_ras_interrupt_dispatch(adev, &ih_data);
15262306a36Sopenharmony_ci	return 0;
15362306a36Sopenharmony_ci}
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_cistatic int amdgpu_sdma_init_inst_ctx(struct amdgpu_sdma_instance *sdma_inst)
15662306a36Sopenharmony_ci{
15762306a36Sopenharmony_ci	uint16_t version_major;
15862306a36Sopenharmony_ci	const struct common_firmware_header *header = NULL;
15962306a36Sopenharmony_ci	const struct sdma_firmware_header_v1_0 *hdr;
16062306a36Sopenharmony_ci	const struct sdma_firmware_header_v2_0 *hdr_v2;
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	header = (const struct common_firmware_header *)
16362306a36Sopenharmony_ci		sdma_inst->fw->data;
16462306a36Sopenharmony_ci	version_major = le16_to_cpu(header->header_version_major);
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci	switch (version_major) {
16762306a36Sopenharmony_ci	case 1:
16862306a36Sopenharmony_ci		hdr = (const struct sdma_firmware_header_v1_0 *)sdma_inst->fw->data;
16962306a36Sopenharmony_ci		sdma_inst->fw_version = le32_to_cpu(hdr->header.ucode_version);
17062306a36Sopenharmony_ci		sdma_inst->feature_version = le32_to_cpu(hdr->ucode_feature_version);
17162306a36Sopenharmony_ci		break;
17262306a36Sopenharmony_ci	case 2:
17362306a36Sopenharmony_ci		hdr_v2 = (const struct sdma_firmware_header_v2_0 *)sdma_inst->fw->data;
17462306a36Sopenharmony_ci		sdma_inst->fw_version = le32_to_cpu(hdr_v2->header.ucode_version);
17562306a36Sopenharmony_ci		sdma_inst->feature_version = le32_to_cpu(hdr_v2->ucode_feature_version);
17662306a36Sopenharmony_ci		break;
17762306a36Sopenharmony_ci	default:
17862306a36Sopenharmony_ci		return -EINVAL;
17962306a36Sopenharmony_ci	}
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	if (sdma_inst->feature_version >= 20)
18262306a36Sopenharmony_ci		sdma_inst->burst_nop = true;
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci	return 0;
18562306a36Sopenharmony_ci}
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_civoid amdgpu_sdma_destroy_inst_ctx(struct amdgpu_device *adev,
18862306a36Sopenharmony_ci				  bool duplicate)
18962306a36Sopenharmony_ci{
19062306a36Sopenharmony_ci	int i;
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci	for (i = 0; i < adev->sdma.num_instances; i++) {
19362306a36Sopenharmony_ci		amdgpu_ucode_release(&adev->sdma.instance[i].fw);
19462306a36Sopenharmony_ci		if (duplicate)
19562306a36Sopenharmony_ci			break;
19662306a36Sopenharmony_ci	}
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci	memset((void *)adev->sdma.instance, 0,
19962306a36Sopenharmony_ci	       sizeof(struct amdgpu_sdma_instance) * AMDGPU_MAX_SDMA_INSTANCES);
20062306a36Sopenharmony_ci}
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ciint amdgpu_sdma_init_microcode(struct amdgpu_device *adev,
20362306a36Sopenharmony_ci			       u32 instance, bool duplicate)
20462306a36Sopenharmony_ci{
20562306a36Sopenharmony_ci	struct amdgpu_firmware_info *info = NULL;
20662306a36Sopenharmony_ci	const struct common_firmware_header *header = NULL;
20762306a36Sopenharmony_ci	int err, i;
20862306a36Sopenharmony_ci	const struct sdma_firmware_header_v2_0 *sdma_hdr;
20962306a36Sopenharmony_ci	uint16_t version_major;
21062306a36Sopenharmony_ci	char ucode_prefix[30];
21162306a36Sopenharmony_ci	char fw_name[40];
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci	amdgpu_ucode_ip_version_decode(adev, SDMA0_HWIP, ucode_prefix, sizeof(ucode_prefix));
21462306a36Sopenharmony_ci	if (instance == 0)
21562306a36Sopenharmony_ci		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s.bin", ucode_prefix);
21662306a36Sopenharmony_ci	else
21762306a36Sopenharmony_ci		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s%d.bin", ucode_prefix, instance);
21862306a36Sopenharmony_ci	err = amdgpu_ucode_request(adev, &adev->sdma.instance[instance].fw, fw_name);
21962306a36Sopenharmony_ci	if (err)
22062306a36Sopenharmony_ci		goto out;
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci	header = (const struct common_firmware_header *)
22362306a36Sopenharmony_ci		adev->sdma.instance[instance].fw->data;
22462306a36Sopenharmony_ci	version_major = le16_to_cpu(header->header_version_major);
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	if ((duplicate && instance) || (!duplicate && version_major > 1)) {
22762306a36Sopenharmony_ci		err = -EINVAL;
22862306a36Sopenharmony_ci		goto out;
22962306a36Sopenharmony_ci	}
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci	err = amdgpu_sdma_init_inst_ctx(&adev->sdma.instance[instance]);
23262306a36Sopenharmony_ci	if (err)
23362306a36Sopenharmony_ci		goto out;
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci	if (duplicate) {
23662306a36Sopenharmony_ci		for (i = 1; i < adev->sdma.num_instances; i++)
23762306a36Sopenharmony_ci			memcpy((void *)&adev->sdma.instance[i],
23862306a36Sopenharmony_ci			       (void *)&adev->sdma.instance[0],
23962306a36Sopenharmony_ci			       sizeof(struct amdgpu_sdma_instance));
24062306a36Sopenharmony_ci	}
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	DRM_DEBUG("psp_load == '%s'\n",
24362306a36Sopenharmony_ci		  adev->firmware.load_type == AMDGPU_FW_LOAD_PSP ? "true" : "false");
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
24662306a36Sopenharmony_ci		switch (version_major) {
24762306a36Sopenharmony_ci		case 1:
24862306a36Sopenharmony_ci			for (i = 0; i < adev->sdma.num_instances; i++) {
24962306a36Sopenharmony_ci				if (!duplicate && (instance != i))
25062306a36Sopenharmony_ci					continue;
25162306a36Sopenharmony_ci				else {
25262306a36Sopenharmony_ci					/* Use a single copy per SDMA firmware type. PSP uses the same instance for all
25362306a36Sopenharmony_ci					 * groups of SDMAs */
25462306a36Sopenharmony_ci					if (adev->ip_versions[SDMA0_HWIP][0] == IP_VERSION(4, 4, 2) &&
25562306a36Sopenharmony_ci					    adev->firmware.load_type == AMDGPU_FW_LOAD_PSP &&
25662306a36Sopenharmony_ci					    adev->sdma.num_inst_per_aid == i) {
25762306a36Sopenharmony_ci						break;
25862306a36Sopenharmony_ci					}
25962306a36Sopenharmony_ci					info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i];
26062306a36Sopenharmony_ci					info->ucode_id = AMDGPU_UCODE_ID_SDMA0 + i;
26162306a36Sopenharmony_ci					info->fw = adev->sdma.instance[i].fw;
26262306a36Sopenharmony_ci					adev->firmware.fw_size +=
26362306a36Sopenharmony_ci						ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE);
26462306a36Sopenharmony_ci				}
26562306a36Sopenharmony_ci			}
26662306a36Sopenharmony_ci			break;
26762306a36Sopenharmony_ci		case 2:
26862306a36Sopenharmony_ci			sdma_hdr = (const struct sdma_firmware_header_v2_0 *)
26962306a36Sopenharmony_ci				adev->sdma.instance[0].fw->data;
27062306a36Sopenharmony_ci			info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA_UCODE_TH0];
27162306a36Sopenharmony_ci			info->ucode_id = AMDGPU_UCODE_ID_SDMA_UCODE_TH0;
27262306a36Sopenharmony_ci			info->fw = adev->sdma.instance[0].fw;
27362306a36Sopenharmony_ci			adev->firmware.fw_size +=
27462306a36Sopenharmony_ci				ALIGN(le32_to_cpu(sdma_hdr->ctx_ucode_size_bytes), PAGE_SIZE);
27562306a36Sopenharmony_ci			info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA_UCODE_TH1];
27662306a36Sopenharmony_ci			info->ucode_id = AMDGPU_UCODE_ID_SDMA_UCODE_TH1;
27762306a36Sopenharmony_ci			info->fw = adev->sdma.instance[0].fw;
27862306a36Sopenharmony_ci			adev->firmware.fw_size +=
27962306a36Sopenharmony_ci				ALIGN(le32_to_cpu(sdma_hdr->ctl_ucode_size_bytes), PAGE_SIZE);
28062306a36Sopenharmony_ci			break;
28162306a36Sopenharmony_ci		default:
28262306a36Sopenharmony_ci			err = -EINVAL;
28362306a36Sopenharmony_ci		}
28462306a36Sopenharmony_ci	}
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ciout:
28762306a36Sopenharmony_ci	if (err)
28862306a36Sopenharmony_ci		amdgpu_sdma_destroy_inst_ctx(adev, duplicate);
28962306a36Sopenharmony_ci	return err;
29062306a36Sopenharmony_ci}
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_civoid amdgpu_sdma_unset_buffer_funcs_helper(struct amdgpu_device *adev)
29362306a36Sopenharmony_ci{
29462306a36Sopenharmony_ci	struct amdgpu_ring *sdma;
29562306a36Sopenharmony_ci	int i;
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci	for (i = 0; i < adev->sdma.num_instances; i++) {
29862306a36Sopenharmony_ci		if (adev->sdma.has_page_queue) {
29962306a36Sopenharmony_ci			sdma = &adev->sdma.instance[i].page;
30062306a36Sopenharmony_ci			if (adev->mman.buffer_funcs_ring == sdma) {
30162306a36Sopenharmony_ci				amdgpu_ttm_set_buffer_funcs_status(adev, false);
30262306a36Sopenharmony_ci				break;
30362306a36Sopenharmony_ci			}
30462306a36Sopenharmony_ci		}
30562306a36Sopenharmony_ci		sdma = &adev->sdma.instance[i].ring;
30662306a36Sopenharmony_ci		if (adev->mman.buffer_funcs_ring == sdma) {
30762306a36Sopenharmony_ci			amdgpu_ttm_set_buffer_funcs_status(adev, false);
30862306a36Sopenharmony_ci			break;
30962306a36Sopenharmony_ci		}
31062306a36Sopenharmony_ci	}
31162306a36Sopenharmony_ci}
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ciint amdgpu_sdma_ras_sw_init(struct amdgpu_device *adev)
31462306a36Sopenharmony_ci{
31562306a36Sopenharmony_ci	int err = 0;
31662306a36Sopenharmony_ci	struct amdgpu_sdma_ras *ras = NULL;
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci	/* adev->sdma.ras is NULL, which means sdma does not
31962306a36Sopenharmony_ci	 * support ras function, then do nothing here.
32062306a36Sopenharmony_ci	 */
32162306a36Sopenharmony_ci	if (!adev->sdma.ras)
32262306a36Sopenharmony_ci		return 0;
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci	ras = adev->sdma.ras;
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ci	err = amdgpu_ras_register_ras_block(adev, &ras->ras_block);
32762306a36Sopenharmony_ci	if (err) {
32862306a36Sopenharmony_ci		dev_err(adev->dev, "Failed to register sdma ras block!\n");
32962306a36Sopenharmony_ci		return err;
33062306a36Sopenharmony_ci	}
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci	strcpy(ras->ras_block.ras_comm.name, "sdma");
33362306a36Sopenharmony_ci	ras->ras_block.ras_comm.block = AMDGPU_RAS_BLOCK__SDMA;
33462306a36Sopenharmony_ci	ras->ras_block.ras_comm.type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
33562306a36Sopenharmony_ci	adev->sdma.ras_if = &ras->ras_block.ras_comm;
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci	/* If not define special ras_late_init function, use default ras_late_init */
33862306a36Sopenharmony_ci	if (!ras->ras_block.ras_late_init)
33962306a36Sopenharmony_ci		ras->ras_block.ras_late_init = amdgpu_sdma_ras_late_init;
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	/* If not defined special ras_cb function, use default ras_cb */
34262306a36Sopenharmony_ci	if (!ras->ras_block.ras_cb)
34362306a36Sopenharmony_ci		ras->ras_block.ras_cb = amdgpu_sdma_process_ras_data_cb;
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci	return 0;
34662306a36Sopenharmony_ci}
347