msm: kgsl: Add CFF user event ioctl to write data to cff dumps

Add the ioctl IOCTL_KGSL_CFF_USER_EVENT to write data to cff dump.
Define a new CFF packet cff_op_user_event for this generic user
event.
Write the surface parameter data packet and verify mem file
packet to cff dumps

Signed-off-by: Sushmita Susheelendra <ssusheel@codeaurora.org>
diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c
index 814f909..ce3717e 100644
--- a/drivers/gpu/msm/kgsl.c
+++ b/drivers/gpu/msm/kgsl.c
@@ -1574,6 +1574,18 @@
 	return result;
 }
 
+static long kgsl_ioctl_cff_user_event(struct kgsl_device_private *dev_priv,
+		unsigned int cmd, void *data)
+{
+	int result = 0;
+	struct kgsl_cff_user_event *param = data;
+
+	kgsl_cffdump_user_event(param->cff_opcode, param->op1, param->op2,
+			param->op3, param->op4, param->op5);
+
+	return result;
+}
+
 typedef long (*kgsl_ioctl_func_t)(struct kgsl_device_private *,
 	unsigned int, void *);
 
@@ -1613,6 +1625,8 @@
 			kgsl_ioctl_gpumem_alloc, 0),
 	KGSL_IOCTL_FUNC(IOCTL_KGSL_CFF_SYNCMEM,
 			kgsl_ioctl_cff_syncmem, 0),
+	KGSL_IOCTL_FUNC(IOCTL_KGSL_CFF_USER_EVENT,
+			kgsl_ioctl_cff_user_event, 0),
 };
 
 static long kgsl_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
diff --git a/drivers/gpu/msm/kgsl_cffdump.c b/drivers/gpu/msm/kgsl_cffdump.c
index 476ceac..2cb2351 100644
--- a/drivers/gpu/msm/kgsl_cffdump.c
+++ b/drivers/gpu/msm/kgsl_cffdump.c
@@ -68,7 +68,6 @@
 	unsigned char op;
 } __packed;
 
-#define CFF_OP_VERIFY_MEM_FILE  0x00000007
 #define CFF_OP_RMW              0x0000000a
 
 #define CFF_OP_WRITE_MEM        0x0000000b
@@ -104,6 +103,17 @@
 	unsigned char op;
 } __packed;
 
+#define CFF_OP_VERIFY_MEM_FILE  0x00000007
+#define CFF_OP_WRITE_SURFACE_PARAMS 0x00000011
+struct cff_op_user_event {
+	unsigned char op;
+	unsigned int op1;
+	unsigned int op2;
+	unsigned int op3;
+	unsigned int op4;
+	unsigned int op5;
+} __packed;
+
 
 static void b64_encodeblock(unsigned char in[3], unsigned char out[4], int len)
 {
@@ -205,7 +215,7 @@
 }
 
 static void cffdump_printline(int id, uint opcode, uint op1, uint op2,
-	uint op3)
+	uint op3, uint op4, uint op5)
 {
 	struct cff_op_write_reg cff_op_write_reg;
 	struct cff_op_poll_reg cff_op_poll_reg;
@@ -213,6 +223,7 @@
 	struct cff_op_memory_base cff_op_memory_base;
 	struct cff_op_hang cff_op_hang;
 	struct cff_op_eof cff_op_eof;
+	struct cff_op_user_event cff_op_user_event;
 	unsigned char out_buf[sizeof(cff_op_write_membuf)/3*4 + 16];
 	void *data;
 	int len = 0, out_size;
@@ -279,6 +290,18 @@
 		data = &cff_op_eof;
 		len = sizeof(cff_op_eof);
 		break;
+
+	case CFF_OP_WRITE_SURFACE_PARAMS:
+	case CFF_OP_VERIFY_MEM_FILE:
+		cff_op_user_event.op = opcode;
+		cff_op_user_event.op1 = op1;
+		cff_op_user_event.op2 = op2;
+		cff_op_user_event.op3 = op3;
+		cff_op_user_event.op4 = op4;
+		cff_op_user_event.op5 = op5;
+		data = &cff_op_user_event;
+		len = sizeof(cff_op_user_event);
+		break;
 	}
 
 	if (len) {
@@ -352,17 +375,25 @@
 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);
+	cffdump_printline(device_id, CFF_OP_MEMORY_BASE, base,
+			range, gmemsize, 0, 0);
 }
 
 void kgsl_cffdump_hang(enum kgsl_deviceid device_id)
 {
-	cffdump_printline(device_id, CFF_OP_HANG, 0, 0, 0);
+	cffdump_printline(device_id, CFF_OP_HANG, 0, 0, 0, 0, 0);
 }
 
 void kgsl_cffdump_close(enum kgsl_deviceid device_id)
 {
-	cffdump_printline(device_id, CFF_OP_EOF, 0, 0, 0);
+	cffdump_printline(device_id, CFF_OP_EOF, 0, 0, 0, 0, 0);
+}
+
+void kgsl_cffdump_user_event(unsigned int cff_opcode, unsigned int op1,
+		unsigned int op2, unsigned int op3,
+		unsigned int op4, unsigned int op5)
+{
+	cffdump_printline(-1, cff_opcode, op1, op2, op3, op4, op5);
 }
 
 void kgsl_cffdump_syncmem(struct kgsl_device_private *dev_priv,
@@ -415,15 +446,15 @@
 
 	BUG_ON(physaddr > 0x66000000 && physaddr < 0x66ffffff);
 	while (sizebytes > 3) {
-		cffdump_printline(-1, CFF_OP_WRITE_MEM, physaddr, *(uint *)src,
-			0);
-		physaddr += 4;
+		cffdump_printline(-1, CFF_OP_WRITE_MEM, gpuaddr, *(uint *)src,
+			0, 0, 0);
+		gpuaddr += 4;
 		src += 4;
 		sizebytes -= 4;
 	}
 	if (sizebytes > 0)
-		cffdump_printline(-1, CFF_OP_WRITE_MEM, physaddr, *(uint *)src,
-			0);
+		cffdump_printline(-1, CFF_OP_WRITE_MEM, gpuaddr, *(uint *)src,
+			0, 0, 0);
 }
 
 void kgsl_cffdump_setmem(uint addr, uint value, uint sizebytes)
