summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/powerpc/mpc55xx/include/irq.h
blob: baa36d88440472d64419dbe05290b0562645ab66 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/**
 * @file
 *
 * @ingroup mpc55xx
 *
 * @brief IRQ
 */

/*
 * Copyright (c) 2008, 2010
 * Embedded Brains GmbH
 * Obere Lagerstr. 30
 * D-82178 Puchheim
 * Germany
 * rtems@embedded-brains.de
 *
 * The license and distribution terms for this file may be found in the file
 * LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
 */

#ifndef LIBBSP_POWERPC_IRQ_H
#define LIBBSP_POWERPC_IRQ_H

#include <rtems/irq-extension.h>
#include <rtems/irq.h>

#include <bspopts.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/*
 * Interrupt numbers
 */

/* Basics */
#define MPC55XX_IRQ_MIN 0U
#define MPC55XX_IRQ_MAX 328U
#define MPC55XX_IRQ_MIN 0U
#define MPC55XX_IRQ_MAX 328U
#define MPC55XX_IRQ_BASE MPC55XX_IRQ_MIN
#define MPC55XX_IRQ_NUMBER (MPC55XX_IRQ_MAX + 1U)

/* Software interrupts */
#define MPC55XX_IRQ_SOFTWARE_MIN 0U
#define MPC55XX_IRQ_SOFTWARE_MAX 7U
#define MPC55XX_IRQ_SOFTWARE_GET_INDEX(v) (v)
#define MPC55XX_IRQ_SOFTWARE_GET_REQUEST(i) (i)
#define MPC55XX_IRQ_SOFTWARE_NUMBER (MPC55XX_IRQ_SOFTWARE_MAX + 1U)

#if MPC55XX_CHIP_TYPE >= 5510 && MPC55XX_CHIP_TYPE <= 5517
  /* eDMA interrupts */
  #define MPC55XX_IRQ_EDMA_ERROR_LOW 10U
  #define MPC55XX_IRQ_EDMA_REQUEST_LOW_MIN 11U
  #define MPC55XX_IRQ_EDMA_REQUEST_LOW_MAX 26U

  #define MPC55XX_IRQ_EDMA_GET_CHANNEL(v) \
    ((v) - MPC55XX_IRQ_EDMA_REQUEST_LOW_MIN)
  #define MPC55XX_IRQ_EDMA_GET_REQUEST(c) \
    ((c) + MPC55XX_IRQ_EDMA_REQUEST_LOW_MIN)

  /* I2C interrupt */
  #define MPC55XX_IRQ_I2C 48U

  /* SIU external interrupts */
  #define MPC55XX_IRQ_SIU_EXTERNAL_0 53U
  #define MPC55XX_IRQ_SIU_EXTERNAL_1 54U
  #define MPC55XX_IRQ_SIU_EXTERNAL_2 55U
  #define MPC55XX_IRQ_SIU_EXTERNAL_3 56U
  #define MPC55XX_IRQ_SIU_EXTERNAL_4_15 57U

  /* eMIOS interrupts */
  #define MPC55XX_IRQ_EMIOS_REQUEST_LOW_MIN 58U
  #define MPC55XX_IRQ_EMIOS_REQUEST_LOW_MAX 81U
  #define MPC55XX_IRQ_EMIOS_GET_CHANNEL(v) \
    ((v) - MPC55XX_IRQ_EMIOS_REQUEST_LOW_MIN)
  #define MPC55XX_IRQ_EMIOS_GET_REQUEST(c) \
    ((c) + MPC55XX_IRQ_EMIOS_REQUEST_LOW_MIN)
