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>
This commit is contained in:
committed by
Bryan Huntsman
parent
e0b5532197
commit
41f8fa3306
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user