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

Commit 1a8c380d authored by Shubhraprakash Das's avatar Shubhraprakash Das
Browse files

msm: kgsl: Reset GPU when CFF is turned on



Reset GPU if it is not active once when CFF is turned on
so that the start CFF opcode is guaranteed to be present in
the CFF. The CFF is only valid from the start opcode.

Change-Id: I610163f34833ad1a869156fcf406f5d4b8957b82
Signed-off-by: default avatarShubhraprakash Das <sadas@codeaurora.org>
parent 1ab4f819
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -627,6 +627,15 @@ int kgsl_cff_dump_enable_set(void *data, u64 val)
		}
		if (!device->cff_dump_enable) {
			device->cff_dump_enable = 1;
			/*
			 * put device to slumber so that we ensure that the
			 * start opcode in CFF is present
			 */
			mutex_lock(&device->mutex);
			ret = kgsl_pwrctrl_slumber(device);
			if (ret)
				device->cff_dump_enable = 0;
			mutex_unlock(&device->mutex);
		}
	} else if (device->cff_dump_enable && !val) {
		device->cff_dump_enable = 0;
+37 −0
Original line number Diff line number Diff line
@@ -1417,6 +1417,43 @@ int kgsl_pwrctrl_sleep(struct kgsl_device *device)
}
EXPORT_SYMBOL(kgsl_pwrctrl_sleep);

/*
 * kgsl_pwrctrl_slumber() - Put device into slumber if it is not in suspend
 * @device: Device pointer
 *
 * Return 0 on success else error code
 */
int kgsl_pwrctrl_slumber(struct kgsl_device *device)
{
	int ret = 0;

	if (KGSL_STATE_SLUMBER == device->state ||
		KGSL_STATE_SUSPEND == device->state)
		return ret;
	if (KGSL_STATE_SUSPEND == device->requested_state)
		return ret;
	/* drain to prevent from more commands being submitted */
	device->ftbl->drain(device);
	/* wait for active count so device can be put in slumber */
	ret = kgsl_active_count_wait(device, 0);
	if (ret) {
		device->ftbl->resume(device);
		return ret;
	}

	ret = device->ftbl->idle(device);
	if (ret) {
		device->ftbl->resume(device);
		return ret;
	}
	/* resume since we drained earlier */
	device->ftbl->resume(device);
	kgsl_pwrctrl_request_state(device, KGSL_STATE_SLUMBER);
	ret = kgsl_pwrctrl_sleep(device);
	return ret;
}
EXPORT_SYMBOL(kgsl_pwrctrl_slumber);

/**
 * kgsl_pwrctrl_wake() - Power up the GPU from a slumber/sleep state
 * @device - Pointer to the kgsl_device struct
+1 −0
Original line number Diff line number Diff line
@@ -157,5 +157,6 @@ void kgsl_active_count_put(struct kgsl_device *device);
int kgsl_active_count_wait(struct kgsl_device *device, int count);
void kgsl_pwrctrl_clk(struct kgsl_device *device, int state,
				int requested_state);
int kgsl_pwrctrl_slumber(struct kgsl_device *device);

#endif /* __KGSL_PWRCTRL_H */