diff options
-rw-r--r-- | drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/etnaviv/etnaviv_gpu.h | 2 |
2 files changed, 16 insertions, 6 deletions
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c index d4c7b443a757..ada45fdd0eae 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c | |||
@@ -412,13 +412,19 @@ static void etnaviv_gpu_load_clock(struct etnaviv_gpu *gpu, u32 clock) | |||
412 | 412 | ||
413 | static void etnaviv_gpu_update_clock(struct etnaviv_gpu *gpu) | 413 | static void etnaviv_gpu_update_clock(struct etnaviv_gpu *gpu) |
414 | { | 414 | { |
415 | unsigned int fscale = 1 << (6 - gpu->freq_scale); | 415 | if (gpu->identity.minor_features2 & |
416 | u32 clock; | 416 | chipMinorFeatures2_DYNAMIC_FREQUENCY_SCALING) { |
417 | 417 | clk_set_rate(gpu->clk_core, | |
418 | clock = VIVS_HI_CLOCK_CONTROL_DISABLE_DEBUG_REGISTERS | | 418 | gpu->base_rate_core >> gpu->freq_scale); |
419 | VIVS_HI_CLOCK_CONTROL_FSCALE_VAL(fscale); | 419 | clk_set_rate(gpu->clk_shader, |
420 | gpu->base_rate_shader >> gpu->freq_scale); | ||
421 | } else { | ||
422 | unsigned int fscale = 1 << (6 - gpu->freq_scale); | ||
423 | u32 clock = VIVS_HI_CLOCK_CONTROL_DISABLE_DEBUG_REGISTERS | | ||
424 | VIVS_HI_CLOCK_CONTROL_FSCALE_VAL(fscale); | ||
420 | 425 | ||
421 | etnaviv_gpu_load_clock(gpu, clock); | 426 | etnaviv_gpu_load_clock(gpu, clock); |
427 | } | ||
422 | } | 428 | } |
423 | 429 | ||
424 | static int etnaviv_hw_reset(struct etnaviv_gpu *gpu) | 430 | static int etnaviv_hw_reset(struct etnaviv_gpu *gpu) |
@@ -1742,11 +1748,13 @@ static int etnaviv_gpu_platform_probe(struct platform_device *pdev) | |||
1742 | DBG("clk_core: %p", gpu->clk_core); | 1748 | DBG("clk_core: %p", gpu->clk_core); |
1743 | if (IS_ERR(gpu->clk_core)) | 1749 | if (IS_ERR(gpu->clk_core)) |
1744 | gpu->clk_core = NULL; | 1750 | gpu->clk_core = NULL; |
1751 | gpu->base_rate_core = clk_get_rate(gpu->clk_core); | ||
1745 | 1752 | ||
1746 | gpu->clk_shader = devm_clk_get(&pdev->dev, "shader"); | 1753 | gpu->clk_shader = devm_clk_get(&pdev->dev, "shader"); |
1747 | DBG("clk_shader: %p", gpu->clk_shader); | 1754 | DBG("clk_shader: %p", gpu->clk_shader); |
1748 | if (IS_ERR(gpu->clk_shader)) | 1755 | if (IS_ERR(gpu->clk_shader)) |
1749 | gpu->clk_shader = NULL; | 1756 | gpu->clk_shader = NULL; |
1757 | gpu->base_rate_shader = clk_get_rate(gpu->clk_shader); | ||
1750 | 1758 | ||
1751 | /* TODO: figure out max mapped size */ | 1759 | /* TODO: figure out max mapped size */ |
1752 | dev_set_drvdata(dev, gpu); | 1760 | dev_set_drvdata(dev, gpu); |
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h index 9227a9740447..689cb8f3680c 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h | |||
@@ -152,6 +152,8 @@ struct etnaviv_gpu { | |||
152 | u32 hangcheck_dma_addr; | 152 | u32 hangcheck_dma_addr; |
153 | struct work_struct recover_work; | 153 | struct work_struct recover_work; |
154 | unsigned int freq_scale; | 154 | unsigned int freq_scale; |
155 | unsigned long base_rate_core; | ||
156 | unsigned long base_rate_shader; | ||
155 | }; | 157 | }; |
156 | 158 | ||
157 | static inline void gpu_write(struct etnaviv_gpu *gpu, u32 reg, u32 data) | 159 | static inline void gpu_write(struct etnaviv_gpu *gpu, u32 reg, u32 data) |