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

Commit 3e1f6bce authored by Kyle Piefer's avatar Kyle Piefer Committed by Gerrit - the friendly Code Review server
Browse files

msm: kgsl: Update slumber entry sequence for A630v2



A630v2 uses a simplified RSC slumber entry sequence.
Add the new sequence and version checks to take the
right code path.

CRs-Fixed: 2085877
Change-Id: Ie297399b73160d43fd940d1f25fe3462f79923a8
Signed-off-by: default avatarKyle Piefer <kpiefer@codeaurora.org>
parent 24029597
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -935,6 +935,7 @@
#define A6XX_GMU_AO_SPARE_CNTL			0x23B16

/* GMU RSC control registers */
#define A6XX_GPU_RSCC_RSC_STATUS0_DRV0		0x23404
#define A6XX_GMU_RSCC_CONTROL_REQ		0x23B07
#define A6XX_GMU_RSCC_CONTROL_ACK		0x23B08

+32 −18
Original line number Diff line number Diff line
@@ -1435,36 +1435,50 @@ static int a6xx_rpmh_power_on_gpu(struct kgsl_device *device)
static int a6xx_rpmh_power_off_gpu(struct kgsl_device *device)
{
	struct gmu_device *gmu = &device->gmu;
	const struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
	int val;
	struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
	int ret;

	/* RSC sleep sequence */
	/* RSC sleep sequence is different on v1 */
	if (adreno_is_a630v1(adreno_dev))
		kgsl_gmu_regwrite(device, A6XX_RSCC_TIMESTAMP_UNIT1_EN_DRV0, 1);

	kgsl_gmu_regwrite(device, A6XX_GMU_RSCC_CONTROL_REQ, 1);
	wmb();

	if (timed_poll_check(device,
	if (adreno_is_a630v1(adreno_dev))
		ret = timed_poll_check(device,
				A6XX_RSCC_TIMESTAMP_UNIT1_OUTPUT_DRV0,
				BIT(0),
				GPU_START_TIMEOUT,
			BIT(0))) {
				BIT(0));
	else
		ret = timed_poll_check(device,
				A6XX_GPU_RSCC_RSC_STATUS0_DRV0,
				BIT(16),
				GPU_START_TIMEOUT,
				BIT(16));

	if (ret) {
		dev_err(&gmu->pdev->dev, "GPU RSC power off fail\n");
		return -EINVAL;
		return -ETIMEDOUT;
	}

	/* Read to clear the timestamp valid signal. Don't care what we read. */
	if (adreno_is_a630v1(adreno_dev)) {
		kgsl_gmu_regread(device,
				A6XX_RSCC_TIMESTAMP_UNIT0_TIMESTAMP_L_DRV0,
				&ret);
		kgsl_gmu_regread(device,
				A6XX_RSCC_TIMESTAMP_UNIT0_TIMESTAMP_H_DRV0,
				&ret);
	}

	/* Read to clear the timestamp */
	kgsl_gmu_regread(device, A6XX_RSCC_TIMESTAMP_UNIT0_TIMESTAMP_L_DRV0,
			&val);
	kgsl_gmu_regread(device, A6XX_RSCC_TIMESTAMP_UNIT0_TIMESTAMP_H_DRV0,
			&val);
	kgsl_gmu_regwrite(device, A6XX_GMU_RSCC_CONTROL_REQ, 0);

	if (ADRENO_FEATURE(adreno_dev, ADRENO_LM) &&
			test_bit(ADRENO_LM_CTRL, &adreno_dev->pwrctrl_flag))
		kgsl_gmu_regwrite(device, A6XX_GMU_AO_SPARE_CNTL, 0);

	/* FIXME: v2 has different procedure to trigger sequence */

	return 0;
}