Skip to content

Commit 0e7107a

Browse files
akhilpo-qcomRob Clark
authored andcommitted
drm/msm/a6xx: Set Keep-alive votes to block IFPC
Set Keepalive votes at appropriate places to block IFPC power collapse until we access all the required registers. This is required during gpu IRQ handling and also during preemption. Signed-off-by: Akhil P Oommen <akhilpo@oss.qualcomm.com> Patchwork: https://patchwork.freedesktop.org/patch/673369/ Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com>
1 parent a27d774 commit 0e7107a

2 files changed

Lines changed: 37 additions & 9 deletions

File tree

drivers/gpu/drm/msm/adreno/a6xx_gpu.c

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1771,8 +1771,6 @@ static void a6xx_cp_hw_err_irq(struct msm_gpu *gpu)
17711771

17721772
static void a6xx_fault_detect_irq(struct msm_gpu *gpu)
17731773
{
1774-
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
1775-
struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
17761774
struct msm_ringbuffer *ring = gpu->funcs->active_ring(gpu);
17771775

17781776
/*
@@ -1784,13 +1782,6 @@ static void a6xx_fault_detect_irq(struct msm_gpu *gpu)
17841782
if (gpu_read(gpu, REG_A6XX_RBBM_STATUS3) & A6XX_RBBM_STATUS3_SMMU_STALLED_ON_FAULT)
17851783
return;
17861784

1787-
/*
1788-
* Force the GPU to stay on until after we finish
1789-
* collecting information
1790-
*/
1791-
if (!adreno_has_gmu_wrapper(adreno_gpu))
1792-
gmu_write(&a6xx_gpu->gmu, REG_A6XX_GMU_GMU_PWR_COL_KEEPALIVE, 1);
1793-
17941785
DRM_DEV_ERROR(&gpu->pdev->dev,
17951786
"gpu fault ring %d fence %x status %8.8X rb %4.4x/%4.4x ib1 %16.16llX/%4.4x ib2 %16.16llX/%4.4x\n",
17961787
ring ? ring->id : -1, ring ? ring->fctx->last_fence : 0,
@@ -1832,9 +1823,24 @@ static void a7xx_sw_fuse_violation_irq(struct msm_gpu *gpu)
18321823
}
18331824
}
18341825

1826+
static void a6xx_gpu_keepalive_vote(struct msm_gpu *gpu, bool on)
1827+
{
1828+
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
1829+
struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
1830+
1831+
if (adreno_has_gmu_wrapper(adreno_gpu))
1832+
return;
1833+
1834+
gmu_write(&a6xx_gpu->gmu, REG_A6XX_GMU_GMU_PWR_COL_KEEPALIVE, on);
1835+
}
1836+
18351837
static irqreturn_t a6xx_irq(struct msm_gpu *gpu)
18361838
{
18371839
struct msm_drm_private *priv = gpu->dev->dev_private;
1840+
1841+
/* Set keepalive vote to avoid power collapse after RBBM_INT_0_STATUS is read */
1842+
a6xx_gpu_keepalive_vote(gpu, true);
1843+
18381844
u32 status = gpu_read(gpu, REG_A6XX_RBBM_INT_0_STATUS);
18391845

18401846
gpu_write(gpu, REG_A6XX_RBBM_INT_CLEAR_CMD, status);
@@ -1871,6 +1877,8 @@ static irqreturn_t a6xx_irq(struct msm_gpu *gpu)
18711877
if (status & A6XX_RBBM_INT_0_MASK_CP_SW)
18721878
a6xx_preempt_irq(gpu);
18731879

1880+
a6xx_gpu_keepalive_vote(gpu, false);
1881+
18741882
return IRQ_HANDLED;
18751883
}
18761884

drivers/gpu/drm/msm/adreno/a6xx_preempt.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,21 @@ static void preempt_disable_postamble(struct a6xx_gpu *a6xx_gpu)
136136
a6xx_gpu->postamble_enabled = false;
137137
}
138138

139+
/*
140+
* Set preemption keepalive vote. Please note that this vote is different from the one used in
141+
* a6xx_irq()
142+
*/
143+
static void a6xx_preempt_keepalive_vote(struct msm_gpu *gpu, bool on)
144+
{
145+
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
146+
struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
147+
148+
if (adreno_has_gmu_wrapper(adreno_gpu))
149+
return;
150+
151+
gmu_write(&a6xx_gpu->gmu, REG_A6XX_GMU_PWR_COL_PREEMPT_KEEPALIVE, on);
152+
}
153+
139154
void a6xx_preempt_irq(struct msm_gpu *gpu)
140155
{
141156
uint32_t status;
@@ -176,6 +191,8 @@ void a6xx_preempt_irq(struct msm_gpu *gpu)
176191

177192
set_preempt_state(a6xx_gpu, PREEMPT_NONE);
178193

194+
a6xx_preempt_keepalive_vote(gpu, false);
195+
179196
trace_msm_gpu_preemption_irq(a6xx_gpu->cur_ring->id);
180197

181198
/*
@@ -302,6 +319,9 @@ void a6xx_preempt_trigger(struct msm_gpu *gpu)
302319

303320
spin_unlock_irqrestore(&ring->preempt_lock, flags);
304321

322+
/* Set the keepalive bit to keep the GPU ON until preemption is complete */
323+
a6xx_preempt_keepalive_vote(gpu, true);
324+
305325
a6xx_fenced_write(a6xx_gpu,
306326
REG_A6XX_CP_CONTEXT_SWITCH_SMMU_INFO, a6xx_gpu->preempt_smmu_iova[ring->id],
307327
BIT(1), true);

0 commit comments

Comments
 (0)