source: rtems/c/src/lib/libbsp/powerpc/score603e/startup/genpvec.c @ 4145ad6

4.104.114.84.95
Last change on this file since 4145ad6 was 4145ad6, checked in by Joel Sherrill <joel.sherrill@…>, on 01/29/01 at 15:40:58

2001-01-27 Ralf Corsepius <corsepiu@…>

  • startup/genpvec.c: #include <chain.h> instead of "chain.h", fix CVS-Id.
  • include/chain.h: Remove.
  • include/Makefile.am: Remove chain.h.
  • Property mode set to 100644
File size: 5.0 KB
Line 
1/*  genpvec.c
2 *
3 *  These routines handle the external exception.  Multiple ISRs occur off
4 *  of this one interrupt.
5 *
6 *  COPYRIGHT (c) 1989-1997.
7 *  On-Line Applications Research Corporation (OAR).
8 *  Copyright assigned to U.S. Government, 1994.
9 *
10 *  The license and distribution terms for this file may in
11 *  the file LICENSE in this distribution or at
12 *  http://www.OARcorp.com/rtems/license.html.
13 *
14 *  $Id$
15 */
16
17#include <bsp.h>
18#include <chain.h>
19#include <assert.h>
20
21#include <stdio.h> /* for sprintf */
22
23
24/*
25 * Proto types for this file                                         
26 */
27
28rtems_isr external_exception_ISR (
29  rtems_vector_number   vector                                  /* IN  */
30);
31
32#define   NUM_LIRQ_HANDLERS   20
33#define   NUM_LIRQ            ( MAX_BOARD_IRQS - PPC_IRQ_LAST )
34
35/*
36 * Structure to for one of possible multiple interrupt handlers for
37 * a given interrupt.
38 */
39typedef struct
40{
41  Chain_Node          Node;
42  rtems_isr_entry     handler;                  /* isr routine        */
43  rtems_vector_number vector;                   /* vector number      */
44} EE_ISR_Type;
45
46
47/* Note:  The following will not work if we add a method to remove
48 *        handlers at a later time.
49 */
50  EE_ISR_Type       ISR_Nodes [NUM_LIRQ_HANDLERS];
51  rtems_unsigned16  Nodes_Used;
52  Chain_Control     ISR_Array  [NUM_LIRQ];
53
54/* XXX */
55void init_irq_data_register();
56
57void initialize_external_exception_vector ()
58{
59  int i;
60  rtems_isr_entry previous_isr;
61  rtems_status_code status;
62
63  Nodes_Used = 0;
64
65  /*
66   * Mask out all interupts until they have a handler installed.
67   */
68
69  for (i=0; i <NUM_LIRQ; i++)
70    Chain_Initialize_empty( &ISR_Array[i] );
71 
72  init_irq_data_register();
73   
74  /* 
75   * Install external_exception_ISR () as the handler for
76   *  the General Purpose Interrupt.
77   */
78  status = rtems_interrupt_catch( external_exception_ISR,
79           PPC_IRQ_EXTERNAL, (rtems_isr_entry *) &previous_isr );
80}
81
82void Init_EE_mask_init() {
83;
84}
85
86/*
87 *  This routine installs one of multiple ISRs for the general purpose
88 *  inerrupt.
89 */
90rtems_isr_entry  set_EE_vector(
91  rtems_isr_entry     handler,      /* isr routine        */
92  rtems_vector_number vector        /* vector number      */
93)
94{
95  rtems_unsigned16 vec_idx  = vector - Score_IRQ_First;
96  rtems_unsigned32 index;
97 
98  assert  (Nodes_Used < NUM_LIRQ_HANDLERS);
99   
100  /*
101   *  If we have already installed this handler for this vector, then
102   *  just reset it.
103   */
104
105  for ( index=0 ; index <= Nodes_Used ; index++ ) {
106    if ( ISR_Nodes[index].vector == vector &&
107         ISR_Nodes[index].handler == handler )
108      return NULL;
109  }
110
111  /*
112   *  Doing things in this order makes them more atomic
113   */
114 
115  Nodes_Used++;
116
117  index = Nodes_Used - 1;
118
119  ISR_Nodes[index].handler = handler;
120  ISR_Nodes[index].vector  = vector;
121
122  /* printf( "Vector Index: %04x, Vector: %d (%x)\n",
123          vec_idx, vector, vector); */
124
125  Chain_Append( &ISR_Array[vec_idx], &ISR_Nodes[index].Node );
126
127  /*
128   * Unmask the interrupt.
129   */
130  unmask_irq( vec_idx );
131
132  return NULL;
133}
134
135/*
136 * This interrupt service routine is called for an External Exception.
137 */
138rtems_isr external_exception_ISR (
139  rtems_vector_number   vector             /* IN  */
140)
141{
142 rtems_unsigned16    index;
143 EE_ISR_Type         *node;
144 rtems_unsigned16    value;
145 char                err_msg[100];
146#if (HAS_PMC_PSC8)
147 rtems_unsigned16    PMC_irq;
148 rtems_unsigned16    check_irq;
149 rtems_unsigned16    status_word;
150#endif
151
152 index = read_and_clear_irq();
153 if ( index >= NUM_LIRQ ) {
154   sprintf( err_msg, "ERROR:: Invalid interrupt number (%02x)\n", index );
155   DEBUG_puts( err_msg );
156   return;
157 }
158
159#if (HAS_PMC_PSC8)
160  PMC_irq = SCORE603E_PCI_IRQ_0 - SCORE603E_IRQ00;
161
162  if (index ==  PMC_irq) {
163    status_word = read_and_clear_PMC_irq( index );
164
165    for (check_irq=SCORE603E_IRQ16; check_irq<=SCORE603E_IRQ19; check_irq++) {
166      if ( Is_PMC_IRQ( check_irq, status_word )) {
167        index = check_irq - SCORE603E_IRQ00;
168        node = (EE_ISR_Type *)(ISR_Array[ index ].first);
169
170        if ( _Chain_Is_tail( &ISR_Array[ index ], (void *)node ) ) {
171          sprintf(err_msg,"ERROR:: check %d interrupt %02d has no isr\n",
172                  check_irq, index);
173          DEBUG_puts( err_msg);
174          value = get_irq_mask();
175          sprintf(err_msg,"        Mask = %02x\n", value);
176          DEBUG_puts( err_msg);
177        }
178        while ( !_Chain_Is_tail( &ISR_Array[ index ], (void *)node ) ) {
179          (*node->handler)( node->vector );
180          node = (EE_ISR_Type *) node->Node.next;
181        }
182      }
183    }
184  }
185  else
186#endif
187  {
188    node = (EE_ISR_Type *)(ISR_Array[ index ].first);
189    if ( _Chain_Is_tail( &ISR_Array[ index ], (void *)node ) ) {
190      sprintf(err_msg,"ERROR:: interrupt %02x has no isr\n", index);
191      DEBUG_puts( err_msg);
192      value = get_irq_mask();
193      sprintf(err_msg,"        Mask = %02x\n", value);
194      DEBUG_puts( err_msg);
195      return;
196    }
197    while ( !_Chain_Is_tail( &ISR_Array[ index ], (void *)node ) ) {
198     (*node->handler)( node->vector );
199     node = (EE_ISR_Type *) node->Node.next;
200    }
201  }
202
203}
204
205
206
Note: See TracBrowser for help on using the repository browser.