From 41f8fa330664879217c2fef2dd373446c9c650ca Mon Sep 17 00:00:00 2001 From: Sushmita Susheelendra Date: Wed, 11 May 2011 17:15:58 -0600 Subject: [PATCH] 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 --- drivers/gpu/msm/kgsl.c | 14 +++++++ drivers/gpu/msm/kgsl_cffdump.c | 67 ++++++++++++++++++++++++++-------- drivers/gpu/msm/kgsl_cffdump.h | 5 +++ include/linux/msm_kgsl.h | 14 ++++++- 4 files changed, 83 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 814f909b752..ce3717e479c 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -1574,6 +1574,18 @@ static long kgsl_ioctl_cff_syncmem(struct kgsl_device_private *dev_priv, 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 @@ static const struct { 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 476ceac14a3..2cb2351769d 100644 --- a/drivers/gpu/msm/kgsl_cffdump.c +++ b/drivers/gpu/msm/kgsl_cffdump.c @@ -68,7 +68,6 @@ struct cff_op_wait_irq { 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 @@ struct cff_op_eof { 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_membuf(int id, unsigned char *out_buf, int out_bufsize) } 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 @@ static void cffdump_printline(int id, uint opcode, uint op1, uint op2, 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 @@ static void cffdump_printline(int id, uint opcode, uint op1, uint op2, 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_open(enum kgsl_deviceid device_id) 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 @@ void kgsl_cffdump_syncmem(struct kgsl_device_private *dev_priv, 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 @@ void kgsl_cffdump_setmem(uint addr, uint value, uint sizebytes) 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 @@ void kgsl_cffdump_regwrite(enum kgsl_deviceid device_id, uint addr, 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 @@ void kgsl_cffdump_regpoll(enum kgsl_deviceid device_id, uint addr, 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 @@ void kgsl_cffdump_slavewrite(uint addr, uint value) 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 @@ int kgsl_cffdump_waitirq(void) 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 91e7299ebc4..140e4868e0c 100644 --- a/drivers/gpu/msm/kgsl_cffdump.h +++ b/drivers/gpu/msm/kgsl_cffdump.h @@ -35,6 +35,9 @@ void kgsl_cffdump_regpoll(enum kgsl_deviceid device_id, uint addr, 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 @@ void kgsl_cffdump_hang(enum kgsl_deviceid device_id); #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 ed54bdf4c5c..911cd0fa481 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 @@ struct kgsl_sharedmem_free { #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;