diff options
| author | Thierry Reding <thierry.reding@avionic-design.de> | 2013-02-13 10:13:16 -0500 |
|---|---|---|
| committer | Thierry Reding <thierry.reding@avionic-design.de> | 2013-02-22 02:21:37 -0500 |
| commit | e450fcc6669705ef49784080ac6dd8513df37763 (patch) | |
| tree | 1411de86b91f4407f3368b47b2c68ea6f6345b01 /drivers/gpu/drm | |
| parent | 84ff6b270893cd8b054bae371a315c905ffa3ac9 (diff) | |
drm/tegra: Add list of framebuffers to debugfs
This list is most useful to inspect whether framebuffer reference
counting works as expected. The code is loosely based on the i915
implementation.
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/tegra/drm.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c index 97485af6eaf9..181a370c56c1 100644 --- a/drivers/gpu/drm/tegra/drm.c +++ b/drivers/gpu/drm/tegra/drm.c | |||
| @@ -143,6 +143,45 @@ static void tegra_drm_preclose(struct drm_device *drm, struct drm_file *file) | |||
| 143 | tegra_dc_cancel_page_flip(crtc, file); | 143 | tegra_dc_cancel_page_flip(crtc, file); |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | #ifdef CONFIG_DEBUG_FS | ||
| 147 | static int tegra_debugfs_framebuffers(struct seq_file *s, void *data) | ||
| 148 | { | ||
| 149 | struct drm_info_node *node = (struct drm_info_node *)s->private; | ||
| 150 | struct drm_device *drm = node->minor->dev; | ||
| 151 | struct drm_framebuffer *fb; | ||
| 152 | |||
| 153 | mutex_lock(&drm->mode_config.fb_lock); | ||
| 154 | |||
| 155 | list_for_each_entry(fb, &drm->mode_config.fb_list, head) { | ||
| 156 | seq_printf(s, "%3d: user size: %d x %d, depth %d, %d bpp, refcount %d\n", | ||
| 157 | fb->base.id, fb->width, fb->height, fb->depth, | ||
| 158 | fb->bits_per_pixel, | ||
| 159 | atomic_read(&fb->refcount.refcount)); | ||
| 160 | } | ||
| 161 | |||
| 162 | mutex_unlock(&drm->mode_config.fb_lock); | ||
| 163 | |||
| 164 | return 0; | ||
| 165 | } | ||
| 166 | |||
| 167 | static struct drm_info_list tegra_debugfs_list[] = { | ||
| 168 | { "framebuffers", tegra_debugfs_framebuffers, 0 }, | ||
| 169 | }; | ||
| 170 | |||
| 171 | static int tegra_debugfs_init(struct drm_minor *minor) | ||
| 172 | { | ||
| 173 | return drm_debugfs_create_files(tegra_debugfs_list, | ||
| 174 | ARRAY_SIZE(tegra_debugfs_list), | ||
| 175 | minor->debugfs_root, minor); | ||
| 176 | } | ||
| 177 | |||
| 178 | static void tegra_debugfs_cleanup(struct drm_minor *minor) | ||
| 179 | { | ||
| 180 | drm_debugfs_remove_files(tegra_debugfs_list, | ||
| 181 | ARRAY_SIZE(tegra_debugfs_list), minor); | ||
| 182 | } | ||
| 183 | #endif | ||
| 184 | |||
| 146 | struct drm_driver tegra_drm_driver = { | 185 | struct drm_driver tegra_drm_driver = { |
| 147 | .driver_features = DRIVER_BUS_PLATFORM | DRIVER_MODESET | DRIVER_GEM, | 186 | .driver_features = DRIVER_BUS_PLATFORM | DRIVER_MODESET | DRIVER_GEM, |
| 148 | .load = tegra_drm_load, | 187 | .load = tegra_drm_load, |
| @@ -155,6 +194,11 @@ struct drm_driver tegra_drm_driver = { | |||
| 155 | .enable_vblank = tegra_drm_enable_vblank, | 194 | .enable_vblank = tegra_drm_enable_vblank, |
| 156 | .disable_vblank = tegra_drm_disable_vblank, | 195 | .disable_vblank = tegra_drm_disable_vblank, |
| 157 | 196 | ||
| 197 | #if defined(CONFIG_DEBUG_FS) | ||
| 198 | .debugfs_init = tegra_debugfs_init, | ||
| 199 | .debugfs_cleanup = tegra_debugfs_cleanup, | ||
| 200 | #endif | ||
| 201 | |||
| 158 | .gem_free_object = drm_gem_cma_free_object, | 202 | .gem_free_object = drm_gem_cma_free_object, |
| 159 | .gem_vm_ops = &drm_gem_cma_vm_ops, | 203 | .gem_vm_ops = &drm_gem_cma_vm_ops, |
| 160 | .dumb_create = drm_gem_cma_dumb_create, | 204 | .dumb_create = drm_gem_cma_dumb_create, |
