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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [lib/] [libbsp/] [powerpc/] [score603e/] [startup/] [genpvec.c] - Blame information for rev 173

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 unneback
/*  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
 
28
rtems_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
 */
39
typedef 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 */
55
void init_irq_data_register();
56
 
57
void 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
 
82
void Init_EE_mask_init() {
83
;
84
}
85
 
86
/*
87
 *  This routine installs one of multiple ISRs for the general purpose
88
 *  inerrupt.
89
 */
90
rtems_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
 */
138
rtems_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
 

powered by: WebSVN 2.1.0

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