From: Rob Clark <robdcl...@chromium.org>

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: Rob Clark <robdcl...@chromium.org>
---
 drivers/gpu/drm/msm/msm_gpu.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
index 6503ce655b10..2eaca2a22de9 100644
--- a/drivers/gpu/drm/msm/msm_gpu.c
+++ b/drivers/gpu/drm/msm/msm_gpu.c
@@ -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:
@@ -279,6 +280,7 @@ static void msm_gpu_crashstate_capture(struct msm_gpu *gpu,
        state->fault_info = gpu->fault_info;
 
        if (submit) {
+               extern bool rd_full;
                int i;
 
                if (state->fault_info.ttbr0) {
@@ -294,9 +296,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);
                }
        }
 
-- 
2.49.0

Reply via email to