#elif MPC55XX_CHIP_TYPE >= 5554 && MPC55XX_CHIP_TYPE <= 5567
  /* eDMA interrupts */
  #define MPC55XX_IRQ_EDMA_ERROR_LOW 10U
  #define MPC55XX_IRQ_EDMA_REQUEST_LOW_MIN 11U
  #define MPC55XX_IRQ_EDMA_REQUEST_LOW_MAX 42U

  #define MPC55XX_IRQ_EDMA_ERROR_HIGH 210U
  #define MPC55XX_IRQ_EDMA_REQUEST_HIGH_MIN 211U
  #define MPC55XX_IRQ_EDMA_REQUEST_HIGH_MAX 242U

  #define MPC55XX_IRQ_EDMA_GET_CHANNEL(v) \
    (((v) > MPC55XX_IRQ_EDMA_REQUEST_LOW_MAX) \
      ? ((v) + 32U - MPC55XX_IRQ_EDMA_REQUEST_HIGH_MIN) \
      : ((v) - MPC55XX_IRQ_EDMA_REQUEST_LOW_MIN))
  #define MPC55XX_IRQ_EDMA_GET_REQUEST(c) \
    (((c) >= 32U) \
      ? ((c) - 32U + MPC55XX_IRQ_EDMA_REQUEST_HIGH_MIN) \
      : ((c) + MPC55XX_IRQ_EDMA_REQUEST_LOW_MIN))

  /* SIU external interrupts */
  #define MPC55XX_IRQ_SIU_EXTERNAL_0 46U
  #define MPC55XX_IRQ_SIU_EXTERNAL_1 47U
  #define MPC55XX_IRQ_SIU_EXTERNAL_2 48U
  #define MPC55XX_IRQ_SIU_EXTERNAL_3 49U
  #define MPC55XX_IRQ_SIU_EXTERNAL_4_15 50U

  /* eMIOS interrupts */
  #define MPC55XX_IRQ_EMIOS_REQUEST_LOW_MIN 51U
  #define MPC55XX_IRQ_EMIOS_REQUEST_LOW_MAX 66U
  #define MPC55XX_IRQ_EMIOS_REQUEST_HIGH_MIN 202U
  #define MPC55XX_IRQ_EMIOS_REQUEST_HIGH_MAX 209U

  #define MPC55XX_IRQ_EMIOS_GET_CHANNEL(v) \
    (((v) > MPC55XX_IRQ_EMIOS_REQUEST_LOW_MAX) \
      ? ((v) + 16U - MPC55XX_IRQ_EMIOS_REQUEST_HIGH_MIN) \
      : ((v) - MPC55XX_IRQ_EMIOS_REQUEST_LOW_MIN))

  #define MPC55XX_IRQ_EMIOS_GET_REQUEST(c) \
    (((c) >= 16U) \
      ? ((c) - 16U + MPC55XX_IRQ_EMIOS_REQUEST_HIGH_MIN) \
      : ((c) + MPC55XX_IRQ_EMIOS_REQUEST_LOW_MIN))
#else
  #error "unexpected chip type"
#endif

/* Checks */
#define MPC55XX_IRQ_IS_VALID(v) \
  ((v) >= MPC55XX_IRQ_MIN && \
   (v) <= MPC55XX_IRQ_MAX)
#define MPC55XX_IRQ_IS_SOFTWARE(v) \
  ((v) >= MPC55XX_IRQ_SOFTWARE_MIN && \
   (v) <= MPC55XX_IRQ_SOFTWARE_MAX)

/*
 * Interrupt controller
 */

#define MPC55XX_INTC_MIN_PRIORITY 1U
#define MPC55XX_INTC_MAX_PRIORITY 15U
#define MPC55XX_INTC_DISABLED_PRIORITY 0U
#define MPC55XX_INTC_INVALID_PRIORITY (MPC55XX_INTC_MAX_PRIORITY + 1)
#define MPC55XX_INTC_DEFAULT_PRIORITY (MPC55XX_INTC_MIN_PRIORITY + 1)
#define MPC55XX_INTC_IS_VALID_PRIORITY(p) \
  ((p) >= MPC55XX_INTC_DISABLED_PRIORITY && (p) <= MPC55XX_INTC_MAX_PRIORITY)

rtems_status_code mpc55xx_interrupt_handler_install(
  rtems_vector_number vector,
  const char *info,
  rtems_option options,
  unsigned priority,
  rtems_interrupt_handler handler,
  void *arg
);

rtems_status_code mpc55xx_intc_get_priority(
  rtems_vector_number vector,
  unsigned *priority
);

rtems_status_code mpc55xx_intc_set_priority(
  rtems_vector_number vector,
  unsigned priority
);

rtems_status_code mpc55xx_intc_raise_software_irq(rtems_vector_number vector);

rtems_status_code mpc55xx_intc_clear_software_irq(rtems_vector_number vector);

/**
 * @addtogroup bsp_interrupt
 *
 * @{
 */

#define BSP_INTERRUPT_VECTOR_MIN 0

#define BSP_INTERRUPT_VECTOR_MAX 328

#define BSP_INTERRUPT_USE_INDEX_TABLE

#define BSP_INTERRUPT_NO_HEAP_USAGE

#ifdef BSP_INTERRUPT_USE_INDEX_TABLE
  #define BSP_INTERRUPT_HANDLER_TABLE_SIZE 63
  typedef uint8_t bsp_interrupt_handler_index_type;
#endif

/** @} */

#ifdef __cplusplus
};
#endif /* __cplusplus */

#endif /* LIBBSP_POWERPC_IRQ_H */