[PATCH] bsps/sparc: Remove tlib clock driver
Daniel Hellstrom
daniel at gaisler.com
Tue Jan 24 11:59:53 UTC 2017
Hi Sebastian.
We are currently working on the rtems master and updating the drivers
and sparc tools. Please hold of before you push this one so that we can
review it first. Your patch is probably ok, it is just that I want to
have time to look at it first.
Best Regards,
Daniel Hellstrom
On 2017-01-23 15:58, Sebastian Huber wrote:
> This driver lacked several features and cannot support SMP
> configurations. Use the standard clock driver instead.
> ---
> c/src/lib/libbsp/sparc/leon3/Makefile.am | 5 +-
> c/src/lib/libbsp/sparc/leon3/clock/ckinit.c | 10 -
> c/src/lib/libbsp/sparc/shared/include/tlib.h | 8 -
> c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c | 290 ----------------------
> 4 files changed, 2 insertions(+), 311 deletions(-)
> delete mode 100644 c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c
>
> diff --git a/c/src/lib/libbsp/sparc/leon3/Makefile.am b/c/src/lib/libbsp/sparc/leon3/Makefile.am
> index f2f690e..42084c2 100644
> --- a/c/src/lib/libbsp/sparc/leon3/Makefile.am
> +++ b/c/src/lib/libbsp/sparc/leon3/Makefile.am
> @@ -68,13 +68,12 @@ libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_names.c
> libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_show.c
> libbsp_a_SOURCES += ../../sparc/shared/amba/ahbstat.c
>
> -# Clock Driver and Timer Library
> +# Timer Library
> include_bsp_HEADERS += ../../sparc/shared/include/gptimer.h
> include_bsp_HEADERS += ../../sparc/shared/include/tlib.h
> libbsp_a_SOURCES += ../../sparc/shared/timer/gptimer.c
> libbsp_a_SOURCES += ../../sparc/shared/timer/tlib.c
> -libbsp_a_SOURCES += ../../sparc/shared/timer/tlib_ckinit.c
> -# non-Driver Manager Clock Implementation
> +# Clock Driver
> libbsp_a_SOURCES += clock/ckinit.c
> libbsp_a_SOURCES += ../../shared/clockdrv_shell.h
>
> diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
> index f2372ec..ca0d0c7 100644
> --- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
> +++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
> @@ -28,14 +28,6 @@
> #include <rtems/score/profiling.h>
> #include <rtems/timecounter.h>
>
> -/* The LEON3 BSP Timer driver can rely on the Driver Manager if the
> - * DrvMgr is initialized during startup. Otherwise the classic driver
> - * must be used.
> - *
> - * The DrvMgr Clock driver is located in the shared/timer directory
> - */
> -#ifndef RTEMS_DRVMGR_STARTUP
> -
> /* LEON3 Timer system interrupt number */
> static int clkirq;
>
> @@ -281,5 +273,3 @@ static void leon3_clock_initialize(void)
> #define Clock_driver_timecounter_tick() leon3_tc_do_tick()
>
> #include "../../../shared/clockdrv_shell.h"
> -
> -#endif
> diff --git a/c/src/lib/libbsp/sparc/shared/include/tlib.h b/c/src/lib/libbsp/sparc/shared/include/tlib.h
> index 7e6c49a..118722b 100644
> --- a/c/src/lib/libbsp/sparc/shared/include/tlib.h
> +++ b/c/src/lib/libbsp/sparc/shared/include/tlib.h
> @@ -54,14 +54,6 @@ struct tlib_dev {
> struct tlib_drv *drv;
> };
>
> -#ifdef RTEMS_DRVMGR_STARTUP
> -/* Clock Driver Timer register function. Only used when the TLIB-Clock
> - * driver is used. A specific Timer is registered as the System Clock
> - * timer.
> - */
> -extern void Clock_timer_register(int timer_number);
> -#endif
> -
> /* Register Timer. Called by Timer Drivers in order to register
> * a Timer to the Timer Library. The registration order determines
> * the Timer Number used in tlib_open() to identify a specific
> diff --git a/c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c b/c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c
> deleted file mode 100644
> index 2848f4c..0000000
> --- a/c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c
> +++ /dev/null
> @@ -1,290 +0,0 @@
> -/*
> - * Clock Tick Device Driver using Timer Library implemented
> - * by the GRLIB GPTIMER / LEON2 Timer drivers.
> - *
> - * COPYRIGHT (c) 2010.
> - * Cobham 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.
> - *
> - */
> -
> -#include <rtems.h>
> -#include <rtems/timecounter.h>
> -#include <rtems/score/percpu.h>
> -#include <stdlib.h>
> -#include <bsp.h>
> -#include <bsp/tlib.h>
> -
> -#ifdef RTEMS_DRVMGR_STARTUP
> -
> -/* Undefine this to save space in standard LEON configurations,
> - * it will assume that Prescaler is running at 1MHz.
> - */
> -#undef CLOCK_DRIVER_DONT_ASSUME_PRESCALER_1MHZ
> -
> -/* Set the below defines from bsp.h if function needed.
> -#undef CLOCK_DRIVER_ISRS_PER_TICK
> -#undef CLOCK_DRIVER_USE_FAST_IDLE
> -*/
> -
> -/*
> - * Number of Clock ticks since initialization
> - */
> -volatile uint32_t Clock_driver_ticks;
> -
> -/*
> - * Timer Number in Timer Library. Defaults to the first Timer in
> - * the System.
> - */
> -int Clock_timer = 0;
> -
> -/*
> - * Timer Handle in Timer Library
> - */
> -void *Clock_handle = NULL;
> -
> -#ifdef CLOCK_DRIVER_DONT_ASSUME_PRESCALER_1MHZ
> -unsigned int Clock_basefreq;
> -#endif
> -
> -void Clock_exit(void);
> -void Clock_isr(void *arg_unused);
> -
> -static rtems_timecounter_simple tlib_tc;
> -
> -static uint32_t tlib_tc_get(rtems_timecounter_simple *tc)
> -{
> - unsigned int clicks = 0;
> -
> - if (Clock_handle != NULL) {
> - tlib_get_counter(Clock_handle, &clicks);
> - }
> -
> - return clicks;
> -}
> -
> -static bool tlib_tc_is_pending(rtems_timecounter_simple *tc)
> -{
> - bool pending = false;
> -
> - if (Clock_handle != NULL) {
> - pending = tlib_interrupt_pending(Clock_handle, 0) != 0;
> - }
> -
> - return pending;
> -}
> -
> -static uint32_t tlib_tc_get_timecount(struct timecounter *tc)
> -{
> - return rtems_timecounter_simple_downcounter_get(
> - tc,
> - tlib_tc_get,
> - tlib_tc_is_pending
> - );
> -}
> -
> -static void tlib_tc_at_tick(rtems_timecounter_simple *tc)
> -{
> - /* Nothing to do? */
> -}
> -
> -static void tlib_tc_tick(void)
> -{
> - rtems_timecounter_simple_downcounter_tick(
> - &tlib_tc,
> - tlib_tc_get,
> - tlib_tc_at_tick
> - );
> -}
> -
> -/*
> - * Clock_isr
> - *
> - * This is the clock tick interrupt handler.
> - *
> - * Input parameters:
> - * vector - vector number
> - *
> - * Output parameters: NONE
> - *
> - * Return values: NONE
> - *
> - */
> -
> -void Clock_isr(void *arg_unused)
> -{
> - /*
> - * Support for shared interrupts. Ack IRQ at source, only handle
> - * interrupts generated from the tick-timer.
> - */
> - if ( tlib_interrupt_pending(Clock_handle, 1) == 0 )
> - return;
> -
> - /*
> - * Accurate count of ISRs
> - */
> -
> - Clock_driver_ticks += 1;
> -
> -#ifdef CLOCK_DRIVER_USE_FAST_IDLE
> - do {
> - tlib_tc_tick();
> - } while ( _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle );
> -
> - return;
> -
> -#else
> -
> -#ifdef CLOCK_DRIVER_ISRS_PER_TICK
> - /*
> - * The driver is multiple ISRs per clock tick.
> - */
> -
> - if ( !Clock_driver_isrs ) {
> -
> - tlib_tc_tick();
> -
> - Clock_driver_isrs = CLOCK_DRIVER_ISRS_PER_TICK;
> - }
> - Clock_driver_isrs--;
> -#else
> -
> - /*
> - * The driver is one ISR per clock tick.
> - */
> - tlib_tc_tick();
> -#endif
> -#endif
> -}
> -
> -/*
> - * Clock_exit
> - *
> - * This routine allows the clock driver to exit by masking the interrupt and
> - * disabling the clock's counter.
> - *
> - * Input parameters: NONE
> - *
> - * Output parameters: NONE
> - *
> - * Return values: NONE
> - *
> - */
> -
> -void Clock_exit( void )
> -{
> - /* Stop all activity of the Timer, no more ISRs.
> - * We could be using tlib_close(), however tlib_stop() is quicker
> - * and independent of IRQ unregister code.
> - */
> - if ( Clock_handle ) {
> - tlib_stop(Clock_handle);
> - Clock_handle = NULL;
> - }
> -}
> -
> -/*
> - * Clock_initialize
> - *
> - * This routine initializes the clock driver and starts the Clock.
> - *
> - * Input parameters:
> - * major - clock device major number
> - * minor - clock device minor number
> - * parg - pointer to optional device driver arguments
> - *
> - * Output parameters: NONE
> - *
> - * Return values:
> - * rtems_device_driver status code
> - */
> -
> -rtems_device_driver Clock_initialize(
> - rtems_device_major_number major,
> - rtems_device_minor_number minor,
> - void *pargp
> -)
> -{
> - uint64_t frequency;
> - unsigned int tick_hz;
> -
> - /*
> - * Take Timer that should be used as system timer.
> - *
> - */
> - Clock_handle = tlib_open(Clock_timer);
> - if ( Clock_handle == NULL ) {
> - /* System Clock Timer not found */
> - return RTEMS_NOT_DEFINED;
> - }
> -
> - /*
> - * Install Clock ISR before starting timer
> - */
> - tlib_irq_register(Clock_handle, Clock_isr, NULL);
> -
> - /* Set Timer Frequency to tick at Configured value. The Timer
> - * Frequency is set in multiples of the timer base frequency.
> - *
> - * In standard LEON3 designs the base frequency is is 1MHz, to
> - * save instructions undefine CLOCK_DRIVER_DONT_ASSUME_PRESCALER_1MHZ
> - * to avoid 64-bit calculation.
> - */
> -#ifdef CLOCK_DRIVER_DONT_ASSUME_PRESCALER_1MHZ
> - {
> - uint64_t tmp;
> -
> - tlib_get_freq(Clock_handle, &Clock_basefreq, NULL);
> -
> - frequency = Clock_basefreq
> - tmp = frequency * (uint64_t)rtems_configuration_get_microseconds_per_tick();
> - tick_hz = tmp / 1000000;
> - }
> -#else
> - frequency = 1000000;
> - tick_hz = rtems_configuration_get_microseconds_per_tick();
> -#endif
> -
> - tlib_set_freq(Clock_handle, tick_hz);
> -
> - rtems_timecounter_simple_install(
> - &tlib_tc,
> - frequency,
> - tick_hz,
> - tlib_tc_get_timecount
> - );
> -
> - /*
> - * IRQ and Frequency is setup, now we start the Timer. IRQ is still
> - * disabled globally during startup, so IRQ will hold for a while.
> - */
> - tlib_start(Clock_handle, 0);
> -
> - /*
> - * Register function called at system shutdown
> - */
> - atexit( Clock_exit );
> -
> - /*
> - * If we are counting ISRs per tick, then initialize the counter.
> - */
> -
> -#ifdef CLOCK_DRIVER_ISRS_PER_TICK
> - Clock_driver_isrs = CLOCK_DRIVER_ISRS_PER_TICK;
> -#endif
> -
> - return RTEMS_SUCCESSFUL;
> -}
> -
> -/*** Timer Driver Interface ***/
> -
> -/* Set system clock timer instance */
> -void Clock_timer_register(int timer_number)
> -{
> - Clock_timer = timer_number;
> -}
> -
> -#endif
More information about the devel
mailing list