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 = {
.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)
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",
.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;
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);
}
#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
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;