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

Commit a18eecda authored by Puranam V G Tejaswi's avatar Puranam V G Tejaswi
Browse files

msm: kgsl: Poll GDCSR for holi target to ensure CX collapse



The regulator_is_enabled() API doesn't guarantee that CX gdsc has
collapsed at hardware. There could be a vote on the GDSC from another
subsystem like TZ. So poll the CX GDSCR register to ensure that CX has
indeed collapsed.

Change-Id: Ic07cde5ba3442689cb73b33fe57c3d4371cb9565
Signed-off-by: default avatarPuranam V G Tejaswi <pvgtejas@codeaurora.org>
parent f021cc3c
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -3567,17 +3567,15 @@ static void adreno_clk_set_options(struct kgsl_device *device, const char *name,
static void adreno_regulator_disable_poll(struct kgsl_device *device)
{
	struct kgsl_pwrctrl *pwr = &device->pwrctrl;
	const struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(
						ADRENO_DEVICE(device));

	/* Set the parent in retention voltage to disable CPR interrupts */
	kgsl_regulator_set_voltage(device->dev, pwr->gx_gdsc_parent,
			pwr->gx_gdsc_parent_min_corner);
	if (gpudev->regulator_disable_poll)
		return gpudev->regulator_disable_poll(device);

	if (!kgsl_regulator_disable_wait(pwr->gx_gdsc, 200))
		dev_err(device->dev, "Regulator vdd is stuck on\n");

	/* Remove the vote for the vdd parent supply */
	kgsl_regulator_set_voltage(device->dev, pwr->gx_gdsc_parent, 0);

	if (!kgsl_regulator_disable_wait(pwr->cx_gdsc, 200))
		dev_err(device->dev, "Regulator vddcx is stuck on\n");
}
+1 −0
Original line number Diff line number Diff line
@@ -812,6 +812,7 @@ struct adreno_gpudev {
	const struct adreno_power_ops *power_ops;
	int (*clear_pending_transactions)(struct adreno_device *adreno_dev);
	void (*deassert_gbif_halt)(struct adreno_device *adreno_dev);
	void (*regulator_disable_poll)(struct kgsl_device *device);
};

/**
+32 −2
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#include "adreno_pm4types.h"
#include "adreno_trace.h"
#include "kgsl_trace.h"
#include "kgsl_util.h"

/* IFPC & Preemption static powerup restore list */
static u32 a6xx_pwrup_reglist[] = {
@@ -249,6 +250,7 @@ bool a6xx_cx_regulator_disable_wait(struct regulator *reg,
{
	ktime_t tout = ktime_add_us(ktime_get(), timeout * 1000);
	unsigned int val;
	struct adreno_device *adreno_dev = ADRENO_DEVICE(device);

	if (IS_ERR_OR_NULL(reg))
		return true;
@@ -256,13 +258,22 @@ bool a6xx_cx_regulator_disable_wait(struct regulator *reg,
	regulator_disable(reg);

	for (;;) {
		if (adreno_is_a619_holi(adreno_dev))
			adreno_read_gmu_wrapper(adreno_dev,
					A6XX_GPU_CC_CX_GDSCR, &val);
		else
			gmu_core_regread(device, A6XX_GPU_CC_CX_GDSCR, &val);

		if (!(val & BIT(31)))
			return true;

		if (ktime_compare(ktime_get(), tout) > 0) {
			gmu_core_regread(device, A6XX_GPU_CC_CX_GDSCR, &val);
			if (adreno_is_a619_holi(adreno_dev))
				adreno_read_gmu_wrapper(adreno_dev,
						A6XX_GPU_CC_CX_GDSCR, &val);
			else
				gmu_core_regread(device, A6XX_GPU_CC_CX_GDSCR,
							&val);
			return (!(val & BIT(31)));
		}

@@ -2476,6 +2487,24 @@ u64 a6xx_read_alwayson(struct adreno_device *adreno_dev)
	return (((u64) hi) << 32) | lo;
}

static void a619_holi_regulator_disable_poll(struct kgsl_device *device)
{
	struct kgsl_pwrctrl *pwr = &device->pwrctrl;

	/* Set the parent in retention voltage to disable CPR interrupts */
	kgsl_regulator_set_voltage(device->dev, pwr->gx_gdsc_parent,
			pwr->gx_gdsc_parent_min_corner);

	if (!kgsl_regulator_disable_wait(pwr->gx_gdsc, 200))
		dev_err(device->dev, "Regulator vdd is stuck on\n");

	/* Remove the vote for the vdd parent supply */
	kgsl_regulator_set_voltage(device->dev, pwr->gx_gdsc_parent, 0);

	if (!a6xx_cx_regulator_disable_wait(pwr->cx_gdsc, device, 200))
		dev_err(device->dev, "Regulator vddcx is stuck on\n");
}

const struct adreno_gpudev adreno_a6xx_gpudev = {
	.reg_offsets = a6xx_register_offsets,
	.probe = a6xx_probe,
@@ -2624,6 +2653,7 @@ const struct adreno_gpudev adreno_a619_holi_gpudev = {
	.power_ops = &adreno_power_operations,
	.clear_pending_transactions = a6xx_clear_pending_transactions,
	.deassert_gbif_halt = a6xx_deassert_gbif_halt,
	.regulator_disable_poll = a619_holi_regulator_disable_poll,
};

const struct adreno_gpudev adreno_a630_gpudev = {