Commit 4108c2be authored by Samuel Zhang's avatar Samuel Zhang Committed by Alex Deucher
Browse files

drm/amdgpu: fix fence fallback timer expired error



IH is not working after switching a new gpu index for the first time.

During VM resume, QEMU programming of VF MSIX table (register GFXMSIX_VECT0_ADDR_LO)
may not work.The access could be blocked by nBIF protection as VF isn't in
exclusive access mode. Exclusive access is enabled now, disable/enable MSIX
so that QEMU reprograms MSIX table.

call amdgpu_restore_msix on resume to restore msix table.

Signed-off-by: default avatarSamuel Zhang <guoqing.zhang@amd.com>
Acked-by: default avatarLijo Lazar <lijo.lazar@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 2f405eb4
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -5109,6 +5109,13 @@ static inline int amdgpu_virt_resume(struct amdgpu_device *adev)
	int r;
	unsigned int prev_physical_node_id = adev->gmc.xgmi.physical_node_id;

	/* During VM resume, QEMU programming of VF MSIX table (register GFXMSIX_VECT0_ADDR_LO)
	 * may not work. The access could be blocked by nBIF protection as VF isn't in
	 * exclusive access mode. Exclusive access is enabled now, disable/enable MSIX
	 * so that QEMU reprograms MSIX table.
	 */
	amdgpu_restore_msix(adev);

	r = adev->gfxhub.funcs->get_xgmi_info(adev);
	if (r)
		return r;
+1 −1
Original line number Diff line number Diff line
@@ -242,7 +242,7 @@ static bool amdgpu_msi_ok(struct amdgpu_device *adev)
	return true;
}

static void amdgpu_restore_msix(struct amdgpu_device *adev)
void amdgpu_restore_msix(struct amdgpu_device *adev)
{
	u16 ctrl;

+1 −0
Original line number Diff line number Diff line
@@ -146,5 +146,6 @@ void amdgpu_irq_gpu_reset_resume_helper(struct amdgpu_device *adev);
int amdgpu_irq_add_domain(struct amdgpu_device *adev);
void amdgpu_irq_remove_domain(struct amdgpu_device *adev);
unsigned amdgpu_irq_create_mapping(struct amdgpu_device *adev, unsigned src_id);
void amdgpu_restore_msix(struct amdgpu_device *adev);

#endif