aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJordan Crouse <jcrouse@codeaurora.org>2017-11-21 14:40:56 -0500
committerRob Clark <robdclark@gmail.com>2018-01-10 08:58:42 -0500
commitf56d9df656c41b141399c1edbcc9b0ed048120c2 (patch)
tree50b17f3c9461c2d04e3627e74b60f77408f69f41
parent999ae6edc1c19e316dd61f4b3e1a6984ea293280 (diff)
drm/msm/adreno: Read the speed bins for a5xx targets
Some 5xx based chipsets have different bins for GPU clock speeds. Read the fuses (if applicable) and set the appropriate OPP table. This will only work with OPP v2 tables - the bin will be ignored for legacy pwrlevel tables. Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r--drivers/gpu/drm/msm/adreno/a5xx_gpu.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
index a1f4eeeb73e2..fdbe9e9bb2b1 100644
--- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
@@ -17,6 +17,8 @@
17#include <linux/dma-mapping.h> 17#include <linux/dma-mapping.h>
18#include <linux/of_address.h> 18#include <linux/of_address.h>
19#include <linux/soc/qcom/mdt_loader.h> 19#include <linux/soc/qcom/mdt_loader.h>
20#include <linux/pm_opp.h>
21#include <linux/nvmem-consumer.h>
20#include "msm_gem.h" 22#include "msm_gem.h"
21#include "msm_mmu.h" 23#include "msm_mmu.h"
22#include "a5xx_gpu.h" 24#include "a5xx_gpu.h"
@@ -1184,6 +1186,25 @@ static const struct adreno_gpu_funcs funcs = {
1184 .get_timestamp = a5xx_get_timestamp, 1186 .get_timestamp = a5xx_get_timestamp,
1185}; 1187};
1186 1188
1189static void check_speed_bin(struct device *dev)
1190{
1191 struct nvmem_cell *cell;
1192 u32 bin, val;
1193
1194 cell = nvmem_cell_get(dev, "speed_bin");
1195
1196 /* If a nvmem cell isn't defined, nothing to do */
1197 if (IS_ERR(cell))
1198 return;
1199
1200 bin = *((u32 *) nvmem_cell_read(cell, NULL));
1201 nvmem_cell_put(cell);
1202
1203 val = (1 << bin);
1204
1205 dev_pm_opp_set_supported_hw(dev, &val, 1);
1206}
1207
1187struct msm_gpu *a5xx_gpu_init(struct drm_device *dev) 1208struct msm_gpu *a5xx_gpu_init(struct drm_device *dev)
1188{ 1209{
1189 struct msm_drm_private *priv = dev->dev_private; 1210 struct msm_drm_private *priv = dev->dev_private;
@@ -1210,6 +1231,8 @@ struct msm_gpu *a5xx_gpu_init(struct drm_device *dev)
1210 1231
1211 a5xx_gpu->lm_leakage = 0x4E001A; 1232 a5xx_gpu->lm_leakage = 0x4E001A;
1212 1233
1234 check_speed_bin(&pdev->dev);
1235
1213 ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 4); 1236 ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 4);
1214 if (ret) { 1237 if (ret) {
1215 a5xx_destroy(&(a5xx_gpu->base.base)); 1238 a5xx_destroy(&(a5xx_gpu->base.base));