/*
 * 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 <linux/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);

/**
 * drm_print_bits - print bits to a &drm_printer stream
 *
 * Print bits (in flag fields for example) in human readable form.
 *
 * @p: the &drm_printer
 * @value: field value.
 * @bits: Array with bit names.
 * @nbits: Size of bit names array.
 */
void drm_print_bits(struct drm_printer *p, unsigned long value,
		    const char * const bits[], unsigned int nbits)
{
	bool first = true;
	unsigned int i;

	if (WARN_ON_ONCE(nbits > BITS_PER_TYPE(value)))
		nbits = BITS_PER_TYPE(value);

	for_each_set_bit(i, &value, nbits) {
		if (WARN_ON_ONCE(!bits[i]))
			continue;
		drm_printf(p, "%s%s", first ? "" : ",",
			   bits[i]);
		first = false;
	}
	if (first)
		drm_printf(p, "(none)");
}
EXPORT_SYMBOL(drm_print_bits);

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

	va_start(args, format);
	vaf.fmt = format;
	vaf.va = &args;
	drm_trace_printf("[" 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;

	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