bsps/leon3: Send the IPI on bus line 0

The BSP sent the inter-processor interrupt on bus line 14 and followed
the interrupt map.  The GR765 reset map maps bus line 14 to controller
line 1, which the DMA controllers use.  The GR765 keeps the controller
lines 13 and 14 free after reset.  No peripheral drives bus line 0.

Add the option LEON3_IPI_BUS_LINE for the initial value of
LEON3_mp_irq.  It is 0 for the GR740 and the GR765, and 14 otherwise.
With a map, map bus line 0 in the copy to the controller line defined
by the new option LEON3_IPI_CONTROLLER_LINE, which is 14 by default.
Accept vector 0 where its map entry is not zero.  Let the shared memory
driver force the controller line of LEON3_mp_irq.

Assisted-by: Claude:claude-opus-5-5 claude-code
Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
This commit is contained in:
Sebastian Huber
2026-09-30 09:53:11 -05:00
committed by Kinsey Moore
parent 795abe60c4
commit a7a701b67c
10 changed files with 91 additions and 14 deletions
+8 -3
View File
@@ -213,9 +213,14 @@ RTEMS_DEPRECATED static inline void BSP_shared_interrupt_mask( int irq )
}
#if defined( RTEMS_SMP ) || defined( RTEMS_MULTIPROCESSING )
/* Irq used by the shared memory driver and for inter-processor interrupts.
* The variable is weakly linked. Redefine the variable in your application
* to override the BSP default.
/**
* @brief This constant is the bus line of the shared memory driver and of the
* inter-processor interrupts.
*
* The BSP option LEON3_IPI_BUS_LINE defines the initial value. The constant
* is weakly linked, so an application may define it. Where the BSP uses the
* interrupt map, keep the value zero. The BSP maps bus line 0 to the
* controller line defined by the BSP option LEON3_IPI_CONTROLLER_LINE.
*/
extern const unsigned char LEON3_mp_irq;
#endif
+2
View File
@@ -69,6 +69,8 @@ extern "C" {
* Where the BSP uses no interrupt map, a bus line maps to the controller line
* of the same number. Where the BSP uses the interrupt map, the directive
* gets the controller line to which the interrupt map connects the bus line.
* In SMP and multiprocessing configurations, bus line 0 connects to the
* controller line defined by the BSP option LEON3_IPI_CONTROLLER_LINE.
*
* Bus lines which map to the same controller line share its interrupt
* handlers. They also share its enable, pending and affinity state.
+5 -3
View File
@@ -118,9 +118,11 @@ extern uint32_t LEON3_IrqCtrl_EIrq;
* interrupt clear register, which clears every pending interrupt. Where the
* BSP uses the interrupt map, the function copies the interrupt map entry of
* each bus line into the interrupt map copy of the BSP. It masks each entry
* by the count of controller lines. Where the BSP determines the extended
* controller line at run time, the function reads it from the interrupt
* controller.
* by the count of controller lines. In SMP and multiprocessing
* configurations, it maps bus line 0 to the controller line defined by the
* BSP option LEON3_IPI_CONTROLLER_LINE. Where the BSP determines the
* extended controller line at run time, the function reads it from the
* interrupt controller.
*
* @param[in, out] regs is the register block address of the first IRQ(A)MP
* interrupt controller. Only the first controller provides the interrupt
+3 -1
View File
@@ -17,6 +17,7 @@
#include <rtems.h>
#include <bsp.h>
#include <bsp/irqimpl.h>
#include <leon.h>
#include <shm_driver.h>
@@ -63,7 +64,8 @@ void Shm_Get_configuration( uint32_t localnode, shm_config_table **shmcfg )
LEON3_IrqCtrl_Regs->piforce[ LEON3_Cpu_Index ]
);
if ( BSP_shm_cfgtbl.Intr.value == 0 ) {
BSP_shm_cfgtbl.Intr.value = 1 << LEON3_mp_irq; /* Use default MP-IRQ */
BSP_shm_cfgtbl.Intr.value = 1U
<< leon3_irqmap_get_unchecked( LEON3_mp_irq );
}
BSP_shm_cfgtbl.Intr.length = 4;
+4 -3
View File
@@ -49,10 +49,11 @@
#include <rtems/sysinit.h>
#if defined( RTEMS_SMP ) || defined( RTEMS_MULTIPROCESSING )
/* Irq used by shared memory driver and for inter-processor interrupts.
* Can be overridden by being defined in the application.
/*
* The bus line of the shared memory driver and of the inter-processor
* interrupts. An application may define it.
*/
const unsigned char LEON3_mp_irq __attribute__(( weak )) = 14;
const unsigned char LEON3_mp_irq __attribute__(( weak )) = LEON3_IPI_BUS_LINE;
#endif
/*
+14 -4
View File
@@ -119,19 +119,28 @@ void leon3_ext_irq_init( irqamp *regs )
IRQAMP_IRQMAP_IRQMAP_4_N_3_GET( irqmap_n )
);
}
#if defined( RTEMS_SMP ) || defined( RTEMS_MULTIPROCESSING )
/*
* No peripheral drives bus line 0. The copy maps it to the controller line
* of the inter-processor interrupt.
*/
LEON3_IrqCtrl_Mapping[ 0 ] = LEON3_IPI_CONTROLLER_LINE;
#endif
#endif
}
bool bsp_interrupt_is_valid_vector( rtems_vector_number vector )
{
#if LEON3_IRQMAP_BUS_LINE_COUNT != 0
return vector < BSP_INTERRUPT_VECTOR_COUNT &&
leon3_irqmap_get_unchecked( vector ) != 0;
#else
if ( vector == 0 ) {
return false;
}
#if LEON3_IRQMAP_BUS_LINE_COUNT != 0
return vector < BSP_INTERRUPT_VECTOR_COUNT &&
leon3_irqmap_get_unchecked( vector ) != 0;
#elif defined( LEON3_IRQAMP_EXTENDED_INTERRUPT )
#if defined( LEON3_IRQAMP_EXTENDED_INTERRUPT )
return vector <= BSP_INTERRUPT_VECTOR_MAX_EXT;
#else
if ( LEON3_IrqCtrl_EIrq > 0 ) {
@@ -140,6 +149,7 @@ bool bsp_interrupt_is_valid_vector( rtems_vector_number vector )
return vector <= BSP_INTERRUPT_VECTOR_MAX_STD;
#endif
#endif
}
#if defined( RTEMS_SMP )
+4
View File
@@ -46,8 +46,12 @@ links:
uid: optirqampbase
- role: build-dependency
uid: optirqampextirq
- role: build-dependency
uid: optipibusline
- role: build-dependency
uid: optirqmapbuslinecount
- role: build-dependency
uid: optipicontrollerline
- role: build-dependency
uid: optirqampts
- role: build-dependency
@@ -0,0 +1,25 @@
SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
actions:
- get-integer: null
- format-and-define: null
build-type: option
copyrights:
- Copyright (C) 2026 embedded brains GmbH & Co. KG
default:
- enabled-by:
- sparc/gr740
- sparc/gr765
value: 0
- enabled-by: true
value: 14
description: |
This option defines the initial value of LEON3_mp_irq, the bus line of the
inter-processor interrupt and of the shared memory driver. Where the BSP
uses the interrupt map, the value zero selects bus line 0. No peripheral
drives this bus line, and the BSP maps it to the controller line defined by
LEON3_IPI_CONTROLLER_LINE.
enabled-by: true
format: '{}'
links: []
name: LEON3_IPI_BUS_LINE
type: build
@@ -0,0 +1,25 @@
SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
actions:
- get-integer: null
- assert-in-set:
- 13
- 14
- format-and-define: null
build-type: option
copyrights:
- Copyright (C) 2026 embedded brains GmbH & Co. KG
default:
- enabled-by: true
value: 14
description: |
This option defines the controller line of the inter-processor interrupt.
Only a BSP which uses the interrupt map uses the option. The BSP maps bus
line 0 to this controller line in the copy of the interrupt map and leaves
the interrupt map register unchanged. The GR765 keeps the controller lines
13 and 14 free of peripherals after reset, see GR765-DSUM, section 14.2.3.
Controller line 15 is not maskable.
enabled-by: LEON3_IRQMAP_BUS_LINE_COUNT
format: '{}'
links: []
name: LEON3_IPI_CONTROLLER_LINE
type: build
@@ -6,6 +6,7 @@ actions:
- 32
- 64
- format-and-define: null
- env-enable: null
build-type: option
copyrights:
- Copyright (C) 2026 Frontgrade Gaisler