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

drm: Add a helper function for printing a debugfs_regset32.

The debugfs_regset32 is nice to use for reducing boilerplate in
dumping a bunch of regs in debugfs, but we also want to be able to
print to dmesg them at runtime for driver debugging. drm_printer lets
us format debugfs and the printk the same way.

v2: Add some kerneldoc for the function (requested by danvet)

Signed-off-by: Eric Anholt <eric@anholt.net>
Link: https://patchwork.freedesktop.org/patch/msgid/20190220210343.28157-1-eric@anholt.net
Reviewed-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com> (v1)
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>

+30
+28
drivers/gpu/drm/drm_print.c
··· 253 253 va_end(args); 254 254 } 255 255 EXPORT_SYMBOL(drm_err); 256 + 257 + /** 258 + * drm_print_regset32 - print the contents of registers to a 259 + * &drm_printer stream. 260 + * 261 + * @p: the &drm printer 262 + * @regset: the list of registers to print. 263 + * 264 + * Often in driver debug, it's useful to be able to either capture the 265 + * contents of registers in the steady state using debugfs or at 266 + * specific points during operation. This lets the driver have a 267 + * single list of registers for both. 268 + */ 269 + void drm_print_regset32(struct drm_printer *p, struct debugfs_regset32 *regset) 270 + { 271 + int namelen = 0; 272 + int i; 273 + 274 + for (i = 0; i < regset->nregs; i++) 275 + namelen = max(namelen, (int)strlen(regset->regs[i].name)); 276 + 277 + for (i = 0; i < regset->nregs; i++) { 278 + drm_printf(p, "%*s = 0x%08x\n", 279 + namelen, regset->regs[i].name, 280 + readl(regset->base + regset->regs[i].offset)); 281 + } 282 + } 283 + EXPORT_SYMBOL(drm_print_regset32);
+2
include/drm/drm_print.h
··· 30 30 #include <linux/printk.h> 31 31 #include <linux/seq_file.h> 32 32 #include <linux/device.h> 33 + #include <linux/debugfs.h> 33 34 34 35 /** 35 36 * DOC: print ··· 85 84 __printf(2, 3) 86 85 void drm_printf(struct drm_printer *p, const char *f, ...); 87 86 void drm_puts(struct drm_printer *p, const char *str); 87 + void drm_print_regset32(struct drm_printer *p, struct debugfs_regset32 *regset); 88 88 89 89 __printf(2, 0) 90 90 /**