/*
 * FILE NAME
 *	arch/mips/vr41xx/common/int-handler.S
 *
 * BRIEF MODULE DESCRIPTION
 *	Interrupt dispatcher for the NEC VR4100 series.
 *
 * Author: Yoichi Yuasa
 *         yyuasa@mvista.com or source@mvista.com
 *
 * Copyright 2001 MontaVista Software Inc.
 *
 *  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.
 *
 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  675 Mass Ave, Cambridge, MA 02139, USA.
 */
/*
 * Changes:
 *  MontaVista Software Inc. <yyuasa@mvista.com> or <source@mvista.com>
 *  - New creation, NEC VR4100 series are supported.
 *
 *  Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
 *  - Coped with INTASSIGN of NEC VR4133.
 */
#include <asm/asm.h>
#include <asm/regdef.h>
#include <asm/mipsregs.h>
#include <asm/stackframe.h>

		.text
		.set	noreorder

		.align	5
		NESTED(vr41xx_handle_interrupt, PT_SIZE, ra)
		.set	noat
		SAVE_ALL
		CLI
		.set	at
		.set	noreorder

		/*
		 * Get the pending interrupts
		 */
		mfc0	t0, CP0_CAUSE
		mfc0	t1, CP0_STATUS
		andi	t0, 0xff00
		and	t0, t0, t1

		andi	t1, t0, CAUSEF_IP7	# MIPS timer interrupt
		bnez	t1, handle_irq
		li	a0, 7

		andi	t1, t0, 0x7800		# check for Int1-4
		beqz	t1, 1f

		andi	t1, t0, CAUSEF_IP3	# check for Int1
		bnez	t1, handle_int
		li	a0, 3

		andi	t1, t0, CAUSEF_IP4	# check for Int2
		bnez	t1, handle_int
		li	a0, 4

		andi	t1, t0, CAUSEF_IP5	# check for Int3
		bnez	t1, handle_int
		li	a0, 5

		andi	t1, t0, CAUSEF_IP6	# check for Int4
		bnez	t1, handle_int
		li	a0, 6

1:
		andi	t1, t0, CAUSEF_IP2	# check for Int0
		bnez	t1, handle_int
		li	a0, 2

		andi	t1, t0, CAUSEF_IP0	# check for IP0
		bnez	t1, handle_irq
		li	a0, 0

		andi	t1, t0, CAUSEF_IP1	# check for IP1
		bnez	t1, handle_irq
		li	a0, 1

		j	spurious_interrupt
		nop

handle_int:
		jal	irq_dispatch
		move	a1, sp
		j	ret_from_irq
		nop

handle_irq:
		jal	do_IRQ
		move	a1, sp
		j	ret_from_irq
		END(vr41xx_handle_interrupt)
