uboot/arch/powerpc/lib/interrupts.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2000-2002
   3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   4 *
   5 * (C) Copyright 2003
   6 * Gleb Natapov <gnatapov@mrv.com>
   7 *
   8 * SPDX-License-Identifier:     GPL-2.0+
   9 */
  10
  11#include <common.h>
  12#include <asm/processor.h>
  13#include <watchdog.h>
  14#ifdef CONFIG_LED_STATUS
  15#include <status_led.h>
  16#endif
  17
  18#ifdef CONFIG_SHOW_ACTIVITY
  19void board_show_activity (ulong) __attribute__((weak, alias("__board_show_activity")));
  20
  21void __board_show_activity (ulong dummy)
  22{
  23        return;
  24}
  25#endif /* CONFIG_SHOW_ACTIVITY */
  26
  27#ifndef CONFIG_SYS_WATCHDOG_FREQ
  28#define CONFIG_SYS_WATCHDOG_FREQ (CONFIG_SYS_HZ / 2)
  29#endif
  30
  31static unsigned decrementer_count; /* count value for 1e6/HZ microseconds */
  32
  33static __inline__ unsigned long get_dec (void)
  34{
  35        unsigned long val;
  36
  37        asm volatile ("mfdec %0":"=r" (val):);
  38
  39        return val;
  40}
  41
  42
  43static __inline__ void set_dec (unsigned long val)
  44{
  45        if (val)
  46                asm volatile ("mtdec %0"::"r" (val));
  47}
  48
  49
  50void enable_interrupts (void)
  51{
  52        set_msr (get_msr () | MSR_EE);
  53}
  54
  55/* returns flag if MSR_EE was set before */
  56int disable_interrupts (void)
  57{
  58        ulong msr = get_msr ();
  59
  60        set_msr (msr & ~MSR_EE);
  61        return ((msr & MSR_EE) != 0);
  62}
  63
  64int interrupt_init (void)
  65{
  66        /* call cpu specific function from $(CPU)/interrupts.c */
  67        interrupt_init_cpu (&decrementer_count);
  68
  69        set_dec (decrementer_count);
  70
  71        set_msr (get_msr () | MSR_EE);
  72
  73        return (0);
  74}
  75
  76static volatile ulong timestamp = 0;
  77
  78void timer_interrupt (struct pt_regs *regs)
  79{
  80        /* call cpu specific function from $(CPU)/interrupts.c */
  81        timer_interrupt_cpu (regs);
  82
  83        /* Restore Decrementer Count */
  84        set_dec (decrementer_count);
  85
  86        timestamp++;
  87
  88#if defined(CONFIG_WATCHDOG) || defined (CONFIG_HW_WATCHDOG)
  89        if ((timestamp % (CONFIG_SYS_WATCHDOG_FREQ)) == 0)
  90                WATCHDOG_RESET ();
  91#endif    /* CONFIG_WATCHDOG || CONFIG_HW_WATCHDOG */
  92
  93#ifdef CONFIG_LED_STATUS
  94        status_led_tick (timestamp);
  95#endif /* CONFIG_LED_STATUS */
  96
  97#ifdef CONFIG_SHOW_ACTIVITY
  98        board_show_activity (timestamp);
  99#endif /* CONFIG_SHOW_ACTIVITY */
 100}
 101
 102ulong get_timer (ulong base)
 103{
 104        return (timestamp - base);
 105}
 106