Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / gpu / drm / nouveau / nvkm / subdev / pmu / fuc / idle.fuc
1 /*
2  * Copyright 2013 Red Hat Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * Authors: Ben Skeggs
23  */
24
25 #ifdef INCLUDE_PROC
26 process(PROC_IDLE, #idle, #idle_recv)
27 #endif
28
29 /******************************************************************************
30  * IDLE data segment
31  *****************************************************************************/
32 #ifdef INCLUDE_DATA
33 #endif
34
35 /******************************************************************************
36  * IDLE code segment
37  *****************************************************************************/
38 #ifdef INCLUDE_CODE
39 // description
40 //
41 // $r15 - current (idle)
42 // $r14 - message
43 // $r0  - zero
44 idle_recv:
45         ret
46
47 // description
48 //
49 // $r15 - current (idle)
50 // $r0  - zero
51 idle:
52         // set our "no interrupt has occurred during our execution" flag
53         bset $flags $p0
54
55         // count IDLE invocations for debugging purposes
56         nv_iord($r1, NV_PPWR_DSCRATCH(1))
57         add b32 $r1 1
58         nv_iowr(NV_PPWR_DSCRATCH(1), $r1)
59
60         // keep looping while there's pending messages for any process
61         idle_loop:
62         mov $r1 #proc_list_head
63         bclr $flags $p2
64         idle_proc:
65                 // process the process' messages until there's none left
66                 idle_proc_exec:
67                         push $r1
68                         mov b32 $r14 $r1
69                         call(recv)
70                         pop $r1
71                         bra not $p1 #idle_proc_next
72                         bset $flags $p2
73                         bra #idle_proc_exec
74                 // next process!
75                 idle_proc_next:
76                 add b32 $r1 #proc_size
77                 cmp b32 $r1 $r15
78                 bra ne #idle_proc
79         bra $p2 #idle_loop
80
81         // sleep if no interrupts have occurred
82         sleep $p0
83         bra #idle
84 #endif