12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /* 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:
|