Merge tag 'for-linus-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml
[linux-2.6-microblaze.git] / drivers / gpu / drm / gma500 / blitter.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2014, Patrik Jakobsson
4  * All Rights Reserved.
5  *
6  * Authors: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
7  */
8
9 #include "psb_drv.h"
10
11 #include "blitter.h"
12 #include "psb_reg.h"
13
14 /* Wait for the blitter to be completely idle */
15 int gma_blt_wait_idle(struct drm_psb_private *dev_priv)
16 {
17         unsigned long stop = jiffies + HZ;
18         int busy = 1;
19
20         /* NOP for Cedarview */
21         if (IS_CDV(dev_priv->dev))
22                 return 0;
23
24         /* First do a quick check */
25         if ((PSB_RSGX32(PSB_CR_2D_SOCIF) == _PSB_C2_SOCIF_EMPTY) &&
26             ((PSB_RSGX32(PSB_CR_2D_BLIT_STATUS) & _PSB_C2B_STATUS_BUSY) == 0))
27                 return 0;
28
29         do {
30                 busy = (PSB_RSGX32(PSB_CR_2D_SOCIF) != _PSB_C2_SOCIF_EMPTY);
31         } while (busy && !time_after_eq(jiffies, stop));
32
33         if (busy)
34                 return -EBUSY;
35
36         do {
37                 busy = ((PSB_RSGX32(PSB_CR_2D_BLIT_STATUS) &
38                         _PSB_C2B_STATUS_BUSY) != 0);
39         } while (busy && !time_after_eq(jiffies, stop));
40
41         /* If still busy, we probably have a hang */
42         return (busy) ? -EBUSY : 0;
43 }