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 26process(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 44idle_recv: 45 ret 46 47// description 48// 49// $r15 - current (idle) 50// $r0 - zero 51idle: 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 85