forked from rubenslte/android_kernel_samsung_msm8226
Merge "msm: kgsl: Add a type field to the adreno draw context flags"
This commit is contained in:
committed by
Gerrit - the friendly Code Review server
commit
e421a6c93c
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user