Commit 5d64af40 authored by Gavin Wan's avatar Gavin Wan Committed by Alex Deucher
Browse files

drm/amd/amdgpu: fix SDMA IRQ client ID <-> req mapping.



sdma has 2 instances in SRIOV cpx mode. Odd numbered VFs have
sdma0/sdma1 instances. Even numbered vfs have sdma2/sdma3. For
Even numbered vfs, the sdma2 & sdma3 (irq srouce id
CLIENTID_SDMA2 and CLIENTID_SDMA3) should map to irq seq 0 & 1.

Signed-off-by: default avatarGavin Wan <Gavin.Wan@amd.com>
Reviewed-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 89d568ab
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -83,7 +83,7 @@ static unsigned sdma_v4_4_2_seq_to_irq_id(int seq_num)
	}
}

static int sdma_v4_4_2_irq_id_to_seq(unsigned client_id)
static int sdma_v4_4_2_irq_id_to_seq(struct amdgpu_device *adev, unsigned client_id)
{
	switch (client_id) {
	case SOC15_IH_CLIENTID_SDMA0:
@@ -91,8 +91,14 @@ static int sdma_v4_4_2_irq_id_to_seq(unsigned client_id)
	case SOC15_IH_CLIENTID_SDMA1:
		return 1;
	case SOC15_IH_CLIENTID_SDMA2:
		if (amdgpu_sriov_vf(adev) && (adev->gfx.xcc_mask == 0x1))
			return 0;
		else
			return 2;
	case SOC15_IH_CLIENTID_SDMA3:
		if (amdgpu_sriov_vf(adev) && (adev->gfx.xcc_mask == 0x1))
			return 1;
		else
			return 3;
	default:
		return -EINVAL;
@@ -1524,7 +1530,7 @@ static int sdma_v4_4_2_process_trap_irq(struct amdgpu_device *adev,
	uint32_t instance, i;

	DRM_DEBUG("IH: SDMA trap\n");
	instance = sdma_v4_4_2_irq_id_to_seq(entry->client_id);
	instance = sdma_v4_4_2_irq_id_to_seq(adev, entry->client_id);

	/* Client id gives the SDMA instance in AID. To know the exact SDMA
	 * instance, interrupt entry gives the node id which corresponds to the AID instance.
@@ -1567,7 +1573,7 @@ static int sdma_v4_4_2_process_ras_data_cb(struct amdgpu_device *adev,
	if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__SDMA))
		goto out;

	instance = sdma_v4_4_2_irq_id_to_seq(entry->client_id);
	instance = sdma_v4_4_2_irq_id_to_seq(adev, entry->client_id);
	if (instance < 0)
		goto out;

@@ -1586,7 +1592,7 @@ static int sdma_v4_4_2_process_illegal_inst_irq(struct amdgpu_device *adev,

	DRM_ERROR("Illegal instruction in SDMA command stream\n");

	instance = sdma_v4_4_2_irq_id_to_seq(entry->client_id);
	instance = sdma_v4_4_2_irq_id_to_seq(adev, entry->client_id);
	if (instance < 0)
		return 0;

@@ -1620,7 +1626,7 @@ static int sdma_v4_4_2_print_iv_entry(struct amdgpu_device *adev,
	struct amdgpu_task_info *task_info;
	u64 addr;

	instance = sdma_v4_4_2_irq_id_to_seq(entry->client_id);
	instance = sdma_v4_4_2_irq_id_to_seq(adev, entry->client_id);
	if (instance < 0 || instance >= adev->sdma.num_instances) {
		dev_err(adev->dev, "sdma instance invalid %d\n", instance);
		return -EINVAL;