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

Commit d19c2292 authored by Hareesh Gundu's avatar Hareesh Gundu Committed by Gerrit - the friendly Code Review server
Browse files

msm: kgsl: Add speed bin read capabilities for A306a GPU



A306a GPU have the two different frequency plans. The frequency
plan needs to be loaded dynamically based on the speed bin
information. Add support for A306a gpu to read the speed bin
information and choose frequency plan dynamically.

Change-Id: Iba53d4381d61f23ce1195a147493b0d292cd3723
Signed-off-by: default avatarHareesh Gundu <hareeshg@codeaurora.org>
parent e7587c62
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -151,6 +151,43 @@ static const unsigned int _a3xx_pwron_fixup_fs_instructions[] = {
	0x00000000, 0x03000000, 0x00000000, 0x00000000,
};

static void a3xx_efuse_speed_bin(struct adreno_device *adreno_dev)
{
	unsigned int val;
	unsigned int speed_bin[3];
	struct kgsl_device *device = &adreno_dev->dev;

	if (of_property_read_u32_array(device->pdev->dev.of_node,
		"qcom,gpu-speed-bin", speed_bin, 3))
		return;

	adreno_efuse_read_u32(adreno_dev, speed_bin[0], &val);

	adreno_dev->speed_bin = (val & speed_bin[1]) >> speed_bin[2];
}

static const struct {
	int (*check)(struct adreno_device *adreno_dev);
	void (*func)(struct adreno_device *adreno_dev);
} a3xx_efuse_funcs[] = {
	{ adreno_is_a306a, a3xx_efuse_speed_bin },
};

static void a3xx_check_features(struct adreno_device *adreno_dev)
{
	unsigned int i;

	if (adreno_efuse_map(adreno_dev))
		return;

	for (i = 0; i < ARRAY_SIZE(a3xx_efuse_funcs); i++) {
		if (a3xx_efuse_funcs[i].check(adreno_dev))
			a3xx_efuse_funcs[i].func(adreno_dev);
	}

	adreno_efuse_unmap(adreno_dev);
}

/**
 * _a3xx_pwron_fixup() - Initialize a special command buffer to run a
 * post-power collapse shader workaround
@@ -604,6 +641,9 @@ static void a3xx_platform_setup(struct adreno_device *adreno_dev)
		gpudev->vbif_xin_halt_ctrl0_mask =
				A30X_VBIF_XIN_HALT_CTRL0_MASK;
	}

	/* Check efuse bits for various capabilties */
	a3xx_check_features(adreno_dev);
}

static int a3xx_send_me_init(struct adreno_device *adreno_dev,