source: rtems/bsps/powerpc/mpc55xxevb/start/irq.c @ e560ee85

Last change on this file since e560ee85 was e560ee85, checked in by Joel Sherrill <joel@…>, on 03/01/22 at 21:38:55

bsps/powerpc/: Scripted embedded brains header file clean up

Updates #4625.

  • Property mode set to 100644
File size: 4.8 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup RTEMSBSPsPowerPCMPC55XX
5 *
6 * @brief Source file for MPC55XX interrupt support.
7 */
8
9/*
10 * Copyright (c) 2008-2012 embedded brains GmbH.  All rights reserved.
11 *
12 * The license and distribution terms for this file may be
13 * found in the file LICENSE in this distribution or at
14 * http://www.rtems.org/license/LICENSE.
15 */
16
17#include <mpc55xx/regs.h>
18
19#include <libcpu/powerpc-utility.h>
20
21#include <bsp/irq.h>
22#include <bsp/vectors.h>
23#include <bsp/irq-generic.h>
24
25#define RTEMS_STATUS_CHECKS_USE_PRINTK
26
27#include <rtems/status-checks.h>
28
29/**
30 * @brief Returns the priority @a priority of IRQ @a vector from the INTC.
31 */
32rtems_status_code mpc55xx_intc_get_priority( rtems_vector_number vector, unsigned *priority)
33{
34        if (MPC55XX_IRQ_IS_VALID( vector)) {
35                *priority = INTC.PSR [vector].B.PRI;
36                return RTEMS_SUCCESSFUL;
37        } else {
38                *priority = MPC55XX_INTC_INVALID_PRIORITY;
39                return RTEMS_INVALID_NUMBER;
40        }
41}
42
43/**
44 * @brief Sets the priority of IRQ @a vector to @a priority at the INTC.
45 */
46rtems_status_code mpc55xx_intc_set_priority( rtems_vector_number vector, unsigned priority)
47{
48        if (MPC55XX_IRQ_IS_VALID( vector) && MPC55XX_INTC_IS_VALID_PRIORITY( priority)) {
49                INTC.PSR [vector].B.PRI = priority;
50                if (INTC.PSR [vector].B.PRI == priority) {
51                        return RTEMS_SUCCESSFUL;
52                } else {
53                        return RTEMS_IO_ERROR;
54                }
55        } else {
56                return RTEMS_INVALID_NUMBER;
57        }
58}
59
60/**
61 * @brief Raises the software IRQ with number @a vector.
62 */
63rtems_status_code mpc55xx_intc_raise_software_irq( rtems_vector_number vector)
64{
65        if (MPC55XX_IRQ_IS_SOFTWARE( vector)) {
66                INTC.SSCIR [vector].B.SET = 1;
67                return RTEMS_SUCCESSFUL;
68        } else {
69                return RTEMS_INVALID_NUMBER;
70        }
71}
72
73/**
74 * @brief Clears the software IRQ with number @a vector.
75 */
76rtems_status_code mpc55xx_intc_clear_software_irq( rtems_vector_number vector)
77{
78        if (MPC55XX_IRQ_IS_SOFTWARE( vector)) {
79                INTC.SSCIR [vector].B.CLR = 1;
80                return RTEMS_SUCCESSFUL;
81        } else {
82                return RTEMS_INVALID_NUMBER;
83        }
84}
85
86/**
87 * @brief Installs interrupt handler and sets priority.
88 */
89rtems_status_code mpc55xx_interrupt_handler_install(
90        rtems_vector_number vector,
91        const char *info,
92        rtems_option options,
93        unsigned priority,
94        rtems_interrupt_handler handler,
95        void *arg
96)
97{
98        if (MPC55XX_IRQ_IS_VALID( vector) && MPC55XX_INTC_IS_VALID_PRIORITY( priority)) {
99                rtems_status_code sc = RTEMS_SUCCESSFUL;
100
101                sc = rtems_interrupt_handler_install( vector, info, options, handler, arg);
102                RTEMS_CHECK_SC( sc, "Install interrupt handler");
103
104                return mpc55xx_intc_set_priority( vector, priority);
105        } else {
106                return RTEMS_INVALID_NUMBER;
107        }
108}
109
110void bsp_interrupt_dispatch(uintptr_t exception_number)
111{
112        /* Acknowledge interrupt request */
113        rtems_vector_number vector = INTC.IACKR.B.INTVEC;
114
115        /* Save machine state and enable external exceptions */
116        uint32_t msr = ppc_external_exceptions_enable();
117
118        /* Dispatch interrupt handlers */
119        bsp_interrupt_handler_dispatch( vector);
120
121        /* Restore machine state */
122        ppc_external_exceptions_disable( msr);
123
124        /* End of interrupt */
125        INTC.EOIR.R = 1;
126}
127
128void bsp_interrupt_facility_initialize(void)
129{
130        rtems_vector_number vector;
131
132        /* Initialize interrupt controller */
133
134        /* Disable all interrupts */
135        for (vector = MPC55XX_IRQ_MIN; vector <= MPC55XX_IRQ_MAX; ++vector) {
136                INTC.PSR [vector].B.PRI = MPC55XX_INTC_DISABLED_PRIORITY;
137        }
138
139        /* Software vector mode */
140        INTC.MCR.B.VTES = 0;
141        INTC.MCR.B.HVEN = 0;
142
143        /* Set current priority to 0 */
144        INTC.CPR.B.PRI = 0;
145}
146
147rtems_status_code bsp_interrupt_get_attributes(
148  rtems_vector_number         vector,
149  rtems_interrupt_attributes *attributes
150)
151{
152  return RTEMS_SUCCESSFUL;
153}
154
155rtems_status_code bsp_interrupt_is_pending(
156  rtems_vector_number vector,
157  bool               *pending
158)
159{
160  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
161  bsp_interrupt_assert(pending != NULL);
162  *pending = false;
163  return RTEMS_UNSATISFIED;
164}
165
166rtems_status_code bsp_interrupt_raise(rtems_vector_number vector)
167{
168  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
169  return RTEMS_UNSATISFIED;
170}
171
172rtems_status_code bsp_interrupt_clear(rtems_vector_number vector)
173{
174  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
175  return RTEMS_UNSATISFIED;
176}
177
178rtems_status_code bsp_interrupt_vector_is_enabled(
179  rtems_vector_number vector,
180  bool               *enabled
181)
182{
183  bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
184  bsp_interrupt_assert(enabled != NULL);
185  *enabled = false;
186  return RTEMS_UNSATISFIED;
187}
188
189rtems_status_code bsp_interrupt_vector_enable( rtems_vector_number vector)
190{
191        bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
192        mpc55xx_intc_set_priority( vector, MPC55XX_INTC_DEFAULT_PRIORITY);
193        return RTEMS_SUCCESSFUL;
194}
195
196rtems_status_code bsp_interrupt_vector_disable( rtems_vector_number vector)
197{
198        bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
199        mpc55xx_intc_set_priority( vector, MPC55XX_INTC_DISABLED_PRIORITY);
200        return RTEMS_SUCCESSFUL;
201}
Note: See TracBrowser for help on using the repository browser.