diff options
| author | Rob Clark <robdclark@gmail.com> | 2012-12-10 11:46:43 -0500 |
|---|---|---|
| committer | Rob Clark <robdclark@gmail.com> | 2013-02-17 17:55:42 -0500 |
| commit | 6f646095ec2f5d38a6429dd896cb2d5cbbb776dc (patch) | |
| tree | 41444767a379449c4e57f60dbee6d3bf2c670904 /drivers/gpu/drm | |
| parent | 21a245d2d62ef617978316203af032d499805cd2 (diff) | |
drm/cma: add debugfs helpers
Add helper to display fb's which can be used directly in drm_info_list:
static struct drm_info_list foo_debugfs_list[] = {
...
{ "fb", drm_fb_cma_debugfs_show, 0 },
};
to display information about CMA fb objects, as well as a
drm_gem_cma_describe() which can be used if the driver bothers to keep
a list of CMA GEM objects.
Signed-off-by: Rob Clark <robdclark@gmail.com>
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/drm_fb_cma_helper.c | 53 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_gem_cma_helper.c | 21 |
2 files changed, 74 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c index ef68e34b16ec..8044c5e56665 100644 --- a/drivers/gpu/drm/drm_fb_cma_helper.c +++ b/drivers/gpu/drm/drm_fb_cma_helper.c | |||
| @@ -180,6 +180,59 @@ struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb, | |||
| 180 | } | 180 | } |
| 181 | EXPORT_SYMBOL_GPL(drm_fb_cma_get_gem_obj); | 181 | EXPORT_SYMBOL_GPL(drm_fb_cma_get_gem_obj); |
| 182 | 182 | ||
| 183 | #ifdef CONFIG_DEBUG_FS | ||
| 184 | /** | ||
| 185 | * drm_fb_cma_describe() - Helper to dump information about a single | ||
| 186 | * CMA framebuffer object | ||
| 187 | */ | ||
| 188 | void drm_fb_cma_describe(struct drm_framebuffer *fb, struct seq_file *m) | ||
| 189 | { | ||
| 190 | struct drm_fb_cma *fb_cma = to_fb_cma(fb); | ||
| 191 | int i, n = drm_format_num_planes(fb->pixel_format); | ||
| 192 | |||
| 193 | seq_printf(m, "fb: %dx%d@%4.4s\n", fb->width, fb->height, | ||
| 194 | (char *)&fb->pixel_format); | ||
| 195 | |||
| 196 | for (i = 0; i < n; i++) { | ||
| 197 | seq_printf(m, " %d: offset=%d pitch=%d, obj: ", | ||
| 198 | i, fb->offsets[i], fb->pitches[i]); | ||
| 199 | drm_gem_cma_describe(fb_cma->obj[i], m); | ||
| 200 | } | ||
| 201 | } | ||
| 202 | EXPORT_SYMBOL_GPL(drm_fb_cma_describe); | ||
| 203 | |||
| 204 | /** | ||
| 205 | * drm_fb_cma_debugfs_show() - Helper to list CMA framebuffer objects | ||
| 206 | * in debugfs. | ||
| 207 | */ | ||
| 208 | int drm_fb_cma_debugfs_show(struct seq_file *m, void *arg) | ||
| 209 | { | ||
| 210 | struct drm_info_node *node = (struct drm_info_node *) m->private; | ||
| 211 | struct drm_device *dev = node->minor->dev; | ||
| 212 | struct drm_framebuffer *fb; | ||
| 213 | int ret; | ||
| 214 | |||
| 215 | ret = mutex_lock_interruptible(&dev->mode_config.mutex); | ||
| 216 | if (ret) | ||
| 217 | return ret; | ||
| 218 | |||
| 219 | ret = mutex_lock_interruptible(&dev->struct_mutex); | ||
| 220 | if (ret) { | ||
| 221 | mutex_unlock(&dev->mode_config.mutex); | ||
| 222 | return ret; | ||
| 223 | } | ||
| 224 | |||
| 225 | list_for_each_entry(fb, &dev->mode_config.fb_list, head) | ||
| 226 | drm_fb_cma_describe(fb, m); | ||
| 227 | |||
| 228 | mutex_unlock(&dev->struct_mutex); | ||
| 229 | mutex_unlock(&dev->mode_config.mutex); | ||
| 230 | |||
| 231 | return 0; | ||
| 232 | } | ||
| 233 | EXPORT_SYMBOL_GPL(drm_fb_cma_debugfs_show); | ||
| 234 | #endif | ||
| 235 | |||
| 183 | static struct fb_ops drm_fbdev_cma_ops = { | 236 | static struct fb_ops drm_fbdev_cma_ops = { |
| 184 | .owner = THIS_MODULE, | 237 | .owner = THIS_MODULE, |
| 185 | .fb_fillrect = sys_fillrect, | 238 | .fb_fillrect = sys_fillrect, |
diff --git a/drivers/gpu/drm/drm_gem_cma_helper.c b/drivers/gpu/drm/drm_gem_cma_helper.c index 1aa8fee1e865..0a7e011509bd 100644 --- a/drivers/gpu/drm/drm_gem_cma_helper.c +++ b/drivers/gpu/drm/drm_gem_cma_helper.c | |||
| @@ -249,3 +249,24 @@ int drm_gem_cma_dumb_destroy(struct drm_file *file_priv, | |||
| 249 | return drm_gem_handle_delete(file_priv, handle); | 249 | return drm_gem_handle_delete(file_priv, handle); |
| 250 | } | 250 | } |
| 251 | EXPORT_SYMBOL_GPL(drm_gem_cma_dumb_destroy); | 251 | EXPORT_SYMBOL_GPL(drm_gem_cma_dumb_destroy); |
| 252 | |||
| 253 | #ifdef CONFIG_DEBUG_FS | ||
| 254 | void drm_gem_cma_describe(struct drm_gem_cma_object *cma_obj, struct seq_file *m) | ||
| 255 | { | ||
| 256 | struct drm_gem_object *obj = &cma_obj->base; | ||
| 257 | struct drm_device *dev = obj->dev; | ||
| 258 | uint64_t off = 0; | ||
| 259 | |||
| 260 | WARN_ON(!mutex_is_locked(&dev->struct_mutex)); | ||
| 261 | |||
| 262 | if (obj->map_list.map) | ||
| 263 | off = (uint64_t)obj->map_list.hash.key; | ||
| 264 | |||
| 265 | seq_printf(m, "%2d (%2d) %08llx %08Zx %p %d", | ||
| 266 | obj->name, obj->refcount.refcount.counter, | ||
| 267 | off, cma_obj->paddr, cma_obj->vaddr, obj->size); | ||
| 268 | |||
| 269 | seq_printf(m, "\n"); | ||
| 270 | } | ||
| 271 | EXPORT_SYMBOL_GPL(drm_gem_cma_describe); | ||
| 272 | #endif | ||