@@ -435,12 +466,14 @@
 	while (sizebytes > 3) {
 		/* Use 32bit memory writes as long as there's at least
 		 * 4 bytes left */
-		cffdump_printline(-1, CFF_OP_WRITE_MEM, addr, value, 0);
+		cffdump_printline(-1, CFF_OP_WRITE_MEM, addr, value,
+				0, 0, 0);
 		addr += 4;
 		sizebytes -= 4;
 	}
 	if (sizebytes > 0)
-		cffdump_printline(-1, CFF_OP_WRITE_MEM, addr, value, 0);
+		cffdump_printline(-1, CFF_OP_WRITE_MEM, addr, value,
+				0, 0, 0);
 }
 
 void kgsl_cffdump_regwrite(enum kgsl_deviceid device_id, uint addr,
@@ -449,7 +482,8 @@
 	if (!kgsl_cff_dump_enable)
 		return;
 
-	cffdump_printline(device_id, CFF_OP_WRITE_REG, addr, value, 0);
+	cffdump_printline(device_id, CFF_OP_WRITE_REG, addr, value,
+			0, 0, 0);
 }
 
 void kgsl_cffdump_regpoll(enum kgsl_deviceid device_id, uint addr,
@@ -458,7 +492,8 @@
 	if (!kgsl_cff_dump_enable)
 		return;
 
-	cffdump_printline(device_id, CFF_OP_POLL_REG, addr, value, mask);
+	cffdump_printline(device_id, CFF_OP_POLL_REG, addr, value,
+			mask, 0, 0);
 }
 
 void kgsl_cffdump_slavewrite(uint addr, uint value)
@@ -466,7 +501,7 @@
 	if (!kgsl_cff_dump_enable)
 		return;
 
-	cffdump_printline(-1, CFF_OP_WRITE_REG, addr, value, 0);
+	cffdump_printline(-1, CFF_OP_WRITE_REG, addr, value, 0, 0, 0);
 }
 
 int kgsl_cffdump_waitirq(void)
@@ -474,7 +509,7 @@
 	if (!kgsl_cff_dump_enable)
 		return 0;
 
-	cffdump_printline(-1, CFF_OP_WAIT_IRQ, 0, 0, 0);
+	cffdump_printline(-1, CFF_OP_WAIT_IRQ, 0, 0, 0, 0, 0);
 
 	return 1;
 }
diff --git a/drivers/gpu/msm/kgsl_cffdump.h b/drivers/gpu/msm/kgsl_cffdump.h
index 91e7299..140e486 100644
--- a/drivers/gpu/msm/kgsl_cffdump.h
+++ b/drivers/gpu/msm/kgsl_cffdump.h
@@ -35,6 +35,9 @@
 bool kgsl_cffdump_parse_ibs(struct kgsl_device_private *dev_priv,
 	const struct kgsl_memdesc *memdesc, uint gpuaddr, int sizedwords,
 	bool check_only);
+void kgsl_cffdump_user_event(unsigned int cff_opcode, unsigned int op1,
+		unsigned int op2, unsigned int op3,
+		unsigned int op4, unsigned int op5);
 static inline bool kgsl_cffdump_flags_no_memzero(void) { return true; }
 
 void kgsl_cffdump_memory_base(enum kgsl_deviceid device_id, unsigned int base,
@@ -58,6 +61,8 @@
 #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
+#define kgsl_cffdump_user_event(cff_opcode, op1, op2, op3, op4, op5) \
+	(void)param
 
 #endif /* CONFIG_MSM_KGSL_CFF_DUMP */
 
diff --git a/include/linux/msm_kgsl.h b/include/linux/msm_kgsl.h
index ed54bdf..911cd0f 100644
--- a/include/linux/msm_kgsl.h
+++ b/include/linux/msm_kgsl.h
@@ -2,7 +2,7 @@
 #define _MSM_KGSL_H
 
 #define KGSL_VERSION_MAJOR        3
-#define KGSL_VERSION_MINOR        6
+#define KGSL_VERSION_MINOR        7
 
 /*context flags */
 #define KGSL_CONTEXT_SAVE_GMEM	1
@@ -320,6 +320,18 @@
 #define IOCTL_KGSL_SHAREDMEM_FREE \
 	_IOW(KGSL_IOC_TYPE, 0x21, struct kgsl_sharedmem_free)
 
+struct kgsl_cff_user_event {
+	unsigned char cff_opcode;
+	unsigned int op1;
+	unsigned int op2;
+	unsigned int op3;
+	unsigned int op4;
+	unsigned int op5;
+	unsigned int __pad[2];
+};
+
+#define IOCTL_KGSL_CFF_USER_EVENT \
+	_IOW(KGSL_IOC_TYPE, 0x31, struct kgsl_cff_user_event)
 
 struct kgsl_gmem_desc {
 	unsigned int x;