msm: kgsl: add MEMORY_BASE and HANG packets

These are changes to the cffdump output format.
MEMORY_BASE reports the address range we're using at the start
of the dump, which helps the postprocessors validate memory
writes.

HANG is emitted at the start of kgsl_postmortem_dump(), and can
be used by the postprocessors to stop when the hang occurs.

Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
diff --git a/drivers/gpu/msm/adreno_postmortem.c b/drivers/gpu/msm/adreno_postmortem.c
index 4b25dcf..6a34da6 100644
--- a/drivers/gpu/msm/adreno_postmortem.c
+++ b/drivers/gpu/msm/adreno_postmortem.c
@@ -20,6 +20,7 @@
 #include "adreno_ringbuffer.h"
 #include "adreno_postmortem.h"
 #include "adreno_debugfs.h"
+#include "kgsl_cffdump.h"
 
 #include "a200_reg.h"
 
@@ -799,6 +800,8 @@
 
 	BUG_ON(device == NULL);
 
+	kgsl_cffdump_hang(device->id);
+
 	/* For a manual dump, make sure that the system is idle */
 
 	if (manual) {
diff --git a/drivers/gpu/msm/kgsl_cffdump.c b/drivers/gpu/msm/kgsl_cffdump.c
index fe24d15..fbb7811 100644
--- a/drivers/gpu/msm/kgsl_cffdump.c
+++ b/drivers/gpu/msm/kgsl_cffdump.c
@@ -20,6 +20,7 @@
 #include <linux/slab.h>
 #include <linux/time.h>
 #include <linux/sched.h>
+#include <mach/socinfo.h>
 
 #include "kgsl.h"
 #include "kgsl_cffdump.h"
@@ -85,6 +86,19 @@
 	uint buffer[MEMBUF_SIZE];
 } __packed;
 
+#define CFF_OP_MEMORY_BASE	0x0000000d
+struct cff_op_memory_base {
+	unsigned char op;
+	uint base;
+	uint size;
+	uint gmemsize;
+} __packed;
+
+#define CFF_OP_HANG		0x0000000e
+struct cff_op_hang {
+	unsigned char op;
+} __packed;
+
 #define CFF_OP_EOF              0xffffffff
 struct cff_op_eof {
 	unsigned char op;
@@ -196,6 +210,8 @@
 	struct cff_op_write_reg cff_op_write_reg;
 	struct cff_op_poll_reg cff_op_poll_reg;
 	struct cff_op_wait_irq cff_op_wait_irq;
+	struct cff_op_memory_base cff_op_memory_base;
+	struct cff_op_hang cff_op_hang;
 	struct cff_op_eof cff_op_eof;
 	unsigned char out_buf[sizeof(cff_op_write_membuf)/3*4 + 16];
 	void *data;
@@ -243,6 +259,21 @@
 		len = sizeof(cff_op_wait_irq);
 		break;
 
+	case CFF_OP_MEMORY_BASE:
+		cff_op_memory_base.op = opcode;
+		cff_op_memory_base.base = op1;
+		cff_op_memory_base.size = op2;
+		cff_op_memory_base.gmemsize = op3;
+		data = &cff_op_memory_base;
+		len = sizeof(cff_op_memory_base);
+		break;
+
+	case CFF_OP_HANG:
+		cff_op_hang.op = opcode;
+		data = &cff_op_hang;
+		len = sizeof(cff_op_hang);
+		break;
+
 	case CFF_OP_EOF:
 		cff_op_eof.op = opcode;
 		data = &cff_op_eof;
@@ -306,6 +337,27 @@
 
 void kgsl_cffdump_open(enum kgsl_deviceid device_id)
 {
+	/*TODO: move this to where we can report correct gmemsize*/
+	unsigned int va_base;
+
+	if (cpu_is_msm8x60() || cpu_is_msm8960())
+		va_base = 0x40000000;
+	else
+		va_base = 0x20000000;
+
+	kgsl_cffdump_memory_base(device_id, va_base,
+			CONFIG_MSM_KGSL_PAGE_TABLE_SIZE, SZ_256K);
+}
+
+void kgsl_cffdump_memory_base(enum kgsl_deviceid device_id, unsigned int base,
+			      unsigned int range, unsigned gmemsize)
+{
+	cffdump_printline(device_id, CFF_OP_MEMORY_BASE, base, range, gmemsize);
+}
+
+void kgsl_cffdump_hang(enum kgsl_deviceid device_id)
+{
+	cffdump_printline(device_id, CFF_OP_HANG, 0, 0, 0);
 }
 
 void kgsl_cffdump_close(enum kgsl_deviceid device_id)
diff --git a/drivers/gpu/msm/kgsl_cffdump.h b/drivers/gpu/msm/kgsl_cffdump.h
index aca7a7c..91e7299 100644
--- a/drivers/gpu/msm/kgsl_cffdump.h
+++ b/drivers/gpu/msm/kgsl_cffdump.h
@@ -37,6 +37,11 @@
 	bool check_only);
 static inline bool kgsl_cffdump_flags_no_memzero(void) { return true; }
 
+void kgsl_cffdump_memory_base(enum kgsl_deviceid device_id, unsigned int base,
+			      unsigned int range, unsigned int gmemsize);
+
+void kgsl_cffdump_hang(enum kgsl_deviceid device_id);
+
 #else
 
 #define kgsl_cffdump_init()					(void)0
@@ -51,6 +56,8 @@
 #define kgsl_cffdump_parse_ibs(dev_priv, memdesc, gpuaddr, \
 	sizedwords, check_only)					true
 #define kgsl_cffdump_flags_no_memzero()				true
+#define kgsl_cffdump_memory_base(base, range, gmemsize)		(void)0
+#define kgsl_cffdump_hang(device_id)				(void)0
 
 #endif /* CONFIG_MSM_KGSL_CFF_DUMP */