0001 /*
0002 * Copyright 2013 Red Hat Inc.
0003 *
0004 * Permission is hereby granted, free of charge, to any person obtaining a
0005 * copy of this software and associated documentation files (the "Software"),
0006 * to deal in the Software without restriction, including without limitation
0007 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
0008 * and/or sell copies of the Software, and to permit persons to whom the
0009 * Software is furnished to do so, subject to the following conditions:
0010 *
0011 * The above copyright notice and this permission notice shall be included in
0012 * all copies or substantial portions of the Software.
0013 *
0014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
0017 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
0018 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
0019 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0020 * OTHER DEALINGS IN THE SOFTWARE.
0021 *
0022 * Authors: Ben Skeggs
0023 */
0024
0025 #ifdef INCLUDE_PROC
0026 process(PROC_IDLE, #idle, #idle_recv)
0027 #endif
0028
0029 /******************************************************************************
0030 * IDLE data segment
0031 *****************************************************************************/
0032 #ifdef INCLUDE_DATA
0033 #endif
0034
0035 /******************************************************************************
0036 * IDLE code segment
0037 *****************************************************************************/
0038 #ifdef INCLUDE_CODE
0039 // description
0040 //
0041 // $r15 - current (idle)
0042 // $r14 - message
0043 // $r0 - zero
0044 idle_recv:
0045 ret
0046
0047 // description
0048 //
0049 // $r15 - current (idle)
0050 // $r0 - zero
0051 idle:
0052 // set our "no interrupt has occurred during our execution" flag
0053 bset $flags $p0
0054
0055 // count IDLE invocations for debugging purposes
0056 nv_iord($r1, NV_PPWR_DSCRATCH(1))
0057 add b32 $r1 1
0058 nv_iowr(NV_PPWR_DSCRATCH(1), $r1)
0059
0060 // keep looping while there's pending messages for any process
0061 idle_loop:
0062 mov $r1 #proc_list_head
0063 bclr $flags $p2
0064 idle_proc:
0065 // process the process' messages until there's none left
0066 idle_proc_exec:
0067 push $r1
0068 mov b32 $r14 $r1
0069 call(recv)
0070 pop $r1
0071 bra not $p1 #idle_proc_next
0072 bset $flags $p2
0073 bra #idle_proc_exec
0074 // next process!
0075 idle_proc_next:
0076 add b32 $r1 #proc_size
0077 cmp b32 $r1 $r15
0078 bra ne #idle_proc
0079 bra $p2 #idle_loop
0080
0081 // sleep if no interrupts have occurred
0082 sleep $p0
0083 bra #idle
0084 #endif