[Intel-gfx] [PATCH 02/17] intel: Track the current packet location in the decode context.

Eric Anholt eric at anholt.net
Wed Jan 4 23:54:44 CET 2012


This is the start of plumbing the context through the decode
callchain instead of the current 4 arguments.
---
 intel/intel_decode.c              |   69 +++++++++++++++++++++++--------------
 intel/tests/gen7-3d.batch-ref.txt |   18 +++++-----
 2 files changed, 52 insertions(+), 35 deletions(-)

diff --git a/intel/intel_decode.c b/intel/intel_decode.c
index 81ef712..61797e1 100644
--- a/intel/intel_decode.c
+++ b/intel/intel_decode.c
@@ -39,13 +39,20 @@ struct drm_intel_decode {
 	/** PCI device ID. */
 	uint32_t devid;
 
-	/** GPU address of the start of the batchbuffer data. */
+	/** GPU address of the start of the current packet. */
 	uint32_t hw_offset;
-	/** CPU Virtual address of the start of the batchbuffer data. */
+	/** CPU virtual address of the start of the current packet. */
 	uint32_t *data;
-	/** Number of DWORDs of batchbuffer data. */
+	/** DWORDs of remaining batchbuffer data starting from the packet. */
 	uint32_t count;
 
+	/** GPU address of the start of the batchbuffer data. */
+	uint32_t base_hw_offset;
+	/** CPU Virtual address of the start of the batchbuffer data. */
+	uint32_t *base_data;
+	/** Number of DWORDs of batchbuffer data. */
+	uint32_t base_count;
+
 	/** @{
 	 * GPU head and tail pointers, which will be noted in the dump, or ~0.
 	 */
@@ -3583,9 +3590,9 @@ void
 drm_intel_decode_set_batch_pointer(struct drm_intel_decode *ctx,
 				   void *data, uint32_t hw_offset, int count)
 {
-	ctx->data = data;
-	ctx->hw_offset = hw_offset;
-	ctx->count = count;
+	ctx->base_data = data;
+	ctx->base_hw_offset = hw_offset;
+	ctx->base_count = count;
 }
 
 void
@@ -3616,16 +3623,15 @@ drm_intel_decode(struct drm_intel_decode *ctx)
 	int ret;
 	unsigned int index = 0;
 	int failures = 0;
-	uint32_t *data;
-	uint32_t count, hw_offset;
 	uint32_t devid;
 
 	if (!ctx)
 		return;
 
-	data = ctx->data;
-	count = ctx->count;
-	hw_offset = ctx->hw_offset;
+	ctx->data = ctx->base_data;
+	ctx->hw_offset = ctx->base_hw_offset;
+	ctx->count = ctx->base_count;
+
 	devid = ctx->devid;
 	head_offset = ctx->head;
 	tail_offset = ctx->tail;
@@ -3634,11 +3640,13 @@ drm_intel_decode(struct drm_intel_decode *ctx)
 	saved_s2_set = 0;
 	saved_s4_set = 1;
 
-	while (index < count) {
-		switch ((data[index] & 0xe0000000) >> 29) {
+	while (ctx->count > 0) {
+		index = 0;
+
+		switch ((ctx->data[index] & 0xe0000000) >> 29) {
 		case 0x0:
-			ret = decode_mi(data + index, count - index,
-					hw_offset + index * 4, &failures);
+			ret = decode_mi(ctx->data, ctx->count,
+					ctx->hw_offset, &failures);
 
 			/* If MI_BATCHBUFFER_END happened, then dump
 			 * the rest of the output in case we some day
@@ -3650,9 +3658,10 @@ drm_intel_decode(struct drm_intel_decode *ctx)
 				if (ctx->dump_past_end) {
 					index++;
 				} else {
-					for (index = index + 1; index < count;
+					for (index = index + 1; index < ctx->count;
 					     index++) {
-						instr_out(data, hw_offset,
+						instr_out(ctx->data,
+							  ctx->hw_offset,
 							  index, "\n");
 					}
 				}
@@ -3660,32 +3669,40 @@ drm_intel_decode(struct drm_intel_decode *ctx)
 				index += ret;
 			break;
 		case 0x2:
-			index += decode_2d(data + index, count - index,
-					   hw_offset + index * 4, &failures);
+			index += decode_2d(ctx->data, ctx->count,
+					   ctx->hw_offset, &failures);
 			break;
 		case 0x3:
 			if (IS_9XX(devid) && !IS_GEN3(devid)) {
 				index +=
-				    decode_3d_965(data + index, count - index,
-						  hw_offset + index * 4, devid,
+				    decode_3d_965(ctx->data, ctx->count,
+						  ctx->hw_offset, devid,
 						  &failures);
 			} else if (IS_GEN3(devid)) {
-				index += decode_3d(data + index, count - index,
-						   hw_offset + index * 4,
+				index += decode_3d(ctx->data, ctx->count,
+						   ctx->hw_offset,
 						   devid, &failures);
 			} else {
 				index +=
-				    decode_3d_i830(data + index, count - index,
-						   hw_offset + index * 4, devid,
+				    decode_3d_i830(ctx->data, ctx->count,
+						   ctx->hw_offset, devid,
 						   &failures);
 			}
 			break;
 		default:
-			instr_out(data, hw_offset, index, "UNKNOWN\n");
+			instr_out(ctx->data, ctx->hw_offset, index,
+				  "UNKNOWN\n");
 			failures++;
 			index++;
 			break;
 		}
 		fflush(out);
+
+		if (ctx->count < index)
+			break;
+
+		ctx->count -= index;
+		ctx->data += index;
+		ctx->hw_offset += 4 * index;
 	}
 }
diff --git a/intel/tests/gen7-3d.batch-ref.txt b/intel/tests/gen7-3d.batch-ref.txt
index c710a78..953b7bd 100644
--- a/intel/tests/gen7-3d.batch-ref.txt
+++ b/intel/tests/gen7-3d.batch-ref.txt
@@ -282,7 +282,7 @@ Bad count in 3DSTATE_CONSTANT_VS_STATE
 0x123003ec:      0x00600810: MI_NOOP write NOPID reg, val=0x200810
 0x123003f0:      0x02380000: MI_FLUSH
 0x123003f4:      0x00000000: MI_NOOP
-0x123003f8:      0xea9de040:    UNKNOWN
+0x123003f8:      0xea9de040: UNKNOWN
 0x123003fc:      0x00007f93: MI_NOOP
 0x12300400:      0x02279b80: MI_FLUSH
 0x12300404:      0x00000000: MI_NOOP
@@ -483,7 +483,7 @@ Bad count in 3DSTATE_CONSTANT_VS_STATE
 0x123006b0:      0x00000000: MI_NOOP
 0x123006b4:      0x0000000b: MI_NOOP
 0x123006b8:      0x00000000: MI_NOOP
-0x123006bc:      0xea9de040:    UNKNOWN
+0x123006bc:      0xea9de040: UNKNOWN
 0x123006c0:      0x00007f93: MI_NOOP
 0x123006c4:      0x00000000: MI_NOOP
 0x123006c8:      0x00000001: MI_NOOP
@@ -556,7 +556,7 @@ Bad count in 3DSTATE_CONSTANT_VS_STATE
 0x12300798:      0x00600810: MI_NOOP write NOPID reg, val=0x200810
 0x1230079c:      0x02390000: MI_FLUSH
 0x123007a0:      0x00000000: MI_NOOP
-0x123007a4:      0xea9de040:    UNKNOWN
+0x123007a4:      0xea9de040: UNKNOWN
 0x123007a8:      0x00007f93: MI_NOOP
 0x123007ac:      0x02279b80: MI_FLUSH
 0x123007b0:      0x00000000: MI_NOOP
@@ -666,7 +666,7 @@ Bad count in 3DSTATE_CONSTANT_VS_STATE
 0x123008f0:      0x00600810: MI_NOOP write NOPID reg, val=0x200810
 0x123008f4:      0x02380000: MI_FLUSH
 0x123008f8:      0x00000000: MI_NOOP
-0x123008fc:      0xea9de040:    UNKNOWN
+0x123008fc:      0xea9de040: UNKNOWN
 0x12300900:      0x00007f93: MI_NOOP
 0x12300904:      0x02279b80: MI_FLUSH
 0x12300908:      0x00000000: MI_NOOP
@@ -844,7 +844,7 @@ Bad count in 3DSTATE_CONSTANT_VS_STATE
 0x12300b4c:      0x00000000: MI_NOOP
 0x12300b50:      0x0000000b: MI_NOOP
 0x12300b54:      0x00000000: MI_NOOP
-0x12300b58:      0xea9de040:    UNKNOWN
+0x12300b58:      0xea9de040: UNKNOWN
 0x12300b5c:      0x00007f93: MI_NOOP
 0x12300b60:      0x00000000: MI_NOOP
 0x12300b64:      0x00000001: MI_NOOP
@@ -917,7 +917,7 @@ Bad count in 3DSTATE_CONSTANT_VS_STATE
 0x12300c34:      0x00600810: MI_NOOP write NOPID reg, val=0x200810
 0x12300c38:      0x02390000: MI_FLUSH
 0x12300c3c:      0x00000000: MI_NOOP
-0x12300c40:      0xea9de040:    UNKNOWN
+0x12300c40:      0xea9de040: UNKNOWN
 0x12300c44:      0x00007f93: MI_NOOP
 0x12300c48:      0x02279b80: MI_FLUSH
 0x12300c4c:      0x00000000: MI_NOOP
@@ -1027,7 +1027,7 @@ Bad count in 3DSTATE_CONSTANT_VS_STATE
 0x12300d8c:      0x00600810: MI_NOOP write NOPID reg, val=0x200810
 0x12300d90:      0x02380000: MI_FLUSH
 0x12300d94:      0x00000000: MI_NOOP
-0x12300d98:      0xea9de040:    UNKNOWN
+0x12300d98:      0xea9de040: UNKNOWN
 0x12300d9c:      0x00007f93: MI_NOOP
 0x12300da0:      0x02279b80: MI_FLUSH
 0x12300da4:      0x00000000: MI_NOOP
@@ -1205,7 +1205,7 @@ Bad count in 3DSTATE_CONSTANT_VS_STATE
 0x12300fe8:      0x00000000: MI_NOOP
 0x12300fec:      0x0000000b: MI_NOOP
 0x12300ff0:      0x00000000: MI_NOOP
-0x12300ff4:      0xea9de040:    UNKNOWN
+0x12300ff4:      0xea9de040: UNKNOWN
 0x12300ff8:      0x00007f93: MI_NOOP
 0x12300ffc:      0x00000000: MI_NOOP
 0x12301000:      0x00000001: MI_NOOP
@@ -1278,7 +1278,7 @@ Bad count in 3DSTATE_CONSTANT_VS_STATE
 0x123010d0:      0x00600810: MI_NOOP write NOPID reg, val=0x200810
 0x123010d4:      0x02390000: MI_FLUSH
 0x123010d8:      0x00000000: MI_NOOP
-0x123010dc:      0xea9de040:    UNKNOWN
+0x123010dc:      0xea9de040: UNKNOWN
 0x123010e0:      0x00007f93: MI_NOOP
 0x123010e4:      0x02279b80: MI_FLUSH
 0x123010e8:      0x00000000: MI_NOOP
-- 
1.7.7.3




More information about the Intel-gfx mailing list