/*
 * Copyright (C) 2016 Red Hat
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 * Authors:
 * Rob Clark <robdclark@gmail.com>
 */

#define DEBUG /* for pr_debug() */

#include <stdarg.h>

#include <linux/io.h>
#include <linux/moduleparam.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/trace.h>

#include <drm/drm.h>
#include <drm/drm_drv.h>
#include <drm/drm_print.h>

/*
 * __drm_debug_syslog: Enable debug output to system logs
 * Bitmask of DRM_UT_x. See include/drm/drm_print.h for details.
 */
unsigned int __drm_debug_syslog;
EXPORT_SYMBOL(__drm_debug_syslog);

/*
 * __drm_debug_trace: Enable debug output in drm tracing instance.
 * Bitmask of DRM_UT_x. See include/drm/drm_print.h for details.
 */
unsigned int __drm_debug_trace;
EXPORT_SYMBOL(__drm_debug_trace);

#define DEBUG_PARM_DESC(dst) \
"Enable debug output to " dst ", where each bit enables a debug category.\n" \
"\t\tBit 0 (0x01)  will enable CORE messages (drm core code)\n" \
"\t\tBit 1 (0x02)  will enable DRIVER messages (drm controller code)\n" \
"\t\tBit 2 (0x04)  will enable KMS messages (modesetting code)\n" \
"\t\tBit 3 (0x08)  will enable PRIME messages (prime code)\n" \
"\t\tBit 4 (0x10)  will enable ATOMIC messages (atomic code)\n" \
"\t\tBit 5 (0x20)  will enable VBL messages (vblank code)\n" \
"\t\tBit 7 (0x80)  will enable LEASE messages (leasing code)\n" \
"\t\tBit 8 (0x100) will enable DP messages (displayport code)"

MODULE_PARM_DESC(debug, DEBUG_PARM_DESC("syslog"));
module_param_named(debug, __drm_debug_syslog, int, 0600);

MODULE_PARM_DESC(trace, DEBUG_PARM_DESC("tracefs"));
module_param_named(trace, __drm_debug_trace, int, 0600);

#ifdef CONFIG_TRACING
struct trace_array *trace_arr;
#endif

void __drm_puts_coredump(struct drm_printer *p, const char *str)
{
	struct drm_print_iterator *iterator = p->arg;
	ssize_t len;

	if (!iterator->remain)
		return;

	if (iterator->offset < iterator->start) {
		ssize_t copy;

		len = strlen(str);

		if (iterator->offset + len <= iterator->start) {
			iterator->offset += len;
			return;
		}

		copy = len - (iterator->start - iterator->offset);

		if (copy > iterator->remain)
			copy = iterator->remain;

		/* Copy out the bit of the string that we need */
		memcpy(iterator->data,
			str + (iterator->start - iterator->offset), copy);

		iterator->offset = iterator->start + copy;
		iterator->remain -= copy;
	} else {
		ssize_t pos = iterator->offset - iterator->start;

		len = min_t(ssize_t, strlen(str), iterator->remain);

		memcpy(iterator->data + pos, str, len);

		iterator->offset += len;
		iterator->remain -= len;
	}
}
EXPORT_SYMBOL(__drm_puts_coredump);

void __drm_printfn_coredump(struct drm_printer *p, struct va_format *vaf)
{
	struct drm_print_iterator *iterator = p->arg;
	size_t len;
	char *buf;

	if (!iterator->remain)
		return;

	/* Figure out how big the string will be */
	len = snprintf(NULL, 0, "%pV", vaf);

	/* This is the easiest path, we've already advanced beyond the offset */
	if (iterator->offset + len <= iterator->start) {
		iterator->offset += len;
		return;
	}

	/* Then check if we can directly copy into the target buffer */
	if ((iterator->offset >= iterator->start) && (len < iterator->remain)) {
		ssize_t pos = iterator->offset - iterator->start;

		snprintf(((char *) iterator->data) + pos,
			iterator->remain, "%pV", vaf);

		iterator->offset += len;
		iterator->remain -= len;

		return;
	}

	/*
	 * Finally, hit the slow path and make a temporary string to copy over
	 * using _drm_puts_coredump
	 */
	buf = kmalloc(len + 1, GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY);
	if (!buf)
		return;

	snprintf(buf, len + 1, "%pV", vaf);
	__drm_puts_coredump(p, (const char *) buf);

	kfree(buf);
}
EXPORT_SYMBOL(__drm_printfn_coredump);

