summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2023-09-15 11:11:31 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2023-10-20 11:16:54 +0200
commit3f03a6d2ef787d8b0a6ebf4549eb992c0aced513 (patch)
treeb984c04ceef4db7d0afb45001bfc7607c548252f
parentb6dc4b47077803cde93648016d15ce3992573d03 (diff)
bsps/leon3: Make GPTIMER fall back mandatory
Using the auto reload counter which generates the clock ticks for the timecounter or CPU counter is quite difficult and only works in uniprocessor configurations. Update #4954.
-rw-r--r--bsps/sparc/leon3/clock/ckinit.c35
-rw-r--r--bsps/sparc/leon3/include/bsp/leon3.h43
-rw-r--r--bsps/sparc/leon3/include/leon.h21
-rw-r--r--bsps/sparc/leon3/start/amba.c2
-rw-r--r--bsps/sparc/leon3/start/cpucounter.c2
5 files changed, 43 insertions, 60 deletions
diff --git a/bsps/sparc/leon3/clock/ckinit.c b/bsps/sparc/leon3/clock/ckinit.c
index eea4649fa3..d800f01e4a 100644
--- a/bsps/sparc/leon3/clock/ckinit.c
+++ b/bsps/sparc/leon3/clock/ckinit.c
@@ -69,19 +69,6 @@ static struct timecounter leon3_tc;
static void leon3_tc_tick_default(void)
{
-#if !defined(RTEMS_SMP)
- SPARC_Counter *counter;
- rtems_interrupt_level level;
-
- counter = &_SPARC_Counter;
- rtems_interrupt_local_disable(level);
-
- grlib_store_32(&LEON3_IrqCtrl_Regs->iclear, counter->pending_mask);
- counter->accumulated += counter->interval;
-
- rtems_interrupt_local_enable(level);
-#endif
-
rtems_timecounter_tick();
}
@@ -238,29 +225,11 @@ static void leon3_clock_use_gptimer(
gptimer_timer *timer
)
{
-#ifdef RTEMS_SMP
/*
- * The GR712RC for example has no timestamp unit in the interrupt
- * controller. At least on SMP configurations we must use a second timer
- * in free running mode for the timecounter. The timer is initialized by
- * leon3_counter_initialize().
+ * As a fall back, use a second timer in free-running mode for the
+ * timecounter. The timer is initialized by leon3_counter_initialize().
*/
tc->tc_get_timecount = _SPARC_Get_timecount_down;
-#else
- SPARC_Counter *counter;
-
- counter = &_SPARC_Counter;
- counter->read_isr_disabled = _SPARC_Counter_read_clock_isr_disabled;
- counter->read = _SPARC_Counter_read_clock;
- counter->counter_register = &timer->tcntval;
- counter->pending_register = &LEON3_IrqCtrl_Regs->ipend;
- counter->pending_mask = UINT32_C(1) << clkirq;
- counter->accumulated = rtems_configuration_get_microseconds_per_tick();
- counter->interval = rtems_configuration_get_microseconds_per_tick();
-
- tc->tc_get_timecount = _SPARC_Get_timecount_clock;
-#endif
-
tc->tc_frequency = LEON3_GPTIMER_0_FREQUENCY_SET_BY_BOOT_LOADER,
rtems_timecounter_install(tc);
diff --git a/bsps/sparc/leon3/include/bsp/leon3.h b/bsps/sparc/leon3/include/bsp/leon3.h
index fdb43b5817..ad33d73631 100644
--- a/bsps/sparc/leon3/include/bsp/leon3.h
+++ b/bsps/sparc/leon3/include/bsp/leon3.h
@@ -11,6 +11,8 @@
/*
* Copyright (C) 2014, 2021 embedded brains GmbH & Co. KG
*
+ * Copyright (C) 2015 Cobham Gaisler AB
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -173,13 +175,48 @@ static inline uint32_t leon3_get_cpu_count( const irqamp *regs )
return IRQAMP_MPSTAT_NCPU_GET( grlib_load_32( &regs->mpstat ) ) + 1;
}
+#if !defined(LEON3_GPTIMER_BASE)
+/**
+ * @brief This object lets the user override which on-chip GPTIMER core will be
+ * used for system clock timer.
+ *
+ * This controls which timer core will be accociated with LEON3_Timer_Regs
+ * registers base address. This value will by destroyed during initialization.
+ *
+ * * 0 = Default configuration. GPTIMER[0]
+ *
+ * * 1 = GPTIMER[1]
+ *
+ * * 2 = GPTIMER[2]
+ *
+ * * ...
+ */
+extern int leon3_timer_core_index;
+
+/**
+ * @brief This object lets the user override system clock timer prescaler.
+ *
+ * This affects all timer instances on the system clock timer core determined
+ * by ::leon3_timer_core_index.
+ *
+ * * 0 = Default configuration. Use bootloader configured value.
+ *
+ * * N = Prescaler is set to N. N must not be less that number of timers.
+ *
+ * * 8 = Prescaler is set to 8 (the fastest prescaler possible on all HW)
+ *
+ * * ...
+ */
+extern unsigned int leon3_timer_prescaler;
+#endif
+
/**
* @brief This constant defines the index of the GPTIMER timer used by the
* clock driver.
*/
#if defined(RTEMS_MULTIPROCESSING)
#define LEON3_CLOCK_INDEX \
- ( rtems_configuration_get_user_multiprocessing_table() ? LEON3_Cpu_Index : 0 )
+ ( leon3_timer_core_index != 0 ? 0 : 2 * LEON3_Cpu_Index )
#else
#define LEON3_CLOCK_INDEX 0
#endif
@@ -188,11 +225,7 @@ static inline uint32_t leon3_get_cpu_count( const irqamp *regs )
* @brief This constant defines the index of the GPTIMER timer used by the
* CPU counter if the CPU counter uses the GPTIMER.
*/
-#if defined(RTEMS_SMP)
#define LEON3_COUNTER_GPTIMER_INDEX ( LEON3_CLOCK_INDEX + 1 )
-#else
-#define LEON3_COUNTER_GPTIMER_INDEX LEON3_CLOCK_INDEX
-#endif
/**
* @brief This constant defines the frequency set by the boot loader of the
diff --git a/bsps/sparc/leon3/include/leon.h b/bsps/sparc/leon3/include/leon.h
index 812f691fd0..28ba59ff21 100644
--- a/bsps/sparc/leon3/include/leon.h
+++ b/bsps/sparc/leon3/include/leon.h
@@ -340,27 +340,6 @@ extern int syscon_uart_index;
extern int leon3_debug_uart_index;
#endif
-/* Let user override which on-chip TIMER core will be used for system clock
- * timer. This controls which timer core will be accociated with
- * LEON3_Timer_Regs registers base address. This value will by destroyed during
- * initialization.
- * 0 = Default configuration. GPTIMER[0]
- * 1 = GPTIMER[1]
- * 2 = GPTIMER[2]
- * ...
- */
-extern int leon3_timer_core_index;
-
-/* Let user override system clock timer prescaler. This affects all timer
- * instances on the system clock timer core determined by
- * leon3_timer_core_index.
- * 0 = Default configuration. Use bootloader configured value.
- * N = Prescaler is set to N. N must not be less that number of timers.
- * 8 = Prescaler is set to 8 (the fastest prescaler possible on all HW)
- * ...
- */
-extern unsigned int leon3_timer_prescaler;
-
#endif /* !ASM */
#ifdef __cplusplus
diff --git a/bsps/sparc/leon3/start/amba.c b/bsps/sparc/leon3/start/amba.c
index 72f1f5e63b..05708e06d0 100644
--- a/bsps/sparc/leon3/start/amba.c
+++ b/bsps/sparc/leon3/start/amba.c
@@ -39,8 +39,10 @@
#include <string.h>
+#if !defined(LEON3_GPTIMER_BASE)
unsigned int leon3_timer_prescaler __attribute__((weak)) = 0;
int leon3_timer_core_index __attribute__((weak)) = 0;
+#endif
/* AMBA Plug&Play information description.
*
diff --git a/bsps/sparc/leon3/start/cpucounter.c b/bsps/sparc/leon3/start/cpucounter.c
index a6db7677a3..374e43c9b1 100644
--- a/bsps/sparc/leon3/start/cpucounter.c
+++ b/bsps/sparc/leon3/start/cpucounter.c
@@ -89,7 +89,7 @@ static void leon3_counter_use_gptimer(SPARC_Counter *counter, gptimer *gpt)
counter->read = _SPARC_Counter_read_down;
counter->counter_register = &timer->tcntval;
- /* Make timer free running */
+ /* Make timer free-running */
grlib_store_32(&timer->trldval, 0xffffffff);
grlib_store_32(&timer->tctrl, GPTIMER_TCTRL_EN | GPTIMER_TCTRL_RS);