OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rc203soc/] [sw/] [uClinux/] [arch/] [mips/] [kernel/] [tyne.S] - Rev 1777

Go to most recent revision | Compare with Previous | Blame | View Log

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

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.