drm/msm/a6xx: Switch to GMU AO counter
[ Upstream commit f195421318bd00151b3a111af6f315a25c3438a8 ] CP_ALWAYS_ON counter falls under GX domain which is collapsed during IFPC. So switch to GMU_ALWAYS_ON counter for any CPU reads since it is not impacted by IFPC. Both counters are clocked by same xo clock source. Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com> Patchwork: https://patchwork.freedesktop.org/patch/673373/ Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
ea44af1bd8
commit
469b6b0813
@@ -16,6 +16,19 @@
|
||||
|
||||
#define GPU_PAS_ID 13
|
||||
|
||||
static u64 read_gmu_ao_counter(struct a6xx_gpu *a6xx_gpu)
|
||||
{
|
||||
u64 count_hi, count_lo, temp;
|
||||
|
||||
do {
|
||||
count_hi = gmu_read(&a6xx_gpu->gmu, REG_A6XX_GMU_ALWAYS_ON_COUNTER_H);
|
||||
count_lo = gmu_read(&a6xx_gpu->gmu, REG_A6XX_GMU_ALWAYS_ON_COUNTER_L);
|
||||
temp = gmu_read(&a6xx_gpu->gmu, REG_A6XX_GMU_ALWAYS_ON_COUNTER_H);
|
||||
} while (unlikely(count_hi != temp));
|
||||
|
||||
return (count_hi << 32) | count_lo;
|
||||
}
|
||||
|
||||
static bool fence_status_check(struct msm_gpu *gpu, u32 offset, u32 value, u32 status, u32 mask)
|
||||
{
|
||||
/* Success if !writedropped0/1 */
|
||||
@@ -376,8 +389,7 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
|
||||
OUT_RING(ring, upper_32_bits(rbmemptr(ring, fence)));
|
||||
OUT_RING(ring, submit->seqno);
|
||||
|
||||
trace_msm_gpu_submit_flush(submit,
|
||||
gpu_read64(gpu, REG_A6XX_CP_ALWAYS_ON_COUNTER));
|
||||
trace_msm_gpu_submit_flush(submit, read_gmu_ao_counter(a6xx_gpu));
|
||||
|
||||
a6xx_flush(gpu, ring);
|
||||
}
|
||||
@@ -577,8 +589,7 @@ static void a7xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
|
||||
}
|
||||
|
||||
|
||||
trace_msm_gpu_submit_flush(submit,
|
||||
gpu_read64(gpu, REG_A6XX_CP_ALWAYS_ON_COUNTER));
|
||||
trace_msm_gpu_submit_flush(submit, read_gmu_ao_counter(a6xx_gpu));
|
||||
|
||||
a6xx_flush(gpu, ring);
|
||||
|
||||
@@ -2260,16 +2271,7 @@ static int a6xx_gmu_get_timestamp(struct msm_gpu *gpu, uint64_t *value)
|
||||
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
|
||||
struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
|
||||
|
||||
mutex_lock(&a6xx_gpu->gmu.lock);
|
||||
|
||||
/* Force the GPU power on so we can read this register */
|
||||
a6xx_gmu_set_oob(&a6xx_gpu->gmu, GMU_OOB_PERFCOUNTER_SET);
|
||||
|
||||
*value = gpu_read64(gpu, REG_A6XX_CP_ALWAYS_ON_COUNTER);
|
||||
|
||||
a6xx_gmu_clear_oob(&a6xx_gpu->gmu, GMU_OOB_PERFCOUNTER_SET);
|
||||
|
||||
mutex_unlock(&a6xx_gpu->gmu.lock);
|
||||
*value = read_gmu_ao_counter(a6xx_gpu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user