summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhou, Jie <b30303@freescale.com>2011-03-03 01:02:40 +0800
committerZhou, Jie <b30303@freescale.com>2011-03-03 17:44:01 +0800
commit39abbad4b453f707b2c3d07233876efe018943c4 (patch)
treec6a4ab428f28700b82dccd423573a379da3f77c5
parentd88984b563a75f78110b1ba230f4cf1981bfe4c1 (diff)
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>
-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" );