summaryrefslogtreecommitdiff
path: root/drivers/gpu/msm
diff options
context:
space:
mode:
authorRajesh Kemisetti <rajeshk@codeaurora.org>2017-01-15 18:59:29 +0530
committerRajesh Kemisetti <rajeshk@codeaurora.org>2017-01-16 21:55:02 +0530
commit761d7536e16aa84334d393faad779c5d232b6002 (patch)
tree146b4ee2611859eeeb850ebcad2400e9735a3722 /drivers/gpu/msm
parent0236a0326d76722f27e2782e5c1840c9e81564f6 (diff)
msm: kgsl: Enable HW clockgating and preemption for SDM660 GPU
Enable HW clockgating and preemption for A512 GPU to save power and for better context switching. Also update proper size for CP MERCIU size. Change-Id: If3e5101c2695b1f06d650d320bc8d3bebac29f6f Signed-off-by: Rajesh Kemisetti <rajeshk@codeaurora.org>
Diffstat (limited to 'drivers/gpu/msm')
-rw-r--r--drivers/gpu/msm/adreno-gpulist.h4
-rw-r--r--drivers/gpu/msm/adreno_a5xx.c75
2 files changed, 74 insertions, 5 deletions
diff --git a/drivers/gpu/msm/adreno-gpulist.h b/drivers/gpu/msm/adreno-gpulist.h
index 2418ee003c22..f1439381d781 100644
--- a/drivers/gpu/msm/adreno-gpulist.h
+++ b/drivers/gpu/msm/adreno-gpulist.h
@@ -289,8 +289,8 @@ static const struct adreno_gpu_core adreno_gpulist[] = {
.major = 1,
.minor = 2,
.patchid = ANY_ID,
- .features = ADRENO_64BIT | ADRENO_CONTENT_PROTECTION |
- ADRENO_CPZ_RETENTION,
+ .features = ADRENO_PREEMPTION | ADRENO_64BIT |
+ ADRENO_CONTENT_PROTECTION | ADRENO_CPZ_RETENTION,
.pm4fw_name = "a530_pm4.fw",
.pfpfw_name = "a530_pfp.fw",
.zap_name = "a512_zap",
diff --git a/drivers/gpu/msm/adreno_a5xx.c b/drivers/gpu/msm/adreno_a5xx.c
index 90b833888d9d..0aab38ccc703 100644
--- a/drivers/gpu/msm/adreno_a5xx.c
+++ b/drivers/gpu/msm/adreno_a5xx.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -197,7 +197,8 @@ static void a5xx_platform_setup(struct adreno_device *adreno_dev)
/* A510 has 3 XIN ports in VBIF */
gpudev->vbif_xin_halt_ctrl0_mask =
A510_VBIF_XIN_HALT_CTRL0_MASK;
- } else if (adreno_is_a540(adreno_dev)) {
+ } else if (adreno_is_a540(adreno_dev) ||
+ adreno_is_a512(adreno_dev)) {
gpudev->snapshot_data->sect_sizes->cp_merciu = 1024;
}
@@ -485,7 +486,7 @@ static int a5xx_regulator_enable(struct adreno_device *adreno_dev)
kgsl_regwrite(device, A5XX_RBBM_CLOCK_CNTL, 0x00000055);
a5xx_hwcg_set(adreno_dev, true);
/* Turn on sp_input_clk at HM level */
- kgsl_regrmw(device, A5XX_RBBM_CLOCK_CNTL, 3, 0);
+ kgsl_regrmw(device, A5XX_RBBM_CLOCK_CNTL, 0xFF, 0);
return 0;
}
@@ -535,6 +536,9 @@ static void a5xx_regulator_disable(struct adreno_device *adreno_dev)
unsigned int reg;
struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
+ if (adreno_is_a512(adreno_dev))
+ return;
+
/* If feature is not supported or not enabled */
if (!ADRENO_FEATURE(adreno_dev, ADRENO_SPTP_PC) ||
!test_bit(ADRENO_SPTP_PC_CTRL, &adreno_dev->pwrctrl_flag)) {
@@ -1120,6 +1124,65 @@ static const struct kgsl_hwcg_reg a540_hwcg_regs[] = {
{A5XX_RBBM_CLOCK_HYST_GPMU, 0x00000004}
};
+static const struct kgsl_hwcg_reg a512_hwcg_regs[] = {
+ {A5XX_RBBM_CLOCK_CNTL_SP0, 0x02222222},
+ {A5XX_RBBM_CLOCK_CNTL_SP1, 0x02222222},
+ {A5XX_RBBM_CLOCK_CNTL2_SP0, 0x02222220},
+ {A5XX_RBBM_CLOCK_CNTL2_SP1, 0x02222220},
+ {A5XX_RBBM_CLOCK_HYST_SP0, 0x0000F3CF},
+ {A5XX_RBBM_CLOCK_HYST_SP1, 0x0000F3CF},
+ {A5XX_RBBM_CLOCK_DELAY_SP0, 0x00000080},
+ {A5XX_RBBM_CLOCK_DELAY_SP1, 0x00000080},
+ {A5XX_RBBM_CLOCK_CNTL_TP0, 0x22222222},
+ {A5XX_RBBM_CLOCK_CNTL_TP1, 0x22222222},
+ {A5XX_RBBM_CLOCK_CNTL2_TP0, 0x22222222},
+ {A5XX_RBBM_CLOCK_CNTL2_TP1, 0x22222222},
+ {A5XX_RBBM_CLOCK_CNTL3_TP0, 0x00002222},
+ {A5XX_RBBM_CLOCK_CNTL3_TP1, 0x00002222},
+ {A5XX_RBBM_CLOCK_HYST_TP0, 0x77777777},
+ {A5XX_RBBM_CLOCK_HYST_TP1, 0x77777777},
+ {A5XX_RBBM_CLOCK_HYST2_TP0, 0x77777777},
+ {A5XX_RBBM_CLOCK_HYST2_TP1, 0x77777777},
+ {A5XX_RBBM_CLOCK_HYST3_TP0, 0x00007777},
+ {A5XX_RBBM_CLOCK_HYST3_TP1, 0x00007777},
+ {A5XX_RBBM_CLOCK_DELAY_TP0, 0x11111111},
+ {A5XX_RBBM_CLOCK_DELAY_TP1, 0x11111111},
+ {A5XX_RBBM_CLOCK_DELAY2_TP0, 0x11111111},
+ {A5XX_RBBM_CLOCK_DELAY2_TP1, 0x11111111},
+ {A5XX_RBBM_CLOCK_DELAY3_TP0, 0x00001111},
+ {A5XX_RBBM_CLOCK_DELAY3_TP1, 0x00001111},
+ {A5XX_RBBM_CLOCK_CNTL_UCHE, 0x22222222},
+ {A5XX_RBBM_CLOCK_CNTL2_UCHE, 0x22222222},
+ {A5XX_RBBM_CLOCK_CNTL3_UCHE, 0x22222222},
+ {A5XX_RBBM_CLOCK_CNTL4_UCHE, 0x00222222},
+ {A5XX_RBBM_CLOCK_HYST_UCHE, 0x00444444},
+ {A5XX_RBBM_CLOCK_DELAY_UCHE, 0x00000002},
+ {A5XX_RBBM_CLOCK_CNTL_RB0, 0x22222222},
+ {A5XX_RBBM_CLOCK_CNTL_RB1, 0x22222222},
+ {A5XX_RBBM_CLOCK_CNTL2_RB0, 0x00222222},
+ {A5XX_RBBM_CLOCK_CNTL2_RB1, 0x00222222},
+ {A5XX_RBBM_CLOCK_CNTL_CCU0, 0x00022220},
+ {A5XX_RBBM_CLOCK_CNTL_CCU1, 0x00022220},
+ {A5XX_RBBM_CLOCK_CNTL_RAC, 0x05522222},
+ {A5XX_RBBM_CLOCK_CNTL2_RAC, 0x00555555},
+ {A5XX_RBBM_CLOCK_HYST_RB_CCU0, 0x04040404},
+ {A5XX_RBBM_CLOCK_HYST_RB_CCU1, 0x04040404},
+ {A5XX_RBBM_CLOCK_HYST_RAC, 0x07444044},
+ {A5XX_RBBM_CLOCK_DELAY_RB_CCU_L1_0, 0x00000002},
+ {A5XX_RBBM_CLOCK_DELAY_RB_CCU_L1_1, 0x00000002},
+ {A5XX_RBBM_CLOCK_DELAY_RAC, 0x00010011},
+ {A5XX_RBBM_CLOCK_CNTL_TSE_RAS_RBBM, 0x04222222},
+ {A5XX_RBBM_CLOCK_MODE_GPC, 0x02222222},
+ {A5XX_RBBM_CLOCK_MODE_VFD, 0x00002222},
+ {A5XX_RBBM_CLOCK_HYST_TSE_RAS_RBBM, 0x00000000},
+ {A5XX_RBBM_CLOCK_HYST_GPC, 0x04104004},
+ {A5XX_RBBM_CLOCK_HYST_VFD, 0x00000000},
+ {A5XX_RBBM_CLOCK_DELAY_HLSQ, 0x00000000},
+ {A5XX_RBBM_CLOCK_DELAY_TSE_RAS_RBBM, 0x00004000},
+ {A5XX_RBBM_CLOCK_DELAY_GPC, 0x00000200},
+ {A5XX_RBBM_CLOCK_DELAY_VFD, 0x00002222},
+};
+
static const struct {
int (*devfunc)(struct adreno_device *adreno_dev);
const struct kgsl_hwcg_reg *regs;
@@ -1127,6 +1190,7 @@ static const struct {
} a5xx_hwcg_registers[] = {
{ adreno_is_a540, a540_hwcg_regs, ARRAY_SIZE(a540_hwcg_regs) },
{ adreno_is_a530, a530_hwcg_regs, ARRAY_SIZE(a530_hwcg_regs) },
+ { adreno_is_a512, a512_hwcg_regs, ARRAY_SIZE(a512_hwcg_regs) },
{ adreno_is_a510, a510_hwcg_regs, ARRAY_SIZE(a510_hwcg_regs) },
{ adreno_is_a505, a50x_hwcg_regs, ARRAY_SIZE(a50x_hwcg_regs) },
{ adreno_is_a506, a50x_hwcg_regs, ARRAY_SIZE(a50x_hwcg_regs) },
@@ -1871,6 +1935,11 @@ static void a5xx_start(struct adreno_device *adreno_dev)
kgsl_regwrite(device, A5XX_CP_MERCIU_SIZE, 0x20);
kgsl_regwrite(device, A5XX_CP_ROQ_THRESHOLDS_2, 0x40000030);
kgsl_regwrite(device, A5XX_CP_ROQ_THRESHOLDS_1, 0x20100D0A);
+ } else if (adreno_is_a540(adreno_dev) || adreno_is_a512(adreno_dev)) {
+ kgsl_regwrite(device, A5XX_CP_MEQ_THRESHOLDS, 0x40);
+ kgsl_regwrite(device, A5XX_CP_MERCIU_SIZE, 0x400);
+ kgsl_regwrite(device, A5XX_CP_ROQ_THRESHOLDS_2, 0x80000060);
+ kgsl_regwrite(device, A5XX_CP_ROQ_THRESHOLDS_1, 0x40201B16);
} else {
kgsl_regwrite(device, A5XX_CP_MEQ_THRESHOLDS, 0x40);
kgsl_regwrite(device, A5XX_CP_MERCIU_SIZE, 0x40);