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

Commit 43695aa5 authored by Lynus Vaz's avatar Lynus Vaz
Browse files

msm: kgsl: Overwrite a GPU snapshot with a GMU snapshot



If we get a GMU fault, overwrite any existing GPU snapshot unless it
is a GMU snapshot.

Change-Id: Id2de38770ae400c138bea18d567b984eeb7c4ca9
Signed-off-by: default avatarLynus Vaz <lvaz@codeaurora.org>
parent 7cf6dd03
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2464,7 +2464,7 @@ void adreno_spin_idle_debug(struct adreno_device *adreno_dev,

	dev_err(device->dev, " hwfault=%8.8X\n", hwfault);

	kgsl_device_snapshot(device, NULL);
	kgsl_device_snapshot(device, NULL, adreno_gmu_gpu_fault(adreno_dev));
}

/**
+4 −0
Original line number Diff line number Diff line
@@ -1329,6 +1329,10 @@ static inline void adreno_set_gpu_fault(struct adreno_device *adreno_dev,
	smp_wmb();
}

static inline bool adreno_gmu_gpu_fault(struct adreno_device *adreno_dev)
{
	return adreno_gpu_fault(adreno_dev) & ADRENO_GMU_FAULT;
}

/**
 * adreno_clear_gpu_fault() - Clear the GPU fault register
+2 −2
Original line number Diff line number Diff line
@@ -685,7 +685,7 @@ static int a3xx_send_me_init(struct adreno_device *adreno_dev,
		struct kgsl_device *device = KGSL_DEVICE(adreno_dev);

		dev_err(device->dev, "CP initialization failed to idle\n");
		kgsl_device_snapshot(device, NULL);
		kgsl_device_snapshot(device, NULL, false);
	}

	return ret;
@@ -1823,7 +1823,7 @@ static int _ringbuffer_bootstrap_ucode(struct adreno_device *adreno_dev,

	if (ret) {
		KGSL_DRV_ERR(device, "microcode bootstrap failed to idle\n");
		kgsl_device_snapshot(device, NULL);
		kgsl_device_snapshot(device, NULL, false);
	}

	/* Clear the chicken bit for speed up on A430 and its derivatives */
+1 −1
Original line number Diff line number Diff line
@@ -1535,7 +1535,7 @@ static int a4xx_send_me_init(struct adreno_device *adreno_dev,
		struct kgsl_device *device = KGSL_DEVICE(adreno_dev);

		dev_err(device->dev, "CP initialization failed to idle\n");
		kgsl_device_snapshot(device, NULL);
		kgsl_device_snapshot(device, NULL, false);
	}

	return ret;
+4 −4
Original line number Diff line number Diff line
@@ -2046,7 +2046,7 @@ static void recover_dispatch_q(struct kgsl_device *device,
	kfree(replay);
}

static void do_header_and_snapshot(struct kgsl_device *device,
static void do_header_and_snapshot(struct kgsl_device *device, int fault,
		struct adreno_ringbuffer *rb, struct kgsl_drawobj_cmd *cmdobj)
{
	struct kgsl_drawobj *drawobj = DRAWOBJ(cmdobj);
@@ -2054,7 +2054,7 @@ static void do_header_and_snapshot(struct kgsl_device *device,
	/* Always dump the snapshot on a non-drawobj failure */
	if (cmdobj == NULL) {
		adreno_fault_header(device, rb, NULL);
		kgsl_device_snapshot(device, NULL);
		kgsl_device_snapshot(device, NULL, fault & ADRENO_GMU_FAULT);
		return;
	}

@@ -2066,7 +2066,7 @@ static void do_header_and_snapshot(struct kgsl_device *device,
	adreno_fault_header(device, rb, cmdobj);

	if (!(drawobj->context->flags & KGSL_CONTEXT_NO_SNAPSHOT))
		kgsl_device_snapshot(device, drawobj->context);
		kgsl_device_snapshot(device, NULL, fault & ADRENO_GMU_FAULT);
}

static int dispatcher_do_fault(struct adreno_device *adreno_dev)
@@ -2192,7 +2192,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);

	do_header_and_snapshot(device, hung_rb, cmdobj);
	do_header_and_snapshot(device, fault, hung_rb, cmdobj);

	/* Turn off the KEEPALIVE vote from the ISR for hard fault */
	if (gpudev->gpu_keepalive && fault & ADRENO_HARD_FAULT)
Loading