From cb0163949d6273829739e37cef8b48cd8fbb0fef Mon Sep 17 00:00:00 2001 From: Pranav Patel Date: Tue, 21 Jun 2022 15:05:38 +0530 Subject: [PATCH] msm: kgsl: Enable BCL only after first boot is done BCL requires that respective Central Broadcast register be programed from TZ. This programing happens only when zap shader firmware load is successful. Zap firmware load can fail in boot up path, but we are setting bcl_enabled to true before firmware load is successful. This is not correct. BCL should be enabled only after respective register programing is done from TZ side. Otherwise gmu goes to error state when ACK from BCL is expected during boot. Enable BCL only after we successfully complete first boot to ensure that Central Broadcast register is programed before enabling BCL. Change-Id: I6267c943262cc0448fa77d29d5ae6e8f5cae7e9f Signed-off-by: Pranav Patel --- drivers/gpu/msm/adreno_a6xx_gmu.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/msm/adreno_a6xx_gmu.c b/drivers/gpu/msm/adreno_a6xx_gmu.c index 6ee6a797fed4..8a4ea1752b24 100644 --- a/drivers/gpu/msm/adreno_a6xx_gmu.c +++ b/drivers/gpu/msm/adreno_a6xx_gmu.c @@ -2231,9 +2231,6 @@ static int a6xx_gmu_first_boot(struct adreno_device *adreno_dev) device->gmu_fault = false; - if (ADRENO_FEATURE(adreno_dev, ADRENO_BCL)) - adreno_dev->bcl_enabled = true; - trace_kgsl_pwr_set_state(device, KGSL_STATE_AWARE); return 0; @@ -3022,6 +3019,17 @@ static int a6xx_first_boot(struct adreno_device *adreno_dev) set_bit(GMU_PRIV_FIRST_BOOT_DONE, &gmu->flags); set_bit(GMU_PRIV_GPU_STARTED, &gmu->flags); + /* + * BCL needs respective Central Broadcast register to + * be programed from TZ. This programing happens only + * when zap shader firmware load is successful. Zap firmware + * load can fail in boot up path hence enable BCL only after we + * successfully complete first boot to ensure that Central + * Broadcast register was programed before enabling BCL. + */ + if (ADRENO_FEATURE(adreno_dev, ADRENO_BCL)) + adreno_dev->bcl_enabled = true; + device->pwrctrl.last_stat_updated = ktime_get(); device->state = KGSL_STATE_ACTIVE;