summaryrefslogtreecommitdiffstats
path: root/bsps/sparc/leon3/include/tm27.h
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/sparc/leon3/include/tm27.h')
-rw-r--r--bsps/sparc/leon3/include/tm27.h113
1 files changed, 85 insertions, 28 deletions
diff --git a/bsps/sparc/leon3/include/tm27.h b/bsps/sparc/leon3/include/tm27.h
index dda21f558f..75004ef5ae 100644
--- a/bsps/sparc/leon3/include/tm27.h
+++ b/bsps/sparc/leon3/include/tm27.h
@@ -1,6 +1,8 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
/**
* @file
- * @ingroup sparc_leon3
+ * @ingroup RTEMSBSPsSPARCLEON3
* @brief Implementations for interrupt mechanisms for Time Test 27
*/
@@ -8,9 +10,26 @@
* COPYRIGHT (c) 2006.
* Aeroflex Gaisler AB.
*
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _RTEMS_TMTEST27
@@ -21,7 +40,11 @@
#define __tm27_h
#include <bsp.h>
-#include <leon.h>
+#include <bsp/irq-generic.h>
+
+#if defined(RTEMS_SMP)
+#include <rtems/score/smpimpl.h>
+#endif
/*
* Define the interrupt mechanism for Time Test 27
@@ -43,6 +66,8 @@
#define MUST_WAIT_FOR_INTERRUPT 1
+#define TM27_USE_VECTOR_HANDLER
+
#define Install_tm27_vector( handler ) \
set_vector( (handler), TEST_VECTOR, 1 );
@@ -59,40 +84,72 @@
#else /* use a regular asynchronous trap */
-#define TEST_INTERRUPT_SOURCE LEON_INTERRUPT_EXTERNAL_1
-#define TEST_INTERRUPT_SOURCE2 LEON_INTERRUPT_EXTERNAL_1+1
+extern uint32_t Interrupt_nest;
+
+#define TEST_INTERRUPT_SOURCE 5
+#define TEST_INTERRUPT_SOURCE2 6
#define MUST_WAIT_FOR_INTERRUPT 1
+#define TM27_INTERRUPT_VECTOR_DEFAULT TEST_INTERRUPT_SOURCE
-static inline void Install_tm27_vector(
- void ( *handler )( rtems_vector_number )
-)
+static inline void Install_tm27_vector( rtems_interrupt_handler handler )
{
- (void) rtems_interrupt_handler_install(
+ static rtems_interrupt_entry entry_low;
+ static rtems_interrupt_entry entry_high;
+
+#if defined(RTEMS_SMP)
+ bsp_interrupt_set_affinity(
+ TEST_INTERRUPT_SOURCE,
+ _SMP_Get_online_processors()
+ );
+ bsp_interrupt_set_affinity(
+ TEST_INTERRUPT_SOURCE2,
+ _SMP_Get_online_processors()
+ );
+#endif
+
+ rtems_interrupt_entry_initialize(
+ &entry_low,
+ handler,
+ NULL,
+ "tm27 low"
+ );
+ (void) rtems_interrupt_entry_install(
TEST_INTERRUPT_SOURCE,
- "tm27 low",
RTEMS_INTERRUPT_SHARED,
- (rtems_interrupt_handler) handler,
- NULL
+ &entry_low
+ );
+ rtems_interrupt_entry_initialize(
+ &entry_high,
+ handler,
+ NULL,
+ "tm27 high"
);
- (void) rtems_interrupt_handler_install(
+ (void) rtems_interrupt_entry_install(
TEST_INTERRUPT_SOURCE2,
- "tm27 high",
RTEMS_INTERRUPT_SHARED,
- (rtems_interrupt_handler) handler,
- NULL
+ &entry_high
);
}
-#define Cause_tm27_intr() \
- do { \
- LEON_Force_interrupt( TEST_INTERRUPT_SOURCE+(Interrupt_nest>>1)); \
- nop(); \
- nop(); \
- nop(); \
- } while (0)
-
-#define Clear_tm27_intr() \
- LEON_Clear_interrupt( TEST_INTERRUPT_SOURCE )
+static inline void Cause_tm27_intr( void )
+{
+ rtems_vector_number vector;
+
+ vector = TEST_INTERRUPT_SOURCE + ( Interrupt_nest >> 1 );
+#if defined(RTEMS_SMP)
+ (void) rtems_interrupt_raise_on( vector, rtems_scheduler_get_processor() );
+#else
+ (void) rtems_interrupt_raise( vector );
+#endif
+ nop();
+ nop();
+ nop();
+}
+
+static inline void Clear_tm27_intr( void )
+{
+ (void) rtems_interrupt_clear( TEST_INTERRUPT_SOURCE );
+}
#define Lower_tm27_intr() /* empty */