ASR_BASE
Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/marvell/linux/drivers/soc/asr/debug/debugfs-asr.c b/marvell/linux/drivers/soc/asr/debug/debugfs-asr.c
new file mode 100644
index 0000000..582d8c0
--- /dev/null
+++ b/marvell/linux/drivers/soc/asr/debug/debugfs-asr.c
@@ -0,0 +1,79 @@
+#include <linux/debugfs.h>
+#include <linux/uaccess.h>
+#include <linux/module.h>
+#include <linux/io.h>
+#include <linux/cpufreq.h>
+
+
+#define CPU_MIPS_LOOP 250000000
+static unsigned int get_cpu_mips(void)
+{
+ struct timespec64 v1, v2;
+ unsigned long cnt, total;
+#ifdef CONFIG_ARM64
+ unsigned long i;
+#endif
+
+ cnt = CPU_MIPS_LOOP;
+ raw_local_irq_disable();
+ ktime_get_real_ts64(&v1);
+#ifdef CONFIG_ARM64
+ __asm__ __volatile__(
+ "mov %0, %1\n"
+ "timer_loop: subs %0, %0, #1\n"
+ "bhi timer_loop"
+ : "=&r" (i)
+ : "r" (cnt)
+ : "cc");
+#else
+ while (cnt--)
+ barrier();
+#endif
+ ktime_get_real_ts64(&v2);
+ raw_local_irq_enable();
+ total = (v2.tv_sec - v1.tv_sec) * 1000000 + (v2.tv_nsec - v1.tv_nsec) / 1000;
+
+ return CPU_MIPS_LOOP / total;
+}
+
+static ssize_t mips_read(struct file *filp, char __user *buffer,
+ size_t count, loff_t *ppos)
+{
+ unsigned int mips, cpu;
+
+ mips = get_cpu_mips();
+ cpu = raw_smp_processor_id();
+ pr_info("Attention! You need to keep cpufreq don't change!\n");
+ pr_info("Calculated out MIPS is %dMhz, while setting is %dkhz\n",
+ mips, cpufreq_get(cpu));
+ return 0;
+}
+
+const struct file_operations show_mips_fops = {
+ .read = mips_read,
+};
+
+struct dentry *asr_debug_entry;
+
+static int __init asr_debugfs_init(void)
+{
+ struct dentry *showmips;
+
+ asr_debug_entry = debugfs_create_dir("asr", NULL);
+ if (!asr_debug_entry)
+ return -ENOENT;
+
+ showmips = debugfs_create_file("showmips", 0664,
+ asr_debug_entry, NULL, &show_mips_fops);
+ if (!showmips)
+ goto err_mips;
+
+ return 0;
+
+err_mips:
+ debugfs_remove(asr_debug_entry);
+ asr_debug_entry = NULL;
+return -ENOENT;
+}
+
+core_initcall_sync(asr_debugfs_init);
\ No newline at end of file