bsps/sparc/leon3: Fix GPTIMER timer index logic

The old logic would lead to an error when
multiprocessing was enabled and
`LEON3_GPTIMER_BASE` was defined due to
`leon3_timer_core_index` being undefined.

The new logic fixes this and keeps the same
intent:
 - If multiprocessing is not enabled, the timer
   index is 0
 - If multiprocessing is enabled and
   `LEON3_GPTIMER_BASE` is defined, the timer
   index is twice the CPU boot index
 - If multiprocessing is enabled and
   `LEON3_GPTIMER_BASE` is not defined, we
   fallback to the old logic using the GPTIMER
   core index.

Close #5258
This commit is contained in:
Matteo Concas
2025-06-16 12:37:18 +02:00
committed by Kinsey Moore
parent df1d85c0f8
commit ae361faeba
2 changed files with 7 additions and 14 deletions

View File

@@ -21,14 +21,6 @@
#include <leon.h> #include <leon.h>
#include <rtems/btimer.h> #include <rtems/btimer.h>
#if defined(RTEMS_MULTIPROCESSING)
#define LEON3_TIMER_INDEX \
((rtems_configuration_get_user_multiprocessing_table()) ? \
(rtems_configuration_get_user_multiprocessing_table()->node) - 1 : 1)
#else
#define LEON3_TIMER_INDEX 0
#endif
bool benchmark_timer_find_average_overhead; bool benchmark_timer_find_average_overhead;
bool benchmark_timer_is_initialized = false; bool benchmark_timer_is_initialized = false;
@@ -39,7 +31,7 @@ void benchmark_timer_initialize(void)
* Timer runs long and accurate enough not to require an interrupt. * Timer runs long and accurate enough not to require an interrupt.
*/ */
if (LEON3_Timer_Regs) { if (LEON3_Timer_Regs) {
gptimer_timer *timer = &LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX]; gptimer_timer *timer = &LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX];
if ( benchmark_timer_is_initialized == false ) { if ( benchmark_timer_is_initialized == false ) {
/* approximately 1 us per countdown */ /* approximately 1 us per countdown */
grlib_store_32( &timer->trldval, 0xffffff ); grlib_store_32( &timer->trldval, 0xffffff );
@@ -61,7 +53,7 @@ benchmark_timer_t benchmark_timer_read(void)
if (LEON3_Timer_Regs) { if (LEON3_Timer_Regs) {
total = total =
grlib_load_32( &LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX].tcntval ); grlib_load_32( &LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].tcntval );
total = 0xffffff - total; total = 0xffffff - total;

View File

@@ -216,11 +216,12 @@ extern unsigned int leon3_timer_prescaler;
* @brief This constant defines the index of the GPTIMER timer used by the * @brief This constant defines the index of the GPTIMER timer used by the
* clock driver. * clock driver.
*/ */
#if defined(RTEMS_MULTIPROCESSING) #if !defined(RTEMS_MULTIPROCESSING)
#define LEON3_CLOCK_INDEX \
( leon3_timer_core_index != 0 ? 0 : 2 * LEON3_Cpu_Index )
#else
#define LEON3_CLOCK_INDEX 0 #define LEON3_CLOCK_INDEX 0
#elif defined(LEON3_GPTIMER_BASE)
#define LEON3_CLOCK_INDEX ( 2 * LEON3_Cpu_Index )
#else
#define LEON3_CLOCK_INDEX ( leon3_timer_core_index != 0 ? 0 : 2 * LEON3_Cpu_Index )
#endif #endif
/** /**