Move most of the timer interrupt related PPC code to ppc_lib/interrupts.c * Patch by Anders Larsen, 17 Sep 2003: Bring ARM memory layout in sync with the documentation: stack and malloc-heap are now located _below_ the U-Boot codemaster
parent
fa1399ed12
commit
a8c7c708a9
@ -1 +1 @@ |
||||
TEXT_BASE = 0x21f00000
|
||||
TEXT_BASE = 0x21f80000
|
||||
|
@ -1,2 +1,2 @@ |
||||
TEXT_BASE = 0xa0f08000
|
||||
TEXT_BASE = 0xa0f80000
|
||||
#TEXT_BASE = 0
|
||||
|
@ -0,0 +1,27 @@ |
||||
Subject: Re: [PATCH][CFT] bring ARM memory layout in line with the documented behaviour |
||||
From: "Anders Larsen" <alarsen@rea.de> |
||||
Date: Thu, 18 Sep 2003 14:15:21 +0200 |
||||
To: Wolfgang Denk <wd@denx.de> |
||||
|
||||
... |
||||
>I still see references to _armboot_start, _armboot_end_data, and |
||||
>_armboot_end - which role do these play now? Can we get rid of them? |
||||
> |
||||
>How are they (should they be) set in your memory map above? |
||||
|
||||
_armboot_start contains the value of TEXT_BASE (0xA07E0000); it seems |
||||
TEXT_BASE and _armboot_start are both used for the same purpose in |
||||
different parts of the (ARM) code. |
||||
Furthermore, the startup code (cpu/<arm>/start.S) internally uses |
||||
another variable (_TEXT_BASE) with the same content as _armboot_start. |
||||
I agree that this mess should be cleaned up. |
||||
|
||||
_armboot_end_data is the end address of the initialized data section, |
||||
and is only used in one place (board/logodl/flash.c - the reference in |
||||
lib_arm/board.c is purely informational). |
||||
|
||||
_armboot_end is the end address of the BSS and is used to determine |
||||
the address of the VFD buffer. |
||||
|
||||
Eliminating those should be doable, and at least the patch already |
||||
eliminates _armboot_real_end. |
@ -0,0 +1,148 @@ |
||||
/*
|
||||
* (C) Copyright 2000-2002 |
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de. |
||||
* |
||||
* (C) Copyright 2003 |
||||
* Gleb Natapov <gnatapov@mrv.com> |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <asm/processor.h> |
||||
#include <watchdog.h> |
||||
#ifdef CONFIG_STATUS_LED |
||||
#include <status_led.h> |
||||
#endif |
||||
|
||||
#ifdef CONFIG_SHOW_ACTIVITY |
||||
extern void board_show_activity (ulong); |
||||
#endif /* CONFIG_SHOW_ACTIVITY */ |
||||
|
||||
#ifndef CFG_WATCHDOG_FREQ |
||||
#define CFG_WATCHDOG_FREQ (CFG_HZ / 2) |
||||
#endif |
||||
|
||||
extern int interrupt_init_cpu (unsigned *); |
||||
extern void timer_interrupt_cpu (struct pt_regs *); |
||||
|
||||
static unsigned decrementer_count; /* count value for 1e6/HZ microseconds */ |
||||
|
||||
static __inline__ unsigned long get_msr (void) |
||||
{ |
||||
unsigned long msr; |
||||
|
||||
asm volatile ("mfmsr %0":"=r" (msr):); |
||||
|
||||
return msr; |
||||
} |
||||
|
||||
static __inline__ void set_msr (unsigned long msr) |
||||
{ |
||||
asm volatile ("mtmsr %0"::"r" (msr)); |
||||
} |
||||
|
||||
static __inline__ unsigned long get_dec (void) |
||||
{ |
||||
unsigned long val; |
||||
|
||||
asm volatile ("mfdec %0":"=r" (val):); |
||||
|
||||
return val; |
||||
} |
||||
|
||||
|
||||
static __inline__ void set_dec (unsigned long val) |
||||
{ |
||||
if (val) |
||||
asm volatile ("mtdec %0"::"r" (val)); |
||||
} |
||||
|
||||
|
||||
void enable_interrupts (void) |
||||
{ |
||||
set_msr (get_msr () | MSR_EE); |
||||
} |
||||
|
||||
/* returns flag if MSR_EE was set before */ |
||||
int disable_interrupts (void) |
||||
{ |
||||
ulong msr = get_msr (); |
||||
|
||||
set_msr (msr & ~MSR_EE); |
||||
return ((msr & MSR_EE) != 0); |
||||
} |
||||
|
||||
int interrupt_init (void) |
||||
{ |
||||
int ret; |
||||
|
||||
/* call cpu specific function from $(CPU)/interrupts.c */ |
||||
ret = interrupt_init_cpu (&decrementer_count); |
||||
|
||||
if (ret) |
||||
return ret; |
||||
|
||||
set_dec (decrementer_count); |
||||
|
||||
set_msr (get_msr () | MSR_EE); |
||||
|
||||
return (0); |
||||
} |
||||
|
||||
static volatile ulong timestamp = 0; |
||||
|
||||
void timer_interrupt (struct pt_regs *regs) |
||||
{ |
||||
/* call cpu specific function from $(CPU)/interrupts.c */ |
||||
timer_interrupt_cpu (regs); |
||||
|
||||
/* Restore Decrementer Count */ |
||||
set_dec (decrementer_count); |
||||
|
||||
timestamp++; |
||||
|
||||
#if defined(CONFIG_WATCHDOG) || defined (CONFIG_HW_WATCHDOG) |
||||
if ((timestamp % (CFG_WATCHDOG_FREQ)) == 0) |
||||
WATCHDOG_RESET (); |
||||
#endif /* CONFIG_WATCHDOG || CONFIG_HW_WATCHDOG */ |
||||
|
||||
#ifdef CONFIG_STATUS_LED |
||||
status_led_tick (timestamp); |
||||
#endif /* CONFIG_STATUS_LED */ |
||||
|
||||
#ifdef CONFIG_SHOW_ACTIVITY |
||||
board_show_activity (timestamp); |
||||
#endif /* CONFIG_SHOW_ACTIVITY */ |
||||
} |
||||
|
||||
void reset_timer (void) |
||||
{ |
||||
timestamp = 0; |
||||
} |
||||
|
||||
ulong get_timer (ulong base) |
||||
{ |
||||
return (timestamp - base); |
||||
} |
||||
|
||||
void set_timer (ulong t) |
||||
{ |
||||
timestamp = t; |
||||
} |
Loading…
Reference in new issue