uboot/arch/powerpc/lib/interrupts.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * (C) Copyright 2000-2002
   4 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   5 *
   6 * (C) Copyright 2003
   7 * Gleb Natapov <gnatapov@mrv.com>
   8 */
   9
  10#include <common.h>
  11#include <asm/processor.h>
  12#include <watchdog.h>
  13#ifdef CONFIG_LED_STATUS
  14#include <status_led.h>
  15#endif
  16
  17#ifndef CONFIG_MPC83XX_TIMER
  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#endif /* !CONFIG_MPC83XX_TIMER */
  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
  64#ifndef CONFIG_MPC83XX_TIMER
  65int interrupt_init (void)
  66{
  67        /* call cpu specific function from $(CPU)/interrupts.c */
  68        interrupt_init_cpu (&decrementer_count);
  69
  70        set_dec (decrementer_count);
  71
  72        set_msr (get_msr () | MSR_EE);
  73
  74        return (0);
  75}
  76
  77static volatile ulong timestamp = 0;
  78
  79void timer_interrupt (struct pt_regs *regs)
  80{
  81        /* call cpu specific function from $(CPU)/interrupts.c */
  82        timer_interrupt_cpu (regs);
  83
  84        /* Restore Decrementer Count */
  85        set_dec (decrementer_count);
  86
  87        timestamp++;
  88
  89#if defined(CONFIG_WATCHDOG) || defined (CONFIG_HW_WATCHDOG)
  90        if ((timestamp % (CONFIG_SYS_WATCHDOG_FREQ)) == 0)
  91                WATCHDOG_RESET ();
  92#endif    /* CONFIG_WATCHDOG || CONFIG_HW_WATCHDOG */
  93
  94#ifdef CONFIG_LED_STATUS
  95        status_led_tick (timestamp);
  96#endif /* CONFIG_LED_STATUS */
  97
  98#ifdef CONFIG_SHOW_ACTIVITY
  99        board_show_activity (timestamp);
 100#endif /* CONFIG_SHOW_ACTIVITY */
 101}
 102
 103ulong get_timer (ulong base)
 104{
 105        return (timestamp - base);
 106}
 107#endif /* !CONFIG_MPC83XX_TIMER */
 108