Commit 2e8ef6a5 authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/amdgpu: add cached GPU fault structure to vm struct



When we get a GPU page fault, cache the fault for later
analysis.

Cc: samuel.pitoiset@gmail.com
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Acked-by: default avatarGuchun Chen <guchun.chen@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent ec4d770b
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -2730,3 +2730,34 @@ void amdgpu_debugfs_vm_bo_info(struct amdgpu_vm *vm, struct seq_file *m)
		   total_done_objs);
}
#endif

/**
 * amdgpu_vm_update_fault_cache - update cached fault into.
 * @adev: amdgpu device pointer
 * @pasid: PASID of the VM
 * @addr: Address of the fault
 * @status: GPUVM fault status register
 * @vmhub: which vmhub got the fault
 *
 * Cache the fault info for later use by userspace in debugging.
 */
void amdgpu_vm_update_fault_cache(struct amdgpu_device *adev,
				  unsigned int pasid,
				  uint64_t addr,
				  uint32_t status,
				  unsigned int vmhub)
{
	struct amdgpu_vm *vm;
	unsigned long flags;

	xa_lock_irqsave(&adev->vm_manager.pasids, flags);

	vm = xa_load(&adev->vm_manager.pasids, pasid);
	if (vm) {
		vm->fault_info.addr = addr;
		vm->fault_info.status = status;
		vm->fault_info.vmhub = vmhub;
	}
	xa_unlock_irqrestore(&adev->vm_manager.pasids, flags);
}
+18 −0
Original line number Diff line number Diff line
@@ -252,6 +252,15 @@ struct amdgpu_vm_update_funcs {
		      struct dma_fence **fence);
};

struct amdgpu_vm_fault_info {
	/* fault address */
	uint64_t	addr;
	/* fault status register */
	uint32_t	status;
	/* which vmhub? gfxhub, mmhub, etc. */
	unsigned int	vmhub;
};

struct amdgpu_vm {
	/* tree of virtual addresses mapped */
	struct rb_root_cached	va;
@@ -343,6 +352,9 @@ struct amdgpu_vm {

	/* Memory partition number, -1 means any partition */
	int8_t			mem_id;

	/* cached fault info */
	struct amdgpu_vm_fault_info fault_info;
};

struct amdgpu_vm_manager {
@@ -554,4 +566,10 @@ static inline void amdgpu_vm_eviction_unlock(struct amdgpu_vm *vm)
	mutex_unlock(&vm->eviction_lock);
}

void amdgpu_vm_update_fault_cache(struct amdgpu_device *adev,
				  unsigned int pasid,
				  uint64_t addr,
				  uint32_t status,
				  unsigned int vmhub);

#endif