On Tue, 2024-01-16 at 15:07 +0200, Jani Nikula wrote: > We've lacked a device specific debug printer. Add one. Take category > into account too. > > __builtin_return_address(0) is inaccurate here, so don't use it. If > necessary, we can later pass __func__ to drm_dbg_printer() by wrapping > it inside a macro. > > Signed-off-by: Jani Nikula <jani.nikula@xxxxxxxxx> > --- > drivers/gpu/drm/drm_print.c | 21 +++++++++++++++++++++ > include/drm/drm_print.h | 24 ++++++++++++++++++++++++ > 2 files changed, 45 insertions(+) > > diff --git a/drivers/gpu/drm/drm_print.c b/drivers/gpu/drm/drm_print.c > index 91dbcdeaad3f..673b29c732ea 100644 > --- a/drivers/gpu/drm/drm_print.c > +++ b/drivers/gpu/drm/drm_print.c > @@ -189,6 +189,27 @@ void __drm_printfn_debug(struct drm_printer *p, struct va_format *vaf) > } > EXPORT_SYMBOL(__drm_printfn_debug); > > +void __drm_printfn_dbg(struct drm_printer *p, struct va_format *vaf) > +{ > + const struct drm_device *drm = p->arg; > + const struct device *dev = drm ? drm->dev : NULL; > + enum drm_debug_category category = p->category; > + const char *prefix = p->prefix ?: ""; > + const char *prefix_pad = p->prefix ? " " : ""; > + > + if (!__drm_debug_enabled(category)) > + return; > + > + /* Note: __builtin_return_address(0) is useless here. */ > + if (dev) > + dev_printk(KERN_DEBUG, dev, "[" DRM_NAME "]%s%s %pV", > + prefix_pad, prefix, vaf); > + else > + printk(KERN_DEBUG "[" DRM_NAME "]%s%s %pV", > + prefix_pad, prefix, vaf); > +} > +EXPORT_SYMBOL(__drm_printfn_dbg); > + > void __drm_printfn_err(struct drm_printer *p, struct va_format *vaf) > { > struct drm_device *drm = p->arg; > diff --git a/include/drm/drm_print.h b/include/drm/drm_print.h > index b8b4cb9bb878..27e23c06dad4 100644 > --- a/include/drm/drm_print.h > +++ b/include/drm/drm_print.h > @@ -176,6 +176,7 @@ struct drm_printer { > void (*puts)(struct drm_printer *p, const char *str); > void *arg; > const char *prefix; > + enum drm_debug_category category; > }; > > void __drm_printfn_coredump(struct drm_printer *p, struct va_format *vaf); > @@ -184,6 +185,7 @@ void __drm_printfn_seq_file(struct drm_printer *p, struct va_format *vaf); > void __drm_puts_seq_file(struct drm_printer *p, const char *str); > void __drm_printfn_info(struct drm_printer *p, struct va_format *vaf); > void __drm_printfn_debug(struct drm_printer *p, struct va_format *vaf); > +void __drm_printfn_dbg(struct drm_printer *p, struct va_format *vaf); I was wondering why you had both _debug() and _dbg() functions here, but I see your goal is to remove _debug() at the end (done in the last patch in the series). > void __drm_printfn_err(struct drm_printer *p, struct va_format *vaf); > > __printf(2, 3) > @@ -331,6 +333,28 @@ static inline struct drm_printer drm_debug_printer(const char *prefix) > return p; > } > > +/** > + * drm_dbg_printer - construct a &drm_printer for drm device specific output > + * @drm: the &struct drm_device pointer, or NULL > + * @category: the debug category to use > + * @prefix: debug output prefix, or NULL for no prefix > + * > + * RETURNS: > + * The &drm_printer object > + */ > +static inline struct drm_printer drm_dbg_printer(struct drm_device *drm, > + enum drm_debug_category category, > + const char *prefix) > +{ > + struct drm_printer p = { > + .printfn = __drm_printfn_dbg, > + .arg = drm, > + .prefix = prefix, > + .category = category, > + }; > + return p; > +} > + > /** > * drm_err_printer - construct a &drm_printer that outputs to drm_err() > * @drm: the &struct drm_device pointer Reviewed-by: Luca Coelho <luciano.coelho@xxxxxxxxx> -- Cheers, Luca.