// SPDX-License-Identifier: GPL-2.0-only
/*
 * Intel MIC Platform Software Stack (MPSS)
 *
 * Copyright(c) 2015 Intel Corporation.
 *
 * Intel MIC Coprocessor State Management (COSM) Driver
 */

#include <linux/debugfs.h>
#include <linux/slab.h>
#include <linux/io.h>
#include "cosm_main.h"

/* Debugfs parent dir */
static struct dentry *cosm_dbg;

/*
 * log_buf_show - Display MIC kernel log buffer
 *
 * log_buf addr/len is read from System.map by user space
 * and populated in sysfs entries.
 */
static int log_buf_show(struct seq_file *s, void *unused)
{
	void __iomem *log_buf_va;
	int __iomem *log_buf_len_va;
	struct cosm_device *cdev = s->private;
	void *kva;
	int size;
	u64 aper_offset;

	if (!cdev || !cdev->log_buf_addr || !cdev->log_buf_len)
		goto done;

	mutex_lock(&cdev->cosm_mutex);
	switch (cdev->state) {
	case MIC_BOOTING:
	case MIC_ONLINE:
	case MIC_SHUTTING_DOWN:
		break;
	default:
		goto unlock;
	}

	/*
	 * Card kernel will never be relocated and any kernel text/data mapping
	 * can be translated to phys address by subtracting __START_KERNEL_map.
	 */
	aper_offset = (u64)cdev->log_buf_len - __START_KERNEL_map;
	log_buf_len_va = cdev->hw_ops->aper(cdev)->va + aper_offset;
	aper_offset = (u64)cdev->log_buf_addr - __START_KERNEL_map;
	log_buf_va = cdev->hw_ops->aper(cdev)->va + aper_offset;

	size = ioread32(log_buf_len_va);
	kva = kmalloc(size, GFP_KERNEL);
	if (!kva)
		goto unlock;

	memcpy_fromio(kva, log_buf_va, size);
	seq_write(s, kva, size);
	kfree(kva);
unlock:
	mutex_unlock(&cdev->cosm_mutex);
done:
	return 0;
}

DEFINE_SHOW_ATTRIBUTE(log_buf);

/*
 * force_reset_show - Force MIC reset
 *
 * Invokes the force_reset COSM bus op instead of the standard reset
 * op in case a force reset of the MIC device is required
 */
static int force_reset_show(struct seq_file *s, void *pos)
{
	struct cosm_device *cdev = s->private;

	cosm_stop(cdev, true);
	return 0;
}

DEFINE_SHOW_ATTRIBUTE(force_reset);

void cosm_create_debug_dir(struct cosm_device *cdev)
{
	char name[16];

	if (!cosm_dbg)
		return;

	scnprintf(name, sizeof(name), "mic%d", cdev->index);
	cdev->dbg_dir = debugfs_create_dir(name, cosm_dbg);

	debugfs_create_file("log_buf", 0444, cdev->dbg_dir, cdev,
			    &log_buf_fops);
	debugfs_create_file("force_reset", 0444, cdev->dbg_dir, cdev,
			    &force_reset_fops);
}

void cosm_delete_debug_dir(struct cosm_device *cdev)
{
	debugfs_remove_recursive(cdev->dbg_dir);
}

void cosm_init_debugfs(void)
{
	cosm_dbg = debugfs_create_dir(KBUILD_MODNAME, NULL);
}

void cosm_exit_debugfs(void)
{
	debugfs_remove(cosm_dbg);
}
