patch-1.3.48 linux/arch/mips/kernel/tyne.S

Next file: linux/arch/mips/kernel/tynedma.c
Previous file: linux/arch/mips/kernel/tyne-c.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v1.3.47/linux/arch/mips/kernel/tyne.S linux/arch/mips/kernel/tyne.S
@@ -0,0 +1,128 @@
+/*
+ * arch/mips/kernel/tyne.S
+ *
+ * Deskstation Tyne specific Assembler code
+ *
+ * Copyright (C) 1994, 1995 Waldorf Electronics
+ * written by Ralf Baechle and Andreas Busse
+ */
+#include <asm/asm.h>
+#include <asm/mipsconfig.h>
+#include <asm/mipsregs.h>
+#include <asm/stackframe.h>
+
+/*
+ * Deskstation Tyne interrupt handler
+ */
+		.text
+		.set	noreorder
+		.set	noat
+		.align	5
+		NESTED(deskstation_tyne_handle_int, FR_SIZE, sp)
+		SAVE_ALL
+		CLI
+		.set	at
+		lui	s0,%hi(PORT_BASE)
+		li	t1,0x0f
+		sb	t1,%lo(PORT_BASE+0x20)(s0)	# poll command
+		lb	t1,%lo(PORT_BASE+0x20)(s0)	# read result
+		li	s1,1
+		bgtz	t1,Lpoll_second
+		andi	t1,t1,7
+		/*
+		 * Acknowledge first pic
+		 */
+		lb	t2,%lo(PORT_BASE+0x21)(s0)
+		lui	s4,%hi(cache_21)
+		lb	t0,%lo(cache_21)(s4)
+		sllv	s1,s1,t1
+		or	t0,t0,s1
+		sb	t0,%lo(cache_21)(s4)
+		sb	t0,%lo(PORT_BASE+0x21)(s0)
+		lui	s3,%hi(intr_count)
+		lw	t0,%lo(intr_count)(s3)
+		li	t2,0x20
+		sb	t2,%lo(PORT_BASE+0x20)(s0)
+		/*
+		 * Now call the real handler
+		 */
+		la	t3,IRQ_vectors
+		sll	t2,t1,2
+		addu	t3,t3,t2
+		lw	t3,(t3)
+		addiu	t0,t0,1
+		jalr	t3
+		sw	t0,%lo(intr_count)(s3)			# delay slot
+		lw	t0,%lo(intr_count)(s3)
+		/*
+		 * Unblock first pic
+		 */
+		lbu	t1,%lo(PORT_BASE+0x21)(s0)
+		lb	t1,%lo(cache_21)(s4)
+		subu	t0,t0,1
+		sw	t0,%lo(intr_count)(s3)
+		nor	s1,zero,s1
+		and	t1,t1,s1
+		sb	t1,%lo(cache_21)(s4)
+		jr	v0
+		sb	t1,%lo(PORT_BASE+0x21)(s0)	# delay slot
+
+		.align	5
+Lpoll_second:	li	t1,0x0f
+		sb	t1,%lo(PORT_BASE+0xa0)(s0)	# poll command
+		lb	t1,%lo(PORT_BASE+0xa0)(s0)	# read result
+		lui	s4,%hi(cache_A1)
+		bgtz	t1,spurious_interrupt
+		andi	t1,t1,7
+		/*
+		 * Acknowledge second pic
+		 */
+		lbu	t2,%lo(PORT_BASE+0xa1)(s0)
+		lb	t3,%lo(cache_A1)(s4)
+		sllv	s1,s1,t1
+		or	t3,t3,s1
+		sb	t3,%lo(cache_A1)(s4)
+		sb	t3,%lo(PORT_BASE+0xa1)(s0)
+		li	t3,0x20
+		sb	t3,%lo(PORT_BASE+0xa0)(s0)
+		lui	s3,%hi(intr_count)
+		lw	t0,%lo(intr_count)(s3)
+		sb	t3,%lo(PORT_BASE+0x20)(s0)
+		/*
+		 * Now call the real handler
+		 */
+		la	t0,IRQ_vectors
+		sll	t2,t1,2
+		addu	t0,t0,t2
+		lw	t0,32(t0)
+		addiu	t0,t0,1
+		jalr	t0
+		sw	t0,%lo(intr_count)(s3)			# delay slot
+		lw	t0,%lo(intr_count)(s3)
+		/*
+		 * Unblock second pic
+		 */
+		lb	t1,%lo(PORT_BASE+0xa1)(s0)
+		lb	t1,%lo(cache_A1)(s4)
+		subu	t0,t0,1
+		lw	t0,%lo(intr_count)(s3)
+		nor	s1,zero,s1
+		and	t1,t1,s1
+		sb	t1,%lo(cache_A1)(s4)
+		jr	v0
+		sb	t1,%lo(PORT_BASE+0xa1)(s0)	# delay slot
+		END(deskstation_tyne_handle_int)
+
+		.align	5
+LEAF(spurious_interrupt)
+		/*
+		 * Nothing happened... (whistle)
+		 */
+		lui	t1,%hi(spurious_count)
+		lw	t0,%lo(spurious_count)(t1)
+		la	v0,return
+		addiu	t0,1
+		jr	ra
+		sw	t0,%lo(spurious_count)(t1)
+		END(spurious_interrupt)
+

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov with Sam's (original) version
of this