1 // SPDX-License-Identifier: GPL-2.0 << 2 /* 1 /* 3 * The idle loop for all SuperH platforms. !! 2 * Idle daemon for PowerPC. Idle daemon will handle any action >> 3 * that needs to be taken when the system becomes idle. 4 * 4 * 5 * Copyright (C) 2002 - 2009 Paul Mundt !! 5 * Written by Cort Dougan (cort@cs.nmt.edu) >> 6 * >> 7 * This program is free software; you can redistribute it and/or >> 8 * modify it under the terms of the GNU General Public License >> 9 * as published by the Free Software Foundation; either version >> 10 * 2 of the License, or (at your option) any later version. 6 */ 11 */ 7 #include <linux/cpu.h> !! 12 #include <linux/config.h> 8 #include <linux/module.h> !! 13 #include <linux/errno.h> 9 #include <linux/init.h> !! 14 #include <linux/sched.h> >> 15 #include <linux/kernel.h> 10 #include <linux/mm.h> 16 #include <linux/mm.h> 11 #include <linux/pm.h> << 12 #include <linux/tick.h> << 13 #include <linux/preempt.h> << 14 #include <linux/thread_info.h> << 15 #include <linux/irqflags.h> << 16 #include <linux/smp.h> 17 #include <linux/smp.h> 17 #include <linux/atomic.h> !! 18 #include <linux/smp_lock.h> >> 19 #include <linux/stddef.h> >> 20 #include <linux/unistd.h> >> 21 #include <linux/ptrace.h> >> 22 #include <linux/slab.h> >> 23 >> 24 #include <asm/pgtable.h> >> 25 #include <asm/uaccess.h> >> 26 #include <asm/system.h> >> 27 #include <asm/io.h> 18 #include <asm/processor.h> 28 #include <asm/processor.h> 19 #include <asm/smp.h> !! 29 #include <asm/mmu.h> 20 #include <asm/bl_bit.h> !! 30 #include <asm/cache.h> >> 31 #include <asm/cputable.h> 21 32 22 static void (*sh_idle)(void); !! 33 unsigned long zero_paged_on; >> 34 unsigned long powersave_nap; >> 35 unsigned long powersave_lowspeed; 23 36 24 void default_idle(void) !! 37 extern void power_save(void); 25 { << 26 set_bl_bit(); << 27 raw_local_irq_enable(); << 28 /* Isn't this racy ? */ << 29 cpu_sleep(); << 30 raw_local_irq_disable(); << 31 clear_bl_bit(); << 32 } << 33 38 34 void __noreturn arch_cpu_idle_dead(void) !! 39 int idled(void) 35 { 40 { 36 play_dead(); !! 41 int do_power_save = 0; 37 } << 38 42 39 void arch_cpu_idle(void) !! 43 /* Check if CPU can powersave (get rid of that soon!) */ 40 { !! 44 if (cur_cpu_spec[smp_processor_id()]->cpu_features & 41 sh_idle(); !! 45 (CPU_FTR_CAN_DOZE | CPU_FTR_CAN_NAP)) >> 46 do_power_save = 1; >> 47 >> 48 /* endless loop with no priority at all */ >> 49 current->nice = 20; >> 50 current->counter = -100; >> 51 init_idle(); >> 52 for (;;) { >> 53 #ifdef CONFIG_SMP >> 54 if (!do_power_save) { >> 55 /* >> 56 * Deal with another CPU just having chosen a thread to >> 57 * run here: >> 58 */ >> 59 int oldval = xchg(¤t->need_resched, -1); >> 60 >> 61 if (!oldval) { >> 62 while(current->need_resched == -1) >> 63 ; /* Do Nothing */ >> 64 } >> 65 } >> 66 #endif >> 67 if (do_power_save && !current->need_resched) >> 68 power_save(); >> 69 >> 70 if (current->need_resched) { >> 71 schedule(); >> 72 check_pgt_cache(); >> 73 } >> 74 } >> 75 return 0; 42 } 76 } 43 77 44 void __init select_idle_routine(void) !! 78 /* 45 { !! 79 * SMP entry into the idle task - calls the same thing as the 46 /* !! 80 * non-smp versions. -- Cort 47 * If a platform has set its own idle !! 81 */ 48 */ !! 82 int cpu_idle(void) 49 if (!sh_idle) << 50 sh_idle = default_idle; << 51 } << 52 << 53 void stop_this_cpu(void *unused) << 54 { 83 { 55 local_irq_disable(); !! 84 idled(); 56 set_cpu_online(smp_processor_id(), fal !! 85 return 0; 57 << 58 for (;;) << 59 cpu_sleep(); << 60 } 86 } 61 87
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.