On Sun, Oct 15, 2017 at 06:30:39PM +0200, Noralf Trønnes wrote: > Add drm_gem_fb_debugfs_show() function to provide a debugfs > representation of the framebuffer and GEM object(s). > > Signed-off-by: Noralf Trønnes <noralf@xxxxxxxxxxx> > --- > drivers/gpu/drm/drm_gem_framebuffer_helper.c | 45 ++++++++++++++++++++++++++++ > include/drm/drm_gem_framebuffer_helper.h | 6 ++++ > 2 files changed, 51 insertions(+) > > diff --git a/drivers/gpu/drm/drm_gem_framebuffer_helper.c b/drivers/gpu/drm/drm_gem_framebuffer_helper.c > index aa8cb9bfa499..18fdcc29427a 100644 > --- a/drivers/gpu/drm/drm_gem_framebuffer_helper.c > +++ b/drivers/gpu/drm/drm_gem_framebuffer_helper.c > @@ -265,6 +265,51 @@ int drm_gem_fb_prepare_fb(struct drm_plane *plane, > } > EXPORT_SYMBOL_GPL(drm_gem_fb_prepare_fb); > > +#ifdef CONFIG_DEBUG_FS > +static void drm_gem_fb_describe(struct drm_framebuffer *fb, struct seq_file *m) > +{ > + struct drm_gem_object *obj; > + unsigned int i; > + > + seq_printf(m, "[FB:%d] %dx%d@%4.4s\n", fb->base.id, fb->width, > + fb->height, (char *)&fb->format->format); > + > + for (i = 0; i < fb->format->num_planes; i++) { > + obj = fb->obj[i]; > + seq_printf(m, "\t%u: offset=%d pitch=%d, GEM: name=%d", > + i, fb->offsets[i], fb->pitches[i], obj->name); > + seq_printf(m, " refcount=%d start=%08lx size=%zu%s\n", > + kref_read(&obj->refcount), > + drm_vma_node_start(&obj->vma_node), obj->size, > + obj->import_attach ? " (imported)" : ""); > + } > +} Given that gem is the defacto standard and that we can easily skip the gem specific stuff on non-gem drivers by checking the pointer for NULL I think we should add the framebuffer list by default. Like we already do for e.g. atomic state, see drm_atomic_debugfs_init. Probably better to split it up into a generic fb describe, which calls into a gem_obj describe, with maybe in the future the option to also call into driver callbacks to dump more driver state. There's probably more stuff that we should list by default in debugfs, like blob properties and similar things. -Daniel > + > +/** > + * drm_gem_fb_debugfs_show() - Helper to list GEM backed framebuffer objects > + * in debugfs. > + * @m: Output file > + * @arg: Private data for the callback > + * > + * This function gives a debugfs representation of the framebuffers with their > + * backing GEM objects. See drm_debugfs_create_files() for more info. > + */ > +int drm_gem_fb_debugfs_show(struct seq_file *m, void *arg) > +{ > + struct drm_info_node *node = m->private; > + struct drm_device *dev = node->minor->dev; > + struct drm_framebuffer *fb; > + > + mutex_lock(&dev->mode_config.fb_lock); > + drm_for_each_fb(fb, dev) > + drm_gem_fb_describe(fb, m); > + mutex_unlock(&dev->mode_config.fb_lock); > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(drm_gem_fb_debugfs_show); > +#endif > + > /** > * drm_gem_fbdev_fb_create - Create a GEM backed &drm_framebuffer for fbdev > * emulation > diff --git a/include/drm/drm_gem_framebuffer_helper.h b/include/drm/drm_gem_framebuffer_helper.h > index 5ca7cdc3f527..1bb73d961aba 100644 > --- a/include/drm/drm_gem_framebuffer_helper.h > +++ b/include/drm/drm_gem_framebuffer_helper.h > @@ -28,6 +28,12 @@ drm_gem_fb_create(struct drm_device *dev, struct drm_file *file, > int drm_gem_fb_prepare_fb(struct drm_plane *plane, > struct drm_plane_state *state); > > +#ifdef CONFIG_DEBUG_FS > +struct seq_file; > + > +int drm_gem_fb_debugfs_show(struct seq_file *m, void *arg); > +#endif > + > struct drm_framebuffer * > drm_gem_fbdev_fb_create(struct drm_device *dev, > struct drm_fb_helper_surface_size *sizes, > -- > 2.14.2 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel