source: rtems/c/src/lib/libbsp/mips/csb350/irq/vectorisrs.c @ 8ef8a32

5
Last change on this file since 8ef8a32 was 8ef8a32, checked in by Sebastian Huber <sebastian.huber@…>, on 11/11/16 at 09:48:14

bsps/mips: Use <libcpu/isr_entries.h>

Avoid duplicate mips_vector_isr_handlers() declarations.

  • Property mode set to 100644
File size: 3.7 KB
Line 
1/**
2 *  @file
3 * 
4 *  Au1x00 Interrupt Vectoring
5 */
6
7/*
8 *  Copyright (c) 2005 by Cogent Computer Systems
9 *  Written by Jay Monkman <jtm@lopingdog.com>
10 *
11 *  The license and distribution terms for this file may be
12 *  found in the file LICENSE in this distribution or at
13 *  http://www.rtems.org/license/LICENSE.
14 */
15
16#include <rtems.h>
17#include <stdlib.h>
18#include <libcpu/au1x00.h>
19#include <libcpu/isr_entries.h>
20#include <rtems/irq.h>
21#include <bsp/irq.h>
22#include <bsp/irq-generic.h>
23
24static void call_vectored_isr(CPU_Interrupt_frame *, uint32_t , void *);
25
26#include <rtems/bspIo.h>  /* for printk */
27
28void mips_vector_isr_handlers( CPU_Interrupt_frame *frame )
29{
30  unsigned int sr;
31  unsigned int cause;
32
33  mips_get_sr( sr );
34  mips_get_cause( cause );
35
36  cause &= (sr & SR_IMASK);
37  cause >>= CAUSE_IPSHIFT;
38
39  /* count/compare interrupt */
40  if ( cause & 0x80 ) {
41      unsigned long zero = 0;
42      /*
43       * I don't see a good way to disable the compare
44       * interrupt, so let's just ignore it.
45       */
46      __asm__ volatile ("mtc0 %0, $11\n" :: "r" (zero));
47  }
48
49  /* Performance counter */
50  if ( cause & 0x40 ) {
51      bsp_interrupt_handler_dispatch(AU1X00_IRQ_PERF);
52  }
53
54  /* Interrupt controller 0 */
55  if ( cause & 0x0c ) {
56      call_vectored_isr(frame, cause, (void *)AU1X00_IC0_ADDR);
57  }
58
59  /* Interrupt controller 1 */
60  if ( cause & 0x30 ) {
61      call_vectored_isr(frame, cause, (void *)AU1X00_IC1_ADDR);
62  }
63
64  /* SW[0] */
65  if ( cause & 0x01 )
66      bsp_interrupt_handler_dispatch( AU1X00_IRQ_SW0 );
67
68  /* SW[1] */
69  if ( cause & 0x02 )
70      bsp_interrupt_handler_dispatch( AU1X00_IRQ_SW1 );
71}
72
73void mips_default_isr( int vector )
74{
75  unsigned int sr;
76  unsigned int cause;
77
78  mips_get_sr( sr );
79  mips_get_cause( cause );
80
81  printk( "Unhandled isr exception: vector 0x%02x, cause 0x%08X, sr 0x%08X\n",
82      vector, cause, sr );
83  rtems_fatal_error_occurred(1);
84}
85
86static void call_vectored_isr(
87    CPU_Interrupt_frame *frame,
88    uint32_t cause,
89    void *ctrlr
90    )
91{
92    uint32_t src;
93    uint32_t mask;
94    int index;
95
96    /* get mask register */
97    mask = AU1X00_IC_MASKRD(ctrlr);
98
99    /* check request 0 */
100    src = AU1X00_IC_REQ0INT(ctrlr);
101    src = src & mask;
102    index = 0;
103    while (src) {
104        /* check LSB */
105        if (src & 1) {
106            /* clear rising/falling edge detects */
107            AU1X00_IC_RISINGCLR(ctrlr) = (1 << index);
108            AU1X00_IC_FALLINGCLR(ctrlr) = (1 << index);
109            au_sync();
110            bsp_interrupt_handler_dispatch(AU1X00_IRQ_IC0_BASE + index);
111        }
112        index ++;
113
114        /* shift, and make sure MSB is clear */
115        src = (src >> 1) & 0x7fffffff;
116    }
117
118    /* check request 1 */
119    src = AU1X00_IC_REQ1INT(ctrlr);
120    src = src & mask;
121    index = 0;
122    while (src) {
123        /* check LSB */
124        if (src & 1) {
125            /* clear rising/falling edge detects */
126            AU1X00_IC_RISINGCLR(ctrlr) = (1 << index);
127            AU1X00_IC_FALLINGCLR(ctrlr) = (1 << index);
128            au_sync();
129            bsp_interrupt_handler_dispatch(AU1X00_IRQ_IC0_BASE + index);
130        }
131        index ++;
132
133        /* shift, and make sure MSB is clear */
134        src = (src >> 1) & 0x7fffffff;
135    }
136}
137
138/* Generate a software interrupt */
139int assert_sw_irq(uint32_t irqnum)
140{
141    uint32_t cause;
142
143    if (irqnum <= 1) {
144        mips_get_cause(cause);
145        cause = cause | ((irqnum + 1) << CAUSE_IPSHIFT);
146        mips_set_cause(cause);
147
148        return irqnum;
149    } else {
150        return -1;
151    }
152}
153
154/* Clear a software interrupt */
155int negate_sw_irq(uint32_t irqnum)
156{
157    uint32_t cause;
158
159    if (irqnum <= 1) {
160        mips_get_cause(cause);
161        cause = cause & ~((irqnum + 1) << CAUSE_IPSHIFT);
162        mips_set_cause(cause);
163
164        return irqnum;
165    } else {
166        return -1;
167    }
168}
Note: See TracBrowser for help on using the repository browser.