Commit 7e0357fc authored by Mohammad Zafar Ziya's avatar Mohammad Zafar Ziya Committed by Alex Deucher
Browse files

drm/amdgpu/jpeg: add jpeg ras poison consumption handling



Add jpeg ras poison event callback and consumption handling

V2: Removed the default poison consumption cb handle

Signed-off-by: default avatarMohammad Zafar Ziya <Mohammadzafar.ziya@amd.com>
Reviewed-by: default avatarLijo Lazar <lijo.lazar@amd.com>
Reviewed-by: default avatarTao Zhou <tao.zhou1@amd.com>
Reviewed-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e91241c0
Loading
Loading
Loading
Loading
+18 −0
Original line number Original line Diff line number Diff line
@@ -216,3 +216,21 @@ int amdgpu_jpeg_dec_ring_test_ib(struct amdgpu_ring *ring, long timeout)
error:
error:
	return r;
	return r;
}
}

int amdgpu_jpeg_process_poison_irq(struct amdgpu_device *adev,
				struct amdgpu_irq_src *source,
				struct amdgpu_iv_entry *entry)
{
	struct ras_common_if *ras_if = adev->jpeg.ras_if;
	struct ras_dispatch_if ih_data = {
		.entry = entry,
	};

	if (!ras_if)
		return 0;

	ih_data.head = *ras_if;
	amdgpu_ras_interrupt_dispatch(adev, &ih_data);

	return 0;
}
+4 −0
Original line number Original line Diff line number Diff line
@@ -69,4 +69,8 @@ void amdgpu_jpeg_ring_end_use(struct amdgpu_ring *ring);
int amdgpu_jpeg_dec_ring_test_ring(struct amdgpu_ring *ring);
int amdgpu_jpeg_dec_ring_test_ring(struct amdgpu_ring *ring);
int amdgpu_jpeg_dec_ring_test_ib(struct amdgpu_ring *ring, long timeout);
int amdgpu_jpeg_dec_ring_test_ib(struct amdgpu_ring *ring, long timeout);


int amdgpu_jpeg_process_poison_irq(struct amdgpu_device *adev,
				struct amdgpu_irq_src *source,
				struct amdgpu_iv_entry *entry);

#endif /*__AMDGPU_JPEG_H__*/
#endif /*__AMDGPU_JPEG_H__*/
+16 −0
Original line number Original line Diff line number Diff line
@@ -99,6 +99,18 @@ static int jpeg_v2_5_sw_init(void *handle)
				VCN_2_0__SRCID__JPEG_DECODE, &adev->jpeg.inst[i].irq);
				VCN_2_0__SRCID__JPEG_DECODE, &adev->jpeg.inst[i].irq);
		if (r)
		if (r)
			return r;
			return r;

		/* JPEG DJPEG POISON EVENT */
		r = amdgpu_irq_add_id(adev, amdgpu_ih_clientid_jpeg[i],
			VCN_2_6__SRCID_DJPEG0_POISON, &adev->jpeg.inst[i].irq);
		if (r)
			return r;

		/* JPEG EJPEG POISON EVENT */
		r = amdgpu_irq_add_id(adev, amdgpu_ih_clientid_jpeg[i],
			VCN_2_6__SRCID_EJPEG0_POISON, &adev->jpeg.inst[i].irq);
		if (r)
			return r;
	}
	}


	r = amdgpu_jpeg_sw_init(adev);
	r = amdgpu_jpeg_sw_init(adev);
@@ -573,6 +585,10 @@ static int jpeg_v2_5_process_interrupt(struct amdgpu_device *adev,
	case VCN_2_0__SRCID__JPEG_DECODE:
	case VCN_2_0__SRCID__JPEG_DECODE:
		amdgpu_fence_process(&adev->jpeg.inst[ip_instance].ring_dec);
		amdgpu_fence_process(&adev->jpeg.inst[ip_instance].ring_dec);
		break;
		break;
	case VCN_2_6__SRCID_DJPEG0_POISON:
	case VCN_2_6__SRCID_EJPEG0_POISON:
		amdgpu_jpeg_process_poison_irq(adev, source, entry);
		break;
	default:
	default:
		DRM_ERROR("Unhandled interrupt: %d %d\n",
		DRM_ERROR("Unhandled interrupt: %d %d\n",
			  entry->src_id, entry->src_data[0]);
			  entry->src_id, entry->src_data[0]);
+3 −0
Original line number Original line Diff line number Diff line
@@ -29,4 +29,7 @@
#define VCN_2_0__SRCID__JPEG_ENCODE					151		// 0x97 JRBC Encode interrupt
#define VCN_2_0__SRCID__JPEG_ENCODE					151		// 0x97 JRBC Encode interrupt
#define VCN_2_0__SRCID__JPEG_DECODE					153		// 0x99 JRBC Decode interrupt
#define VCN_2_0__SRCID__JPEG_DECODE					153		// 0x99 JRBC Decode interrupt


#define VCN_2_6__SRCID_DJPEG0_POISON					161
#define VCN_2_6__SRCID_EJPEG0_POISON					162

#endif
#endif