summaryrefslogtreecommitdiff
path: root/drivers/misc/tegra-profiler/debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/tegra-profiler/debug.c')
-rw-r--r--drivers/misc/tegra-profiler/debug.c164
1 files changed, 164 insertions, 0 deletions
diff --git a/drivers/misc/tegra-profiler/debug.c b/drivers/misc/tegra-profiler/debug.c
new file mode 100644
index 000000000000..e0270a310ae4
--- /dev/null
+++ b/drivers/misc/tegra-profiler/debug.c
@@ -0,0 +1,164 @@
+/*
+ * drivers/misc/tegra-profiler/debug.c
+ *
+ * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ */
+
+#include <linux/module.h>
+#include <asm/irq_regs.h>
+
+#include <linux/tegra_profiler.h>
+
+#include "debug.h"
+#include "hrt.h"
+#include "tegra.h"
+
+#ifdef QM_DEBUG_SAMPLES_ENABLE
+
+static inline void
+init_sample(struct quadd_record_data *record, struct pt_regs *regs)
+{
+ struct quadd_debug_data *s = &record->debug;
+
+ record->magic = QUADD_RECORD_MAGIC;
+ record->record_type = QUADD_RECORD_TYPE_DEBUG;
+
+ if (!regs)
+ regs = get_irq_regs();
+
+ if (!regs)
+ record->cpu_mode = QUADD_CPU_MODE_NONE;
+ else
+ record->cpu_mode = user_mode(regs) ?
+ QUADD_CPU_MODE_USER : QUADD_CPU_MODE_KERNEL;
+
+ s->cpu = quadd_get_processor_id();
+ s->pid = 0;
+ s->time = quadd_get_time();
+ s->timer_period = 0;
+
+ s->extra_value1 = 0;
+ s->extra_value2 = 0;
+ s->extra_value3 = 0;
+}
+
+void qm_debug_handler_sample(struct pt_regs *regs)
+{
+ struct quadd_record_data record;
+ struct quadd_debug_data *s = &record.debug;
+
+ init_sample(&record, regs);
+
+ s->type = QM_DEBUG_SAMPLE_TYPE_TIMER_HANDLE;
+
+ quadd_put_sample(&record, NULL, 0);
+}
+
+void qm_debug_timer_forward(struct pt_regs *regs, u64 period)
+{
+ struct quadd_record_data record;
+ struct quadd_debug_data *s = &record.debug;
+
+ init_sample(&record, regs);
+
+ s->type = QM_DEBUG_SAMPLE_TYPE_TIMER_FORWARD;
+ s->timer_period = period;
+
+ quadd_put_sample(&record, NULL, 0);
+}
+
+void qm_debug_timer_start(struct pt_regs *regs, u64 period)
+{
+ struct quadd_record_data record;
+ struct quadd_debug_data *s = &record.debug;
+
+ init_sample(&record, regs);
+
+ s->type = QM_DEBUG_SAMPLE_TYPE_TIMER_START;
+ s->timer_period = period;
+
+ quadd_put_sample(&record, NULL, 0);
+}
+
+void qm_debug_timer_cancel(void)
+{
+ struct quadd_record_data record;
+ struct quadd_debug_data *s = &record.debug;
+
+ init_sample(&record, NULL);
+
+ s->type = QM_DEBUG_SAMPLE_TYPE_TIMER_CANCEL;
+
+ quadd_put_sample(&record, NULL, 0);
+}
+
+void
+qm_debug_task_sched_in(pid_t prev_pid, pid_t current_pid, int prev_nr_active)
+{
+ struct quadd_record_data record;
+ struct quadd_debug_data *s = &record.debug;
+
+ init_sample(&record, NULL);
+
+ s->type = QM_DEBUG_SAMPLE_TYPE_SCHED_IN;
+
+ s->extra_value1 = prev_pid;
+ s->extra_value2 = current_pid;
+ s->extra_value3 = prev_nr_active;
+
+ quadd_put_sample(&record, NULL, 0);
+}
+
+void qm_debug_read_counter(int event_id, u32 prev_val, u32 val)
+{
+ struct quadd_record_data record;
+ struct quadd_debug_data *s = &record.debug;
+
+ init_sample(&record, NULL);
+
+ s->type = QM_DEBUG_SAMPLE_TYPE_READ_COUNTER;
+
+ s->extra_value1 = event_id;
+ s->extra_value2 = prev_val;
+ s->extra_value3 = val;
+
+ quadd_put_sample(&record, NULL, 0);
+}
+
+void qm_debug_start_source(int source_type)
+{
+ struct quadd_record_data record;
+ struct quadd_debug_data *s = &record.debug;
+
+ init_sample(&record, NULL);
+
+ s->type = QM_DEBUG_SAMPLE_TYPE_SOURCE_START;
+ s->extra_value1 = source_type;
+
+ quadd_put_sample(&record, NULL, 0);
+}
+
+void qm_debug_stop_source(int source_type)
+{
+ struct quadd_record_data record;
+ struct quadd_debug_data *s = &record.debug;
+
+ init_sample(&record, NULL);
+
+ s->type = QM_DEBUG_SAMPLE_TYPE_SOURCE_STOP;
+ s->extra_value1 = source_type;
+
+ quadd_put_sample(&record, NULL, 0);
+}
+
+#endif /* QM_DEBUG_SAMPLES_ENABLE */