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;