[PATCH 002/111] LEON3: GPTIMER timer watchdog driver

Gedare Bloom gedare at rtems.org
Fri Feb 27 15:33:02 UTC 2015


OK I'm going to try to work my way through LIBPCI and maybe DRVMGR
today. Slow going. :)

On Fri, Feb 27, 2015 at 9:18 AM, Daniel Hellstrom <daniel at gaisler.com> wrote:
> Perfect! The headers move patch has been completed, I will send it together
> with the other updates to come.
>
> DanielH
>
>
>
> On 02/27/2015 03:06 PM, Gedare Bloom wrote:
>>
>> Yes I prefer to have fixes posted as a follow-up patch. We don't need
>> to slog through another 100 patches for a few tweaks.
>>
>> Gedare
>>
>> On Fri, Feb 27, 2015 at 5:39 AM, Joel Sherrill
>> <joel.sherrill at oarcorp.com> wrote:
>>>
>>>
>>> On February 27, 2015 3:55:22 AM EST, Daniel Hellstrom
>>> <daniel at gaisler.com> wrote:
>>>>
>>>> On 02/26/2015 07:13 PM, Gedare Bloom wrote:
>>>>>
>>>>> bsp-specific headers should not be installed to include/. this has
>>>>> historically been allowed but we want to get away from it.
>>>>
>>>> Ok, this is a problem for all drivers I submit. I will add a patch in
>>>> the end to move all existing BSP drivers and all new BSP drivers
>>>> headers into include/bsp. Is that okay?
>>>
>>> I think so. Given the number of patches, this may be hard to do and
>>> rebase.
>>>
>>> Plus it isn't merging something that does not build.
>>>
>>>>> On Thu, Feb 26, 2015 at 11:38 AM, Daniel Hellstrom
>>>>
>>>> <daniel at gaisler.com> wrote:
>>>>>>
>>>>>> Last timer instance of GPTIMER is sometimes a watchdog timer that
>>>>>> can reset the system on timer underflow.
>>>>>> ---
>>>>>>    c/src/lib/libbsp/sparc/leon3/Makefile.am        |    2 +
>>>>>>    c/src/lib/libbsp/sparc/leon3/include/watchdog.h |   49
>>>>
>>>> ++++++++++++
>>>>>>
>>>>>>    c/src/lib/libbsp/sparc/leon3/preinstall.am      |    4 +
>>>>>>    c/src/lib/libbsp/sparc/leon3/timer/watchdog.c   |   90
>>>>
>>>> +++++++++++++++++++++++
>>>>>>
>>>>>>    4 files changed, 145 insertions(+), 0 deletions(-)
>>>>>>    create mode 100644 c/src/lib/libbsp/sparc/leon3/include/watchdog.h
>>>>>>    create mode 100644 c/src/lib/libbsp/sparc/leon3/timer/watchdog.c
>>>>>>
>>>>>> diff --git a/c/src/lib/libbsp/sparc/leon3/Makefile.am
>>>>
>>>> b/c/src/lib/libbsp/sparc/leon3/Makefile.am
>>>>>>
>>>>>> index cec0b34..4cb6e79 100644
>>>>>> --- a/c/src/lib/libbsp/sparc/leon3/Makefile.am
>>>>>> +++ b/c/src/lib/libbsp/sparc/leon3/Makefile.am
>>>>>> @@ -125,6 +125,8 @@ libbsp_a_SOURCES +=
>>>>
>>>> ../../sparc/shared/i2c/i2cmst.c
>>>>>>
>>>>>>    # timer
>>>>>>    libbsp_a_SOURCES += timer/timer.c
>>>>>> +libbsp_a_SOURCES += timer/watchdog.c
>>>>>> +include_HEADERS += include/watchdog.h
>>>>>>
>>>>>>    # Cache
>>>>>>    libbsp_a_SOURCES += ../../../libcpu/shared/src/cache_manager.c
>>>>>> diff --git a/c/src/lib/libbsp/sparc/leon3/include/watchdog.h
>>>>
>>>> b/c/src/lib/libbsp/sparc/leon3/include/watchdog.h
>>>>>>
>>>>>> new file mode 100644
>>>>>> index 0000000..fd984e1
>>>>>> --- /dev/null
>>>>>> +++ b/c/src/lib/libbsp/sparc/leon3/include/watchdog.h
>>>>>> @@ -0,0 +1,49 @@
>>>>>> +/*  watchdog.h
>>>>>> + *
>>>>>> + *  The LEON3 BSP timer watch-dog interface
>>>>>> + *
>>>>>> + *  COPYRIGHT (c) 2012.
>>>>>> + *  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.com/license/LICENSE.
>>>>>> + */
>>>>>> +
>>>>>> +#ifndef __WATCHDOG_H__
>>>>>> +#define __WATCHDOG_H__
>>>>>> +
>>>>>> +#ifdef __cplusplus
>>>>>> +extern "C" {
>>>>>> +#endif
>>>>>> +
>>>>>> +/* Initialize BSP watchdog routines. Returns number of watchdog
>>>>
>>>> timers found.
>>>>>>
>>>>>> + * Currently only one is supported.
>>>>>> + */
>>>>>> +int bsp_watchdog_init(void);
>>>>>> +
>>>>>> +/* Reload watchdog (last timer on the first GPTIMER core), all
>>>>
>>>> systems does not
>>>>>>
>>>>>> + * feature a watchdog, it is expected that if this function is
>>>>
>>>> called the
>>>>>>
>>>>>> + * user knows that there is a watchdog available.
>>>>>> + *
>>>>>> + * The prescaler is normally set to number of MHz of system, this
>>>>
>>>> is to
>>>>>>
>>>>>> + * make the system clock tick be stable.
>>>>>> + *
>>>>>> + * Arguments
>>>>>> + *  watchdog       - Always 0 for now
>>>>>> + *  reload_value   - Number of timer clocks (after prescaler) to
>>>>
>>>> count before
>>>>>>
>>>>>> + *                   watchdog is woken.
>>>>>> + */
>>>>>> +void bsp_watchdog_reload(int watchdog, unsigned int reload_value);
>>>>>> +
>>>>>> +/* Stop watchdog timer */
>>>>>> +void bsp_watchdog_stop(int watchdog);
>>>>>> +
>>>>>> +/* Use watchdog0 timer to reset the system */
>>>>>> +void bsp_watchdog_system_reset(void);
>>>>>> +
>>>>>> +#ifdef __cplusplus
>>>>>> +}
>>>>>> +#endif
>>>>>> +
>>>>>> +#endif
>>>>>> diff --git a/c/src/lib/libbsp/sparc/leon3/preinstall.am
>>>>
>>>> b/c/src/lib/libbsp/sparc/leon3/preinstall.am
>>>>>>
>>>>>> index d7b28e4..0c0139f 100644
>>>>>> --- a/c/src/lib/libbsp/sparc/leon3/preinstall.am
>>>>>> +++ b/c/src/lib/libbsp/sparc/leon3/preinstall.am
>>>>>> @@ -165,3 +165,7 @@ $(PROJECT_INCLUDE)/i2cmst.h:
>>>>
>>>> ../../sparc/shared/include/i2cmst.h $(PROJECT_INCLU
>>>>>>
>>>>>>           $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/i2cmst.h
>>>>>>    PREINSTALL_FILES += $(PROJECT_INCLUDE)/i2cmst.h
>>>>>>
>>>>>> +$(PROJECT_INCLUDE)/watchdog.h: include/watchdog.h
>>>>
>>>> $(PROJECT_INCLUDE)/$(dirstamp)
>>>>>>
>>>>>> +       $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/watchdog.h
>>>>>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/watchdog.h
>>>>>> +
>>>>>> diff --git a/c/src/lib/libbsp/sparc/leon3/timer/watchdog.c
>>>>
>>>> b/c/src/lib/libbsp/sparc/leon3/timer/watchdog.c
>>>>>>
>>>>>> new file mode 100644
>>>>>> index 0000000..15e2142
>>>>>> --- /dev/null
>>>>>> +++ b/c/src/lib/libbsp/sparc/leon3/timer/watchdog.c
>>>>>> @@ -0,0 +1,90 @@
>>>>>> +/*  GPTIMER Watchdog timer routines. On some systems the first
>>>>
>>>> GPTIMER
>>>>>>
>>>>>> + *  core's last Timer instance underflow signal is connected to
>>>>
>>>> system
>>>>>>
>>>>>> + *  reset.
>>>>>> + *
>>>>>> + *  COPYRIGHT (c) 2012.
>>>>>> + *  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.com/license/LICENSE.
>>>>>> + */
>>>>>> +
>>>>>> +#include <bsp.h>
>>>>>> +#include <watchdog.h>
>>>>>> +#include <grlib.h>
>>>>>> +
>>>>>> +extern volatile struct gptimer_regs *LEON3_Timer_Regs;
>>>>>> +
>>>>>> +struct gptimer_watchdog_priv {
>>>>>> +  struct gptimer_regs *regs;
>>>>>> +  struct gptimer_timer_regs *timer;
>>>>>> +  int timerno;
>>>>>> +};
>>>>>> +
>>>>>> +struct gptimer_watchdog_priv bsp_watchdogs[1];
>>>>>> +int bsp_watchdog_count = 0;
>>>>>> +
>>>>>> +int bsp_watchdog_init(void)
>>>>>> +{
>>>>>> +  int timercnt;
>>>>>> +
>>>>>> +  if (!LEON3_Timer_Regs)
>>>>>> +    return 0;
>>>>>> +
>>>>>> +  /* Get Watchdogs in system, this is implemented for one GPTIMER
>>>>
>>>> core
>>>>>>
>>>>>> +   * only.
>>>>>> +   *
>>>>>> +   * First watchdog is a special case, we can get the first timer
>>>>
>>>> core by
>>>>>>
>>>>>> +   * looking at LEON3_Timer_Regs, the watchdog within a timer core
>>>>
>>>> is
>>>>>>
>>>>>> +   * always the last timer. Unfortunately we can not know it the
>>>>
>>>> watchdog
>>>>>>
>>>>>> +   * functionality is available or not, we assume that it is if we
>>>>>> +   * reached this function.
>>>>>> +   */
>>>>>> +  bsp_watchdogs[0].regs = (struct gptimer_regs *)LEON3_Timer_Regs;
>>>>>> +
>>>>>> +  /* Find Timer that has watchdog functionality */
>>>>>> +  timercnt = bsp_watchdogs[0].regs->cfg & 0x7;
>>>>>> +  if (timercnt < 2) /* First timer system clock timer */
>>>>>> +    return 0;
>>>>>> +
>>>>>> +  bsp_watchdogs[0].timerno = timercnt - 1;
>>>>>> +  bsp_watchdogs[0].timer =
>>>>
>>>> &bsp_watchdogs[0].regs->timer[bsp_watchdogs[0].timerno];
>>>>>>
>>>>>> +
>>>>>> +  bsp_watchdog_count = 1;
>>>>>> +  return bsp_watchdog_count;
>>>>>> +}
>>>>>> +
>>>>>> +void bsp_watchdog_reload(int watchdog, unsigned int reload_value)
>>>>>> +{
>>>>>> +  if (bsp_watchdog_count == 0)
>>>>>> +    bsp_watchdog_init();
>>>>>> +
>>>>>> +  if (bsp_watchdog_count <= watchdog)
>>>>>> +    return;
>>>>>> +
>>>>>> +  /* Kick watchdog, and clear interrupt pending bit */
>>>>>> +  bsp_watchdogs[watchdog].timer->reload = reload_value;
>>>>>> +  bsp_watchdogs[watchdog].timer->ctrl =
>>>>>> +    (LEON3_GPTIMER_LD | LEON3_GPTIMER_EN) |
>>>>>> +    (bsp_watchdogs[watchdog].timer->ctrl & ~(1<<4));
>>>>>> +}
>>>>>> +
>>>>>> +void bsp_watchdog_stop(int watchdog)
>>>>>> +{
>>>>>> +  if (bsp_watchdog_count == 0)
>>>>>> +    bsp_watchdog_init();
>>>>>> +
>>>>>> +  if (bsp_watchdog_count <= watchdog)
>>>>>> +    return;
>>>>>> +
>>>>>> +  /* Stop watchdog timer */
>>>>>> +  bsp_watchdogs[watchdog].timer->ctrl = 0;
>>>>>> +}
>>>>>> +
>>>>>> +/* Use watchdog timer to reset system */
>>>>>> +void bsp_watchdog_system_reset(void)
>>>>>> +{
>>>>>> +  sparc_disable_interrupts();
>>>>>> +  bsp_watchdog_reload(0, 1);
>>>>>> +}
>>>>>> --
>>>>>> 1.7.0.4
>>>>>>
>>>>>> _______________________________________________
>>>>>> devel mailing list
>>>>>> devel at rtems.org
>>>>>> http://lists.rtems.org/mailman/listinfo/devel
>>>>
>>>> _______________________________________________
>>>> devel mailing list
>>>> devel at rtems.org
>>>> http://lists.rtems.org/mailman/listinfo/devel
>>>
>>> --joel
>
>



More information about the devel mailing list