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 | |
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')
-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, |