diff --git a/drivers/gpu/msm/adreno_drawctxt.c b/drivers/gpu/msm/adreno_drawctxt.c index 023b05759e8..176717d1d8e 100644 --- a/drivers/gpu/msm/adreno_drawctxt.c +++ b/drivers/gpu/msm/adreno_drawctxt.c @@ -12,6 +12,7 @@ */ #include +#include #include "kgsl.h" #include "kgsl_sharedmem.h" @@ -143,7 +144,7 @@ void build_quad_vtxbuff(struct adreno_context *drawctxt, */ int adreno_drawctxt_create(struct kgsl_device *device, struct kgsl_pagetable *pagetable, - struct kgsl_context *context, uint32_t flags) + struct kgsl_context *context, uint32_t *flags) { struct adreno_context *drawctxt; struct adreno_device *adreno_dev = ADRENO_DEVICE(device); @@ -162,26 +163,36 @@ int adreno_drawctxt_create(struct kgsl_device *device, drawctxt->id = context->id; rb->timestamp[context->id] = 0; - if (flags & KGSL_CONTEXT_PREAMBLE) + *flags &= (KGSL_CONTEXT_PREAMBLE | + KGSL_CONTEXT_NO_GMEM_ALLOC | + KGSL_CONTEXT_PER_CONTEXT_TS | + KGSL_CONTEXT_USER_GENERATED_TS | + KGSL_CONTEXT_NO_FAULT_TOLERANCE | + KGSL_CONTEXT_TYPE_MASK); + + if (*flags & KGSL_CONTEXT_PREAMBLE) drawctxt->flags |= CTXT_FLAGS_PREAMBLE; - if (flags & KGSL_CONTEXT_NO_GMEM_ALLOC) + if (*flags & KGSL_CONTEXT_NO_GMEM_ALLOC) drawctxt->flags |= CTXT_FLAGS_NOGMEMALLOC; - if (flags & KGSL_CONTEXT_PER_CONTEXT_TS) + if (*flags & KGSL_CONTEXT_PER_CONTEXT_TS) drawctxt->flags |= CTXT_FLAGS_PER_CONTEXT_TS; - if (flags & KGSL_CONTEXT_USER_GENERATED_TS) { - if (!(flags & KGSL_CONTEXT_PER_CONTEXT_TS)) { + if (*flags & KGSL_CONTEXT_USER_GENERATED_TS) { + if (!(*flags & KGSL_CONTEXT_PER_CONTEXT_TS)) { ret = -EINVAL; goto err; } drawctxt->flags |= CTXT_FLAGS_USER_GENERATED_TS; } - if (flags & KGSL_CONTEXT_NO_FAULT_TOLERANCE) + if (*flags & KGSL_CONTEXT_NO_FAULT_TOLERANCE) drawctxt->flags |= CTXT_FLAGS_NO_FAULT_TOLERANCE; + drawctxt->type = + (*flags & KGSL_CONTEXT_TYPE_MASK) >> KGSL_CONTEXT_TYPE_SHIFT; + ret = adreno_dev->gpudev->ctxt_create(adreno_dev, drawctxt); if (ret) goto err; diff --git a/drivers/gpu/msm/adreno_drawctxt.h b/drivers/gpu/msm/adreno_drawctxt.h index aba29ae2d5e..f0f3b6b066b 100644 --- a/drivers/gpu/msm/adreno_drawctxt.h +++ b/drivers/gpu/msm/adreno_drawctxt.h @@ -57,6 +57,14 @@ /* Context no fault tolerance */ #define CTXT_FLAGS_NO_FAULT_TOLERANCE BIT(16) +/* Symbolic table for the adreno draw context type */ +#define ADRENO_DRAWCTXT_TYPES \ + { KGSL_CONTEXT_TYPE_ANY, "any" }, \ + { KGSL_CONTEXT_TYPE_GL, "GL" }, \ + { KGSL_CONTEXT_TYPE_CL, "CL" }, \ + { KGSL_CONTEXT_TYPE_C2D, "C2D" }, \ + { KGSL_CONTEXT_TYPE_RS, "RS" } + struct kgsl_device; struct adreno_device; struct kgsl_device_private; @@ -95,6 +103,7 @@ struct adreno_context { uint32_t flags; uint32_t pagefault; unsigned long pagefault_ts; + unsigned int type; struct kgsl_pagetable *pagetable; struct kgsl_memdesc gpustate; unsigned int reg_restore[3]; @@ -127,7 +136,7 @@ struct adreno_context { int adreno_drawctxt_create(struct kgsl_device *device, struct kgsl_pagetable *pagetable, struct kgsl_context *context, - uint32_t flags); + uint32_t *flags); void adreno_drawctxt_destroy(struct kgsl_device *device, struct kgsl_context *context); diff --git a/drivers/gpu/msm/adreno_ringbuffer.c b/drivers/gpu/msm/adreno_ringbuffer.c index 8c23a13f478..90f8ba4c110 100644 --- a/drivers/gpu/msm/adreno_ringbuffer.c +++ b/drivers/gpu/msm/adreno_ringbuffer.c @@ -18,6 +18,7 @@ #include "kgsl.h" #include "kgsl_sharedmem.h" #include "kgsl_cffdump.h" +#include "kgsl_trace.h" #include "adreno.h" #include "adreno_pm4types.h" @@ -986,26 +987,31 @@ adreno_ringbuffer_issueibcmds(struct kgsl_device_private *dev_priv, { struct kgsl_device *device = dev_priv->device; struct adreno_device *adreno_dev = ADRENO_DEVICE(device); - unsigned int *link; + unsigned int *link = 0; unsigned int *cmds; unsigned int i; - struct adreno_context *drawctxt; + struct adreno_context *drawctxt = NULL; unsigned int start_index = 0; int ret; - if (device->state & KGSL_STATE_HUNG) - return -EBUSY; - if (!(adreno_dev->ringbuffer.flags & KGSL_FLAGS_STARTED) || - context == NULL || ibdesc == 0 || numibs == 0) - return -EINVAL; + if (device->state & KGSL_STATE_HUNG) { + ret = -EBUSY; + goto done; + } + if (!(adreno_dev->ringbuffer.flags & KGSL_FLAGS_STARTED) || + context == NULL || ibdesc == 0 || numibs == 0) { + ret = -EINVAL; + goto done; + } drawctxt = context->devctxt; if (drawctxt->flags & CTXT_FLAGS_GPU_HANG) { KGSL_CTXT_ERR(device, "proc %s failed fault tolerance" " will not accept commands for context %d\n", drawctxt->pid_name, drawctxt->id); - return -EDEADLK; + ret = -EDEADLK; + goto done; } /*When preamble is enabled, the preamble buffer with state restoration @@ -1032,9 +1038,8 @@ adreno_ringbuffer_issueibcmds(struct kgsl_device_private *dev_priv, cmds = link = kzalloc(sizeof(unsigned int) * (numibs * 3 + 4), GFP_KERNEL); if (!link) { - KGSL_CORE_ERR("kzalloc(%d) failed\n", - sizeof(unsigned int) * (numibs * 3 + 4)); - return -ENOMEM; + ret = -ENOMEM; + goto done; } if (!start_index) { @@ -1099,6 +1104,9 @@ adreno_ringbuffer_issueibcmds(struct kgsl_device_private *dev_priv, ret = 0; done: + trace_kgsl_issueibcmds(device, context->id, ibdesc, numibs, + *timestamp, flags, ret, drawctxt->type); + kfree(link); return ret; } diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 413be7004ad..53ef3927517 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -1214,8 +1214,6 @@ static long kgsl_ioctl_rb_issueibcmds(struct kgsl_device_private *dev_priv, ¶m->timestamp, param->flags); - trace_kgsl_issueibcmds(dev_priv->device, param, ibdesc, result); - free_ibdesc: kfree(ibdesc); done: @@ -1341,7 +1339,7 @@ static long kgsl_ioctl_drawctxt_create(struct kgsl_device_private *dev_priv, if (dev_priv->device->ftbl->drawctxt_create) { result = dev_priv->device->ftbl->drawctxt_create( dev_priv->device, dev_priv->process_priv->pagetable, - context, param->flags); + context, ¶m->flags); if (result) goto done; } diff --git a/drivers/gpu/msm/kgsl_device.h b/drivers/gpu/msm/kgsl_device.h index 37b5730f7b3..0d116609748 100644 --- a/drivers/gpu/msm/kgsl_device.h +++ b/drivers/gpu/msm/kgsl_device.h @@ -106,7 +106,7 @@ struct kgsl_functable { uint32_t flags); int (*drawctxt_create) (struct kgsl_device *device, struct kgsl_pagetable *pagetable, struct kgsl_context *context, - uint32_t flags); + uint32_t *flags); void (*drawctxt_destroy) (struct kgsl_device *device, struct kgsl_context *context); long (*ioctl) (struct kgsl_device_private *dev_priv, diff --git a/drivers/gpu/msm/kgsl_trace.h b/drivers/gpu/msm/kgsl_trace.h index 8c4811eae0c..5f7ee3c44ce 100644 --- a/drivers/gpu/msm/kgsl_trace.h +++ b/drivers/gpu/msm/kgsl_trace.h @@ -24,6 +24,8 @@ #include #include "kgsl_device.h" +#include "adreno_drawctxt.h" + struct kgsl_device; struct kgsl_ringbuffer_issueibcmds; struct kgsl_device_waittimestamp; @@ -34,11 +36,16 @@ struct kgsl_device_waittimestamp; TRACE_EVENT(kgsl_issueibcmds, TP_PROTO(struct kgsl_device *device, - struct kgsl_ringbuffer_issueibcmds *cmd, + int drawctxt_id, struct kgsl_ibdesc *ibdesc, - int result), + int numibs, + int timestamp, + int flags, + int result, + unsigned int type), - TP_ARGS(device, cmd, ibdesc, result), + TP_ARGS(device, drawctxt_id, ibdesc, numibs, timestamp, flags, + result, type), TP_STRUCT__entry( __string(device_name, device->name) @@ -48,21 +55,23 @@ TRACE_EVENT(kgsl_issueibcmds, __field(unsigned int, timestamp) __field(unsigned int, flags) __field(int, result) + __field(unsigned int, drawctxt_type) ), TP_fast_assign( __assign_str(device_name, device->name); - __entry->drawctxt_id = cmd->drawctxt_id; + __entry->drawctxt_id = drawctxt_id; __entry->ibdesc_addr = ibdesc[0].gpuaddr; - __entry->numibs = cmd->numibs; - __entry->timestamp = cmd->timestamp; - __entry->flags = cmd->flags; + __entry->numibs = numibs; + __entry->timestamp = timestamp; + __entry->flags = flags; __entry->result = result; + __entry->drawctxt_type = type; ), TP_printk( "d_name=%s ctx=%u ib=0x%u numibs=%u timestamp=0x%x " - "flags=0x%x(%s) result=%d", + "flags=0x%x(%s) result=%d type=%s", __get_str(device_name), __entry->drawctxt_id, __entry->ibdesc_addr, @@ -74,7 +83,9 @@ TRACE_EVENT(kgsl_issueibcmds, { KGSL_CONTEXT_SUBMIT_IB_LIST, "IB_LIST" }, { KGSL_CONTEXT_CTX_SWITCH, "CTX_SWITCH" }) : "None", - __entry->result + __entry->result, + __print_symbolic(__entry->drawctxt_type, + ADRENO_DRAWCTXT_TYPES) ) ); diff --git a/drivers/gpu/msm/z180.c b/drivers/gpu/msm/z180.c index b78c6fe8d0a..a07959b17e1 100644 --- a/drivers/gpu/msm/z180.c +++ b/drivers/gpu/msm/z180.c @@ -17,6 +17,7 @@ #include "kgsl.h" #include "kgsl_cffdump.h" #include "kgsl_sharedmem.h" +#include "kgsl_trace.h" #include "z180.h" #include "z180_reg.h" @@ -483,6 +484,10 @@ z180_cmdstream_issueibcmds(struct kgsl_device_private *dev_priv, z180_cmdwindow_write(device, ADDR_VGV3_CONTROL, cmd); z180_cmdwindow_write(device, ADDR_VGV3_CONTROL, 0); error: + + trace_kgsl_issueibcmds(device, context->id, ibdesc, numibs, + *timestamp, ctrl, result, 0); + return (int)result; } diff --git a/include/linux/msm_kgsl.h b/include/linux/msm_kgsl.h index 307be2be2a2..2ad040ee2bc 100644 --- a/include/linux/msm_kgsl.h +++ b/include/linux/msm_kgsl.h @@ -21,7 +21,15 @@ #define KGSL_CONTEXT_PER_CONTEXT_TS 0x00000040 #define KGSL_CONTEXT_USER_GENERATED_TS 0x00000080 #define KGSL_CONTEXT_NO_FAULT_TOLERANCE 0x00000200 +/* bits [12:15] are reserved for future use */ +#define KGSL_CONTEXT_TYPE_MASK 0x01F00000 +#define KGSL_CONTEXT_TYPE_SHIFT 20 +#define KGSL_CONTEXT_TYPE_ANY 0 +#define KGSL_CONTEXT_TYPE_GL 1 +#define KGSL_CONTEXT_TYPE_CL 2 +#define KGSL_CONTEXT_TYPE_C2D 3 +#define KGSL_CONTEXT_TYPE_RS 4 #define KGSL_CONTEXT_INVALID 0xffffffff