va_end(args);
 }
 EXPORT_SYMBOL(drm_err);
+
+/**
+ * drm_print_regset32 - print the contents of registers to a
+ * &drm_printer stream.
+ *
+ * @p: the &drm printer
+ * @regset: the list of registers to print.
+ *
+ * Often in driver debug, it's useful to be able to either capture the
+ * contents of registers in the steady state using debugfs or at
+ * specific points during operation.  This lets the driver have a
+ * single list of registers for both.
+ */
+void drm_print_regset32(struct drm_printer *p, struct debugfs_regset32 *regset)
+{
+       int namelen = 0;
+       int i;
+
+       for (i = 0; i < regset->nregs; i++)
+               namelen = max(namelen, (int)strlen(regset->regs[i].name));
+
+       for (i = 0; i < regset->nregs; i++) {
+               drm_printf(p, "%*s = 0x%08x\n",
+                          namelen, regset->regs[i].name,
+                          readl(regset->base + regset->regs[i].offset));
+       }
+}
+EXPORT_SYMBOL(drm_print_regset32);
 
 #include <linux/printk.h>
 #include <linux/seq_file.h>
 #include <linux/device.h>
+#include <linux/debugfs.h>
 
 /**
  * DOC: print
 __printf(2, 3)
 void drm_printf(struct drm_printer *p, const char *f, ...);
 void drm_puts(struct drm_printer *p, const char *str);
+void drm_print_regset32(struct drm_printer *p, struct debugfs_regset32 *regset);
 
 __printf(2, 0)
 /**