summaryrefslogtreecommitdiff
path: root/drivers/misc/benchmark
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2017-08-30 08:25:59 +0000
committerYuval Adam <_@yuv.al>2017-08-30 08:25:59 +0000
commit8e4bff4cab0ddac6060645b0715210484d02ff40 (patch)
tree3a5c3024371a04692a3a6d9974d001cdff8ebf84 /drivers/misc/benchmark
Initial file dump from open source releaseHEADmaster
Diffstat (limited to 'drivers/misc/benchmark')
-rw-r--r--drivers/misc/benchmark/Kconfig5
-rw-r--r--drivers/misc/benchmark/Makefile4
-rw-r--r--drivers/misc/benchmark/benchmark-proc.c136
3 files changed, 145 insertions, 0 deletions
diff --git a/drivers/misc/benchmark/Kconfig b/drivers/misc/benchmark/Kconfig
new file mode 100644
index 00000000..2a6107cb
--- /dev/null
+++ b/drivers/misc/benchmark/Kconfig
@@ -0,0 +1,5 @@
+config BENCHMARK
+ bool "enable benchmark proc"
+ default n
+ help
+ enable benchmark proc
diff --git a/drivers/misc/benchmark/Makefile b/drivers/misc/benchmark/Makefile
new file mode 100644
index 00000000..7738070d
--- /dev/null
+++ b/drivers/misc/benchmark/Makefile
@@ -0,0 +1,4 @@
+# Makefile for the benchMark support
+obj-$(CONFIG_BENCHMARK) += benchmark-proc.o
+
+
diff --git a/drivers/misc/benchmark/benchmark-proc.c b/drivers/misc/benchmark/benchmark-proc.c
new file mode 100644
index 00000000..ed4c79f4
--- /dev/null
+++ b/drivers/misc/benchmark/benchmark-proc.c
@@ -0,0 +1,136 @@
+#include <linux/module.h> /* Specifically, a module */
+#include <linux/kernel.h> /* We're doing kernel work */
+#include <linux/proc_fs.h> /* Necessary because we use the proc fs */
+#include <asm/uaccess.h> /* for copy_from_user */
+#include <linux/slab.h>
+
+#define PROC_MAX_SIZE 64
+struct bench_t{
+ const char *name;
+ const int size;
+ char *buffer;
+};
+
+#define PROC_NAME "benchMark"
+
+static struct bench_t bench_name[] = {
+ [0] = {
+ .name = "fps",
+ .size = 64,
+ },
+ [1] = {
+ .name = "boot_time",
+ .size = 64,
+ },
+ [2] = {
+ .name = "net_time",
+ .size = 512,
+ },
+ [3] = {
+ .name = "cam_time",
+ .size = 64,
+ },
+ [4] = {
+ .name = "app_launch_time",
+ .size = 64,
+ },
+ [5] = {
+ .name = "tpdown_time",
+ .size = 64,
+ },
+ [6] = {
+ .name = "app_launch_data",
+ .size = 1024,
+ },
+ [7] = {
+ .name = "presshome_time", /*zero mean not pressed hHOME key, after update gohome_time, write zero to it*/
+ .size = 64,
+ },
+ [8] = {
+ .name = "gohome_time",
+ .size = 64,
+ },
+};
+
+static struct proc_dir_entry *benchmark_entry;
+/* The buffer used to store character for this module */
+static int benchmark_open(struct inode *inode, struct file *file);
+static ssize_t benchmark_read( struct file *file, char __user *buffer, size_t len, loff_t *offset);
+static ssize_t benchmark_write( struct file *file, const char __user *buffer, size_t len, loff_t *offset );
+
+static const struct file_operations benchmark_fops = {
+ .owner = THIS_MODULE,
+ .read = benchmark_read,
+ .open = benchmark_open,
+ .write = benchmark_write,
+ .release = NULL,
+};
+
+/* This function is called when the module is loaded */
+int init_module()
+{
+ int i;
+ struct proc_dir_entry *entry;
+
+ benchmark_entry = proc_mkdir(PROC_NAME,NULL);
+
+ if (!benchmark_entry) {
+ printk(KERN_ALERT "Error: Could not initialize /proc/%s\n",PROC_NAME);
+ return -ENOMEM;
+ }
+ for (i=0; i<ARRAY_SIZE(bench_name); i++) {
+ entry = proc_create_data(bench_name[i].name, S_IRUGO|S_IWUGO, benchmark_entry, &benchmark_fops, bench_name[i].name);
+ bench_name[i].buffer = (char*)kmalloc(bench_name[i].size, GFP_KERNEL);
+ memset(bench_name[i].buffer, '\0', bench_name[i].size);
+ }
+ printk(KERN_INFO "/proc/%s created\n", PROC_NAME);
+ return 0;
+}
+
+static int benchmark_open(struct inode *inode, struct file *file)
+{
+ int i = 0;
+
+ char *name = PDE_DATA(inode);
+ for (i = 0; i < ARRAY_SIZE(bench_name); i++) {
+ if (!strcmp(name, bench_name[i].name))
+ {
+ file->private_data = (void*)i;
+ return 0;
+ }
+ }
+ return -1;
+}
+
+static ssize_t benchmark_read( struct file *file, char __user *buffer, size_t len, loff_t *offset)
+{
+ int idx = (int)file->private_data;
+
+ return simple_read_from_buffer(buffer, len, offset, bench_name[idx].buffer,bench_name[idx].size);
+}
+
+static ssize_t benchmark_write( struct file *file, const char __user *buffer, size_t len, loff_t *offset )
+{
+ int idx = (int)file->private_data;
+ int ret = 0;
+
+ memset(bench_name[idx].buffer, '\0', bench_name[idx].size);
+ ret = simple_write_to_buffer(bench_name[idx].buffer, bench_name[idx].size, offset, buffer, len);
+
+ return ret;
+}
+
+void cleanup_module()
+{
+ int i;
+ for (i=0; i < ARRAY_SIZE(bench_name); i++) {
+ remove_proc_entry(bench_name[i].name, benchmark_entry);
+ kfree(bench_name[i].buffer);
+ }
+ remove_proc_entry(PROC_NAME, NULL);
+ printk(KERN_INFO "/proc/%s removed\n", PROC_NAME);
+}
+
+device_initcall(init_module);
+MODULE_DESCRIPTION("BENCH MARK PROC");
+MODULE_LICENSE("GPL");