drm/msm: Add a name field for gem objects
authorJordan Crouse <jcrouse@codeaurora.org>
Wed, 7 Nov 2018 22:35:52 +0000 (15:35 -0700)
committerRob Clark <robdclark@gmail.com>
Tue, 11 Dec 2018 18:06:59 +0000 (13:06 -0500)
For debugging purposes it is useful to assign descriptions
to buffers so that we know what they are used for. Add
a field to the buffer object and use that to name the various
kernel side allocations which ends up looking like like this
in /d/dri/X/gem:

   flags       id ref  offset   kaddr            size     madv      name
   00040000: I  0 ( 1) 00000000 0000000070b79eca 00004096           memptrs
      vmas: [gpu: 01000000,mapped,inuse=1]
   00020000: I  0 ( 1) 00000000 0000000031ed4074 00032768           ring0

Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
12 files changed:
drivers/gpu/drm/msm/adreno/a5xx_gpu.c
drivers/gpu/drm/msm/adreno/a5xx_power.c
drivers/gpu/drm/msm/adreno/a5xx_preempt.c
drivers/gpu/drm/msm/adreno/a6xx_gpu.c
drivers/gpu/drm/msm/dsi/dsi_host.c
drivers/gpu/drm/msm/msm_drv.c
drivers/gpu/drm/msm/msm_drv.h
drivers/gpu/drm/msm/msm_fb.c
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem.h
drivers/gpu/drm/msm/msm_gpu.c
drivers/gpu/drm/msm/msm_ringbuffer.c

index c514590ef593eb08700b7d5efefeaebe76601cdb..d5f5e56422f577f9fa6edd00fa1cd2be4575856f 100644 (file)
@@ -510,6 +510,7 @@ static int a5xx_ucode_init(struct msm_gpu *gpu)
                a5xx_gpu->pm4_bo = adreno_fw_create_bo(gpu,
                        adreno_gpu->fw[ADRENO_FW_PM4], &a5xx_gpu->pm4_iova);
 
+
                if (IS_ERR(a5xx_gpu->pm4_bo)) {
                        ret = PTR_ERR(a5xx_gpu->pm4_bo);
                        a5xx_gpu->pm4_bo = NULL;
@@ -517,6 +518,8 @@ static int a5xx_ucode_init(struct msm_gpu *gpu)
                                ret);
                        return ret;
                }
+
+               msm_gem_object_set_name(a5xx_gpu->pm4_bo, "pm4fw");
        }
 
        if (!a5xx_gpu->pfp_bo) {
@@ -530,6 +533,8 @@ static int a5xx_ucode_init(struct msm_gpu *gpu)
                                ret);
                        return ret;
                }
+
+               msm_gem_object_set_name(a5xx_gpu->pfp_bo, "pfpfw");
        }
 
        gpu_write64(gpu, REG_A5XX_CP_ME_INSTR_BASE_LO,
@@ -1214,6 +1219,9 @@ static int a5xx_crashdumper_init(struct msm_gpu *gpu,
                SZ_1M, MSM_BO_UNCACHED, gpu->aspace,
                &dumper->bo, &dumper->iova);
 
+       if (!IS_ERR(dumper->ptr))
+               msm_gem_object_set_name(dumper->bo, "crashdump");
+
        return PTR_ERR_OR_ZERO(dumper->ptr);
 }
 
index 66bcd88dd8c045ad9c720cb675fba66e2c7d2baa..70e65c94e52514e1be323313c36e536de26ef76a 100644 (file)
@@ -300,6 +300,8 @@ void a5xx_gpmu_ucode_init(struct msm_gpu *gpu)
        if (IS_ERR(ptr))
                return;
 
