source: rtems/c/src/lib/libbsp/i386/shared/irq/irq.c @ 3bc12a8f

5
Last change on this file since 3bc12a8f was 3bc12a8f, checked in by Sebastian Huber <sebastian.huber@…>, on 01/26/16 at 10:16:56

Delete unused API extensions

  • Property mode set to 100644
File size: 6.2 KB
RevLine 
[1ecb21d8]1/*
[67a2288]2 *  This file contains the implementation of the function described in irq.h
[1ecb21d8]3 */
4
5/*
[fc5490f]6 *  Copyright (c) 2009 embedded brains GmbH
[a62222fb]7 *  Copyright (C) 1998 valette@crf.canon.fr
[67a2288]8 *
9 *  The license and distribution terms for this file may be
[8c41855]10 *  found in the file LICENSE in this distribution or at
[c499856]11 *  http://www.rtems.org/license/LICENSE.
[67a2288]12 */
13
14#include <bsp.h>
[529cebf0]15#include <bsp/irq.h>
[fc5490f]16#include <bsp/irq-generic.h>
17
[f9abe50]18#include <stdlib.h>
[385212f]19#include <stdio.h>
20#include <inttypes.h>
[eb562f2]21
[67a2288]22/*
23 * pointer to the mask representing the additionnal irq vectors
24 * that must be disabled when a particular entry is activated.
25 * They will be dynamically computed from teh prioruty table given
[0ebbf66]26 * in BSP_rtems_irq_mngt_set();
[67a2288]27 * CAUTION : this table is accessed directly by interrupt routine
28 *           prologue.
29 */
[0ebbf66]30rtems_i8259_masks       irq_mask_or_tbl[BSP_IRQ_LINES_NUMBER];
[67a2288]31
[385212f]32uint32_t            irq_count[BSP_IRQ_LINES_NUMBER] = {0};
33
34uint32_t
35BSP_irq_count_dump(FILE *f)
36{
37uint32_t tot = 0;
38int      i;
39        if ( !f )
40                f = stdout;
41        for ( i=0; i<BSP_IRQ_LINES_NUMBER; i++ ) {
42                tot += irq_count[i];
43                fprintf(f,"IRQ %2u: %9"PRIu32"\n", i, irq_count[i]);
44        }
45        return tot;
46}
47
[67a2288]48/*-------------------------------------------------------------------------+
49| Cache for 1st and 2nd PIC IRQ line's status (enabled or disabled) register.
50+--------------------------------------------------------------------------*/
51/*
52 * lower byte is interrupt mask on the master PIC.
53 * while upper bits are interrupt on the slave PIC.
54 * This cache is initialized in ldseg.s
55 */
[a1c70a2]56rtems_i8259_masks i8259s_cache = 0xFFFB;
[f91fbbf4]57rtems_i8259_masks i8259s_super_imr = 0xFFFB;
[67a2288]58
59/*-------------------------------------------------------------------------+
[0ebbf66]60|         Function:  BSP_irq_disable_at_i8259s
[67a2288]61|      Description: Mask IRQ line in appropriate PIC chip.
62| Global Variables: i8259s_cache
63|        Arguments: vector_offset - number of IRQ line to mask.
[6128a4a]64|          Returns: Nothing.
[67a2288]65+--------------------------------------------------------------------------*/
[838c82b]66int BSP_irq_disable_at_i8259s    (const rtems_irq_number irqLine)
[67a2288]67{
[c83c325]68  unsigned short        mask;
69  rtems_interrupt_level level;
[67a2288]70
[0ebbf66]71  if ( ((int)irqLine < BSP_LOWEST_OFFSET) ||
[ad2cefe]72       ((int)irqLine > BSP_MAX_ON_i8259S )
[67a2288]73       )
74    return 1;
[6128a4a]75
[c83c325]76  rtems_interrupt_disable(level);
[6128a4a]77
[67a2288]78  mask = 1 << irqLine;
79  i8259s_cache |= mask;
[f91fbbf4]80  i8259s_super_imr |= mask;
[6128a4a]81
[67a2288]82  if (irqLine < 8)
83  {
84    outport_byte(PIC_MASTER_IMR_IO_PORT, i8259s_cache & 0xff);
85  }
86  else
87  {
[783e8322]88    outport_byte(PIC_SLAVE_IMR_IO_PORT, ((i8259s_cache & 0xff00) >> 8));
[67a2288]89  }
[c83c325]90  rtems_interrupt_enable(level);
[67a2288]91
92  return 0;
[6128a4a]93}
[67a2288]94
95/*-------------------------------------------------------------------------+
[0ebbf66]96|         Function:  BSP_irq_enable_at_i8259s
[67a2288]97|      Description: Unmask IRQ line in appropriate PIC chip.
98| Global Variables: i8259s_cache
99|        Arguments: irqLine - number of IRQ line to mask.
[6128a4a]100|          Returns: Nothing.
[67a2288]101+--------------------------------------------------------------------------*/
[838c82b]102int BSP_irq_enable_at_i8259s    (const rtems_irq_number irqLine)
[67a2288]103{
[c83c325]104  unsigned short        mask;
105  rtems_interrupt_level level;
[67a2288]106
[0ebbf66]107  if ( ((int)irqLine < BSP_LOWEST_OFFSET) ||
[ad2cefe]108       ((int)irqLine > BSP_MAX_ON_i8259S )
[67a2288]109       )
110    return 1;
111
[c83c325]112  rtems_interrupt_disable(level);
[6128a4a]113
[67a2288]114  mask = ~(1 << irqLine);
115  i8259s_cache &= mask;
[f91fbbf4]116  i8259s_super_imr &= mask;
[6128a4a]117
[67a2288]118  if (irqLine < 8)
119  {
120    outport_byte(PIC_MASTER_IMR_IO_PORT, i8259s_cache & 0xff);
121  }
122  else
123  {
[783e8322]124    outport_byte(PIC_SLAVE_IMR_IO_PORT, ((i8259s_cache & 0xff00) >> 8));
[67a2288]125  }
[c83c325]126  rtems_interrupt_enable(level);
[67a2288]127
128  return 0;
129} /* mask_irq */
130
[838c82b]131int BSP_irq_enabled_at_i8259s           (const rtems_irq_number irqLine)
[67a2288]132{
133  unsigned short mask;
134
[0ebbf66]135  if ( ((int)irqLine < BSP_LOWEST_OFFSET) ||
[ad2cefe]136       ((int)irqLine > BSP_MAX_ON_i8259S )
[67a2288]137     )
138    return 1;
139
140  mask = (1 << irqLine);
141  return  (~(i8259s_cache & mask));
142}
[6128a4a]143
[67a2288]144/*-------------------------------------------------------------------------+
[0ebbf66]145|         Function: BSP_irq_ack_at_i8259s
[67a2288]146|      Description: Signal generic End Of Interrupt (EOI) to appropriate PIC.
147| Global Variables: None.
148|        Arguments: irqLine - number of IRQ line to acknowledge.
[6128a4a]149|          Returns: Nothing.
[67a2288]150+--------------------------------------------------------------------------*/
[838c82b]151int BSP_irq_ack_at_i8259s       (const rtems_irq_number irqLine)
[67a2288]152{
[0ebbf66]153  if ( ((int)irqLine < BSP_LOWEST_OFFSET) ||
[ad2cefe]154       ((int)irqLine > BSP_MAX_ON_i8259S )
[67a2288]155       )
156    return 1;
157
158  if (irqLine >= 8) {
159   outport_byte(PIC_SLAVE_COMMAND_IO_PORT, PIC_EOI);
160  }
161  outport_byte(PIC_MASTER_COMMAND_IO_PORT, PIC_EOI);
162
163  return 0;
164
165} /* ackIRQ */
166
167/*
168 * ------------------------ RTEMS Irq helper functions ----------------
169 */
[6128a4a]170
[fc5490f]171static rtems_irq_prio irqPrioTable[BSP_IRQ_LINES_NUMBER]={
172  /*
[41572c4]173   * actual priorities for each interrupt source:
[fc5490f]174   *    0   means that only current interrupt is masked
175   *    255 means all other interrupts are masked
176   * The second entry has a priority of 255 because
177   * it is the slave pic entry and is should always remain
178   * unmasked.
179   */
180  0,0,
181  255,
182  0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0
183};
184
[f9abe50]185static void compute_i8259_masks_from_prio (void)
[67a2288]186{
[fc5490f]187  rtems_interrupt_level level;
[67a2288]188  unsigned int i;
189  unsigned int j;
[fc5490f]190
[ad2cefe]191  rtems_interrupt_disable(level);
[fc5490f]192
[67a2288]193  /*
194   * Always mask at least current interrupt to prevent re-entrance
195   */
[fc5490f]196  for (i=0; i < BSP_IRQ_LINES_NUMBER; i++) {
[67a2288]197    * ((unsigned short*) &irq_mask_or_tbl[i]) = (1 << i);
[fc5490f]198    for (j = 0; j < BSP_IRQ_LINES_NUMBER; j++) {
[67a2288]199      /*
200       * Mask interrupts at i8259 level that have a lower priority
201       */
[fc5490f]202      if (irqPrioTable [i] > irqPrioTable [j]) {
[67a2288]203        * ((unsigned short*) &irq_mask_or_tbl[i]) |= (1 << j);
204      }
205    }
206  }
[a62222fb]207
208  rtems_interrupt_enable(level);
209}
210
[fc5490f]211rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
[67a2288]212{
[fc5490f]213  BSP_irq_enable_at_i8259s(vector);
[6128a4a]214
[fc5490f]215  return RTEMS_SUCCESSFUL;
[67a2288]216}
217
[fc5490f]218rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
[67a2288]219{
[fc5490f]220  BSP_irq_disable_at_i8259s(vector);
[fe235a1e]221
[fc5490f]222  return RTEMS_SUCCESSFUL;
[67a2288]223}
224
[fc5490f]225rtems_status_code bsp_interrupt_facility_initialize(void)
[67a2288]226{
[a62222fb]227  /*
[fc5490f]228   * set up internal tables used by rtems interrupt prologue
[a62222fb]229   */
[fc5490f]230  compute_i8259_masks_from_prio();
[67a2288]231
[a62222fb]232  /*
[fc5490f]233   * must enable slave pic anyway
[a62222fb]234   */
[fc5490f]235  BSP_irq_enable_at_i8259s(2);
[67a2288]236
[fc5490f]237  return RTEMS_SUCCESSFUL;
[67a2288]238}
239
[fc5490f]240void C_dispatch_isr(int vector)
[67a2288]241{
[385212f]242  irq_count[vector]++;
[fc5490f]243  bsp_interrupt_handler_dispatch(vector);
[6128a4a]244}
Note: See TracBrowser for help on using the repository browser.