aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhou, Jie <b30303@freescale.com>2011-03-03 01:02:40 +0800
committerRichard Zhao <richard.zhao@freescale.com>2011-04-20 15:22:29 +0800
commita56f8b32b75996e04b109243e9ad678b28295622 (patch)
tree4bce91f3e45a608837caad206ed0206ef95ffb84
parent5598b898d832f32da73fd38b2334ac5dca0d2d59 (diff)
downloadlinux-linaro-natty-a56f8b32b75996e04b109243e9ad678b28295622.tar.gz
ENGR00140050 GPU: workaround hang with heavy bus loading
The GPU hang when run two cubes together with one video playback. According to the suggestion from AMD, we'd better not read register when GPU active, especially for CP block. Signed-off-by: Zhou, Jie <b30303@freescale.com> Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
-rw-r--r--drivers/mxc/amd-gpu/common/gsl_intrmgr.c7
-rw-r--r--drivers/mxc/amd-gpu/common/gsl_ringbuffer.c6
2 files changed, 6 insertions, 7 deletions
diff --git a/drivers/mxc/amd-gpu/common/gsl_intrmgr.c b/drivers/mxc/amd-gpu/common/gsl_intrmgr.c
index 2c8b278dfe7a..cba9fc32ab8c 100644
--- a/drivers/mxc/amd-gpu/common/gsl_intrmgr.c
+++ b/drivers/mxc/amd-gpu/common/gsl_intrmgr.c
@@ -58,7 +58,12 @@ kgsl_intr_decode(gsl_device_t *device, gsl_intrblock_t block_id)
unsigned int status;
// read the block's interrupt status bits
- device->ftbl.device_regread(device, block->status_reg, &status);
+ /* exclude CP block here to avoid hang in heavy loading with VPU+GPU */
+ if (block_id == GSL_INTR_BLOCK_YDX_CP) {
+ status = 0x80000000;
+ } else {
+ device->ftbl.device_regread(device, block->status_reg, &status);
+ }
// mask off any interrupts which are disabled
status &= device->intr.enabled[block->id];
diff --git a/drivers/mxc/amd-gpu/common/gsl_ringbuffer.c b/drivers/mxc/amd-gpu/common/gsl_ringbuffer.c
index 76c6c701f126..fb05ff3cbe14 100644
--- a/drivers/mxc/amd-gpu/common/gsl_ringbuffer.c
+++ b/drivers/mxc/amd-gpu/common/gsl_ringbuffer.c
@@ -356,12 +356,6 @@ kgsl_ringbuffer_submit(gsl_ringbuffer_t *rb)
// send the wptr to the hw
rb->device->ftbl.device_regwrite(rb->device, mmCP_RB_WPTR, rb->wptr);
- // force wptr register to be updated
- do
- {
- rb->device->ftbl.device_regread(rb->device, mmCP_RB_WPTR, &value);
- } while (value != rb->wptr);
-
rb->flags |= GSL_FLAGS_ACTIVE;
kgsl_log_write( KGSL_LOG_GROUP_COMMAND | KGSL_LOG_LEVEL_TRACE, "<-- kgsl_ringbuffer_submit.\n" );