+       msm_gem_object_set_name(a5xx_gpu->gpmu_bo, "gpmufw");
+
        while (cmds_size > 0) {
                int i;
                uint32_t _size = cmds_size > TYPE4_MAX_PAYLOAD ?
index 48481e66368534e8a32cebb4ca5ac2b3cd15982a..3d62310a535fbd1e3b746cc6c23bec3d81e1668c 100644 (file)
@@ -245,6 +245,8 @@ static int preempt_init_ring(struct a5xx_gpu *a5xx_gpu,
        if (IS_ERR(ptr))
                return PTR_ERR(ptr);
 
+       msm_gem_object_set_name(bo, "preempt");
+
        a5xx_gpu->preempt_bo[ring->id] = bo;
        a5xx_gpu->preempt_iova[ring->id] = iova;
        a5xx_gpu->preempt[ring->id] = ptr;
index 34d6087e5209da30b86edf2692492123e12de0cf..fefe773c989e0760d0a29fee2c0b7224aa6d74ef 100644 (file)
@@ -333,6 +333,8 @@ static int a6xx_ucode_init(struct msm_gpu *gpu)
 
                        return ret;
                }
+
+               msm_gem_object_set_name(a6xx_gpu->sqe_bo, "sqefw");
        }
 
        gpu_write64(gpu, REG_A6XX_CP_SQE_INSTR_BASE_LO,
index 3b7092e1dcc7d8893b73f4ae143cc0a463ef5342..38e481d2d606f9f8d3a0600c8e5f5495db00a848 100644 (file)
@@ -1083,6 +1083,8 @@ int dsi_tx_buf_alloc_6g(struct msm_dsi_host *msm_host, int size)
                return PTR_ERR(data);
        }
 
+       msm_gem_object_set_name(msm_host->tx_gem_obj, "tx_gem");
+
        msm_host->tx_size = msm_host->tx_gem_obj->size;
 
        return 0;
index 3f8ed21dfffbdd513c57bc3538c9e8977e8bfa98..a73187274b624c50ed13685139ab1aecbec6de02 100644 (file)
@@ -810,7 +810,7 @@ static int msm_ioctl_gem_new(struct drm_device *dev, void *data,
        }
 
        return msm_gem_new_handle(dev, file, args->size,
-                       args->flags, &args->handle);
+                       args->flags, &args->handle, NULL);
 }
 
 static inline ktime_t to_ktime(struct drm_msm_timespec timeout)
index 955c2f522db62c1f8de978d968fb7f71e5d81176..71a03ce21da531dbd26b9c3149f865c1215a2295 100644 (file)
@@ -309,7 +309,7 @@ int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout);
 int msm_gem_cpu_fini(struct drm_gem_object *obj);
 void msm_gem_free_object(struct drm_gem_object *obj);
 int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
