Commit 9fd6f61a authored by Jani Nikula's avatar Jani Nikula
Browse files

drm/print: add drm_dbg_printer() for drm device specific printer



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: default avatarJani Nikula <jani.nikula@intel.com>
Reviewed-by: default avatarLuca Coelho <luciano.coelho@intel.com>
Acked-by: default avatarMaxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/48607d58e5cdf8341ffdd522257542fa2ce41a19.1705410327.git.jani.nikula@intel.com
parent 82195d48
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -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;
+24 −0
Original line number Diff line number Diff line
@@ -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);
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