Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

Rob Clark 6f646095 21a245d2

+83
+53
drivers/gpu/drm/drm_fb_cma_helper.c
··· 180 180 } 181 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 236 static struct fb_ops drm_fbdev_cma_ops = { 184 237 .owner = THIS_MODULE, 185 238 .fb_fillrect = sys_fillrect,
+21
drivers/gpu/drm/drm_gem_cma_helper.c
··· 249 249 return drm_gem_handle_delete(file_priv, handle); 250 250 } 251 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
+5
include/drm/drm_fb_cma_helper.h
··· 23 23 struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb, 24 24 unsigned int plane); 25 25 26 + #ifdef CONFIG_DEBUG_FS 27 + void drm_fb_cma_describe(struct drm_framebuffer *fb, struct seq_file *m); 28 + int drm_fb_cma_debugfs_show(struct seq_file *m, void *arg); 29 + #endif 30 + 26 31 #endif 27 32
+4
include/drm/drm_gem_cma_helper.h
··· 41 41 42 42 extern const struct vm_operations_struct drm_gem_cma_vm_ops; 43 43 44 + #ifdef CONFIG_DEBUG_FS 45 + void drm_gem_cma_describe(struct drm_gem_cma_object *obj, struct seq_file *m); 46 + #endif 47 + 44 48 #endif /* __DRM_GEM_CMA_HELPER_H__ */