diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/nds32/cpu/n1213/Makefile | 4 | ||||
| -rw-r--r-- | arch/nds32/cpu/n1213/ag101/Makefile | 8 | ||||
| -rw-r--r-- | arch/nds32/cpu/n1213/ag101/lowlevel_init.S | 32 | ||||
| -rw-r--r-- | arch/nds32/cpu/n1213/ag101/timer.c | 7 | ||||
| -rw-r--r-- | arch/nds32/cpu/n1213/ag102/Makefile | 8 | ||||
| -rw-r--r-- | arch/nds32/cpu/n1213/ag102/lowlevel_init.S | 26 | ||||
| -rw-r--r-- | arch/nds32/cpu/n1213/ag102/timer.c | 7 | ||||
| -rw-r--r-- | arch/nds32/include/asm/io.h | 41 | ||||
| -rw-r--r-- | arch/nds32/include/asm/setup.h | 190 | ||||
| -rw-r--r-- | arch/nds32/lib/Makefile | 9 | 
10 files changed, 309 insertions, 23 deletions
| diff --git a/arch/nds32/cpu/n1213/Makefile b/arch/nds32/cpu/n1213/Makefile index 4514468d2..b8e0d7273 100644 --- a/arch/nds32/cpu/n1213/Makefile +++ b/arch/nds32/cpu/n1213/Makefile @@ -15,8 +15,8 @@ LIB	= $(obj)lib$(CPU).o  START	= start.o -SRCS	:= $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c) -OBJS	:= $(addprefix $(obj),$(COBJS) $(SOBJS)) +SRCS	:= $(START:.o=.S) $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS-y) $(SOBJS-y))  START	:= $(addprefix $(obj),$(START))  all:	$(obj).depend $(START) $(LIB) diff --git a/arch/nds32/cpu/n1213/ag101/Makefile b/arch/nds32/cpu/n1213/ag101/Makefile index fb388f05d..b53a3eb5f 100644 --- a/arch/nds32/cpu/n1213/ag101/Makefile +++ b/arch/nds32/cpu/n1213/ag101/Makefile @@ -17,15 +17,15 @@ LIB	= $(obj)lib$(SOC).o  COBJS-y	:= cpu.o timer.o  ifndef CONFIG_SKIP_LOWLEVEL_INIT -SOBJS	:= lowlevel_init.o +SOBJS-y	:= lowlevel_init.o  endif  ifndef CONFIG_SKIP_TRUNOFF_WATCHDOG -SOBJS	+= watchdog.o +SOBJS-y	+= watchdog.o  endif -SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c) -OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS-y)) +SRCS	:= $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) +OBJS	:= $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))  all:	$(obj).depend $(LIB) diff --git a/arch/nds32/cpu/n1213/ag101/lowlevel_init.S b/arch/nds32/cpu/n1213/ag101/lowlevel_init.S index 66ed8f0cf..810326d20 100644 --- a/arch/nds32/cpu/n1213/ag101/lowlevel_init.S +++ b/arch/nds32/cpu/n1213/ag101/lowlevel_init.S @@ -22,6 +22,7 @@  #define SDMC_CR1_A		(CONFIG_FTSDMC021_BASE + FTSDMC021_CR1)  #define SDMC_CR2_A		(CONFIG_FTSDMC021_BASE + FTSDMC021_CR2)  #define SDMC_B0_BSR_A		(CONFIG_FTSDMC021_BASE + FTSDMC021_BANK0_BSR) +#define SDMC_B1_BSR_A		(CONFIG_FTSDMC021_BASE + FTSDMC021_BANK1_BSR)  #define SDMC_TP1_D		CONFIG_SYS_FTSDMC021_TP1  #define SDMC_TP2_D		CONFIG_SYS_FTSDMC021_TP2 @@ -29,6 +30,7 @@  #define SDMC_CR2_D		CONFIG_SYS_FTSDMC021_CR2  #define SDMC_B0_BSR_D		CONFIG_SYS_FTSDMC021_BANK0_BSR +#define SDMC_B1_BSR_D		CONFIG_SYS_FTSDMC021_BANK1_BSR  /*   * parameters for the static memory controller @@ -80,6 +82,11 @@ lowlevel_init:  	led	0x10  	jal	remap +#if (defined(NDS32_EXT_FPU_DP) || defined(NDS32_EXT_FPU_SP)) +	led	0x1f +	jal	enable_fpu +#endif +  	led	0x20  	ret	$r10 @@ -151,12 +158,12 @@ relo_base:  	 */  	led	0x1a  	write32	SDMC_B0_BSR_A, SDMC_B0_BSR_D		! 0x00001100 +	write32	SDMC_B1_BSR_A, SDMC_B1_BSR_D		! 0x00001140  	/* clear empty BSR registers */  	led	0x1b  	li	$r4, CONFIG_FTSDMC021_BASE  	li	$r5, 0x0 -	swi	$r5, [$r4 + FTSDMC021_BANK1_BSR]  	swi	$r5, [$r4 + FTSDMC021_BANK2_BSR]  	swi	$r5, [$r4 + FTSDMC021_BANK3_BSR] @@ -207,6 +214,8 @@ relo_base:  	 * - after  remap: flash/rom 0x80000000, sdram: 0x00000000  	 */  	led	0x1c +	write32 SDMC_B0_BSR_A, 0x00001000 +	write32 SDMC_B1_BSR_A, 0x00001040  	setbf15	AHBC_CR_A, FTAHBC020S_CR_REMAP		! 0x1  #endif /* #ifdef CONFIG_MEM_REMAP */ @@ -214,6 +223,27 @@ relo_base:  2:  	ret +	/* +	 * enable_fpu: +	 *  Some of Andes CPU version support FPU coprocessor, if so, +	 *  and toolchain support FPU instruction set, we should enable it. +	 */ +#if (defined(NDS32_EXT_FPU_DP) || defined(NDS32_EXT_FPU_SP)) +enable_fpu: +	mfsr    $r0, $CPU_VER     /* enable FPU if it exists */ +	srli    $r0, $r0, 3 +	andi    $r0, $r0, 1 +	beqz    $r0, 1f           /* skip if no COP */ +	mfsr    $r0, $FUCOP_EXIST +	srli    $r0, $r0, 31 +	beqz    $r0, 1f           /* skip if no FPU */ +	mfsr    $r0, $FUCOP_CTL +	ori     $r0, $r0, 1 +	mtsr    $r0, $FUCOP_CTL +1: +	ret +#endif +  .globl show_led  show_led:      li      $r8, (CONFIG_DEBUG_LED) diff --git a/arch/nds32/cpu/n1213/ag101/timer.c b/arch/nds32/cpu/n1213/ag101/timer.c index ec6eb52f2..758b35411 100644 --- a/arch/nds32/cpu/n1213/ag101/timer.c +++ b/arch/nds32/cpu/n1213/ag101/timer.c @@ -71,7 +71,8 @@ void reset_timer_masked(void)  #ifdef CONFIG_FTTMR010_EXT_CLK  	lastdec = readl(&tmr->timer3_counter) / (TIMER_CLOCK / CONFIG_SYS_HZ);  #else -	lastdec = readl(&tmr->timer3_counter) / (CONFIG_SYS_CLK_FREQ / 2); +	lastdec = readl(&tmr->timer3_counter) / +			(CONFIG_SYS_CLK_FREQ / 2 / CONFIG_SYS_HZ);  #endif  	timestamp = 0;		/* start "advancing" time stamp from 0 */ @@ -95,8 +96,8 @@ ulong get_timer_masked(void)  #ifdef CONFIG_FTTMR010_EXT_CLK  	ulong now = readl(&tmr->timer3_counter) / (TIMER_CLOCK / CONFIG_SYS_HZ);  #else -	ulong now = readl(&tmr->timer3_counter) / \ -			(CONFIG_SYS_CLK_FREQ / 2 / 1024); +	ulong now = readl(&tmr->timer3_counter) / +			(CONFIG_SYS_CLK_FREQ / 2 / CONFIG_SYS_HZ);  #endif  	debug("%s(): now = %lx, lastdec = %lx\n", __func__, now, lastdec); diff --git a/arch/nds32/cpu/n1213/ag102/Makefile b/arch/nds32/cpu/n1213/ag102/Makefile index fb388f05d..b53a3eb5f 100644 --- a/arch/nds32/cpu/n1213/ag102/Makefile +++ b/arch/nds32/cpu/n1213/ag102/Makefile @@ -17,15 +17,15 @@ LIB	= $(obj)lib$(SOC).o  COBJS-y	:= cpu.o timer.o  ifndef CONFIG_SKIP_LOWLEVEL_INIT -SOBJS	:= lowlevel_init.o +SOBJS-y	:= lowlevel_init.o  endif  ifndef CONFIG_SKIP_TRUNOFF_WATCHDOG -SOBJS	+= watchdog.o +SOBJS-y	+= watchdog.o  endif -SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c) -OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS-y)) +SRCS	:= $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) +OBJS	:= $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))  all:	$(obj).depend $(LIB) diff --git a/arch/nds32/cpu/n1213/ag102/lowlevel_init.S b/arch/nds32/cpu/n1213/ag102/lowlevel_init.S index 94018483f..238410dde 100644 --- a/arch/nds32/cpu/n1213/ag102/lowlevel_init.S +++ b/arch/nds32/cpu/n1213/ag102/lowlevel_init.S @@ -98,6 +98,11 @@ lowlevel_init:  	led	0x20  	jal	remap +#if (defined(NDS32_EXT_FPU_DP) || defined(NDS32_EXT_FPU_SP)) +	led	0x2f +	jal	enable_fpu +#endif +  	led	0x30  	ret	$r10 @@ -273,6 +278,27 @@ relo_base:  2:  	ret +	/* +	 * enable_fpu: +	 *  Some of Andes CPU version support FPU coprocessor, if so, +	 *  and toolchain support FPU instruction set, we should enable it. +	 */ +#if (defined(NDS32_EXT_FPU_DP) || defined(NDS32_EXT_FPU_SP)) +enable_fpu: +	mfsr    $r0, $CPU_VER     /* enable FPU if it exists */ +	srli    $r0, $r0, 3 +	andi    $r0, $r0, 1 +	beqz    $r0, 1f           /* skip if no COP */ +	mfsr    $r0, $FUCOP_EXIST +	srli    $r0, $r0, 31 +	beqz    $r0, 1f           /* skip if no FPU */ +	mfsr    $r0, $FUCOP_CTL +	ori     $r0, $r0, 1 +	mtsr    $r0, $FUCOP_CTL +1: +	ret +#endif +  .globl show_led  show_led:      li      $r8, (CONFIG_DEBUG_LED) diff --git a/arch/nds32/cpu/n1213/ag102/timer.c b/arch/nds32/cpu/n1213/ag102/timer.c index ec6eb52f2..758b35411 100644 --- a/arch/nds32/cpu/n1213/ag102/timer.c +++ b/arch/nds32/cpu/n1213/ag102/timer.c @@ -71,7 +71,8 @@ void reset_timer_masked(void)  #ifdef CONFIG_FTTMR010_EXT_CLK  	lastdec = readl(&tmr->timer3_counter) / (TIMER_CLOCK / CONFIG_SYS_HZ);  #else -	lastdec = readl(&tmr->timer3_counter) / (CONFIG_SYS_CLK_FREQ / 2); +	lastdec = readl(&tmr->timer3_counter) / +			(CONFIG_SYS_CLK_FREQ / 2 / CONFIG_SYS_HZ);  #endif  	timestamp = 0;		/* start "advancing" time stamp from 0 */ @@ -95,8 +96,8 @@ ulong get_timer_masked(void)  #ifdef CONFIG_FTTMR010_EXT_CLK  	ulong now = readl(&tmr->timer3_counter) / (TIMER_CLOCK / CONFIG_SYS_HZ);  #else -	ulong now = readl(&tmr->timer3_counter) / \ -			(CONFIG_SYS_CLK_FREQ / 2 / 1024); +	ulong now = readl(&tmr->timer3_counter) / +			(CONFIG_SYS_CLK_FREQ / 2 / CONFIG_SYS_HZ);  #endif  	debug("%s(): now = %lx, lastdec = %lx\n", __func__, now, lastdec); diff --git a/arch/nds32/include/asm/io.h b/arch/nds32/include/asm/io.h index 39c3dc8d9..04708e935 100644 --- a/arch/nds32/include/asm/io.h +++ b/arch/nds32/include/asm/io.h @@ -7,9 +7,7 @@   * Shawn Lin, Andes Technology Corporation <nobuhiro@andestech.com>   * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com>   * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. + * SPDX-License-Identifier:	GPL-2.0   *   * Modifications:   *  16-Sep-1996	RMK	Inlined the inx/outx functions & optimised for both @@ -184,6 +182,43 @@ static inline unsigned int readl(unsigned int *addr)  #define in_8(a)				__raw_readb(a)  /* + * Clear and set bits in one shot. These macros can be used to clear and + * set multiple bits in a register using a single call. These macros can + * also be used to set a multiple-bit bit pattern using a mask, by + * specifying the mask in the 'clear' parameter and the new bit pattern + * in the 'set' parameter. + */ + +#define clrbits(type, addr, clear) \ +	out_##type((addr), in_##type(addr) & ~(clear)) + +#define setbits(type, addr, set) \ +	out_##type((addr), in_##type(addr) | (set)) + +#define clrsetbits(type, addr, clear, set) \ +	out_##type((addr), (in_##type(addr) & ~(clear)) | (set)) + +#define clrbits_be32(addr, clear) clrbits(be32, addr, clear) +#define setbits_be32(addr, set) setbits(be32, addr, set) +#define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set) + +#define clrbits_le32(addr, clear) clrbits(le32, addr, clear) +#define setbits_le32(addr, set) setbits(le32, addr, set) +#define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set) + +#define clrbits_be16(addr, clear) clrbits(be16, addr, clear) +#define setbits_be16(addr, set) setbits(be16, addr, set) +#define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set) + +#define clrbits_le16(addr, clear) clrbits(le16, addr, clear) +#define setbits_le16(addr, set) setbits(le16, addr, set) +#define clrsetbits_le16(addr, clear, set) clrsetbits(le16, addr, clear, set) + +#define clrbits_8(addr, clear) clrbits(8, addr, clear) +#define setbits_8(addr, set) setbits(8, addr, set) +#define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set) + +/*   * Now, pick up the machine-defined IO definitions   * #include <asm/arch/io.h>   */ diff --git a/arch/nds32/include/asm/setup.h b/arch/nds32/include/asm/setup.h new file mode 100644 index 000000000..833d979af --- /dev/null +++ b/arch/nds32/include/asm/setup.h @@ -0,0 +1,190 @@ +/* + *  linux/arch/nds32/include/asm/setup.h + * + *  Copyright (C) 1997-1999 Russell King + *  Copyright (C) 2008 Andes Technology Corporation + *	Copyright (C) 2013 Ken Kuo (ken_kuo@andestech.com) + * + * SPDX-License-Identifier:	GPL-2.0 + * + *  Structure passed to kernel to tell it about the + *  hardware it's running on.  See Documentation/arm/Setup + *  for more info. + */ +#ifndef __ASMNDS32_SETUP_H +#define __ASMNDS32_SETUP_H + +#define COMMAND_LINE_SIZE 256 + +/* The list ends with an ATAG_NONE node. */ +#define ATAG_NONE	0x00000000 + +struct tag_header { +	u32 size; +	u32 tag; +}; + +/* The list must start with an ATAG_CORE node */ +#define ATAG_CORE	0x54410001 + +struct tag_core { +	u32 flags;		/* bit 0 = read-only */ +	u32 pagesize; +	u32 rootdev; +}; + +/* it is allowed to have multiple ATAG_MEM nodes */ +#define ATAG_MEM	0x54410002 + +struct tag_mem32 { +	u32	size; +	u32	start;	/* physical start address */ +}; + +/* VGA text type displays */ +#define ATAG_VIDEOTEXT	0x54410003 + +struct tag_videotext { +	u8		x; +	u8		y; +	u16		video_page; +	u8		video_mode; +	u8		video_cols; +	u16		video_ega_bx; +	u8		video_lines; +	u8		video_isvga; +	u16		video_points; +}; + +/* describes how the ramdisk will be used in kernel */ +#define ATAG_RAMDISK	0x54410004 + +struct tag_ramdisk { +	u32 flags;	/* bit 0 = load, bit 1 = prompt */ +	u32 size;	/* decompressed ramdisk size in _kilo_ bytes */ +	u32 start;	/* starting block of floppy-based RAM disk image */ +}; + +/* + * this one accidentally used virtual addresses - as such, + * it's deprecated. + * describes where the compressed ramdisk image lives (virtual address) + */ +#define ATAG_INITRD		0x54410005 + +/* describes where the compressed ramdisk image lives (physical address) */ +#define ATAG_INITRD2	0x54420005 + +struct tag_initrd { +	u32 start;	/* physical start address */ +	u32 size;	/* size of compressed ramdisk image in bytes */ +}; + +/* board serial number. "64 bits should be enough for everybody" */ +#define ATAG_SERIAL		0x54410006 + +struct tag_serialnr { +	u32 low; +	u32 high; +}; + +/* board revision */ +#define ATAG_REVISION	0x54410007 + +struct tag_revision { +	u32 rev; +}; + +/* initial values for vesafb-type framebuffers. see struct screen_info + * in include/linux/tty.h + */ +#define ATAG_VIDEOLFB	0x54410008 + +struct tag_videolfb { +	u16		lfb_width; +	u16		lfb_height; +	u16		lfb_depth; +	u16		lfb_linelength; +	u32		lfb_base; +	u32		lfb_size; +	u8		red_size; +	u8		red_pos; +	u8		green_size; +	u8		green_pos; +	u8		blue_size; +	u8		blue_pos; +	u8		rsvd_size; +	u8		rsvd_pos; +}; + +/* command line: \0 terminated string */ +#define ATAG_CMDLINE	0x54410009 + +struct tag_cmdline { +	char	cmdline[COMMAND_LINE_SIZE]; +}; + +struct tag { +	struct tag_header hdr; +	union { +		struct tag_core		core; +		struct tag_mem32	mem; +		struct tag_videotext	videotext; +		struct tag_ramdisk	ramdisk; +		struct tag_initrd	initrd; +		struct tag_serialnr	serialnr; +		struct tag_revision	revision; +		struct tag_videolfb	videolfb; +		struct tag_cmdline	cmdline; +	} u; +}; + +struct tagtable { +	u32 tag; +	int (*parse)(const struct tag *); +}; + +#define tag_member_present(tag, member)				\ +	((unsigned long)(&((struct tag *)0L)->member + 1)	\ +		<= (tag)->hdr.size * 4) + +#define tag_next(t)	((struct tag *)((u32 *)(t) + (t)->hdr.size)) +#define tag_size(type)	((sizeof(struct tag_header) + sizeof(struct type)) >> 2) + +#define for_each_tag(t, base) \ +	for (t = base; t->hdr.size; t = tag_next(t)) + +#ifdef __KERNEL__ + +#define __tag __used __attribute__((__section__(".taglist"))) +#define __tagtable(tag, fn) \ +static struct tagtable __tagtable_##fn __tag = { tag, fn } + +/* + * Memory map description + */ +#define NR_BANKS 8 + +struct meminfo { +	int nr_banks; +	struct { +		unsigned long start; +		unsigned long size; +		int           node; +	} bank[NR_BANKS]; +}; + +/* + * Early command line parameters. + */ +struct early_params { +	const char *arg; +	void (*fn)(char **p); +}; + +#define __early_param(name, fn)					\ +static struct early_params __early_##fn __used	\ +__attribute__((__section__("__early_param"))) = { name, fn } + +#endif +#endif diff --git a/arch/nds32/lib/Makefile b/arch/nds32/lib/Makefile index 5de2d289d..2f7e15557 100644 --- a/arch/nds32/lib/Makefile +++ b/arch/nds32/lib/Makefile @@ -13,12 +13,15 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(ARCH).o -OBJS	:= board.o cache.o interrupts.o +COBJS-y += board.o +COBJS-y += cache.o  COBJS-$(CONFIG_CMD_BOOTM) += bootm.o +COBJS-y += interrupts.o -all:	$(LIB) +SRCS  := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) +OBJS	:= $(addprefix $(obj),$(SOBJS-y) $(COBJS-y)) -$(LIB):	$(OBJS) $(SOBJS) +$(LIB): $(obj).depend $(OBJS)  	$(call cmd_link_o_target, $(OBJS))  ######################################################################### |