summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Nabirushkin <inabirushkin@nvidia.com>2013-09-24 18:22:09 +0400
committerRiham Haidar <rhaidar@nvidia.com>2013-11-07 12:12:02 -0800
commit73e7718f5d96f38bf3af28a930dd8300c90d987b (patch)
tree57b37b17c5eac8228723c6076d2f1a19a529c1ec
parentea3db32491e642e368a3d856b06798e6e1a2b498 (diff)
misc: tegra-profiler: add /proc/quadd/status
Add /proc/quadd/status It allows users to see current status of the Tegra Profiler. Bug 1374376 Change-Id: I70d548c47bc80f6a12e3637f0af38fe74403de2d Signed-off-by: Igor Nabirushkin <inabirushkin@nvidia.com> Reviewed-on: http://git-master/r/309638 (cherry picked from commit 895113159ac3fa814b3261446faa64d480c4f309) Reviewed-on: http://git-master/r/326021 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Tested-by: Maxim Morin <mmorin@nvidia.com> Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
-rw-r--r--drivers/misc/tegra-profiler/auth.c5
-rw-r--r--drivers/misc/tegra-profiler/auth.h1
-rw-r--r--drivers/misc/tegra-profiler/comm.c6
-rw-r--r--drivers/misc/tegra-profiler/comm.h1
-rw-r--r--drivers/misc/tegra-profiler/main.c14
-rw-r--r--drivers/misc/tegra-profiler/quadd.h3
-rw-r--r--drivers/misc/tegra-profiler/quadd_proc.c38
-rw-r--r--drivers/misc/tegra-profiler/version.h2
-rw-r--r--include/linux/tegra_profiler.h7
9 files changed, 71 insertions, 6 deletions
diff --git a/drivers/misc/tegra-profiler/auth.c b/drivers/misc/tegra-profiler/auth.c
index 654f401b672a..f443e4532bae 100644
--- a/drivers/misc/tegra-profiler/auth.c
+++ b/drivers/misc/tegra-profiler/auth.c
@@ -296,6 +296,11 @@ int quadd_auth_check_debug_flag(const char *package_name)
}
}
+int quadd_auth_is_auth_open(void)
+{
+ return atomic_read(&auth_ctx.opened) != 0;
+}
+
int quadd_auth_init(struct quadd_ctx *quadd_ctx)
{
int err;
diff --git a/drivers/misc/tegra-profiler/auth.h b/drivers/misc/tegra-profiler/auth.h
index aa810f2d5a63..42d6d85e7a6e 100644
--- a/drivers/misc/tegra-profiler/auth.h
+++ b/drivers/misc/tegra-profiler/auth.h
@@ -20,6 +20,7 @@
struct quadd_ctx;
int quadd_auth_check_debug_flag(const char *package_name);
+int quadd_auth_is_auth_open(void);
int quadd_auth_init(struct quadd_ctx *quadd_ctx);
void quadd_auth_deinit(void);
diff --git a/drivers/misc/tegra-profiler/comm.c b/drivers/misc/tegra-profiler/comm.c
index 51a4abe9d566..35a4a8e15fae 100644
--- a/drivers/misc/tegra-profiler/comm.c
+++ b/drivers/misc/tegra-profiler/comm.c
@@ -366,9 +366,15 @@ static void comm_reset(void)
spin_unlock_irqrestore(&comm_ctx.rb.lock, flags);
}
+static int is_active(void)
+{
+ return atomic_read(&comm_ctx.active) != 0;
+}
+
static struct quadd_comm_data_interface comm_data = {
.put_sample = put_sample,
.reset = comm_reset,
+ .is_active = is_active,
};
static int check_access_permission(void)
diff --git a/drivers/misc/tegra-profiler/comm.h b/drivers/misc/tegra-profiler/comm.h
index 956e44be90c3..a19319d0a71f 100644
--- a/drivers/misc/tegra-profiler/comm.h
+++ b/drivers/misc/tegra-profiler/comm.h
@@ -50,6 +50,7 @@ struct quadd_comm_data_interface {
void (*put_sample)(struct quadd_record_data *data, char *extra_data,
unsigned int extra_length);
void (*reset)(void);
+ int (*is_active)(void);
};
struct quadd_comm_ctx {
diff --git a/drivers/misc/tegra-profiler/main.c b/drivers/misc/tegra-profiler/main.c
index f5238bb55eeb..e8856d302d3b 100644
--- a/drivers/misc/tegra-profiler/main.c
+++ b/drivers/misc/tegra-profiler/main.c
@@ -359,9 +359,19 @@ static void get_capabilities(struct quadd_comm_cap *cap)
cap->blocked_read = 1;
}
-static void get_state(struct quadd_module_state *state)
+void quadd_get_state(struct quadd_module_state *state)
{
+ unsigned int status = 0;
+
quadd_hrt_get_state(state);
+
+ if (ctx.comm->is_active())
+ status |= QUADD_MOD_STATE_STATUS_IS_ACTIVE;
+
+ if (quadd_auth_is_auth_open())
+ status |= QUADD_MOD_STATE_STATUS_IS_AUTH_OPEN;
+
+ state->reserved[QUADD_MOD_STATE_IDX_STATUS] = status;
}
static struct quadd_comm_control_interface control = {
@@ -369,7 +379,7 @@ static struct quadd_comm_control_interface control = {
.stop = stop,
.set_parameters = set_parameters,
.get_capabilities = get_capabilities,
- .get_state = get_state,
+ .get_state = quadd_get_state,
};
static int __init quadd_module_init(void)
diff --git a/drivers/misc/tegra-profiler/quadd.h b/drivers/misc/tegra-profiler/quadd.h
index 75b145ff0e32..41367c3bec96 100644
--- a/drivers/misc/tegra-profiler/quadd.h
+++ b/drivers/misc/tegra-profiler/quadd.h
@@ -25,6 +25,7 @@ struct event_data;
struct quadd_comm_data_interface;
struct quadd_hrt_ctx;
struct quadd_mmap_ctx;
+struct quadd_module_state;
struct quadd_event_source_interface {
int (*enable)(void);
@@ -62,4 +63,6 @@ struct quadd_ctx {
int collect_kernel_ips;
};
+void quadd_get_state(struct quadd_module_state *state);
+
#endif /* __QUADD_H */
diff --git a/drivers/misc/tegra-profiler/quadd_proc.c b/drivers/misc/tegra-profiler/quadd_proc.c
index 02b4cb0e3fce..dbde7041fa04 100644
--- a/drivers/misc/tegra-profiler/quadd_proc.c
+++ b/drivers/misc/tegra-profiler/quadd_proc.c
@@ -74,8 +74,8 @@ static int show_capabilities(struct seq_file *f, void *offset)
seq_printf(f, "support polling mode: %s\n",
YES_NO(cap->blocked_read));
- seq_printf(f, "\n");
- seq_printf(f, "Supported events:\n");
+ seq_puts(f, "\n");
+ seq_puts(f, "Supported events:\n");
seq_printf(f, "cpu_cycles: %s\n",
YES_NO(event->cpu_cycles));
seq_printf(f, "instructions: %s\n",
@@ -114,6 +114,38 @@ static const struct file_operations capabilities_proc_fops = {
.release = single_release,
};
+static int show_status(struct seq_file *f, void *offset)
+{
+ unsigned int status;
+ unsigned int is_auth_open, active;
+ struct quadd_module_state s;
+
+ quadd_get_state(&s);
+ status = s.reserved[QUADD_MOD_STATE_IDX_STATUS];
+
+ active = status & QUADD_MOD_STATE_STATUS_IS_ACTIVE;
+ is_auth_open = status & QUADD_MOD_STATE_STATUS_IS_AUTH_OPEN;
+
+ seq_printf(f, "status: %s\n", active ? "active" : "waiting");
+ seq_printf(f, "auth: %s\n", YES_NO(is_auth_open));
+ seq_printf(f, "all samples: %llu\n", s.nr_all_samples);
+ seq_printf(f, "skipped samples: %llu\n", s.nr_skipped_samples);
+
+ return 0;
+}
+
+static int show_status_proc_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, show_status, NULL);
+}
+
+static const struct file_operations status_proc_fops = {
+ .open = show_status_proc_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
void quadd_proc_init(struct quadd_ctx *context)
{
ctx = context;
@@ -121,12 +153,14 @@ void quadd_proc_init(struct quadd_ctx *context)
proc_mkdir("quadd", NULL);
proc_create("quadd/version", 0, NULL, &version_proc_fops);
proc_create("quadd/capabilities", 0, NULL, &capabilities_proc_fops);
+ proc_create("quadd/status", 0, NULL, &status_proc_fops);
}
void quadd_proc_deinit(void)
{
remove_proc_entry("quadd/version", NULL);
remove_proc_entry("quadd/capabilities", NULL);
+ remove_proc_entry("quadd/status", NULL);
remove_proc_entry("quadd", NULL);
}
diff --git a/drivers/misc/tegra-profiler/version.h b/drivers/misc/tegra-profiler/version.h
index 6b0f795bb60c..b49405420b92 100644
--- a/drivers/misc/tegra-profiler/version.h
+++ b/drivers/misc/tegra-profiler/version.h
@@ -18,7 +18,7 @@
#ifndef __QUADD_VERSION_H
#define __QUADD_VERSION_H
-#define QUADD_MODULE_VERSION "1.34"
+#define QUADD_MODULE_VERSION "1.35"
#define QUADD_MODULE_BRANCH "Dev"
#endif /* __QUADD_VERSION_H */
diff --git a/include/linux/tegra_profiler.h b/include/linux/tegra_profiler.h
index 823b05e5a6f8..1fda9594ce94 100644
--- a/include/linux/tegra_profiler.h
+++ b/include/linux/tegra_profiler.h
@@ -20,10 +20,11 @@
#include <linux/ioctl.h>
#define QUADD_SAMPLES_VERSION 17
-#define QUADD_IO_VERSION 6
+#define QUADD_IO_VERSION 7
#define QUADD_IO_VERSION_DYNAMIC_RB 5
#define QUADD_IO_VERSION_RB_MAX_FILL_COUNT 6
+#define QUADD_IO_VERSION_MOD_STATE_STATUS_FIELD 7
#define QUADD_SAMPLE_VERSION_THUMB_MODE_FLAG 17
@@ -289,8 +290,12 @@ struct quadd_comm_cap {
enum {
QUADD_MOD_STATE_IDX_RB_MAX_FILL_COUNT = 0,
+ QUADD_MOD_STATE_IDX_STATUS,
};
+#define QUADD_MOD_STATE_STATUS_IS_ACTIVE (1 << 0)
+#define QUADD_MOD_STATE_STATUS_IS_AUTH_OPEN (1 << 1)
+
struct quadd_module_state {
u64 nr_all_samples;
u64 nr_skipped_samples;