]>
Commit | Line | Data |
---|---|---|
1c6b5d17 PJ |
1 | /* |
2 | * Copyright (c) 2014, Patrik Jakobsson | |
3 | * All Rights Reserved. | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify it | |
6 | * under the terms and conditions of the GNU General Public License, | |
7 | * version 2, as published by the Free Software Foundation. | |
8 | * | |
9 | * This program is distributed in the hope it will be useful, but WITHOUT | |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
12 | * more details. | |
13 | * | |
14 | * Authors: Patrik Jakobsson <patrik.r.jakobsson@gmail.com> | |
15 | */ | |
16 | ||
17 | #include "psb_drv.h" | |
18 | ||
19 | #include "blitter.h" | |
20 | #include "psb_reg.h" | |
21 | ||
22 | /* Wait for the blitter to be completely idle */ | |
23 | int gma_blt_wait_idle(struct drm_psb_private *dev_priv) | |
24 | { | |
25 | unsigned long stop = jiffies + HZ; | |
26 | int busy = 1; | |
27 | ||
28 | /* NOP for Cedarview */ | |
29 | if (IS_CDV(dev_priv->dev)) | |
30 | return 0; | |
31 | ||
32 | /* First do a quick check */ | |
33 | if ((PSB_RSGX32(PSB_CR_2D_SOCIF) == _PSB_C2_SOCIF_EMPTY) && | |
34 | ((PSB_RSGX32(PSB_CR_2D_BLIT_STATUS) & _PSB_C2B_STATUS_BUSY) == 0)) | |
35 | return 0; | |
36 | ||
37 | do { | |
38 | busy = (PSB_RSGX32(PSB_CR_2D_SOCIF) != _PSB_C2_SOCIF_EMPTY); | |
39 | } while (busy && !time_after_eq(jiffies, stop)); | |
40 | ||
41 | if (busy) | |
42 | return -EBUSY; | |
43 | ||
44 | do { | |
45 | busy = ((PSB_RSGX32(PSB_CR_2D_BLIT_STATUS) & | |
46 | _PSB_C2B_STATUS_BUSY) != 0); | |
47 | } while (busy && !time_after_eq(jiffies, stop)); | |
48 | ||
49 | /* If still busy, we probably have a hang */ | |
50 | return (busy) ? -EBUSY : 0; | |
51 | } |