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