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: Hareesh Gundu <hareeshg@codeaurora.org>
This commit is contained in:
Hareesh Gundu 2016-08-01 17:06:00 +05:30 committed by Gerrit - the friendly Code Review server
parent 85d7e134cc
commit f84d6e3c6c

View file

@ -151,6 +151,43 @@ static const unsigned int _a3xx_pwron_fixup_fs_instructions[] = {
0x00000000, 0x03000000, 0x00000000, 0x00000000, 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 * _a3xx_pwron_fixup() - Initialize a special command buffer to run a
* post-power collapse shader workaround * 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 = gpudev->vbif_xin_halt_ctrl0_mask =
A30X_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, static int a3xx_send_me_init(struct adreno_device *adreno_dev,