[][openwrt][mt7988][tops][add cpu utilization fetching]

[Description]
Add cpu utilization fetching and refactor debugfs of trm and tops

Via reading debugfs file(/sys/kernel/debug/tops/trm/cpu-utilization)
to fetch each core's cpu utilization

[Release-log]
N/A

Change-Id: Iff4c965294c3054a54ba92263191856cd5c722c7
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7907085
diff --git a/package-21.02/kernel/tops/src/trm-debugfs.c b/package-21.02/kernel/tops/src/trm-debugfs.c
new file mode 100644
index 0000000..66c64f3
--- /dev/null
+++ b/package-21.02/kernel/tops/src/trm-debugfs.c
@@ -0,0 +1,88 @@
+// 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);
+}