[PATCH] drm/framebuffer: Add framebuffer debugfs file

Kristian Høgsberg hoegsberg at gmail.com
Mon Oct 23 21:32:04 UTC 2017


On Mon, Oct 23, 2017 at 9:47 AM, Noralf Trønnes <noralf at tronnes.org> wrote:
> Add debugfs file that dumps info about the framebuffers and its planes.
> Also dump info about any connected gem object(s).
>
> Signed-off-by: Noralf Trønnes <noralf at tronnes.org>
> ---
>  drivers/gpu/drm/drm_debugfs.c     |  6 +++++
>  drivers/gpu/drm/drm_framebuffer.c | 51 +++++++++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/drm_gem.c         | 11 +++++++++
>  drivers/gpu/drm/drm_internal.h    |  4 +++
>  4 files changed, 72 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
> index c1807d5754b2..550f29de6c1f 100644
> --- a/drivers/gpu/drm/drm_debugfs.c
> +++ b/drivers/gpu/drm/drm_debugfs.c
> @@ -158,6 +158,12 @@ int drm_debugfs_init(struct drm_minor *minor, int minor_id,
>                 }
>         }
>
> +       ret = drm_framebuffer_debugfs_init(minor);
> +       if (ret) {
> +               DRM_ERROR("Failed to create framebuffer debugfs file\n");
> +               return ret;
> +       }
> +
>         if (dev->driver->debugfs_init) {
>                 ret = dev->driver->debugfs_init(minor);
>                 if (ret) {
> diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
> index af279844d7ce..ebdfe2b5689f 100644
> --- a/drivers/gpu/drm/drm_framebuffer.c
> +++ b/drivers/gpu/drm/drm_framebuffer.c
> @@ -25,7 +25,9 @@
>  #include <drm/drm_auth.h>
>  #include <drm/drm_framebuffer.h>
>  #include <drm/drm_atomic.h>
> +#include <drm/drm_print.h>
>
> +#include "drm_internal.h"
>  #include "drm_crtc_internal.h"
>
>  /**
> @@ -955,3 +957,52 @@ int drm_framebuffer_plane_height(int height,
>         return fb_plane_height(height, fb->format, plane);
>  }
>  EXPORT_SYMBOL(drm_framebuffer_plane_height);
> +
> +#ifdef CONFIG_DEBUG_FS
> +static void drm_framebuffer_print(struct drm_framebuffer *fb,
> +                                 struct drm_printer *p)
> +{
> +       unsigned int i;
> +
> +       drm_printf(p, "[FB:%d] %dx%d@%4.4s refcount=%d\n", fb->base.id,
> +                  fb->width, fb->height, (char *)&fb->format->format,
> +                  drm_framebuffer_read_refcount(fb));

Could you print the format modifier as well?

> +
> +       for (i = 0; i < fb->format->num_planes; i++) {
> +               drm_printf(p, "\t%u: offset=%d pitch=%d",
> +                          i, fb->offsets[i], fb->pitches[i]);
> +               if (fb->obj[i]) {
> +                       drm_printf(p, " GEM: ");
> +                       drm_gem_print(fb->obj[i], p);
> +               } else {
> +                       drm_printf(p, "\n");
> +               }
> +       }
> +}
> +
> +static int drm_framebuffer_info(struct seq_file *m, void *data)
> +{
> +       struct drm_info_node *node = m->private;
> +       struct drm_device *dev = node->minor->dev;
> +       struct drm_printer p = drm_seq_file_printer(m);
> +       struct drm_framebuffer *fb;
> +
> +       mutex_lock(&dev->mode_config.fb_lock);
> +       drm_for_each_fb(fb, dev)
> +               drm_framebuffer_print(fb, &p);
> +       mutex_unlock(&dev->mode_config.fb_lock);
> +
> +       return 0;
> +}
> +
> +static const struct drm_info_list drm_framebuffer_debugfs_list[] = {
> +       { "framebuffer", drm_framebuffer_info, 0 },

This is quite useful, thanks. Ultimately, it would be very nice to
have something like i915_display_info, but in a generic way. There's
not much there that's actually i915 specific:

localhost ~ # cat /sys/kernel/debug/dri/0/i915_display_info
CRTC info
---------
CRTC 36: pipe: A, active=yes, (size=2400x1600), dither=no, bpp=24
        fb: 88, pos: 0x0, size: 2400x1600
        encoder 57: type: TMDS-57, connectors:
                connector 58: type: eDP-1, status: connected, mode:
                id 0:"2400x1600" freq 60 clock 252750 hdisp 2400 hss
2448 hse 2480 htot 2560 vdisp 1600 vss 1603 vse 1613 vtot 1646 type
0x48 flags 0xa
        cursor visible? no, position (0, 0), size 0x0, addr
0x00000000, active? no
        num_scalers=2, scaler_users=0 scaler_id=-1, scalers[0]:
use=no, mode=0, scalers[1]: use=no, mode=0
        --Plane id 27: type=PRI, crtc_pos=   0x   0,
crtc_size=2400x1600, src_pos=0.0000x0.0000,
src_size=2400.0000x1600.0000, format=XR24 little-endian (0x34325258),
rotation=0 (0x00000001)
        --Plane id 30: type=OVL, crtc_pos=   0x   0, crtc_size=   0x
0, src_pos=0.0000x0.0000, src_size=0.0000x0.0000, format=N/A,
rotation=0 (0x00000001)
        --Plane id 33: type=CUR, crtc_pos=   0x   0, crtc_size=   0x
0, src_pos=0.0000x0.0000, src_size=0.0000x0.0000, format=N/A,
rotation=0 (0x00000001)
        underrun reporting: cpu=yes pch=yes
CRTC 46: pipe: B, active=no, (size=0x0), dither=no, bpp=0
        underrun reporting: cpu=yes pch=yes
CRTC 56: pipe: C, active=no, (size=0x0), dither=no, bpp=0
        underrun reporting: cpu=yes pch=yes

Connector info
--------------
connector 58: type eDP-1, status: connected
        name:
        physical dimensions: 260x170mm
        subpixel order: Unknown
        CEA rev: 0
        DPCD rev: 12
        audio support: no
        fixed mode:
                id 61:"2400x1600" freq 60 clock 252750 hdisp 2400 hss
2448 hse 2480 htot 2560 vdisp 1600 vss 1603 vse 1613 vtot 1646 type
0x48 flags 0xa
        DP branch device present: no
        modes:
                id 59:"2400x1600" freq 60 clock 252750 hdisp 2400 hss
2448 hse 2480 htot 2560 vdisp 1600 vss 1603 vse 1613 vtot 1646 type
0x48 flags 0xa
connector 66: type DP-1, status: disconnected
        DPCD rev: 0
        audio support: no
        DP branch device present: no
        modes:
connector 70: type HDMI-A-1, status: disconnected
        audio support: no
        modes:
connector 73: type DP-2, status: disconnected
        DPCD rev: 0
        audio support: no
        DP branch device present: no
        modes:
connector 77: type HDMI-A-2, status: disconnected
        audio support: no
        modes:

Kristian

> +};
> +
> +int drm_framebuffer_debugfs_init(struct drm_minor *minor)
> +{
> +       return drm_debugfs_create_files(drm_framebuffer_debugfs_list,
> +                               ARRAY_SIZE(drm_framebuffer_debugfs_list),
> +                               minor->debugfs_root, minor);
> +}
> +#endif
> diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
> index 55d6182555c7..f42977b28701 100644
> --- a/drivers/gpu/drm/drm_gem.c
> +++ b/drivers/gpu/drm/drm_gem.c
> @@ -40,6 +40,7 @@
>  #include <drm/drmP.h>
>  #include <drm/drm_vma_manager.h>
>  #include <drm/drm_gem.h>
> +#include <drm/drm_print.h>
>  #include "drm_internal.h"
>
>  /** @file drm_gem.c
> @@ -1040,3 +1041,13 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
>         return ret;
>  }
>  EXPORT_SYMBOL(drm_gem_mmap);
> +
> +#ifdef CONFIG_DEBUG_FS
> +void drm_gem_print(const struct drm_gem_object *obj, struct drm_printer *p)
> +{
> +       drm_printf(p, "name=%d refcount=%d start=%08lx size=%zu%s\n",
> +                  obj->name, kref_read(&obj->refcount),
> +                  drm_vma_node_start(&obj->vma_node), obj->size,
> +                  obj->import_attach ? " (imported)" : "");
> +}
> +#endif
> diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
> index fbc3f308fa19..7f4564419bf4 100644
> --- a/drivers/gpu/drm/drm_internal.h
> +++ b/drivers/gpu/drm/drm_internal.h
> @@ -106,6 +106,7 @@ int drm_gem_open_ioctl(struct drm_device *dev, void *data,
>                        struct drm_file *file_priv);
>  void drm_gem_open(struct drm_device *dev, struct drm_file *file_private);
>  void drm_gem_release(struct drm_device *dev, struct drm_file *file_private);
> +void drm_gem_print(const struct drm_gem_object *obj, struct drm_printer *p);
>
>  /* drm_debugfs.c drm_debugfs_crc.c */
>  #if defined(CONFIG_DEBUG_FS)
> @@ -173,3 +174,6 @@ int drm_syncobj_reset_ioctl(struct drm_device *dev, void *data,
>                             struct drm_file *file_private);
>  int drm_syncobj_signal_ioctl(struct drm_device *dev, void *data,
>                              struct drm_file *file_private);
> +
> +/* drm_framebuffer.c */
> +int drm_framebuffer_debugfs_init(struct drm_minor *minor);
> --
> 2.14.2
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list