void __drm_puts_seq_file(struct drm_printer *p, const char *str)
{
	seq_puts(p->arg, str);
}
EXPORT_SYMBOL(__drm_puts_seq_file);

void __drm_printfn_seq_file(struct drm_printer *p, struct va_format *vaf)
{
	seq_printf(p->arg, "%pV", vaf);
}
EXPORT_SYMBOL(__drm_printfn_seq_file);

void __drm_printfn_info(struct drm_printer *p, struct va_format *vaf)
{
	dev_info(p->arg, "[" DRM_NAME "] %pV", vaf);
}
EXPORT_SYMBOL(__drm_printfn_info);

void __drm_printfn_debug_syslog(struct drm_printer *p, struct va_format *vaf)
{
	pr_debug("%s %pV", p->prefix, vaf);
}
EXPORT_SYMBOL(__drm_printfn_debug_syslog);

void __drm_printfn_trace(struct drm_printer *p, struct va_format *vaf)
{
	drm_trace_printf("%s %pV", p->prefix, vaf);
}
EXPORT_SYMBOL(__drm_printfn_trace);

void __drm_printfn_debug_syslog_and_trace(struct drm_printer *p,
					   struct va_format *vaf)
{
	pr_debug("%s %pV", p->prefix, vaf);
	drm_trace_printf("%s %pV", p->prefix, vaf);
}
EXPORT_SYMBOL(__drm_printfn_debug_syslog_and_trace);

void __drm_printfn_err(struct drm_printer *p, struct va_format *vaf)
{
	pr_err("*ERROR* %s %pV", p->prefix, vaf);
}
EXPORT_SYMBOL(__drm_printfn_err);

void __drm_printfn_noop(struct drm_printer *p, struct va_format *vaf)
{
}
EXPORT_SYMBOL(__drm_printfn_noop);

/**
 * drm_puts - print a const string to a &drm_printer stream
 * @p: the &drm printer
 * @str: const string
 *
 * Allow &drm_printer types that have a constant string
 * option to use it.
 */
void drm_puts(struct drm_printer *p, const char *str)
{
	if (p->puts)
		p->puts(p, str);
	else
		drm_printf(p, "%s", str);
}
EXPORT_SYMBOL(drm_puts);

/**
 * drm_printf - print to a &drm_printer stream
 * @p: the &drm_printer
 * @f: format string
 */
void drm_printf(struct drm_printer *p, const char *f, ...)
{
	va_list args;

	va_start(args, f);
	drm_vprintf(p, f, &args);
	va_end(args);
}
EXPORT_SYMBOL(drm_printf);

void drm_dev_printk(const struct device *dev, const char *level,
		    const char *format, ...)
{
	struct va_format vaf;
	va_list args;

	va_start(args, format);
	vaf.fmt = format;
	vaf.va = &args;
	drm_trace_printf("%s%s[" DRM_NAME ":%ps] %pV",
			 dev ? dev_name(dev) : "", dev ? " " : "",
			 __builtin_return_address(0), &vaf);
	va_end(args);

	va_start(args, format);
	vaf.fmt = format;
	vaf.va = &args;

	if (dev)
		dev_printk(level, dev, "[" DRM_NAME ":%ps] %pV",
			   __builtin_return_address(0), &vaf);
	else
		printk("%s" "[" DRM_NAME ":%ps] %pV",
		       level, __builtin_return_address(0), &vaf);

	va_end(args);
}
EXPORT_SYMBOL(drm_dev_printk);

void drm_dev_dbg(const struct device *dev, enum drm_debug_category category,
		 const char *format, ...)
{
	struct va_format vaf;
	va_list args;

	if (drm_debug_syslog_enabled(category)) {
		va_start(args, format);
		vaf.fmt = format;
		vaf.va = &args;

		if (dev)
			dev_printk(KERN_DEBUG, dev, "[" DRM_NAME ":%ps] %pV",
				__builtin_return_address(0), &vaf);
		else
			printk(KERN_DEBUG "[" DRM_NAME ":%ps] %pV",
			__builtin_return_address(0), &vaf);

		va_end(args);
	}

	if (drm_debug_trace_enabled(category)) {
		va_start(args, format);
		vaf.fmt = format;
		vaf.va = &args;
		drm_trace_printf("%s%s[" DRM_NAME ":%ps] %pV",
				 dev ? dev_name(dev) : "", dev ? " " : "",
				 __builtin_return_address(0), &vaf);
		va_end(args);
	}
}
EXPORT_SYMBOL(drm_dev_dbg);

