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 <dan...@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.sherr...@oarcorp.com> wrote: >>> >>> >>> On February 27, 2015 3:55:22 AM EST, Daniel Hellstrom >>> <dan...@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 >>>> >>>> <dan...@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@rtems.org >>>>>> http://lists.rtems.org/mailman/listinfo/devel >>>> >>>> _______________________________________________ >>>> devel mailing list >>>> devel@rtems.org >>>> http://lists.rtems.org/mailman/listinfo/devel >>> >>> --joel > > _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel