// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Copyright (c) 2023 MediaTek Inc. All Rights Reserved.
 *
 * Author: Alvin Kuo <alvin.kuog@mediatek.com>
 */

#include <linux/debugfs.h>
#include <linux/uaccess.h>

#include "debugfs.h"
#include "internal.h"
#include "tops.h"
#include "trm-debugfs.h"
#include "trm.h"

struct dentry *trm_debugfs_root;

static int cpu_utilization_debug_read(struct seq_file *s, void *private)
{
	u32 cpu_utilization;
	enum core_id core;
	int ret;

	seq_puts(s, "CPU Utilization:\n");
	for (core = CORE_OFFLOAD_0; core <= CORE_MGMT; core++) {
		ret = mtk_trm_cpu_utilization(core, &cpu_utilization);
		if (ret) {
			if (core <= CORE_OFFLOAD_3)
				TOPS_ERR("fetch Core%d cpu utilization failed(%d)\n", core, ret);
			else
				TOPS_ERR("fetch CoreM cpu utilization failed(%d)\n", ret);

			return ret;
		}

		if (core <= CORE_OFFLOAD_3)
			seq_printf(s, "Core%d\t\t%u%%\n", core, cpu_utilization);
		else
			seq_printf(s, "CoreM\t\t%u%%\n", cpu_utilization);
	}

	return 0;
}

static int cpu_utilization_debug_open(struct inode *inode, struct file *file)
{
	return single_open(file, cpu_utilization_debug_read, file->private_data);
}

static ssize_t cpu_utilization_debug_write(struct file *file,
					   const char __user *buffer,
					   size_t count, loff_t *data)
{
	return count;
}

static const struct file_operations cpu_utilization_debug_ops = {
	.open = cpu_utilization_debug_open,
	.read = seq_read,
	.llseek = seq_lseek,
	.write = cpu_utilization_debug_write,
	.release = single_release,
};

int mtk_trm_debugfs_init(void)
{
	if (!tops_debugfs_root)
		return -ENOENT;

	if (!trm_debugfs_root) {
		trm_debugfs_root = debugfs_create_dir("trm", tops_debugfs_root);
		if (IS_ERR(trm_debugfs_root)) {
			TOPS_ERR("create trm debugfs root directory failed\n");
			return PTR_ERR(trm_debugfs_root);
		}
	}

	debugfs_create_file("cpu-utilization", 0644, trm_debugfs_root, NULL,
			    &cpu_utilization_debug_ops);

	return 0;
}

void mtk_trm_debugfs_deinit(void)
{
	debugfs_remove_recursive(trm_debugfs_root);
}
