msm: kgsl: Consolidate and cleanup A2XX irq handlers

Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
diff --git a/drivers/gpu/msm/adreno_a2xx.c b/drivers/gpu/msm/adreno_a2xx.c
index f5f6f70..cd99302 100644
--- a/drivers/gpu/msm/adreno_a2xx.c
+++ b/drivers/gpu/msm/adreno_a2xx.c
@@ -1503,28 +1503,41 @@
  * managing the interrupts
  */
 
-#define KGSL_RBBM_INT_MASK \
-	 (RBBM_INT_CNTL__RDERR_INT_MASK |  \
-	  RBBM_INT_CNTL__DISPLAY_UPDATE_INT_MASK)
+#define RBBM_INT_MASK RBBM_INT_CNTL__RDERR_INT_MASK
 
-#define KGSL_CP_INT_MASK \
-	(CP_INT_CNTL__SW_INT_MASK | \
-	CP_INT_CNTL__T0_PACKET_IN_IB_MASK | \
+#define CP_INT_MASK \
+	(CP_INT_CNTL__T0_PACKET_IN_IB_MASK | \
 	CP_INT_CNTL__OPCODE_ERROR_MASK | \
 	CP_INT_CNTL__PROTECTED_MODE_ERROR_MASK | \
 	CP_INT_CNTL__RESERVED_BIT_ERROR_MASK | \
 	CP_INT_CNTL__IB_ERROR_MASK | \
-	CP_INT_CNTL__IB2_INT_MASK | \
 	CP_INT_CNTL__IB1_INT_MASK | \
 	CP_INT_CNTL__RB_INT_MASK)
 
 #define VALID_STATUS_COUNT_MAX	10
 
+static struct {
+	unsigned int mask;
+	const char *message;
+} kgsl_cp_error_irqs[] = {
+	{ CP_INT_CNTL__T0_PACKET_IN_IB_MASK,
+		"ringbuffer TO packet in IB interrupt" },
+	{ CP_INT_CNTL__OPCODE_ERROR_MASK,
+		"ringbuffer opcode error interrupt" },
+	{ CP_INT_CNTL__PROTECTED_MODE_ERROR_MASK,
+		"ringbuffer protected mode error interrupt" },
+	{ CP_INT_CNTL__RESERVED_BIT_ERROR_MASK,
+		"ringbuffer reserved bit error interrupt" },
+	{ CP_INT_CNTL__IB_ERROR_MASK,
+		"ringbuffer IB error interrupt" },
+};
+
 static void a2xx_cp_intrcallback(struct kgsl_device *device)
 {
 	unsigned int status = 0, num_reads = 0, master_status = 0;
 	struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
 	struct adreno_ringbuffer *rb = &adreno_dev->ringbuffer;
+	int i;
 
 	adreno_regread(device, REG_MASTER_INT_SIGNAL, &master_status);
 	while (!status && (num_reads < VALID_STATUS_COUNT_MAX) &&
@@ -1562,43 +1575,22 @@
 		KGSL_CMD_WARN(rb->device, "ringbuffer rb interrupt\n");
 	}
 
-	if (status & CP_INT_CNTL__T0_PACKET_IN_IB_MASK) {
-		KGSL_CMD_CRIT(rb->device,
-			"ringbuffer TO packet in IB interrupt\n");
-		kgsl_pwrctrl_irq(rb->device, KGSL_PWRFLAGS_OFF);
-	}
-	if (status & CP_INT_CNTL__OPCODE_ERROR_MASK) {
-		KGSL_CMD_CRIT(rb->device,
-			"ringbuffer opcode error interrupt\n");
-		kgsl_pwrctrl_irq(rb->device, KGSL_PWRFLAGS_OFF);
-	}
-	if (status & CP_INT_CNTL__PROTECTED_MODE_ERROR_MASK) {
-		KGSL_CMD_CRIT(rb->device,
-			"ringbuffer protected mode error interrupt\n");
-		kgsl_pwrctrl_irq(rb->device, KGSL_PWRFLAGS_OFF);
-	}
-	if (status & CP_INT_CNTL__RESERVED_BIT_ERROR_MASK) {
-		KGSL_CMD_CRIT(rb->device,
-			"ringbuffer reserved bit error interrupt\n");
-		kgsl_pwrctrl_irq(rb->device, KGSL_PWRFLAGS_OFF);
-	}
-	if (status & CP_INT_CNTL__IB_ERROR_MASK) {
-		KGSL_CMD_CRIT(rb->device,
-			"ringbuffer IB error interrupt\n");
-		kgsl_pwrctrl_irq(rb->device, KGSL_PWRFLAGS_OFF);
-	}
-	if (status & CP_INT_CNTL__SW_INT_MASK)
-		KGSL_CMD_INFO(rb->device, "ringbuffer software interrupt\n");
+	for (i = 0; i < ARRAY_SIZE(kgsl_cp_error_irqs); i++) {
+		if (status & kgsl_cp_error_irqs[i].mask) {
+			KGSL_CMD_CRIT(rb->device, "%s\n",
+				 kgsl_cp_error_irqs[i].message);
+			/*
+			 * on fatal errors, turn off the interrupts to
+			 * avoid storming. This has the side effect of
+			 * forcing a PM dump when the timestamp times out
+			 */
 
-	if (status & CP_INT_CNTL__IB2_INT_MASK)
-		KGSL_CMD_INFO(rb->device, "ringbuffer ib2 interrupt\n");
-
-	if (status & (~KGSL_CP_INT_MASK))
-		KGSL_CMD_WARN(rb->device,
-			"bad bits in REG_CP_INT_STATUS %08x\n", status);
+			kgsl_pwrctrl_irq(rb->device, KGSL_PWRFLAGS_OFF);
+		}
+	}
 
 	/* only ack bits we understand */
-	status &= KGSL_CP_INT_MASK;
+	status &= CP_INT_MASK;
 	adreno_regwrite(device, REG_CP_INT_ACK, status);
 
 	if (status & (CP_INT_CNTL__IB1_INT_MASK | CP_INT_CNTL__RB_INT_MASK)) {
@@ -1629,16 +1621,9 @@
 		else
 			KGSL_DRV_CRIT(device,
 				"rbbm read error interrupt: %08x\n", rderr);
-	} else if (status & RBBM_INT_CNTL__DISPLAY_UPDATE_INT_MASK) {
-		KGSL_DRV_INFO(device, "rbbm display update interrupt\n");
-	} else if (status & RBBM_INT_CNTL__GUI_IDLE_INT_MASK) {
-		KGSL_DRV_INFO(device, "rbbm gui idle interrupt\n");
-	} else {
-		KGSL_CMD_WARN(device,
-			"bad bits in REG_CP_INT_STATUS %08x\n", status);
 	}
 
-	status &= KGSL_RBBM_INT_MASK;
+	status &= RBBM_INT_MASK;
 	adreno_regwrite(device, REG_RBBM_INT_ACK, status);
 }
 
@@ -1673,8 +1658,8 @@
 	struct kgsl_device *device = &adreno_dev->dev;
 
 	if (state) {
-		adreno_regwrite(device, REG_RBBM_INT_CNTL, KGSL_RBBM_INT_MASK);
-		adreno_regwrite(device, REG_CP_INT_CNTL, KGSL_CP_INT_MASK);
+		adreno_regwrite(device, REG_RBBM_INT_CNTL, RBBM_INT_MASK);
+		adreno_regwrite(device, REG_CP_INT_CNTL, CP_INT_MASK);
 		adreno_regwrite(device, MH_INTERRUPT_MASK, KGSL_MMU_INT_MASK);
 	} else {
 		adreno_regwrite(device, REG_RBBM_INT_CNTL, 0);