Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 535b852b authored by Jordan Crouse's avatar Jordan Crouse
Browse files

msm: kgsl: Allow a draw context to skip snapshot



Some test applications intentionally generate a GPU fault for
various reasons. Because a GPU fault generates a snapshot and
snapshots are persistent until they are pulled, running the test
application may take up the snapshot slot and prevent a real fault
from being captured and debugged.

This flag allows the draw context to intentionally avoid generating
a snapshot.

Change-Id: Ic0dedbad8476c308a13572d999540b243d97eabc
Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
parent a8fe0d26
Loading
Loading
Loading
Loading
+22 −11
Original line number Diff line number Diff line
@@ -1699,6 +1699,27 @@ replay:
	kfree(replay);
}

static void do_header_and_snapshot(struct kgsl_device *device,
		struct adreno_ringbuffer *rb, struct kgsl_cmdbatch *cmdbatch)
{
	/* Always dump the snapshot on a non-cmdbatch failure */
	if (cmdbatch == NULL) {
		adreno_fault_header(device, rb, NULL);
		kgsl_device_snapshot(device, NULL);
		return;
	}

	/* Skip everything if the PMDUMP flag is set */
	if (test_bit(KGSL_FT_SKIP_PMDUMP, &cmdbatch->fault_policy))
		return;

	/* Print the fault header */
	adreno_fault_header(device, rb, cmdbatch);

	if (!(cmdbatch->context->flags & KGSL_CONTEXT_NO_SNAPSHOT))
		kgsl_device_snapshot(device, cmdbatch->context);
}

static int dispatcher_do_fault(struct adreno_device *adreno_dev)
{
	struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
@@ -1788,17 +1809,7 @@ static int dispatcher_do_fault(struct adreno_device *adreno_dev)
	adreno_readreg64(adreno_dev, ADRENO_REG_CP_IB1_BASE,
		ADRENO_REG_CP_IB1_BASE_HI, &base);

	/*
	 * Dump the snapshot information if this is the first
	 * detected fault for the oldest active command batch
	 */

	if (cmdbatch == NULL ||
		!test_bit(KGSL_FT_SKIP_PMDUMP, &cmdbatch->fault_policy)) {
		adreno_fault_header(device, hung_rb, cmdbatch);
		kgsl_device_snapshot(device,
			cmdbatch ? cmdbatch->context : NULL);
	}
	do_header_and_snapshot(device, hung_rb, cmdbatch);

	/* Terminate the stalled transaction and resume the IOMMU */
	if (fault & ADRENO_IOMMU_PAGE_FAULT)
+2 −1
Original line number Diff line number Diff line
@@ -346,7 +346,8 @@ adreno_drawctxt_create(struct kgsl_device_private *dev_priv,
		KGSL_CONTEXT_PWR_CONSTRAINT |
		KGSL_CONTEXT_IFH_NOP |
		KGSL_CONTEXT_SECURE |
		KGSL_CONTEXT_PREEMPT_STYLE_MASK);
		KGSL_CONTEXT_PREEMPT_STYLE_MASK |
		KGSL_CONTEXT_NO_SNAPSHOT);

	/* Check for errors before trying to initialize */

+1 −1
Original line number Diff line number Diff line
@@ -43,13 +43,13 @@
/* This is a cmdbatch exclusive flag - use the CMDBATCH equivalent instead */
#define KGSL_CONTEXT_SYNC               0x00000400
#define KGSL_CONTEXT_PWR_CONSTRAINT     0x00000800

#define KGSL_CONTEXT_PRIORITY_MASK      0x0000F000
#define KGSL_CONTEXT_PRIORITY_SHIFT     12
#define KGSL_CONTEXT_PRIORITY_UNDEF     0

#define KGSL_CONTEXT_IFH_NOP            0x00010000
#define KGSL_CONTEXT_SECURE             0x00020000
#define KGSL_CONTEXT_NO_SNAPSHOT        0x00040000

#define KGSL_CONTEXT_PREEMPT_STYLE_MASK       0x0E000000
#define KGSL_CONTEXT_PREEMPT_STYLE_SHIFT      25