-               uint32_t size, uint32_t flags, uint32_t *handle);
+               uint32_t size, uint32_t flags, uint32_t *handle, char *name);
 struct drm_gem_object *msm_gem_new(struct drm_device *dev,
                uint32_t size, uint32_t flags);
 struct drm_gem_object *msm_gem_new_locked(struct drm_device *dev,
@@ -325,6 +325,8 @@ void msm_gem_kernel_put(struct drm_gem_object *bo,
 struct drm_gem_object *msm_gem_import(struct drm_device *dev,
                struct dma_buf *dmabuf, struct sg_table *sgt);
 
+void msm_gem_object_set_name(struct drm_gem_object *bo, const char *fmt, ...);
+
 int msm_framebuffer_prepare(struct drm_framebuffer *fb,
                struct msm_gem_address_space *aspace);
 void msm_framebuffer_cleanup(struct drm_framebuffer *fb,
index 1224739094f22f6191f20aa2dc19657cc82b99b4..67dfd8d3dc12caaaf9c17c7e5c3d6dbc344bb696 100644 (file)
@@ -237,6 +237,8 @@ msm_alloc_stolen_fb(struct drm_device *dev, int w, int h, int p, uint32_t format
                return ERR_CAST(bo);
        }
 
+       msm_gem_object_set_name(bo, "stolenfb");
+
        fb = msm_framebuffer_init(dev, &mode_cmd, &bo);
        if (IS_ERR(fb)) {
                DRM_DEV_ERROR(dev->dev, "failed to allocate fb\n");
index 3d46d931ba67f88894a67b7ec9f8e37531f85c0c..ee44b0f01e90660f6df5e9e001c91b357333fbc4 100644 (file)
@@ -491,7 +491,7 @@ int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
        args->pitch = align_pitch(args->width, args->bpp);
        args->size  = PAGE_ALIGN(args->pitch * args->height);
        return msm_gem_new_handle(dev, file, args->size,
-                       MSM_BO_SCANOUT | MSM_BO_WC, &args->handle);
+                       MSM_BO_SCANOUT | MSM_BO_WC, &args->handle, "dumb");
 }
 
 int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
@@ -794,7 +794,7 @@ void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
                        obj->name, kref_read(&obj->refcount),
                        off, msm_obj->vaddr);
 
-       seq_printf(m, " %08zu%9s\n", obj->size, madv);
+       seq_printf(m, " %08zu %9s %-32s\n", obj->size, madv, msm_obj->name);
 
        if (!list_empty(&msm_obj->vmas)) {
 
@@ -833,7 +833,7 @@ void msm_gem_describe_objects(struct list_head *list, struct seq_file *m)
        int count = 0;
        size_t size = 0;
 
-       seq_puts(m, "   flags       id ref  offset   kaddr            size     madv\n");
+       seq_puts(m, "   flags       id ref  offset   kaddr            size     madv      name\n");
        list_for_each_entry(msm_obj, list, mm_list) {
                struct drm_gem_object *obj = &msm_obj->base;
                seq_puts(m, "   ");
@@ -890,7 +890,8 @@ void msm_gem_free_object(struct drm_gem_object *obj)
 
 /* convenience method to construct a GEM buffer object, and userspace handle */
 int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
-               uint32_t size, uint32_t flags, uint32_t *handle)
+               uint32_t size, uint32_t flags, uint32_t *handle,
+               char *name)
 {
        struct drm_gem_object *obj;
        int ret;
@@ -900,6 +901,9 @@ int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
        if (IS_ERR(obj))
                return PTR_ERR(obj);
 
+       if (name)
+               msm_gem_object_set_name(obj, "%s", name);
+
        ret = drm_gem_handle_create(file, obj, handle);
 
        /* drop reference from allocate - handle holds it now */
@@ -1153,3 +1157,16 @@ void msm_gem_kernel_put(struct drm_gem_object *bo,
        else
                drm_gem_object_put_unlocked(bo);
 }
+
+void msm_gem_object_set_name(struct drm_gem_object *bo, const char *fmt, ...)
+{
+       struct msm_gem_object *msm_obj = to_msm_bo(bo);
+       va_list ap;
+
+       if (!fmt)
+               return;
+
+       va_start(ap, fmt);
+       vsnprintf(msm_obj->name, sizeof(msm_obj->name), fmt, ap);
+       va_end(ap);
+}
index b318fe278e524d0e9cabe2fa760dc4618490e258..2064fac871b8c8040a6ff129996952471f7ec0d4 100644 (file)
@@ -93,6 +93,8 @@ struct msm_gem_object {
         */
        struct drm_mm_node *vram_node;
        struct mutex lock; /* Protects resources associated with bo */
+
+       char name[32]; /* Identifier to print for the debugfs files */
 };
 #define to_msm_bo(x) container_of(x, struct msm_gem_object, base)
 
index 86bb1ed8ddbb8e38aca1edd88d785b7346030eb4..c3909ba75b124addf343a666ce298dc701658e2b 100644 (file)
@@ -950,6 +950,8 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
                goto fail;
        }
 
+       msm_gem_object_set_name(gpu->memptrs_bo, "memptrs");
+
        if (nr_rings > ARRAY_SIZE(gpu->rb)) {
                DRM_DEV_INFO_ONCE(drm->dev, "Only creating %zu ringbuffers\n",
                        ARRAY_SIZE(gpu->rb));
index 9fa9525c52933a5c2a7b0125ceab4f914e82abcc..6169bd6ca153d926e33390b318159cf41a17e428 100644 (file)
@@ -45,6 +45,9 @@ struct msm_ringbuffer *msm_ringbuffer_new(struct msm_gpu *gpu, int id,
                ring->start = 0;
                goto fail;
        }
+
+       msm_gem_object_set_name(ring->bo, "ring%d", id);
+
        ring->end   = ring->start + (MSM_GPU_RINGBUFFER_SZ >> 2);
        ring->next  = ring->start;
        ring->cur   = ring->start;