diff options
Diffstat (limited to 'arch/nios2/lib')
| -rw-r--r-- | arch/nios2/lib/Makefile | 49 | ||||
| -rw-r--r-- | arch/nios2/lib/board.c | 164 | ||||
| -rw-r--r-- | arch/nios2/lib/bootm.c | 52 | ||||
| -rw-r--r-- | arch/nios2/lib/cache.S | 74 | ||||
| -rw-r--r-- | arch/nios2/lib/divmod.c | 101 | ||||
| -rw-r--r-- | arch/nios2/lib/math.h | 16 | ||||
| -rw-r--r-- | arch/nios2/lib/mult.c | 56 | ||||
| -rw-r--r-- | arch/nios2/lib/time.c | 38 | 
8 files changed, 550 insertions, 0 deletions
| diff --git a/arch/nios2/lib/Makefile b/arch/nios2/lib/Makefile new file mode 100644 index 000000000..b69bc3885 --- /dev/null +++ b/arch/nios2/lib/Makefile @@ -0,0 +1,49 @@ +# +# (C) Copyright 2000-2006 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# 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 $(TOPDIR)/config.mk + +LIB	= $(obj)lib$(ARCH).a + +SOBJS-y	+= cache.o + +COBJS-y	+= board.o +COBJS-y	+= bootm.o +COBJS-y	+= divmod.o +COBJS-y	+= mult.o +COBJS-y	+= time.o + +SRCS	:= $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) +OBJS	:= $(addprefix $(obj),$(SOBJS-y) $(COBJS-y)) + +$(LIB):	$(obj).depend $(OBJS) +	$(AR) $(ARFLAGS) $@ $(OBJS) + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/arch/nios2/lib/board.c b/arch/nios2/lib/board.c new file mode 100644 index 000000000..8ec66a354 --- /dev/null +++ b/arch/nios2/lib/board.c @@ -0,0 +1,164 @@ +/* + * (C) Copyright 2003, Psyent Corporation <www.psyent.com> + * Scott McNutt <smcnutt@psyent.com> + * + * (C) Copyright 2000-2002 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * 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 <stdio_dev.h> +#include <watchdog.h> +#include <malloc.h> +#include <net.h> +#ifdef CONFIG_STATUS_LED +#include <status_led.h> +#endif +#if defined(CONFIG_SYS_NIOS_EPCSBASE) +#include <nios2-epcs.h> +#endif + +DECLARE_GLOBAL_DATA_PTR; + +/* + * All attempts to come up with a "common" initialization sequence + * that works for all boards and architectures failed: some of the + * requirements are just _too_ different. To get rid of the resulting + * mess of board dependend #ifdef'ed code we now make the whole + * initialization sequence configurable to the user. + * + * The requirements for any new initalization function is simple: it + * receives a pointer to the "global data" structure as it's only + * argument, and returns an integer return code, where 0 means + * "continue" and != 0 means "fatal error, hang the system". + */ + + +typedef int (init_fnc_t) (void); + + +/************************************************************************ + * Initialization sequence						* + ***********************************************************************/ + +init_fnc_t *init_sequence[] = { + +#if defined(CONFIG_BOARD_EARLY_INIT_F) +	board_early_init_f,	/* Call board-specific init code early.*/ +#endif +#if defined(CONFIG_SYS_NIOS_EPCSBASE) +	epcs_reset, +#endif + +	env_init, +	serial_init, +	console_init_f, +	display_options, +	checkcpu, +	checkboard, +	NULL,			/* Terminate this list */ +}; + + +/***********************************************************************/ +void board_init (void) +{ +	bd_t *bd; +	init_fnc_t **init_fnc_ptr; + +	/* Pointer is writable since we allocated a register for it. +	 * Nios treats CONFIG_SYS_GBL_DATA_OFFSET as an address. +	 */ +	gd = (gd_t *)CONFIG_SYS_GBL_DATA_OFFSET; +	/* compiler optimization barrier needed for GCC >= 3.4 */ +	__asm__ __volatile__("": : :"memory"); + +	memset( gd, 0, CONFIG_SYS_GBL_DATA_SIZE ); + +	gd->bd = (bd_t *)(gd+1);	/* At end of global data */ +	gd->baudrate = CONFIG_BAUDRATE; +	gd->cpu_clk = CONFIG_SYS_CLK_FREQ; + +	bd = gd->bd; +	bd->bi_memstart	= CONFIG_SYS_SDRAM_BASE; +	bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE; +	bd->bi_flashstart = CONFIG_SYS_FLASH_BASE; +#if	defined(CONFIG_SYS_SRAM_BASE) && defined(CONFIG_SYS_SRAM_SIZE) +	bd->bi_sramstart= CONFIG_SYS_SRAM_BASE; +	bd->bi_sramsize	= CONFIG_SYS_SRAM_SIZE; +#endif +	bd->bi_baudrate	= CONFIG_BAUDRATE; + +	for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { +		WATCHDOG_RESET (); +		if ((*init_fnc_ptr) () != 0) { +			hang (); +		} +	} + +	WATCHDOG_RESET (); + +	/* The Malloc area is immediately below the monitor copy in RAM */ +	mem_malloc_init(CONFIG_SYS_MALLOC_BASE, CONFIG_SYS_MALLOC_LEN); + +	WATCHDOG_RESET (); +	bd->bi_flashsize = flash_init(); + +	WATCHDOG_RESET (); +	env_relocate(); + +	bd->bi_ip_addr = getenv_IPaddr ("ipaddr"); + +	WATCHDOG_RESET (); +	stdio_init(); +	jumptable_init(); +	console_init_r(); + +	WATCHDOG_RESET (); +	interrupt_init (); + +#if defined(CONFIG_BOARD_LATE_INIT) +	board_late_init (); +#endif + +#if defined(CONFIG_CMD_NET) +#if defined(CONFIG_NET_MULTI) +	puts ("Net:   "); +#endif +	eth_initialize (bd); +#endif + +	/* main_loop */ +	for (;;) { +		WATCHDOG_RESET (); +		main_loop (); +	} +} + + +/***********************************************************************/ + +void hang (void) +{ +	disable_interrupts (); +	puts("### ERROR ### Please reset board ###\n"); +	for (;;); +} diff --git a/arch/nios2/lib/bootm.c b/arch/nios2/lib/bootm.c new file mode 100644 index 000000000..5d25edf80 --- /dev/null +++ b/arch/nios2/lib/bootm.c @@ -0,0 +1,52 @@ +/* + * (C) Copyright 2003, Psyent Corporation <www.psyent.com> + * Scott McNutt <smcnutt@psyent.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 <command.h> +#include <asm/byteorder.h> +#include <asm/cache.h> + +#define NIOS_MAGIC 0x534f494e /* enable command line and initrd passing */ + +int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images) +{ +	void (*kernel)(int, int, int, char *) = (void *)images->ep; +	char *commandline = getenv("bootargs"); +	ulong initrd_start = images->rd_start; +	ulong initrd_end = images->rd_end; + +	if ((flag != 0) && (flag != BOOTM_STATE_OS_GO)) +		return 1; + +	/* flushes data and instruction caches before calling the kernel */ +	disable_interrupts(); +	flush_dcache((ulong)kernel, CONFIG_SYS_DCACHE_SIZE); +	flush_icache((ulong)kernel, CONFIG_SYS_ICACHE_SIZE); + +	debug("bootargs=%s @ 0x%lx\n", commandline, (ulong)&commandline); +	debug("initrd=0x%lx-0x%lx\n", (ulong)initrd_start, (ulong)initrd_end); +	kernel(NIOS_MAGIC, initrd_start, initrd_end, commandline); +	/* does not return */ + +	return 1; +} diff --git a/arch/nios2/lib/cache.S b/arch/nios2/lib/cache.S new file mode 100644 index 000000000..ee3b4b79b --- /dev/null +++ b/arch/nios2/lib/cache.S @@ -0,0 +1,74 @@ +/* + * (C) Copyright 2004, Psyent Corporation <www.psyent.com> + * Scott McNutt <smcnutt@psyent.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 <config.h> + +	.text + +	.global flush_dcache + +flush_dcache: +	add	r5, r5, r4 +	movhi	r8, %hi(CONFIG_SYS_DCACHELINE_SIZE) +	ori	r8, r8, %lo(CONFIG_SYS_DCACHELINE_SIZE) +0:	flushd	0(r4) +	add	r4, r4, r8 +	bltu	r4, r5, 0b +	ret + + +	.global flush_icache + +flush_icache: +	add	r5, r5, r4 +	movhi	r8, %hi(CONFIG_SYS_ICACHELINE_SIZE) +	ori	r8, r8, %lo(CONFIG_SYS_ICACHELINE_SIZE) +1:	flushi	r4 +	add	r4, r4, r8 +	bltu	r4, r5, 1b +	ret + +	.global flush_cache + +flush_cache: +	add	r5, r5, r4 +	mov	r9, r4 +	mov	r10, r5 + +	movhi	r8, %hi(CONFIG_SYS_DCACHELINE_SIZE) +	ori	r8, r8, %lo(CONFIG_SYS_DCACHELINE_SIZE) +0:	flushd	0(r4) +	add	r4, r4, r8 +	bltu	r4, r5, 0b + +	mov	r4, r9 +	mov	r5, r10 +	movhi	r8, %hi(CONFIG_SYS_ICACHELINE_SIZE) +	ori	r8, r8, %lo(CONFIG_SYS_ICACHELINE_SIZE) +1:	flushi	r4 +	add	r4, r4, r8 +	bltu	r4, r5, 1b + +	sync +	flushp +	ret diff --git a/arch/nios2/lib/divmod.c b/arch/nios2/lib/divmod.c new file mode 100644 index 000000000..3c7e71e97 --- /dev/null +++ b/arch/nios2/lib/divmod.c @@ -0,0 +1,101 @@ +/* + * This file is part of GNU CC. + * + * GNU CC 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, or (at your + * option) any later version. + * + * GNU CC 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 GNU CC; see the file COPYING.  If not, write + * to the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#include "math.h" + +USItype udivmodsi4 (USItype num, USItype den, word_type modwanted) +{ +	USItype bit = 1; +	USItype res = 0; + +	while (den < num && bit && !(den & (1L << 31))) { +		den <<= 1; +		bit <<= 1; +	} +	while (bit) { +		if (num >= den) { +			num -= den; +			res |= bit; +		} +		bit >>= 1; +		den >>= 1; +	} +	if (modwanted) +		return num; +	return res; +} + + +SItype __divsi3 (SItype a, SItype b) +{ +	word_type neg = 0; +	SItype res; + +	if (a < 0) { +		a = -a; +		neg = !neg; +	} + +	if (b < 0) { +		b = -b; +		neg = !neg; +	} + +	res = udivmodsi4 (a, b, 0); + +	if (neg) +		res = -res; + +	return res; +} + + +SItype __modsi3 (SItype a, SItype b) +{ +	word_type neg = 0; +	SItype res; + +	if (a < 0) { +		a = -a; +		neg = 1; +	} + +	if (b < 0) +		b = -b; + +	res = udivmodsi4 (a, b, 1); + +	if (neg) +		res = -res; + +	return res; +} + + +SItype __udivsi3 (SItype a, SItype b) +{ +	return udivmodsi4 (a, b, 0); +} + + +SItype __umodsi3 (SItype a, SItype b) +{ +	return udivmodsi4 (a, b, 1); +} diff --git a/arch/nios2/lib/math.h b/arch/nios2/lib/math.h new file mode 100644 index 000000000..f0aed8edc --- /dev/null +++ b/arch/nios2/lib/math.h @@ -0,0 +1,16 @@ +#define BITS_PER_UNIT	8 + +typedef	 int HItype			__attribute__ ((mode (HI))); +typedef unsigned int UHItype		__attribute__ ((mode (HI))); + +typedef		 int SItype		__attribute__ ((mode (SI))); +typedef unsigned int USItype		__attribute__ ((mode (SI))); + +typedef int word_type			__attribute__ ((mode (__word__))); + +struct SIstruct {HItype low, high;}; + +typedef union { +	struct SIstruct s; +	SItype ll; +} SIunion; diff --git a/arch/nios2/lib/mult.c b/arch/nios2/lib/mult.c new file mode 100644 index 000000000..ec8139ed5 --- /dev/null +++ b/arch/nios2/lib/mult.c @@ -0,0 +1,56 @@ +/* + * This file is part of GNU CC. + * + * GNU CC 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, or (at your + * option) any later version. + * + * GNU CC 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 GNU CC; see the file COPYING.  If not, write + * to the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#include <common.h> + +#if !defined(CONFIG_SYS_NIOS_MULT_HW) && !defined(CONFIG_SYS_NIOS_MULT_MSTEP) + +#include "math.h" + +USItype __mulsi3 (USItype a, USItype b) +{ +	USItype c = 0; + +	while (a != 0) { +		if (a & 1) +			c += b; +		a >>= 1; +		b <<= 1; +	} + +	return c; +} + + +UHItype __mulhi3 (UHItype a, UHItype b) +{ +	UHItype c = 0; + +	while (a != 0) { +		if (a & 1) +			c += b; +		a >>= 1; +		b <<= 1; +	} + +	return c; +} + +#endif /*!defined(CONFIG_SYS_NIOS_MULT_HW) && !defined(CONFIG_SYS_NIOS_MULT_MSTEP) */ diff --git a/arch/nios2/lib/time.c b/arch/nios2/lib/time.c new file mode 100644 index 000000000..d5096ee12 --- /dev/null +++ b/arch/nios2/lib/time.c @@ -0,0 +1,38 @@ +/* + * (C) Copyright 2003, Psyent Corporation <www.psyent.com> + * Scott McNutt <smcnutt@psyent.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 <watchdog.h> + + +extern void dly_clks( unsigned long ticks ); + +void __udelay(unsigned long usec) +{ +	/* The Nios core doesn't have a timebase, so we do our +	 * best for now and call a low-level loop that counts +	 * cpu clocks. +	 */ +	unsigned long cnt = (CONFIG_SYS_CLK_FREQ/1000000) * usec; +	dly_clks (cnt); +} |