Skip to content

Commit

Permalink
drm/etnaviv: split out wait for gpu idle
Browse files Browse the repository at this point in the history
Split out into a new externally visible function, as the IOMMUv2
code needs this functionality, too.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
  • Loading branch information
Lucas Stach committed Sep 15, 2016
1 parent e07c0db commit b88163e
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 18 deletions.
40 changes: 22 additions & 18 deletions drivers/gpu/drm/etnaviv/etnaviv_gpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1437,11 +1437,30 @@ static int etnaviv_gpu_clk_disable(struct etnaviv_gpu *gpu)
return 0;
}

int etnaviv_gpu_wait_idle(struct etnaviv_gpu *gpu, unsigned int timeout_ms)
{
unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);

do {
u32 idle = gpu_read(gpu, VIVS_HI_IDLE_STATE);

if ((idle & gpu->idle_mask) == gpu->idle_mask)
return 0;

if (time_is_before_jiffies(timeout)) {
dev_warn(gpu->dev,
"timed out waiting for idle: idle=0x%x\n",
idle);
return -ETIMEDOUT;
}

udelay(5);
} while (1);
}

static int etnaviv_gpu_hw_suspend(struct etnaviv_gpu *gpu)
{
if (gpu->buffer) {
unsigned long timeout;

/* Replace the last WAIT with END */
etnaviv_buffer_end(gpu);

Expand All @@ -1450,22 +1469,7 @@ static int etnaviv_gpu_hw_suspend(struct etnaviv_gpu *gpu)
* happen quickly (as the WAIT is only 200 cycles). If
* we fail, just warn and continue.
*/
timeout = jiffies + msecs_to_jiffies(100);
do {
u32 idle = gpu_read(gpu, VIVS_HI_IDLE_STATE);

if ((idle & gpu->idle_mask) == gpu->idle_mask)
break;

if (time_is_before_jiffies(timeout)) {
dev_warn(gpu->dev,
"timed out waiting for idle: idle=0x%x\n",
idle);
break;
}

udelay(5);
} while (1);
etnaviv_gpu_wait_idle(gpu, 100);
}

return etnaviv_gpu_clk_disable(gpu);
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/etnaviv/etnaviv_gpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ struct etnaviv_cmdbuf *etnaviv_gpu_cmdbuf_new(struct etnaviv_gpu *gpu,
void etnaviv_gpu_cmdbuf_free(struct etnaviv_cmdbuf *cmdbuf);
int etnaviv_gpu_pm_get_sync(struct etnaviv_gpu *gpu);
void etnaviv_gpu_pm_put(struct etnaviv_gpu *gpu);
int etnaviv_gpu_wait_idle(struct etnaviv_gpu *gpu, unsigned int timeout_ms);

extern struct platform_driver etnaviv_gpu_driver;

Expand Down

0 comments on commit b88163e

Please sign in to comment.