Merge "drm/msm: Disable clocks when GPU is inactive"

This commit is contained in:
Linux Build Service Account 2017-08-21 00:20:08 -07:00 committed by Gerrit - the friendly Code Review server
commit b9b46f3610
2 changed files with 26 additions and 1 deletions

View file

@ -15,6 +15,7 @@
#include "msm_iommu.h"
#include "msm_trace.h"
#include "a5xx_gpu.h"
#include <linux/clk/msm-clk.h>
#define SECURE_VA_START 0xc0000000
#define SECURE_VA_SIZE SZ_256M
@ -1169,6 +1170,17 @@ static int a5xx_pm_resume(struct msm_gpu *gpu)
{
int ret;
/*
* Between suspend/resumes the GPU clocks need to be turned off
* but not a complete power down, typically between frames. Set the
* memory retention flags on the GPU core clock to retain memory
* across clock toggles.
*/
if (gpu->core_clk) {
clk_set_flags(gpu->core_clk, CLKFLAG_RETAIN_PERIPH);
clk_set_flags(gpu->core_clk, CLKFLAG_RETAIN_MEM);
}
/* Turn on the core power */
ret = msm_gpu_pm_resume(gpu);
if (ret)
@ -1208,6 +1220,12 @@ static int a5xx_pm_suspend(struct msm_gpu *gpu)
{
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
/* Turn off the memory retention flag when not necessary */
if (gpu->core_clk) {
clk_set_flags(gpu->core_clk, CLKFLAG_NORETAIN_PERIPH);
clk_set_flags(gpu->core_clk, CLKFLAG_NORETAIN_MEM);
}
/* Only do this next bit if we are about to go down */
if (gpu->active_cnt == 1) {
/* Clear the VBIF pipe before shutting down */

View file

@ -863,7 +863,14 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
gpu->dev = drm;
gpu->funcs = funcs;
gpu->name = name;
gpu->inactive = true;
/*
* Set the inactive flag to false, so that when the retire worker
* kicks in from the init path, it knows that it has to turn off the
* clocks. This should be fine to do since this is the init sequence
* and we have an init_lock in msm_open() to protect against bad things
* from happening.
*/
gpu->inactive = false;
INIT_LIST_HEAD(&gpu->active_list);
INIT_WORK(&gpu->retire_work, retire_worker);