void __drm_dbg(enum drm_debug_category category, const char *format, ...)
{
	struct va_format vaf;
	va_list args;

	if (drm_debug_syslog_enabled(category)) {
		va_start(args, format);
		vaf.fmt = format;
		vaf.va = &args;

		printk(KERN_DEBUG "[" DRM_NAME ":%ps] %pV",
		__builtin_return_address(0), &vaf);

		va_end(args);
	}

	if (drm_debug_trace_enabled(category)) {
		va_start(args, format);
		vaf.fmt = format;
		vaf.va = &args;
		drm_trace_printf("[" DRM_NAME ":%ps] %pV",
				 __builtin_return_address(0), &vaf);
		va_end(args);
	}
}
EXPORT_SYMBOL(__drm_dbg);

void __drm_err(const char *format, ...)
{
	struct va_format vaf;
	va_list args;

	va_start(args, format);
	vaf.fmt = format;
	vaf.va = &args;

	printk(KERN_ERR "[" DRM_NAME ":%ps] *ERROR* %pV",
	       __builtin_return_address(0), &vaf);

	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);


/**
 * DOC: DRM Tracing
 *
 * *tl;dr* DRM tracing is a lightweight alternative to traditional DRM debug
 * logging.
 *
 * While DRM logging is quite convenient when reproducing a specific issue, it
 * doesn't help when something goes wrong unexpectedly. There are a couple
 * reasons why one does not want to enable DRM logging at all times:
 *
 * 1. We don't want to overwhelm syslog with drm spam, others have to use it too
 * 2. Console logging is slow
 *
 * DRM tracing aims to solve both these problems.
 *
 * To use DRM tracing, set the drm.trace module parameter (via cmdline or sysfs)
 * to a DRM debug category mask (this is a bitmask of &drm_debug_category
 * values):
 * ::
 *
 *    eg: echo 0x106 > /sys/module/drm/parameters/trace
 *
 * Once active, all log messages in the specified categories will be written to
 * the DRM trace. Once at capacity, the trace will overwrite old messages with
 * new ones. At any point, one can read the trace file to extract the previous N
 * DRM messages:
 * ::
 *
 *    eg: cat /sys/kernel/tracing/instances/drm/trace
 *
 * Considerations
 * **************
 * The trace is subsystem wide, so if you have multiple devices active, they
 * will be adding logs to the same trace.
 *
 * The contents of the DRM Trace are **not** considered UABI. **DO NOT depend on
 * the values of these traces in your userspace.** These traces are intended for
 * entertainment purposes only. The contents of these logs carry no warranty,
 * expressed or implied.
 */


#ifdef CONFIG_TRACING

/**
 * drm_trace_init - initializes the drm trace array
 *
 * This function fetches (or creates) the drm trace array. This should be called
 * once on drm subsystem creation and matched with drm_trace_cleanup().
 */
void drm_trace_init(void)
{
	int ret;

	trace_arr = trace_array_get_by_name("drm", "");
	if (!trace_arr)
		return;

	ret = trace_array_init_printk(trace_arr);
	if (ret)
		drm_trace_cleanup();
}
EXPORT_SYMBOL(drm_trace_init);

/**
 * drm_trace_printf - adds an entry to the drm tracefs instance
 * @format: printf format of the message to add to the trace
 *
 * This function adds a new entry in the drm tracefs instance
 */
void drm_trace_printf(const char *format, ...)
{
	struct va_format vaf;
	va_list args;

	if (!trace_arr)
		return;

	va_start(args, format);
	vaf.fmt = format;
	vaf.va = &args;
	trace_array_printk(trace_arr, _THIS_IP_, "%pV", &vaf);
	va_end(args);
}

/**
 * drm_trace_cleanup - destroys the drm trace array
 *
 * This function destroys the drm trace array created with drm_trace_init. This
 * should be called once on drm subsystem close and matched with
 * drm_trace_init().
 */
void drm_trace_cleanup(void)
{
	if (trace_arr) {
		trace_array_put(trace_arr);
		trace_array_destroy(trace_arr);
		trace_arr = NULL;
	}
}
EXPORT_SYMBOL(drm_trace_cleanup);
#endif
