/* SMP IPI low-level handler * * Copyright (C) 2006-2007 Matsushita Electric Industrial Co., Ltd. * All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * */ #include <linux/sys.h> #include <linux/linkage.h> #include <asm/smp.h> #include <asm/thread_info.h> #include <asm/cpu-regs.h> #include <asm/intctl-regs.h> #include <proc/smp-regs.h> #include <asm/asm-offsets.h> #include <asm/frame.inc> .am33_2 ############################################################################### # # IPI interrupt handler # ############################################################################### .globl mn10300_low_ipi_handler mn10300_low_ipi_handler: add -4,sp mov d0,(sp) movhu (IAGR),d0 and IAGR_GN,d0 lsr 0x2,d0 #ifdef CONFIG_MN10300_CACHE_ENABLED cmp FLUSH_CACHE_IPI,d0 beq mn10300_flush_cache_ipi #endif cmp SMP_BOOT_IRQ,d0 beq mn10300_smp_boot_ipi /* OTHERS */ mov (sp),d0 add 4,sp #ifdef CONFIG_GDBSTUB jmp gdbstub_io_rx_handler #else jmp end #endif ############################################################################### # # Cache flush IPI interrupt handler # ############################################################################### #ifdef CONFIG_MN10300_CACHE_ENABLED mn10300_flush_cache_ipi: mov (sp),d0 add 4,sp /* FLUSH_CACHE_IPI */ add -4,sp SAVE_ALL mov GxICR_DETECT,d2 movbu d2,(GxICR(FLUSH_CACHE_IPI)) # ACK the interrupt movhu (GxICR(FLUSH_CACHE_IPI)),d2 call smp_cache_interrupt[],0 RESTORE_ALL jmp end #endif ############################################################################### # # SMP boot CPU IPI interrupt handler # ############################################################################### mn10300_smp_boot_ipi: /* clear interrupt */ movhu (GxICR(SMP_BOOT_IRQ)),d0 and ~GxICR_REQUEST,d0 movhu d0,(GxICR(SMP_BOOT_IRQ)) mov (sp),d0 add 4,sp # get stack mov (CPUID),a0 add -1,a0 add a0,a0 add a0,a0 mov (start_stack,a0),a0 mov a0,sp jmp initialize_secondary # Jump here after RTI to suppress the icache lookahead end: