Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 92456b93 authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

drm/amdgpu: add some extra VM error handling



If updating the PDs fails we now invalidate all entries to try again later.

Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarChunming Zhou <david1.zhou@amd.com>
Reviewed-by: default avatarJunwei Zhang <Jerry.Zhang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent b1166325
Loading
Loading
Loading
Loading
+33 −1
Original line number Diff line number Diff line
@@ -1103,6 +1103,32 @@ static int amdgpu_vm_update_level(struct amdgpu_device *adev,
	return r;
}

/*
 * amdgpu_vm_invalidate_level - mark all PD levels as invalid
 *
 * @parent: parent PD
 *
 * Mark all PD level as invalid after an error.
 */
static void amdgpu_vm_invalidate_level(struct amdgpu_vm_pt *parent)
{
	unsigned pt_idx;

	/*
	 * Recurse into the subdirectories. This recursion is harmless because
	 * we only have a maximum of 5 layers.
	 */
	for (pt_idx = 0; pt_idx <= parent->last_entry_used; ++pt_idx) {
		struct amdgpu_vm_pt *entry = &parent->entries[pt_idx];

		if (!entry->bo)
			continue;

		entry->addr = ~0ULL;
		amdgpu_vm_invalidate_level(entry);
	}
}

/*
 * amdgpu_vm_update_directories - make sure that all directories are valid
 *
@@ -1115,7 +1141,13 @@ static int amdgpu_vm_update_level(struct amdgpu_device *adev,
int amdgpu_vm_update_directories(struct amdgpu_device *adev,
				 struct amdgpu_vm *vm)
{
	return amdgpu_vm_update_level(adev, vm, &vm->root, 0);
	int r;

	r = amdgpu_vm_update_level(adev, vm, &vm->root, 0);
	if (r)
		amdgpu_vm_invalidate_level(&vm->root);

	return r;
}

/**