From 4cd016b5d6a8f3baeea8850deeb528d5febf4784 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Fri, 30 Nov 2018 08:29:51 -0500 Subject: [PATCH] freedreno: debug GEM obj names With a recent enough kernel, set debug names for GEM BOs, which will show up in $debugfs/gem Signed-off-by: Rob Clark --- src/freedreno/drm/freedreno_bo.c | 9 ++++- src/freedreno/drm/freedreno_drmif.h | 40 ++++++++++++++++++- src/freedreno/drm/freedreno_priv.h | 1 + src/freedreno/drm/msm_bo.c | 22 +++++++++- src/freedreno/ir3/ir3_shader.c | 4 +- .../drivers/freedreno/a3xx/fd3_context.c | 6 +-- src/gallium/drivers/freedreno/a3xx/fd3_gmem.c | 2 +- .../drivers/freedreno/a4xx/fd4_context.c | 6 +-- src/gallium/drivers/freedreno/a4xx/fd4_gmem.c | 2 +- .../drivers/freedreno/a5xx/fd5_context.c | 4 +- src/gallium/drivers/freedreno/a5xx/fd5_gmem.c | 2 +- .../drivers/freedreno/a6xx/fd6_context.c | 6 +-- .../drivers/freedreno/freedreno_resource.c | 8 ++-- 13 files changed, 91 insertions(+), 21 deletions(-) diff --git a/src/freedreno/drm/freedreno_bo.c b/src/freedreno/drm/freedreno_bo.c index ec46e16e9e9..7449160f137 100644 --- a/src/freedreno/drm/freedreno_bo.c +++ b/src/freedreno/drm/freedreno_bo.c @@ -105,7 +105,7 @@ bo_new(struct fd_device *dev, uint32_t size, uint32_t flags, } struct fd_bo * -fd_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags) +_fd_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags) { struct fd_bo *bo = bo_new(dev, size, flags, &dev->bo_cache); if (bo) @@ -113,6 +113,12 @@ fd_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags) return bo; } +void +_fd_bo_set_name(struct fd_bo *bo, const char *fmt, va_list ap) +{ + bo->funcs->set_name(bo, fmt, ap); +} + /* internal function to allocate bo's that use the ringbuffer cache * instead of the normal bo_cache. The purpose is, because cmdstream * bo's get vmap'd on the kernel side, and that is expensive, we want @@ -124,6 +130,7 @@ fd_bo_new_ring(struct fd_device *dev, uint32_t size, uint32_t flags) struct fd_bo *bo = bo_new(dev, size, flags, &dev->ring_cache); if (bo) bo->bo_reuse = RING_CACHE; + fd_bo_set_name(bo, "cmdstream"); return bo; } diff --git a/src/freedreno/drm/freedreno_drmif.h b/src/freedreno/drm/freedreno_drmif.h index 27ca0a96f26..a53c3406950 100644 --- a/src/freedreno/drm/freedreno_drmif.h +++ b/src/freedreno/drm/freedreno_drmif.h @@ -29,6 +29,8 @@ #include +#include "util/u_debug.h" + struct fd_bo; struct fd_pipe; struct fd_device; @@ -107,8 +109,44 @@ int fd_pipe_wait_timeout(struct fd_pipe *pipe, uint32_t timestamp, /* buffer-object functions: */ -struct fd_bo * fd_bo_new(struct fd_device *dev, +struct fd_bo * _fd_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags); +void _fd_bo_set_name(struct fd_bo *bo, const char *fmt, va_list ap); + +static inline void +fd_bo_set_name(struct fd_bo *bo, const char *fmt, ...) _util_printf_format(2, 3); + +static inline void +fd_bo_set_name(struct fd_bo *bo, const char *fmt, ...) +{ +#ifndef NDEBUG + va_list ap; + va_start(ap, fmt); + _fd_bo_set_name(bo, fmt, ap); + va_end(ap); +#endif +} + +static inline struct fd_bo * +fd_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags, + const char *fmt, ...) _util_printf_format(4, 5); + +static inline struct fd_bo * +fd_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags, + const char *fmt, ...) +{ + struct fd_bo *bo = _fd_bo_new(dev, size, flags); +#ifndef NDEBUG + if (fmt) { + va_list ap; + va_start(ap, fmt); + _fd_bo_set_name(bo, fmt, ap); + va_end(ap); + } +#endif + return bo; +} + struct fd_bo *fd_bo_from_handle(struct fd_device *dev, uint32_t handle, uint32_t size); struct fd_bo * fd_bo_from_name(struct fd_device *dev, uint32_t name); diff --git a/src/freedreno/drm/freedreno_priv.h b/src/freedreno/drm/freedreno_priv.h index 45a5d6ccba1..349a2296472 100644 --- a/src/freedreno/drm/freedreno_priv.h +++ b/src/freedreno/drm/freedreno_priv.h @@ -154,6 +154,7 @@ struct fd_bo_funcs { void (*cpu_fini)(struct fd_bo *bo); int (*madvise)(struct fd_bo *bo, int willneed); uint64_t (*iova)(struct fd_bo *bo); + void (*set_name)(struct fd_bo *bo, const char *fmt, va_list ap); void (*destroy)(struct fd_bo *bo); }; diff --git a/src/freedreno/drm/msm_bo.c b/src/freedreno/drm/msm_bo.c index 95f888b6cf6..fd9955ea805 100644 --- a/src/freedreno/drm/msm_bo.c +++ b/src/freedreno/drm/msm_bo.c @@ -117,11 +117,30 @@ static uint64_t msm_bo_iova(struct fd_bo *bo) return req.value; } +static void msm_bo_set_name(struct fd_bo *bo, const char *fmt, va_list ap) +{ + struct drm_msm_gem_info req = { + .handle = bo->handle, + .info = MSM_INFO_SET_NAME, + }; + char buf[32]; + int sz; + + if (bo->dev->version < FD_VERSION_SOFTPIN) + return; + + sz = vsnprintf(buf, sizeof(buf), fmt, ap); + + req.value = VOID2U64(buf); + req.len = MIN2(sz, sizeof(buf)); + + drmCommandWrite(bo->dev->fd, DRM_MSM_GEM_INFO, &req, sizeof(req)); +} + static void msm_bo_destroy(struct fd_bo *bo) { struct msm_bo *msm_bo = to_msm_bo(bo); free(msm_bo); - } static const struct fd_bo_funcs funcs = { @@ -130,6 +149,7 @@ static const struct fd_bo_funcs funcs = { .cpu_fini = msm_bo_cpu_fini, .madvise = msm_bo_madvise, .iova = msm_bo_iova, + .set_name = msm_bo_set_name, .destroy = msm_bo_destroy, }; diff --git a/src/freedreno/ir3/ir3_shader.c b/src/freedreno/ir3/ir3_shader.c index 74d92e13962..51c7b75ea38 100644 --- a/src/freedreno/ir3/ir3_shader.c +++ b/src/freedreno/ir3/ir3_shader.c @@ -126,6 +126,7 @@ static void assemble_variant(struct ir3_shader_variant *v) { struct ir3_compiler *compiler = v->shader->compiler; + struct shader_info *info = &v->shader->nir->info; uint32_t gpu_id = compiler->gpu_id; uint32_t sz, *bin; @@ -134,7 +135,8 @@ assemble_variant(struct ir3_shader_variant *v) v->bo = fd_bo_new(compiler->dev, sz, DRM_FREEDRENO_GEM_CACHE_WCOMBINE | - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, + "%s:%s", ir3_shader_stage(v->shader), info->name); memcpy(fd_bo_map(v->bo), bin, sz); diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_context.c b/src/gallium/drivers/freedreno/a3xx/fd3_context.c index 9927191ea4f..59dcaa4bf6b 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_context.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_context.c @@ -101,13 +101,13 @@ fd3_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) fd_hw_query_init(pctx); fd3_ctx->vs_pvt_mem = fd_bo_new(screen->dev, 0x2000, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "vs_pvt"); fd3_ctx->fs_pvt_mem = fd_bo_new(screen->dev, 0x2000, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "fs_pvt"); fd3_ctx->vsc_size_mem = fd_bo_new(screen->dev, 0x1000, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_size"); fd_context_setup_common_vbos(&fd3_ctx->base); diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c index d01b656b0a2..7de0a92cdc1 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c @@ -785,7 +785,7 @@ update_vsc_pipe(struct fd_batch *batch) if (!pipe->bo) { pipe->bo = fd_bo_new(ctx->dev, 0x40000, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_pipe[%u]", i); } OUT_PKT0(ring, REG_A3XX_VSC_PIPE(i), 3); diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_context.c b/src/gallium/drivers/freedreno/a4xx/fd4_context.c index fc9aad610c0..e9730e9c209 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_context.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_context.c @@ -101,13 +101,13 @@ fd4_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) fd_hw_query_init(pctx); fd4_ctx->vs_pvt_mem = fd_bo_new(screen->dev, 0x2000, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "vs_pvt"); fd4_ctx->fs_pvt_mem = fd_bo_new(screen->dev, 0x2000, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "fs_pvt"); fd4_ctx->vsc_size_mem = fd_bo_new(screen->dev, 0x1000, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_size"); fd_context_setup_common_vbos(&fd4_ctx->base); diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c b/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c index aa6cb81e2f7..d061c8ac70f 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c @@ -582,7 +582,7 @@ update_vsc_pipe(struct fd_batch *batch) struct fd_vsc_pipe *pipe = &ctx->vsc_pipe[i]; if (!pipe->bo) { pipe->bo = fd_bo_new(ctx->dev, 0x40000, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_pipe[%u]", i); } OUT_RELOCW(ring, pipe->bo, 0, 0, 0); /* VSC_PIPE_DATA_ADDRESS[i] */ } diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_context.c b/src/gallium/drivers/freedreno/a5xx/fd5_context.c index 985face47ab..37e02c61b1f 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_context.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_context.c @@ -104,10 +104,10 @@ fd5_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) util_blitter_set_texture_multisample(fd5_ctx->base.blitter, true); fd5_ctx->vsc_size_mem = fd_bo_new(screen->dev, 0x1000, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_size"); fd5_ctx->blit_mem = fd_bo_new(screen->dev, 0x1000, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "blit"); fd_context_setup_common_vbos(&fd5_ctx->base); diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c b/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c index 9d7ebced31d..d72d36dde3e 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c @@ -290,7 +290,7 @@ update_vsc_pipe(struct fd_batch *batch) struct fd_vsc_pipe *pipe = &ctx->vsc_pipe[i]; if (!pipe->bo) { pipe->bo = fd_bo_new(ctx->dev, 0x20000, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_pipe[%u]", i); } OUT_RELOCW(ring, pipe->bo, 0, 0, 0); /* VSC_PIPE_DATA_ADDRESS[i].LO/HI */ } diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_context.c b/src/gallium/drivers/freedreno/a6xx/fd6_context.c index 08318082625..b8939b1449c 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_context.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_context.c @@ -111,14 +111,14 @@ fd6_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) fd6_ctx->vsc_data = fd_bo_new(screen->dev, (A6XX_VSC_DATA_PITCH * 32) + 0x100, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_data"); fd6_ctx->vsc_data2 = fd_bo_new(screen->dev, A6XX_VSC_DATA2_PITCH * 32, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_data2"); fd6_ctx->blit_mem = fd_bo_new(screen->dev, 0x1000, - DRM_FREEDRENO_GEM_TYPE_KMEM); + DRM_FREEDRENO_GEM_TYPE_KMEM, "blit"); fd_context_setup_common_vbos(&fd6_ctx->base); diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index 85bbbe271f9..e59dc96ce35 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -97,10 +97,11 @@ rebind_resource(struct fd_context *ctx, struct pipe_resource *prsc) static void realloc_bo(struct fd_resource *rsc, uint32_t size) { + struct pipe_resource *prsc = &rsc->base; struct fd_screen *screen = fd_screen(rsc->base.screen); uint32_t flags = DRM_FREEDRENO_GEM_CACHE_WCOMBINE | DRM_FREEDRENO_GEM_TYPE_KMEM | - COND(rsc->base.bind & PIPE_BIND_SCANOUT, DRM_FREEDRENO_GEM_SCANOUT); + COND(prsc->bind & PIPE_BIND_SCANOUT, DRM_FREEDRENO_GEM_SCANOUT); /* TODO other flags? */ /* if we start using things other than write-combine, @@ -110,7 +111,8 @@ realloc_bo(struct fd_resource *rsc, uint32_t size) if (rsc->bo) fd_bo_del(rsc->bo); - rsc->bo = fd_bo_new(screen->dev, size, flags); + rsc->bo = fd_bo_new(screen->dev, size, flags, "%ux%ux%u@%u:%x", + prsc->width0, prsc->height0, prsc->depth0, rsc->cpp, prsc->bind); rsc->seqno = p_atomic_inc_return(&screen->rsc_seqno); util_range_set_empty(&rsc->valid_buffer_range); fd_bc_invalidate_resource(rsc, true); @@ -869,7 +871,7 @@ fd_resource_create(struct pipe_screen *pscreen, rsc->lrz_height = lrz_height; rsc->lrz_width = lrz_pitch; rsc->lrz_pitch = lrz_pitch; - rsc->lrz = fd_bo_new(screen->dev, size, flags); + rsc->lrz = fd_bo_new(screen->dev, size, flags, "lrz"); } size = screen->setup_slices(rsc); -- 2.30.2