int-handler.S 2.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
/*
 * Copyright 2002 Momentum Computer Inc.
 * Author: Matthew Dharm <mdharm@momenco.com>
 *
 * Copyright 2001 MontaVista Software Inc.
 * Author: jsun@mvista.com or jsun@junsun.net
 *
 * Copyright 2004 PMC-Sierra
 * Author: Manish Lachwani (lachwani@pmc-sierra.com)
 *
 * Copyright (C) 2004 MontaVista Software Inc.
 * Author: Manish Lachwani, mlachwani@mvista.com
 *
 * First-level interrupt dispatcher for Ocelot-3 board.
 *
 * 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 <asm/asm.h>
#include <asm/mipsregs.h>
#include <asm/addrspace.h>
#include <asm/regdef.h>
#include <asm/stackframe.h>

/*
 * First level interrupt dispatcher for Ocelot-3 board
 */
		.align	5
		NESTED(ocelot3_handle_int, PT_SIZE, sp)
		SAVE_ALL
		CLI
		.set	at

		mfc0	t0, CP0_CAUSE
		mfc0	t2, CP0_STATUS

		and	t0, t2

		andi	t1, t0, STATUSF_IP0	/* sw0 software interrupt (IRQ0) */
		bnez	t1, ll_sw0_irq

		andi	t1, t0, STATUSF_IP1	/* sw1 software interrupt (IRQ1) */
		bnez	t1, ll_sw1_irq

		andi	t1, t0, STATUSF_IP2	/* int0 hardware line (IRQ2) */
		bnez	t1, ll_pci0slot1_irq

		andi	t1, t0, STATUSF_IP3	/* int1 hardware line (IRQ3) */
		bnez	t1, ll_pci0slot2_irq

		andi	t1, t0, STATUSF_IP4	/* int2 hardware line (IRQ4) */
		bnez	t1, ll_pci1slot1_irq

		andi	t1, t0, STATUSF_IP5	/* int3 hardware line (IRQ5) */
		bnez	t1, ll_pci1slot2_irq

		andi	t1, t0, STATUSF_IP6	/* int4 hardware line (IRQ6) */
		bnez	t1, ll_uart_irq

		andi	t1, t0, STATUSF_IP7	/* cpu timer (IRQ7) */
		bnez	t1, ll_cputimer_irq

                /* now look at extended interrupts */
                mfc0    t0, CP0_CAUSE
                cfc0    t1, CP0_S1_INTCONTROL

                /* shift the mask 8 bits left to line up the bits */
                sll     t2, t1, 8

                and     t0, t2
                srl     t0, t0, 16

                andi    t1, t0, STATUSF_IP8     /* int6 hardware line (IRQ9) */
                bnez    t1, ll_mv64340_decode_irq

		.set	reorder

		/* wrong alarm or masked ... */
		j	spurious_interrupt
		nop
		END(ocelot3_handle_int)

		.align	5
ll_sw0_irq:
		li	a0, 0		/* IRQ 1 */
		move	a1, sp
		jal	do_IRQ
		j	ret_from_irq
ll_sw1_irq:
		li	a0, 1		/* IRQ 2 */
		move	a1, sp
		jal	do_IRQ
		j	ret_from_irq

ll_pci0slot1_irq:
		li	a0, 2		/* IRQ 3 */
		move	a1, sp
		jal	do_IRQ
		j	ret_from_irq

ll_pci0slot2_irq:
		li	a0, 3		/* IRQ 4 */
		move	a1, sp
		jal	do_IRQ
		j	ret_from_irq

ll_pci1slot1_irq:
		li	a0, 4		/* IRQ 5 */
		move	a1, sp
		jal	do_IRQ
		j	ret_from_irq

ll_pci1slot2_irq:
		li	a0, 5		/* IRQ 6 */
		move	a1, sp
		jal	do_IRQ
		j	ret_from_irq

ll_uart_irq:
		li	a0, 6		/* IRQ 7 */
		move	a1, sp
		jal	do_IRQ
		j	ret_from_irq

ll_cputimer_irq:
		li	a0, 7		/* IRQ 8 */
		move	a1, sp
		jal	do_IRQ
		j	ret_from_irq

ll_mv64340_decode_irq:
		move	a0, sp
		jal	ll_mv64340_irq
		j	ret_from_irq