Merge "msm: kgsl: Add a type field to the adreno draw context flags"

This commit is contained in:
Linux Build Service Account
2013-04-02 20:52:47 -07:00
committed by Gerrit - the friendly Code Review server
8 changed files with 82 additions and 32 deletions
+18 -7
View File
@@ -12,6 +12,7 @@
*/
#include <linux/slab.h>
#include <linux/msm_kgsl.h>
#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;
+10 -1
View File
@@ -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);
+19 -11
View File
@@ -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;
}
+1 -3
View File
@@ -1214,8 +1214,6 @@ static long kgsl_ioctl_rb_issueibcmds(struct kgsl_device_private *dev_priv,
&param->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, &param->flags);
if (result)
goto done;
}
+1 -1
View File
@@ -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,
+20 -9
View File
@@ -24,6 +24,8 @@
#include <linux/tracepoint.h>
#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)
)
);
+5
View File
@@ -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;
}
+8
View File
@@ -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