[PATCH 005/111] leon3: make timer initialization configurable
Daniel Hellstrom
daniel at gaisler.com
Fri Feb 27 08:52:21 UTC 2015
On 02/26/2015 07:11 PM, Gedare Bloom wrote:
> exported variables should be in a proper namespace.
Ok. I will rename the leon3_* them to LEON3_* something to match the LEON3_mp_irq and LEON3_irq_to_cpu. The irqmp_dev and timer_dev will be renamed to LEON3_IrqCtrl_Adev and LEON3_Timer_Adev to match
the register address variable.
>
> On Thu, Feb 26, 2015 at 11:38 AM, Daniel Hellstrom <daniel at gaisler.com> wrote:
>> Its now possible to select which timer core will be used for
>> system clock timer and to control the timer prescaler that
>> affects all timer instances on that timer core.
>>
>> The timer and interrupt controller AMBA devices are exported
>> to make it possible for other code to get detailed information.
>> For example the frequency of the timer and interrupt controller
>> is required by the cpucounter support.
>> ---
>> c/src/lib/libbsp/sparc/leon3/amba/amba.c | 18 ++++++++++++++++--
>> c/src/lib/libbsp/sparc/leon3/include/leon.h | 24 ++++++++++++++++++++++++
>> 2 files changed, 40 insertions(+), 2 deletions(-)
>>
>> diff --git a/c/src/lib/libbsp/sparc/leon3/amba/amba.c b/c/src/lib/libbsp/sparc/leon3/amba/amba.c
>> index 9706b25..8655ee3 100644
>> --- a/c/src/lib/libbsp/sparc/leon3/amba/amba.c
>> +++ b/c/src/lib/libbsp/sparc/leon3/amba/amba.c
>> @@ -16,6 +16,9 @@
>> #include <leon.h>
>> #include <ambapp.h>
>>
>> +unsigned int leon3_timer_prescaler __attribute__((weak)) = 0;
>> +int leon3_timer_core_index __attribute__((weak)) = 0;
>> +
>> /* AMBA Plug&Play information description.
>> *
>> * After software has scanned AMBA PnP it builds a tree to make
>> @@ -28,6 +31,8 @@ rtems_interrupt_lock LEON3_IrqCtrl_Lock =
>>
>> /* Pointers to Interrupt Controller configuration registers */
>> volatile struct irqmp_regs *LEON3_IrqCtrl_Regs;
>> +struct ambapp_dev *irqmp_dev;
>> +struct ambapp_dev *timer_dev;
>>
>> /*
>> * amba_initialize
>> @@ -64,6 +69,7 @@ void amba_initialize(void)
>> }
>>
>> LEON3_IrqCtrl_Regs = (volatile struct irqmp_regs *)DEV_TO_APB(adev)->start;
>> + irqmp_dev = adev;
>> if ((LEON3_IrqCtrl_Regs->ampctrl >> 28) > 0) {
>> /* IRQ Controller has support for multiple IRQ Controllers, each
>> * CPU can be routed to different Controllers, we find out which
>> @@ -84,16 +90,24 @@ void amba_initialize(void)
>> /* find GP Timer */
>> adev = (void *)ambapp_for_each(&ambapp_plb, (OPTIONS_ALL|OPTIONS_APB_SLVS),
>> VENDOR_GAISLER, GAISLER_GPTIMER,
>> - ambapp_find_by_idx, NULL);
>> + ambapp_find_by_idx, &leon3_timer_core_index);
>> if (adev) {
>> LEON3_Timer_Regs = (volatile struct gptimer_regs *)DEV_TO_APB(adev)->start;
>> + timer_dev = adev;
>>
>> /* Register AMBA Bus Frequency */
>> ambapp_freq_init(
>> &ambapp_plb,
>> - adev,
>> + timer_dev,
>> (LEON3_Timer_Regs->scaler_reload + 1)
>> * LEON3_GPTIMER_0_FREQUENCY_SET_BY_BOOT_LOADER
>> );
>> + /* Set user prescaler configuration. Use this to increase accuracy of timer
>> + * and accociated services like cpucounter.
>> + * Note that minimum value is the number of timer instances present in
>> + * GRTIMER/GPTIMER hardware. See HW manual.
>> + */
>> + if (leon3_timer_prescaler)
>> + LEON3_Timer_Regs->scaler_reload = leon3_timer_prescaler;
>> }
>> }
>> diff --git a/c/src/lib/libbsp/sparc/leon3/include/leon.h b/c/src/lib/libbsp/sparc/leon3/include/leon.h
>> index c7270cf..6057c42 100644
>> --- a/c/src/lib/libbsp/sparc/leon3/include/leon.h
>> +++ b/c/src/lib/libbsp/sparc/leon3/include/leon.h
>> @@ -94,8 +94,11 @@ extern "C" {
>>
>> /* LEON3 Interrupt Controller */
>> extern volatile struct irqmp_regs *LEON3_IrqCtrl_Regs;
>> +extern struct ambapp_dev *irqmp_dev;
>> +
>> /* LEON3 GP Timer */
>> extern volatile struct gptimer_regs *LEON3_Timer_Regs;
>> +extern struct ambapp_dev *timer_dev;
>>
>> /* LEON3 CPU Index of boot CPU */
>> extern uint32_t LEON3_Cpu_Index;
>> @@ -308,6 +311,27 @@ extern int syscon_uart_index;
>> */
>> extern int debug_uart_index;
>>
>> +/* 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;
>> +
>> void leon3_cpu_counter_initialize(void);
>>
>> /* GRLIB extended IRQ controller register */
>> --
>> 1.7.0.4
>>
>> _______________________________________________
>> devel mailing list
>> devel at rtems.org
>> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list