msm: kgsl: use correct 2d ringbuffer offset in resume

The 2d timestamp is used as an index into the ringbuffer.
Now that z180_dev->current_timestamp is preserved across
resume, make sure that ADDR_VGV3_NEXTADDR is set to the
gpu address that corresponds to the current timestamp.

CRs-Fixed: 347025
Change-Id: Ib7dc4579943ab24e04279ede1555539ec21adabd
Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
This commit is contained in:
Jeremy Gebben
2012-04-23 16:02:47 -06:00
parent eac0d1edf2
commit 8b253bf2c4

View File

@@ -304,15 +304,22 @@ error:
return result;
}
static inline unsigned int rb_offset(unsigned int index)
static inline unsigned int rb_offset(unsigned int timestamp)
{
return index*sizeof(unsigned int)*(Z180_PACKET_SIZE);
return (timestamp % Z180_PACKET_COUNT)
*sizeof(unsigned int)*(Z180_PACKET_SIZE);
}
static void addmarker(struct z180_ringbuffer *rb, unsigned int index)
static inline unsigned int rb_gpuaddr(struct z180_device *z180_dev,
unsigned int timestamp)
{
return z180_dev->ringbuffer.cmdbufdesc.gpuaddr + rb_offset(timestamp);
}
static void addmarker(struct z180_ringbuffer *rb, unsigned int timestamp)
{
char *ptr = (char *)(rb->cmdbufdesc.hostptr);
unsigned int *p = (unsigned int *)(ptr + rb_offset(index));
unsigned int *p = (unsigned int *)(ptr + rb_offset(timestamp));
*p++ = Z180_STREAM_PACKET;
*p++ = (Z180_MARKER_CMD | 5);
@@ -326,11 +333,11 @@ static void addmarker(struct z180_ringbuffer *rb, unsigned int index)
*p++ = ADDR_VGV3_LAST << 24;
}
static void addcmd(struct z180_ringbuffer *rb, unsigned int index,
static void addcmd(struct z180_ringbuffer *rb, unsigned int timestamp,
unsigned int cmd, unsigned int nextcnt)
{
char * ptr = (char *)(rb->cmdbufdesc.hostptr);
unsigned int *p = (unsigned int *)(ptr + (rb_offset(index)
unsigned int *p = (unsigned int *)(ptr + (rb_offset(timestamp)
+ (Z180_MARKER_SIZE * sizeof(unsigned int))));
*p++ = Z180_STREAM_PACKET_CALL;
@@ -355,7 +362,7 @@ static void z180_cmdstream_start(struct kgsl_device *device, int init_ram)
z180_cmdwindow_write(device, ADDR_VGV3_MODE, 4);
z180_cmdwindow_write(device, ADDR_VGV3_NEXTADDR,
z180_dev->ringbuffer.cmdbufdesc.gpuaddr);
rb_gpuaddr(z180_dev, z180_dev->current_timestamp));
z180_cmdwindow_write(device, ADDR_VGV3_NEXTCMD, cmd | 5);
@@ -406,9 +413,7 @@ z180_cmdstream_issueibcmds(struct kgsl_device_private *dev_priv,
long result = 0;
unsigned int ofs = PACKETSIZE_STATESTREAM * sizeof(unsigned int);
unsigned int cnt = 5;
unsigned int nextaddr = 0;
unsigned int index = 0;
unsigned int nextindex;
unsigned int old_timestamp = 0;
unsigned int nextcnt = Z180_STREAM_END_CMD | 5;
struct kgsl_mem_entry *entry = NULL;
unsigned int cmd;
@@ -477,26 +482,22 @@ z180_cmdstream_issueibcmds(struct kgsl_device_private *dev_priv,
}
result = 0;
index = z180_dev->current_timestamp % Z180_PACKET_COUNT;
old_timestamp = z180_dev->current_timestamp;
z180_dev->current_timestamp++;
nextindex = z180_dev->current_timestamp % Z180_PACKET_COUNT;
*timestamp = z180_dev->current_timestamp;
z180_dev->ringbuffer.prevctx = context->id;
addcmd(&z180_dev->ringbuffer, index, cmd + ofs, cnt);
addcmd(&z180_dev->ringbuffer, old_timestamp, cmd + ofs, cnt);
kgsl_pwrscale_busy(device);
/* Make sure the next ringbuffer entry has a marker */
addmarker(&z180_dev->ringbuffer, nextindex);
nextaddr = z180_dev->ringbuffer.cmdbufdesc.gpuaddr
+ rb_offset(nextindex);
addmarker(&z180_dev->ringbuffer, z180_dev->current_timestamp);
/* monkey patch the IB so that it jumps back to the ringbuffer */
kgsl_sharedmem_writel(&entry->memdesc,
((sizedwords + 1) * sizeof(unsigned int)),
nextaddr);
((sizedwords + 1) * sizeof(unsigned int)),
rb_gpuaddr(z180_dev, z180_dev->current_timestamp));
kgsl_sharedmem_writel(&entry->memdesc,
((sizedwords + 2) * sizeof(unsigned int)),
nextcnt);