gator: Version 5.16

Signed-off-by: Jon Medhurst <tixy@linaro.org>
diff --git a/drivers/gator/gator_trace_gpu.c b/drivers/gator/gator_trace_gpu.c
index 61ecbe3..12623c4 100644
--- a/drivers/gator/gator_trace_gpu.c
+++ b/drivers/gator/gator_trace_gpu.c
@@ -40,21 +40,27 @@
 	NUMBER_OF_GPU_UNITS
 };
 
-#define MALI_400     (0x0b07)
+#define MALI_4xx     (0x0b07)
 #define MALI_T6xx    (0x0056)
 
 struct mali_gpu_job {
 	int count;
-	int last_core;
 	int last_tgid;
 	int last_pid;
+	int last_job_id;
 };
 
 #define NUMBER_OF_GPU_CORES 16
 static struct mali_gpu_job mali_gpu_jobs[NUMBER_OF_GPU_UNITS][NUMBER_OF_GPU_CORES];
 static DEFINE_SPINLOCK(mali_gpu_jobs_lock);
 
-static void mali_gpu_enqueue(int unit, int core, int tgid, int pid)
+/* Only one event should be running on a unit and core at a time (ie, a start
+ * event can only be followed by a stop and vice versa), but because the kernel
+ * only knows when a job is enqueued and not started, it is possible for a
+ * start1, start2, stop1, stop2. Change it back into start1, stop1, start2,
+ * stop2 by queueing up start2 and releasing it when stop1 is received.
+ */
+static void mali_gpu_enqueue(int unit, int core, int tgid, int pid, int job_id)
 {
 	int count;
 
@@ -63,23 +69,23 @@
 	BUG_ON(count < 0);
 	++mali_gpu_jobs[unit][core].count;
 	if (count) {
-		mali_gpu_jobs[unit][core].last_core = core;
 		mali_gpu_jobs[unit][core].last_tgid = tgid;
 		mali_gpu_jobs[unit][core].last_pid = pid;
+		mali_gpu_jobs[unit][core].last_job_id = job_id;
 	}
 	spin_unlock(&mali_gpu_jobs_lock);
 
 	if (!count) {
-		marshal_sched_gpu_start(unit, core, tgid, pid);
+		marshal_sched_gpu_start(unit, core, tgid, pid/*, job_id*/);
 	}
 }
 
 static void mali_gpu_stop(int unit, int core)
 {
 	int count;
-	int last_core = 0;
 	int last_tgid = 0;
 	int last_pid = 0;
+	int last_job_id = 0;
 
 	spin_lock(&mali_gpu_jobs_lock);
 	if (mali_gpu_jobs[unit][core].count == 0) {
@@ -89,20 +95,20 @@
 	--mali_gpu_jobs[unit][core].count;
 	count = mali_gpu_jobs[unit][core].count;
 	if (count) {
-		last_core = mali_gpu_jobs[unit][core].last_core;
 		last_tgid = mali_gpu_jobs[unit][core].last_tgid;
 		last_pid = mali_gpu_jobs[unit][core].last_pid;
+		last_job_id = mali_gpu_jobs[unit][core].last_job_id;
 	}
 	spin_unlock(&mali_gpu_jobs_lock);
 
 	marshal_sched_gpu_stop(unit, core);
 	if (count) {
-		marshal_sched_gpu_start(unit, last_core, last_tgid, last_pid);
+		marshal_sched_gpu_start(unit, core, last_tgid, last_pid/*, last_job_id*/);
 	}
 }
 
 #if defined(MALI_SUPPORT) && (MALI_SUPPORT != MALI_T6xx)
-#include "gator_events_mali_400.h"
+#include "gator_events_mali_4xx.h"
 
 /*
  * Taken from MALI_PROFILING_EVENT_CHANNEL_* in Mali DDK.
@@ -141,10 +147,10 @@
 	case EVENT_TYPE_START:
 		if (component == EVENT_CHANNEL_VP0) {
 			/* tgid = d0; pid = d1; */
-			mali_gpu_enqueue(GPU_UNIT_VP, 0, d0, d1);
+			mali_gpu_enqueue(GPU_UNIT_VP, 0, d0, d1, 0);
 		} else if (component >= EVENT_CHANNEL_FP0 && component <= EVENT_CHANNEL_FP7) {
 			/* tgid = d0; pid = d1; */
-			mali_gpu_enqueue(GPU_UNIT_FP, component - EVENT_CHANNEL_FP0, d0, d1);
+			mali_gpu_enqueue(GPU_UNIT_FP, component - EVENT_CHANNEL_FP0, d0, d1, 0);
 		}
 		break;
 
@@ -173,9 +179,16 @@
 #endif
 
 #if defined(MALI_SUPPORT) && (MALI_SUPPORT == MALI_T6xx)
+#if defined(MALI_JOB_SLOTS_EVENT_CHANGED)
+GATOR_DEFINE_PROBE(mali_job_slots_event, TP_PROTO(unsigned int event_id, unsigned int tgid, unsigned int pid, unsigned char job_id))
+#else
 GATOR_DEFINE_PROBE(mali_job_slots_event, TP_PROTO(unsigned int event_id, unsigned int tgid, unsigned int pid))
+#endif
 {
 	unsigned int component, state, unit;
+#if !defined(MALI_JOB_SLOTS_EVENT_CHANGED)
+	unsigned char job_id = 0;
+#endif
 
 	component = (event_id >> 16) & 0xFF;	// component is an 8-bit field
 	state = (event_id >> 24) & 0xF;	// state is a 4-bit field
@@ -197,7 +210,7 @@
 	if (unit != GPU_UNIT_NONE) {
 		switch (state) {
 		case EVENT_TYPE_START:
-			mali_gpu_enqueue(unit, 0, tgid, (pid != 0 ? pid : tgid));
+			mali_gpu_enqueue(unit, 0, tgid, (pid != 0 ? pid : tgid), job_id);
 			break;
 		case EVENT_TYPE_STOP:
 			mali_gpu_stop(unit, 0);
@@ -214,7 +227,7 @@
 
 GATOR_DEFINE_PROBE(gpu_activity_start, TP_PROTO(int gpu_unit, int gpu_core, struct task_struct *p))
 {
-	mali_gpu_enqueue(gpu_unit, gpu_core, (int)p->tgid, (int)p->pid);
+	mali_gpu_enqueue(gpu_unit, gpu_core, (int)p->tgid, (int)p->pid, 0);
 }
 
 GATOR_DEFINE_PROBE(gpu_activity_stop, TP_PROTO(int gpu_unit, int gpu_core))
@@ -229,6 +242,7 @@
 	 * Absence of gpu trace points is not an error
 	 */
 
+	memset(&mali_gpu_jobs, sizeof(mali_gpu_jobs), 0);
 	gpu_trace_registered = mali_timeline_trace_registered = mali_job_slots_trace_registered = 0;
 
 #if defined(MALI_SUPPORT) && (MALI_SUPPORT != MALI_T6xx)