diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_dmm_tiler.c')
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_dmm_tiler.c | 25 | 
1 files changed, 21 insertions, 4 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c index c60a85e82c6d..4be0c94673f5 100644 --- a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c +++ b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c @@ -1,11 +1,10 @@  /*   * DMM IOMMU driver support functions for TI OMAP processors.   * + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/   * Author: Rob Clark <[email protected]>   *         Andy Gross <[email protected]>   * - * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ - *   * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License as   * published by the Free Software Foundation version 2. @@ -121,14 +120,22 @@ static int wait_status(struct refill_engine *engine, uint32_t wait_mask)  	while (true) {  		r = dmm_read(dmm, reg[PAT_STATUS][engine->id]);  		err = r & DMM_PATSTATUS_ERR; -		if (err) +		if (err) { +			dev_err(dmm->dev, +				"%s: error (engine%d). PAT_STATUS: 0x%08x\n", +				__func__, engine->id, r);  			return -EFAULT; +		}  		if ((r & wait_mask) == wait_mask)  			break; -		if (--i == 0) +		if (--i == 0) { +			dev_err(dmm->dev, +				"%s: timeout (engine%d). PAT_STATUS: 0x%08x\n", +				__func__, engine->id, r);  			return -ETIMEDOUT; +		}  		udelay(1);  	} @@ -158,6 +165,11 @@ static irqreturn_t omap_dmm_irq_handler(int irq, void *arg)  	dmm_write(dmm, status, DMM_PAT_IRQSTATUS);  	for (i = 0; i < dmm->num_engines; i++) { +		if (status & DMM_IRQSTAT_ERR_MASK) +			dev_err(dmm->dev, +				"irq error(engine%d): IRQSTAT 0x%02x\n", +				i, status & 0xff); +  		if (status & DMM_IRQSTAT_LST) {  			if (dmm->engines[i].async)  				release_engine(&dmm->engines[i]); @@ -298,7 +310,12 @@ static int dmm_txn_commit(struct dmm_txn *txn, bool wait)  				msecs_to_jiffies(100))) {  			dev_err(dmm->dev, "timed out waiting for done\n");  			ret = -ETIMEDOUT; +			goto cleanup;  		} + +		/* Check the engine status before continue */ +		ret = wait_status(engine, DMM_PATSTATUS_READY | +				  DMM_PATSTATUS_VALID | DMM_PATSTATUS_DONE);  	}  cleanup:  |