Commit 757cff73 authored by Rob Clark's avatar Rob Clark
Browse files

drm/msm: Crashdump prep for sparse mappings



In this case, userspace could request dumping partial GEM obj mappings.
Also drop use of should_dump() helper, which really only makes sense in
the old submit->bos[] table world.

Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
Signed-off-by: default avatarRob Clark <robin.clark@oss.qualcomm.com>
Tested-by: default avatarAntonino Maniscalco <antomani103@gmail.com>
Reviewed-by: default avatarAntonino Maniscalco <antomani103@gmail.com>
Patchwork: https://patchwork.freedesktop.org/patch/661496/
parent b58e12a6
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -219,13 +219,14 @@ static void msm_gpu_devcoredump_free(void *data)
}

static void msm_gpu_crashstate_get_bo(struct msm_gpu_state *state,
		struct drm_gem_object *obj, u64 iova, bool full)
				      struct drm_gem_object *obj, u64 iova,
				      bool full, size_t offset, size_t size)
{
	struct msm_gpu_state_bo *state_bo = &state->bos[state->nr_bos];
	struct msm_gem_object *msm_obj = to_msm_bo(obj);

	/* Don't record write only objects */
	state_bo->size = obj->size;
	state_bo->size = size;
	state_bo->flags = msm_obj->flags;
	state_bo->iova = iova;

@@ -236,7 +237,7 @@ static void msm_gpu_crashstate_get_bo(struct msm_gpu_state *state,
	if (full) {
		void *ptr;

		state_bo->data = kvmalloc(obj->size, GFP_KERNEL);
		state_bo->data = kvmalloc(size, GFP_KERNEL);
		if (!state_bo->data)
			goto out;

@@ -249,7 +250,7 @@ static void msm_gpu_crashstate_get_bo(struct msm_gpu_state *state,
			goto out;
		}

		memcpy(state_bo->data, ptr, obj->size);
		memcpy(state_bo->data, ptr + offset, size);
		msm_gem_put_vaddr(obj);
	}
out:
@@ -281,6 +282,7 @@ static void msm_gpu_crashstate_capture(struct msm_gpu *gpu,
		state->fault_info = *fault_info;

	if (submit) {
		extern bool rd_full;
		int i;

		if (state->fault_info.ttbr0) {
@@ -296,9 +298,10 @@ static void msm_gpu_crashstate_capture(struct msm_gpu *gpu,
			sizeof(struct msm_gpu_state_bo), GFP_KERNEL);

		for (i = 0; state->bos && i < submit->nr_bos; i++) {
			msm_gpu_crashstate_get_bo(state, submit->bos[i].obj,
						  submit->bos[i].iova,
						  should_dump(submit, i));
			struct drm_gem_object *obj = submit->bos[i].obj;
			bool dump = rd_full || (submit->bos[i].flags & MSM_SUBMIT_BO_DUMP);
			msm_gpu_crashstate_get_bo(state, obj, submit->bos[i].iova,
						  dump, 0, obj->size);
		}
	}