diff options
Diffstat (limited to 'arch')
45 files changed, 1120 insertions, 104 deletions
| diff --git a/arch/arm/cpu/armv7/zynq/timer.c b/arch/arm/cpu/armv7/zynq/timer.c index 636322a8e..2be253c2c 100644 --- a/arch/arm/cpu/armv7/zynq/timer.c +++ b/arch/arm/cpu/armv7/zynq/timer.c @@ -107,8 +107,7 @@ void __udelay(unsigned long usec)  	if (usec == 0)  		return; -	countticks = (u32) (((unsigned long long) TIMER_TICK_HZ * usec) / -								1000000); +	countticks = lldiv(TIMER_TICK_HZ * usec, 1000000);  	/* decrementing timer */  	timeend = readl(&timer_base->counter) - countticks; diff --git a/arch/arm/cpu/pxa/timer.c b/arch/arm/cpu/pxa/timer.c index 78d9f3274..c4717de6a 100644 --- a/arch/arm/cpu/pxa/timer.c +++ b/arch/arm/cpu/pxa/timer.c @@ -28,12 +28,12 @@ DECLARE_GLOBAL_DATA_PTR;  static unsigned long long tick_to_time(unsigned long long tick)  { -	return tick * CONFIG_SYS_HZ / TIMER_FREQ_HZ; +	return lldiv(tick * CONFIG_SYS_HZ, TIMER_FREQ_HZ);  }  static unsigned long long us_to_tick(unsigned long long us)  { -	return (us * TIMER_FREQ_HZ) / 1000000; +	return lldiv(us * TIMER_FREQ_HZ, 1000000);  }  int timer_init(void) diff --git a/arch/arm/include/asm/arch-socfpga/dwmmc.h b/arch/arm/include/asm/arch-socfpga/dwmmc.h new file mode 100644 index 000000000..945eb646c --- /dev/null +++ b/arch/arm/include/asm/arch-socfpga/dwmmc.h @@ -0,0 +1,12 @@ +/* + * (C) Copyright 2013 Altera Corporation <www.altera.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef	_SOCFPGA_DWMMC_H_ +#define	_SOCFPGA_DWMMC_H_ + +extern int socfpga_dwmmc_init(u32 regbase, int bus_width, int index); + +#endif /* _SOCFPGA_SDMMC_H_ */ diff --git a/arch/arm/include/asm/arch-socfpga/system_manager.h b/arch/arm/include/asm/arch-socfpga/system_manager.h index d965d25ef..838d21053 100644 --- a/arch/arm/include/asm/arch-socfpga/system_manager.h +++ b/arch/arm/include/asm/arch-socfpga/system_manager.h @@ -19,4 +19,69 @@ extern unsigned long sys_mgr_init_table[CONFIG_HPS_PINMUX_NUM];  #define CONFIG_SYSMGR_PINMUXGRP_OFFSET	(0x400) +#define SYSMGR_SDMMC_CTRL_SET(smplsel, drvsel)	\ +	((((drvsel) << 0) & 0x7) | (((smplsel) << 3) & 0x38)) + +struct socfpga_system_manager { +	u32	siliconid1; +	u32	siliconid2; +	u32	_pad_0x8_0xf[2]; +	u32	wddbg; +	u32	bootinfo; +	u32	hpsinfo; +	u32	parityinj; +	u32	fpgaintfgrp_gbl; +	u32	fpgaintfgrp_indiv; +	u32	fpgaintfgrp_module; +	u32	_pad_0x2c_0x2f; +	u32	scanmgrgrp_ctrl; +	u32	_pad_0x34_0x3f[3]; +	u32	frzctrl_vioctrl; +	u32	_pad_0x44_0x4f[3]; +	u32	frzctrl_hioctrl; +	u32	frzctrl_src; +	u32	frzctrl_hwctrl; +	u32	_pad_0x5c_0x5f; +	u32	emacgrp_ctrl; +	u32	emacgrp_l3master; +	u32	_pad_0x68_0x6f[2]; +	u32	dmagrp_ctrl; +	u32	dmagrp_persecurity; +	u32	_pad_0x78_0x7f[2]; +	u32	iswgrp_handoff[8]; +	u32	_pad_0xa0_0xbf[8]; +	u32	romcodegrp_ctrl; +	u32	romcodegrp_cpu1startaddr; +	u32	romcodegrp_initswstate; +	u32	romcodegrp_initswlastld; +	u32	romcodegrp_bootromswstate; +	u32	__pad_0xd4_0xdf[3]; +	u32	romcodegrp_warmramgrp_enable; +	u32	romcodegrp_warmramgrp_datastart; +	u32	romcodegrp_warmramgrp_length; +	u32	romcodegrp_warmramgrp_execution; +	u32	romcodegrp_warmramgrp_crc; +	u32	__pad_0xf4_0xff[3]; +	u32	romhwgrp_ctrl; +	u32	_pad_0x104_0x107; +	u32	sdmmcgrp_ctrl; +	u32	sdmmcgrp_l3master; +	u32	nandgrp_bootstrap; +	u32	nandgrp_l3master; +	u32	usbgrp_l3master; +	u32	_pad_0x11c_0x13f[9]; +	u32	eccgrp_l2; +	u32	eccgrp_ocram; +	u32	eccgrp_usb0; +	u32	eccgrp_usb1; +	u32	eccgrp_emac0; +	u32	eccgrp_emac1; +	u32	eccgrp_dma; +	u32	eccgrp_can0; +	u32	eccgrp_can1; +	u32	eccgrp_nand; +	u32	eccgrp_qspi; +	u32	eccgrp_sdmmc; +}; +  #endif /* _SYSTEM_MANAGER_H_ */ diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c index 77f1a5c97..a8295bf1f 100644 --- a/arch/arm/lib/bootm.c +++ b/arch/arm/lib/bootm.c @@ -350,3 +350,26 @@ int bootz_setup(ulong image, ulong *start, ulong *end)  }  #endif	/* CONFIG_CMD_BOOTZ */ + +#if defined(CONFIG_BOOTM_VXWORKS) +void boot_prep_vxworks(bootm_headers_t *images) +{ +#if defined(CONFIG_OF_LIBFDT) +	int off; + +	if (images->ft_addr) { +		off = fdt_path_offset(images->ft_addr, "/memory"); +		if (off < 0) { +			if (arch_fixup_memory_node(images->ft_addr)) +				puts("## WARNING: fixup memory failed!\n"); +		} +	} +#endif +	cleanup_before_linux(); +} +void boot_jump_vxworks(bootm_headers_t *images) +{ +	/* ARM VxWorks requires device tree physical address to be passed */ +	((void (*)(void *))images->ep)(images->ft_addr); +} +#endif diff --git a/arch/blackfin/config.mk b/arch/blackfin/config.mk index 35f871662..73fa79855 100644 --- a/arch/blackfin/config.mk +++ b/arch/blackfin/config.mk @@ -14,9 +14,9 @@ CONFIG_BFIN_CPU := \  	$(shell awk '$$2 == "CONFIG_BFIN_CPU" { print $$3 }' \  		$(src)include/configs/$(BOARD).h)  else -CONFIG_BFIN_CPU := $(strip $(subst ",,$(CONFIG_BFIN_CPU))) +CONFIG_BFIN_CPU := $(strip $(CONFIG_BFIN_CPU:"%"=%))  endif -CONFIG_BFIN_BOOT_MODE := $(strip $(subst ",,$(CONFIG_BFIN_BOOT_MODE))) +CONFIG_BFIN_BOOT_MODE := $(strip $(CONFIG_BFIN_BOOT_MODE:"%"=%))  PLATFORM_RELFLAGS += -ffixed-P3 -fomit-frame-pointer -mno-fdpic  PLATFORM_CPPFLAGS += -DCONFIG_BLACKFIN diff --git a/arch/blackfin/cpu/initcode.c b/arch/blackfin/cpu/initcode.c index ffaf1017d..2e640afc4 100644 --- a/arch/blackfin/cpu/initcode.c +++ b/arch/blackfin/cpu/initcode.c @@ -18,8 +18,6 @@  #include <asm/mach-common/bits/core.h>  #include <asm/serial.h> -#define BUG() while (1) asm volatile("emuexcpt;"); -  #ifndef __ADSPBF60x__  #include <asm/mach-common/bits/ebiu.h>  #include <asm/mach-common/bits/pll.h> @@ -147,8 +145,6 @@ static struct ddr_config ddr_config_table[] = {  __attribute__((always_inline))  static inline void serial_init(void)  { -	uint32_t uart_base = UART_BASE; -  #if defined(__ADSPBF54x__) || defined(__ADSPBF60x__)  # ifdef BFIN_BOOT_UART_USE_RTS  #  define BFIN_UART_USE_RTS 1 @@ -156,6 +152,7 @@ static inline void serial_init(void)  #  define BFIN_UART_USE_RTS 0  # endif  	if (BFIN_UART_USE_RTS && CONFIG_BFIN_BOOT_MODE == BFIN_BOOT_UART) { +		uint32_t uart_base = UART_BASE;  		size_t i;  		/* force RTS rather than relying on auto RTS */ @@ -195,8 +192,8 @@ static inline void serial_init(void)  #if CONFIG_BFIN_BOOT_MODE != BFIN_BOOT_BYPASS  	if (BFIN_DEBUG_EARLY_SERIAL) { -		serial_early_init(uart_base); -		serial_early_set_baud(uart_base, CONFIG_BAUDRATE); +		serial_early_init(UART_BASE); +		serial_early_set_baud(UART_BASE, CONFIG_BAUDRATE);  	}  #endif  } @@ -547,7 +544,7 @@ maybe_self_refresh(ADI_BOOT_DATA *bs)  __attribute__((always_inline)) static inline u16  program_clocks(ADI_BOOT_DATA *bs, bool put_into_srfs)  { -	u16 vr_ctl; +	u16 vr_ctl = 0;  	serial_putc('a'); @@ -731,6 +728,8 @@ update_serial_clocks(ADI_BOOT_DATA *bs, uint sdivB, uint divB, uint vcoB)  	serial_putc('a'); +	if (BFIN_DEBUG_EARLY_SERIAL || +		CONFIG_BFIN_BOOT_MODE == BFIN_BOOT_UART) {  #ifdef __ADSPBF60x__  	sdivR = bfin_read_CGU_DIV();  	sdivR = ((sdivR >> 8) & 0x1f) * ((sdivR >> 5) & 0x7); @@ -744,6 +743,8 @@ update_serial_clocks(ADI_BOOT_DATA *bs, uint sdivB, uint divB, uint vcoB)  	divisor = vcoB * sdivR;  	quotient = early_division(dividend, divisor);  	serial_early_put_div(quotient - ANOMALY_05000230); +	} +  	serial_putc('c');  } @@ -913,7 +914,8 @@ check_hibernation(ADI_BOOT_DATA *bs, u16 vr_ctl, bool put_into_srfs)  			continue;  		serial_putc('z'); -		uint32_t *hibernate_magic = bfin_read32(DPM0_RESTORE4); +		uint32_t *hibernate_magic = +			(uint32_t *)bfin_read32(DPM0_RESTORE4);  		SSYNC(); /* make sure memory controller is done */  		if (hibernate_magic[0] == 0xDEADBEEF) {  			serial_putc('c'); diff --git a/arch/blackfin/include/asm/blackfin_local.h b/arch/blackfin/include/asm/blackfin_local.h index 8ea8cde69..4d6eeab0e 100644 --- a/arch/blackfin/include/asm/blackfin_local.h +++ b/arch/blackfin/include/asm/blackfin_local.h @@ -81,6 +81,8 @@ extern void blackfin_dcache_flush_invalidate_range(const void *, const void *);  # define NOP_PAD_ANOMALY_05000198  #endif +#define BFIN_BUG() while (1) asm volatile("emuexcpt;"); +  #define _bfin_readX(addr, size, asm_size, asm_ext) ({ \  	u32 __v; \  	__asm__ __volatile__( \ @@ -111,7 +113,7 @@ extern void blackfin_dcache_flush_invalidate_range(const void *, const void *);  	sizeof(*(addr)) == 1 ? bfin_read8(addr)  : \  	sizeof(*(addr)) == 2 ? bfin_read16(addr) : \  	sizeof(*(addr)) == 4 ? bfin_read32(addr) : \ -	({ BUG(); 0; }); \ +	({ BFIN_BUG(); 0; }); \  })  #define bfin_write(addr, val) \  do { \ @@ -119,7 +121,8 @@ do { \  	case 1: bfin_write8(addr, val);  break; \  	case 2: bfin_write16(addr, val); break; \  	case 4: bfin_write32(addr, val); break; \ -	default: BUG(); \ +	default: \ +		BFIN_BUG(); \  	} \  } while (0) diff --git a/arch/blackfin/lib/board.c b/arch/blackfin/lib/board.c index 17d1f468d..392d72d23 100644 --- a/arch/blackfin/lib/board.c +++ b/arch/blackfin/lib/board.c @@ -19,6 +19,7 @@  #include <net.h>  #include <status_led.h>  #include <version.h> +#include <watchdog.h>  #include <asm/cplb.h>  #include <asm/mach-common/bits/mpu.h> diff --git a/arch/blackfin/lib/clocks.c b/arch/blackfin/lib/clocks.c index 97795e11a..7ed56a727 100644 --- a/arch/blackfin/lib/clocks.c +++ b/arch/blackfin/lib/clocks.c @@ -36,7 +36,10 @@ u_long get_vco(void)  u_long get_cclk(void)  {  	static u_long cached_cclk_pll_div, cached_cclk; -	u_long div, csel, ssel; +	u_long div, csel; +#ifndef CGU_DIV +	u_long ssel; +#endif  	if (pll_is_bypassed())  		return CONFIG_CLKIN_HZ; diff --git a/arch/powerpc/config.mk b/arch/powerpc/config.mk index e6bb93572..f75c3bf18 100644 --- a/arch/powerpc/config.mk +++ b/arch/powerpc/config.mk @@ -9,8 +9,9 @@ CROSS_COMPILE ?= ppc_8xx-  CONFIG_STANDALONE_LOAD_ADDR ?= 0x40000  LDFLAGS_FINAL += --gc-sections -PLATFORM_RELFLAGS += -fpic -mrelocatable -ffunction-sections -fdata-sections -PLATFORM_CPPFLAGS += -DCONFIG_PPC -D__powerpc__ +PLATFORM_RELFLAGS += -fpic -mrelocatable -ffunction-sections -fdata-sections \ +								-meabi +PLATFORM_CPPFLAGS += -DCONFIG_PPC -D__powerpc__ -ffixed-r2  PLATFORM_LDFLAGS  += -n  # Support generic board on PPC diff --git a/arch/powerpc/cpu/74xx_7xx/config.mk b/arch/powerpc/cpu/74xx_7xx/config.mk index 905319160..96812a02d 100644 --- a/arch/powerpc/cpu/74xx_7xx/config.mk +++ b/arch/powerpc/cpu/74xx_7xx/config.mk @@ -5,6 +5,4 @@  # SPDX-License-Identifier:	GPL-2.0+  # -PLATFORM_RELFLAGS += -meabi - -PLATFORM_CPPFLAGS += -DCONFIG_74xx_7xx -ffixed-r2 -mstring +PLATFORM_CPPFLAGS += -DCONFIG_74xx_7xx -mstring diff --git a/arch/powerpc/cpu/Makefile b/arch/powerpc/cpu/Makefile index d630abe1d..88b5298be 100644 --- a/arch/powerpc/cpu/Makefile +++ b/arch/powerpc/cpu/Makefile @@ -1,3 +1,3 @@ -ifneq ($(filter mpc83xx mpc85xx mpc86xx,$(CPU)),) -obj-y += mpc8xxx/ -endif +obj-$(CONFIG_MPC83xx) += mpc8xxx/ +obj-$(CONFIG_MPC85xx) += mpc8xxx/ +obj-$(CONFIG_MPC86xx) += mpc8xxx/ diff --git a/arch/powerpc/cpu/mpc512x/config.mk b/arch/powerpc/cpu/mpc512x/config.mk index 04717a485..03759e662 100644 --- a/arch/powerpc/cpu/mpc512x/config.mk +++ b/arch/powerpc/cpu/mpc512x/config.mk @@ -4,7 +4,4 @@  # SPDX-License-Identifier:	GPL-2.0+  # -PLATFORM_RELFLAGS += -meabi - -PLATFORM_CPPFLAGS += -DCONFIG_MPC512X -DCONFIG_E300 \ -			-ffixed-r2 -msoft-float -mcpu=603e +PLATFORM_CPPFLAGS += -DCONFIG_MPC512X -DCONFIG_E300 -msoft-float -mcpu=603e diff --git a/arch/powerpc/cpu/mpc5xx/config.mk b/arch/powerpc/cpu/mpc5xx/config.mk index b33f17a1b..31e2dc987 100644 --- a/arch/powerpc/cpu/mpc5xx/config.mk +++ b/arch/powerpc/cpu/mpc5xx/config.mk @@ -5,6 +5,4 @@  # SPDX-License-Identifier:	GPL-2.0+  # -PLATFORM_RELFLAGS +=	-meabi - -PLATFORM_CPPFLAGS +=	-DCONFIG_5xx -ffixed-r2 -mpowerpc -msoft-float +PLATFORM_CPPFLAGS += -DCONFIG_5xx -mpowerpc -msoft-float diff --git a/arch/powerpc/cpu/mpc5xxx/config.mk b/arch/powerpc/cpu/mpc5xxx/config.mk index 57bdd2d25..3384f6ffc 100644 --- a/arch/powerpc/cpu/mpc5xxx/config.mk +++ b/arch/powerpc/cpu/mpc5xxx/config.mk @@ -5,7 +5,5 @@  # SPDX-License-Identifier:	GPL-2.0+  # -PLATFORM_RELFLAGS += -meabi - -PLATFORM_CPPFLAGS += -DCONFIG_MPC5xxx -ffixed-r2 \ +PLATFORM_CPPFLAGS += -DCONFIG_MPC5xxx \  		     -mstring -mcpu=603e -mmultiple diff --git a/arch/powerpc/cpu/mpc824x/config.mk b/arch/powerpc/cpu/mpc824x/config.mk index ef605f079..a224bc8e7 100644 --- a/arch/powerpc/cpu/mpc824x/config.mk +++ b/arch/powerpc/cpu/mpc824x/config.mk @@ -5,6 +5,4 @@  # SPDX-License-Identifier:	GPL-2.0+  # -PLATFORM_RELFLAGS += -meabi - -PLATFORM_CPPFLAGS += -DCONFIG_MPC824X -ffixed-r2 -mstring -mcpu=603e -msoft-float +PLATFORM_CPPFLAGS += -DCONFIG_MPC824X -mstring -mcpu=603e -msoft-float diff --git a/arch/powerpc/cpu/mpc8260/config.mk b/arch/powerpc/cpu/mpc8260/config.mk index 91b0497cc..dfac710e6 100644 --- a/arch/powerpc/cpu/mpc8260/config.mk +++ b/arch/powerpc/cpu/mpc8260/config.mk @@ -5,7 +5,5 @@  # SPDX-License-Identifier:	GPL-2.0+  # -PLATFORM_RELFLAGS += -meabi - -PLATFORM_CPPFLAGS += -DCONFIG_8260 -DCONFIG_CPM2 -ffixed-r2 \ +PLATFORM_CPPFLAGS += -DCONFIG_8260 -DCONFIG_CPM2 \  		     -mstring -mcpu=603e -mmultiple diff --git a/arch/powerpc/cpu/mpc83xx/config.mk b/arch/powerpc/cpu/mpc83xx/config.mk index c16a00376..dfce4d53b 100644 --- a/arch/powerpc/cpu/mpc83xx/config.mk +++ b/arch/powerpc/cpu/mpc83xx/config.mk @@ -4,7 +4,4 @@  # SPDX-License-Identifier:	GPL-2.0+  # -PLATFORM_RELFLAGS += -meabi - -PLATFORM_CPPFLAGS += -DCONFIG_MPC83xx -DCONFIG_E300 \ -			-ffixed-r2 -msoft-float +PLATFORM_CPPFLAGS += -DCONFIG_MPC83xx -DCONFIG_E300 -msoft-float diff --git a/arch/powerpc/cpu/mpc85xx/config.mk b/arch/powerpc/cpu/mpc85xx/config.mk index 9eef539e5..72c964cd1 100644 --- a/arch/powerpc/cpu/mpc85xx/config.mk +++ b/arch/powerpc/cpu/mpc85xx/config.mk @@ -5,13 +5,10 @@  # SPDX-License-Identifier:	GPL-2.0+  # -PLATFORM_RELFLAGS += -meabi - -PLATFORM_CPPFLAGS += -ffixed-r2 -Wa,-me500 -msoft-float -mno-string +PLATFORM_CPPFLAGS += -Wa,-me500 -msoft-float -mno-string  # -mspe=yes is needed to have -mno-spe accepted by a buggy GCC;  # see "[PATCH,rs6000] make -mno-spe work as expected" on  # http://gcc.gnu.org/ml/gcc-patches/2008-04/msg00311.html -PF_CPPFLAGS_SPE := $(call cc-option,-mspe=yes) \ +PLATFORM_CPPFLAGS += $(call cc-option,-mspe=yes) \  		   $(call cc-option,-mno-spe) -PLATFORM_CPPFLAGS += $(PF_CPPFLAGS_SPE) diff --git a/arch/powerpc/cpu/mpc85xx/speed.c b/arch/powerpc/cpu/mpc85xx/speed.c index 46ae80c4d..35867dffd 100644 --- a/arch/powerpc/cpu/mpc85xx/speed.c +++ b/arch/powerpc/cpu/mpc85xx/speed.c @@ -74,12 +74,33 @@ void get_sys_info(sys_info_t *sys_info)  	uint ratio[CONFIG_SYS_FSL_NUM_CC_PLLS];  	unsigned long sysclk = CONFIG_SYS_CLK_FREQ;  	uint mem_pll_rat; +#ifdef CONFIG_SYS_FSL_SINGLE_SOURCE_CLK +	uint single_src; +#endif  	sys_info->freq_systembus = sysclk; +#ifdef CONFIG_SYS_FSL_SINGLE_SOURCE_CLK +	/* +	 * DDR_REFCLK_SEL rcw bit is used to determine if DDR PLLS +	 * are driven by separate DDR Refclock or single source +	 * differential clock. +	 */ +	single_src = (in_be32(&gur->rcwsr[5]) >> +		      FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_SHIFT) & +		      FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_MASK; +	/* +	 * For single source clocking, both ddrclock and syclock +	 * are driven by differential sysclock. +	 */ +	if (single_src == FSL_CORENET2_RCWSR5_DDR_REFCLK_SINGLE_CLK) { +		printf("Single Source Clock Configuration\n"); +		sys_info->freq_ddrbus = CONFIG_SYS_CLK_FREQ; +	} else +#endif  #ifdef CONFIG_DDR_CLK_FREQ -	sys_info->freq_ddrbus = CONFIG_DDR_CLK_FREQ; +		sys_info->freq_ddrbus = CONFIG_DDR_CLK_FREQ;  #else -	sys_info->freq_ddrbus = sysclk; +		sys_info->freq_ddrbus = sysclk;  #endif  	sys_info->freq_systembus *= (in_be32(&gur->rcwsr[0]) >> 25) & 0x1f; @@ -229,6 +250,9 @@ void get_sys_info(sys_info_t *sys_info)  	case 4:  		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 4;  		break; +	case 5: +		sys_info->freq_fman[1] = sys_info->freq_systembus; +		break;  	case 6:  		sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK] / 2;  		break; diff --git a/arch/powerpc/cpu/mpc86xx/config.mk b/arch/powerpc/cpu/mpc86xx/config.mk index 5dbf6a847..69a0b96ea 100644 --- a/arch/powerpc/cpu/mpc86xx/config.mk +++ b/arch/powerpc/cpu/mpc86xx/config.mk @@ -5,7 +5,4 @@  # SPDX-License-Identifier:	GPL-2.0+  # -PLATFORM_RELFLAGS += -meabi - -PLATFORM_CPPFLAGS += -ffixed-r2 -mstring -PLATFORM_CPPFLAGS += -maltivec -mabi=altivec -msoft-float +PLATFORM_CPPFLAGS += -mstring -maltivec -mabi=altivec -msoft-float diff --git a/arch/powerpc/cpu/mpc8xx/config.mk b/arch/powerpc/cpu/mpc8xx/config.mk index c04e7338c..ee2c88366 100644 --- a/arch/powerpc/cpu/mpc8xx/config.mk +++ b/arch/powerpc/cpu/mpc8xx/config.mk @@ -5,6 +5,4 @@  # SPDX-License-Identifier:	GPL-2.0+  # -PLATFORM_RELFLAGS += -meabi - -PLATFORM_CPPFLAGS += -DCONFIG_8xx -ffixed-r2 -mstring -mcpu=860 -msoft-float +PLATFORM_CPPFLAGS += -DCONFIG_8xx -mstring -mcpu=860 -msoft-float diff --git a/arch/powerpc/cpu/mpc8xxx/Makefile b/arch/powerpc/cpu/mpc8xxx/Makefile index f66ee2e42..e95539e0a 100644 --- a/arch/powerpc/cpu/mpc8xxx/Makefile +++ b/arch/powerpc/cpu/mpc8xxx/Makefile @@ -19,10 +19,8 @@ ifdef MINIMAL  obj-$(CONFIG_FSL_LAW) += law.o  else - -ifneq ($(CPU),mpc83xx) -obj-y	+= cpu.o -endif +obj-$(CONFIG_MPC85xx) += cpu.o +obj-$(CONFIG_MPC86xx) += cpu.o  obj-$(CONFIG_OF_LIBFDT) += fdt.o  obj-$(CONFIG_FSL_LBC) += fsl_lbc.o diff --git a/arch/powerpc/cpu/ppc4xx/config.mk b/arch/powerpc/cpu/ppc4xx/config.mk index c2b0f9aab..71c2a6c72 100644 --- a/arch/powerpc/cpu/ppc4xx/config.mk +++ b/arch/powerpc/cpu/ppc4xx/config.mk @@ -5,8 +5,7 @@  # SPDX-License-Identifier:	GPL-2.0+  # -PLATFORM_RELFLAGS += -meabi -PLATFORM_CPPFLAGS += -DCONFIG_4xx -ffixed-r2 -mstring -msoft-float +PLATFORM_CPPFLAGS += -DCONFIG_4xx -mstring -msoft-float  cfg=$(shell grep configs $(OBJTREE)/include/config.h | sed 's/.*<\(configs.*\)>/\1/')  is440:=$(shell grep CONFIG_440 $(TOPDIR)/include/$(cfg)) diff --git a/arch/powerpc/include/asm/config_mpc85xx.h b/arch/powerpc/include/asm/config_mpc85xx.h index 99e16bdf6..54ce2f053 100644 --- a/arch/powerpc/include/asm/config_mpc85xx.h +++ b/arch/powerpc/include/asm/config_mpc85xx.h @@ -711,7 +711,8 @@ defined(CONFIG_PPC_T1020) || defined(CONFIG_PPC_T1022)  #define CONFIG_FM_PLAT_CLK_DIV	1  #define CONFIG_SYS_FM1_CLK		CONFIG_FM_PLAT_CLK_DIV  #define CONFIG_SYS_FM_MURAM_SIZE	0x30000 -#define CONFIG_SYS_FSL_TBCLK_DIV	32 +#define CONFIG_SYS_FSL_SINGLE_SOURCE_CLK +#define CONFIG_SYS_FSL_TBCLK_DIV	16  #define CONFIG_SYS_FSL_PCIE_COMPAT	"fsl,qoriq-pcie-v2.4"  #define CONFIG_SYS_FSL_USB1_PHY_ENABLE  #define CONFIG_SYS_FSL_USB2_PHY_ENABLE @@ -745,7 +746,7 @@ defined(CONFIG_PPC_T1020) || defined(CONFIG_PPC_T1022)  #define CONFIG_SYS_NUM_FM1_DTSEC	6  #define CONFIG_SYS_NUM_FM1_10GEC	2  #endif -#define CONFIG_SYS_FSL_NUM_USB_CTRLS	2 +#define CONFIG_USB_MAX_CONTROLLER_COUNT 2  #define CONFIG_NUM_DDR_CONTROLLERS	1  #define CONFIG_PME_PLAT_CLK_DIV		1  #define CONFIG_SYS_PME_CLK		CONFIG_PME_PLAT_CLK_DIV diff --git a/arch/powerpc/include/asm/immap_85xx.h b/arch/powerpc/include/asm/immap_85xx.h index 672e8c665..68c3c8245 100644 --- a/arch/powerpc/include/asm/immap_85xx.h +++ b/arch/powerpc/include/asm/immap_85xx.h @@ -1774,6 +1774,9 @@ defined(CONFIG_PPC_T1020) || defined(CONFIG_PPC_T1022)  #define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S3_PLL2	0x00040000  #define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S4_PLL1	0x00020000  #define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S4_PLL2	0x00010000 +#define FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_SHIFT 4 +#define FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_MASK	0x00000011 +#define FSL_CORENET2_RCWSR5_DDR_REFCLK_SINGLE_CLK	1  #else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */  #define FSL_CORENET_RCWSR0_MEM_PLL_RAT_SHIFT	17 diff --git a/arch/powerpc/lib/bootm.c b/arch/powerpc/lib/bootm.c index e7153b048..41fc8f7ff 100644 --- a/arch/powerpc/lib/bootm.c +++ b/arch/powerpc/lib/bootm.c @@ -32,6 +32,7 @@ DECLARE_GLOBAL_DATA_PTR;  extern ulong get_effective_memsize(void);  static ulong get_sp (void); +extern void ft_fixup_num_cores(void *blob);  static void set_clocks_in_mhz (bd_t *kbd);  #ifndef CONFIG_SYS_LINUX_LOWMEM_MAX_SIZE @@ -277,3 +278,58 @@ static void set_clocks_in_mhz (bd_t *kbd)  #endif /* CONFIG_MPC5xxx */  	}  } + +#if defined(CONFIG_BOOTM_VXWORKS) +void boot_prep_vxworks(bootm_headers_t *images) +{ +#if defined(CONFIG_OF_LIBFDT) +	int off; +	u64 base, size; + +	if (!images->ft_addr) +		return; + +	base = (u64)gd->bd->bi_memstart; +	size = (u64)gd->bd->bi_memsize; + +	off = fdt_path_offset(images->ft_addr, "/memory"); +	if (off < 0) +		fdt_fixup_memory(images->ft_addr, base, size); + +#if defined(CONFIG_MP) +#if defined(CONFIG_MPC85xx) +	ft_fixup_cpu(images->ft_addr, base + size); +	ft_fixup_num_cores(images->ft_addr); +#elif defined(CONFIG_MPC86xx) +	off = fdt_add_mem_rsv(images->ft_addr, +			determine_mp_bootpg(NULL), (u64)4096); +	if (off < 0) +		printf("## WARNING %s: %s\n", __func__, fdt_strerror(off)); +	ft_fixup_num_cores(images->ft_addr); +#endif +	flush_cache((unsigned long)images->ft_addr, images->ft_len); +#endif +#endif +} + +void boot_jump_vxworks(bootm_headers_t *images) +{ +	/* PowerPC VxWorks boot interface conforms to the ePAPR standard +	 * general purpuse registers: +	 * +	 *	r3: Effective address of the device tree image +	 *	r4: 0 +	 *	r5: 0 +	 *	r6: ePAPR magic value +	 *	r7: shall be the size of the boot IMA in bytes +	 *	r8: 0 +	 *	r9: 0 +	 *	TCR: WRC = 0, no watchdog timer reset will occur +	 */ +	WATCHDOG_RESET(); + +	((void (*)(void *, ulong, ulong, ulong, +		ulong, ulong, ulong))images->ep)(images->ft_addr, +		0, 0, EPAPR_MAGIC, getenv_bootm_mapsize(), 0, 0); +} +#endif diff --git a/arch/sandbox/cpu/cpu.c b/arch/sandbox/cpu/cpu.c index cfc1fda1e..38019e0b4 100644 --- a/arch/sandbox/cpu/cpu.c +++ b/arch/sandbox/cpu/cpu.c @@ -5,13 +5,23 @@  #include <common.h>  #include <os.h> +#include <asm/state.h>  DECLARE_GLOBAL_DATA_PTR; -int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +void reset_cpu(ulong ignored)  { +	if (state_uninit()) +		os_exit(2); +  	/* This is considered normal termination for now */  	os_exit(0); +} + +int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	reset_cpu(0); +  	return 0;  } @@ -28,7 +38,14 @@ unsigned long __attribute__((no_instrument_function)) timer_get_us(void)  int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)  { -	return -1; +	if (flag & (BOOTM_STATE_OS_GO | BOOTM_STATE_OS_FAKE_GO)) { +		bootstage_mark(BOOTSTAGE_ID_RUN_OS); +		printf("## Transferring control to Linux (at address %08lx)...\n", +		       images->ep); +		reset_cpu(0); +	} + +	return 0;  }  int cleanup_before_linux(void) diff --git a/arch/sandbox/cpu/os.c b/arch/sandbox/cpu/os.c index 26f44cb59..725b50517 100644 --- a/arch/sandbox/cpu/os.c +++ b/arch/sandbox/cpu/os.c @@ -27,6 +27,10 @@  /* Operating System Interface */ +struct os_mem_hdr { +	size_t length;		/* number of bytes in the block */ +}; +  ssize_t os_read(int fd, void *buf, size_t count)  {  	return read(fd, buf, count); @@ -128,8 +132,45 @@ void os_tty_raw(int fd)  void *os_malloc(size_t length)  { -	return mmap(NULL, length, PROT_READ | PROT_WRITE, -			MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +	struct os_mem_hdr *hdr; + +	hdr = mmap(NULL, length + sizeof(*hdr), PROT_READ | PROT_WRITE, +		   MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +	if (hdr == MAP_FAILED) +		return NULL; +	hdr->length = length; + +	return hdr + 1; +} + +void *os_free(void *ptr) +{ +	struct os_mem_hdr *hdr = ptr; + +	hdr--; +	if (ptr) +		munmap(hdr, hdr->length + sizeof(*hdr)); +} + +void *os_realloc(void *ptr, size_t length) +{ +	struct os_mem_hdr *hdr = ptr; +	void *buf = NULL; + +	hdr--; +	if (length != 0) { +		buf = os_malloc(length); +		if (!buf) +			return buf; +		if (ptr) { +			if (length > hdr->length) +				length = hdr->length; +			memcpy(buf, ptr, length); +		} +	} +	os_free(ptr); + +	return buf;  }  void os_usleep(unsigned long usec) @@ -347,3 +388,53 @@ ssize_t os_get_filesize(const char *fname)  		return ret;  	return buf.st_size;  } + +void os_putc(int ch) +{ +	putchar(ch); +} + +void os_puts(const char *str) +{ +	while (*str) +		os_putc(*str++); +} + +int os_write_ram_buf(const char *fname) +{ +	struct sandbox_state *state = state_get_current(); +	int fd, ret; + +	fd = open(fname, O_CREAT | O_WRONLY, 0777); +	if (fd < 0) +		return -ENOENT; +	ret = write(fd, state->ram_buf, state->ram_size); +	close(fd); +	if (ret != state->ram_size) +		return -EIO; + +	return 0; +} + +int os_read_ram_buf(const char *fname) +{ +	struct sandbox_state *state = state_get_current(); +	int fd, ret; +	int size; + +	size = os_get_filesize(fname); +	if (size < 0) +		return -ENOENT; +	if (size != state->ram_size) +		return -ENOSPC; +	fd = open(fname, O_RDONLY); +	if (fd < 0) +		return -ENOENT; + +	ret = read(fd, state->ram_buf, state->ram_size); +	close(fd); +	if (ret != state->ram_size) +		return -EIO; + +	return 0; +} diff --git a/arch/sandbox/cpu/start.c b/arch/sandbox/cpu/start.c index 1b1545478..1df21d49f 100644 --- a/arch/sandbox/cpu/start.c +++ b/arch/sandbox/cpu/start.c @@ -4,11 +4,12 @@   */  #include <common.h> +#include <os.h>  #include <asm/getopt.h>  #include <asm/sections.h>  #include <asm/state.h> -#include <os.h> +DECLARE_GLOBAL_DATA_PTR;  int sandbox_early_getopt_check(void)  { @@ -50,9 +51,9 @@ int sandbox_early_getopt_check(void)  		/* then the long flag */  		if (opt->has_arg) -			printf("--%-*s", max_noarg_len, opt->flag); -		else  			printf("--%-*s <arg> ", max_arg_len, opt->flag); +		else +			printf("--%-*s", max_noarg_len, opt->flag);  		/* finally the help text */  		printf("  %s\n", opt->help); @@ -75,7 +76,8 @@ int sandbox_main_loop_init(void)  	/* Execute command if required */  	if (state->cmd) {  		run_command_list(state->cmd, -1, 0); -		os_exit(state->exit_type); +		if (!state->interactive) +			os_exit(state->exit_type);  	}  	return 0; @@ -96,25 +98,93 @@ static int sandbox_cmdline_cb_fdt(struct sandbox_state *state, const char *arg)  }  SANDBOX_CMDLINE_OPT_SHORT(fdt, 'd', 1, "Specify U-Boot's control FDT"); -int main(int argc, char *argv[]) +static int sandbox_cmdline_cb_interactive(struct sandbox_state *state, +					  const char *arg) +{ +	state->interactive = true; +	return 0; +} + +SANDBOX_CMDLINE_OPT_SHORT(interactive, 'i', 0, "Enter interactive mode"); + +static int sandbox_cmdline_cb_memory(struct sandbox_state *state, +				     const char *arg)  { -	struct sandbox_state *state;  	int err; -	err = state_init(); -	if (err) +	/* For now assume we always want to write it */ +	state->write_ram_buf = true; +	state->ram_buf_fname = arg; + +	if (os_read_ram_buf(arg)) { +		printf("Failed to read RAM buffer\n");  		return err; +	} + +	return 0; +} +SANDBOX_CMDLINE_OPT_SHORT(memory, 'm', 1, +			  "Read/write ram_buf memory contents from file"); + +static int sandbox_cmdline_cb_state(struct sandbox_state *state, +				    const char *arg) +{ +	state->state_fname = arg; +	return 0; +} +SANDBOX_CMDLINE_OPT_SHORT(state, 's', 1, "Specify the sandbox state FDT"); + +static int sandbox_cmdline_cb_read(struct sandbox_state *state, +				   const char *arg) +{ +	state->read_state = true; +	return 0; +} +SANDBOX_CMDLINE_OPT_SHORT(read, 'r', 0, "Read the state FDT on startup"); + +static int sandbox_cmdline_cb_write(struct sandbox_state *state, +				    const char *arg) +{ +	state->write_state = true; +	return 0; +} +SANDBOX_CMDLINE_OPT_SHORT(write, 'w', 0, "Write state FDT on exit"); + +static int sandbox_cmdline_cb_ignore_missing(struct sandbox_state *state, +					     const char *arg) +{ +	state->ignore_missing_state_on_read = true; +	return 0; +} +SANDBOX_CMDLINE_OPT_SHORT(ignore_missing, 'n', 0, +			  "Ignore missing state on read"); + +int main(int argc, char *argv[]) +{ +	struct sandbox_state *state; +	int ret; + +	ret = state_init(); +	if (ret) +		goto err;  	state = state_get_current();  	if (os_parse_args(state, argc, argv))  		return 1; -	/* -	 * Do pre- and post-relocation init, then start up U-Boot. This will -	 * never return. -	 */ +	ret = sandbox_read_state(state, state->state_fname); +	if (ret) +		goto err; + +	/* Do pre- and post-relocation init */  	board_init_f(0); -	/* NOTREACHED - board_init_f() does not return */ +	board_init_r(gd->new_gd, 0); + +	/* NOTREACHED - board_init_r() does not return */  	return 0; + +err: +	printf("Error %d\n", ret); +	return 1;  } diff --git a/arch/sandbox/cpu/state.c b/arch/sandbox/cpu/state.c index 56d504141..a145808a5 100644 --- a/arch/sandbox/cpu/state.c +++ b/arch/sandbox/cpu/state.c @@ -4,6 +4,9 @@   */  #include <common.h> +#include <errno.h> +#include <fdtdec.h> +#include <os.h>  #include <asm/state.h>  /* Main state record for the sandbox */ @@ -15,6 +18,324 @@ void state_record_exit(enum exit_type_id exit_type)  	state->exit_type = exit_type;  } +static int state_ensure_space(int extra_size) +{ +	void *blob = state->state_fdt; +	int used, size, free; +	void *buf; +	int ret; + +	used = fdt_off_dt_strings(blob) + fdt_size_dt_strings(blob); +	size = fdt_totalsize(blob); +	free = size - used; +	if (free > extra_size) +		return 0; + +	size = used + extra_size; +	buf = os_malloc(size); +	if (!buf) +		return -ENOMEM; + +	ret = fdt_open_into(blob, buf, size); +	if (ret) { +		os_free(buf); +		return -EIO; +	} + +	os_free(blob); +	state->state_fdt = buf; +	return 0; +} + +static int state_read_file(struct sandbox_state *state, const char *fname) +{ +	int size; +	int ret; +	int fd; + +	size = os_get_filesize(fname); +	if (size < 0) { +		printf("Cannot find sandbox state file '%s'\n", fname); +		return -ENOENT; +	} +	state->state_fdt = os_malloc(size); +	if (!state->state_fdt) { +		puts("No memory to read sandbox state\n"); +		return -ENOMEM; +	} +	fd = os_open(fname, OS_O_RDONLY); +	if (fd < 0) { +		printf("Cannot open sandbox state file '%s'\n", fname); +		ret = -EPERM; +		goto err_open; +	} +	if (os_read(fd, state->state_fdt, size) != size) { +		printf("Cannot read sandbox state file '%s'\n", fname); +		ret = -EIO; +		goto err_read; +	} +	os_close(fd); + +	return 0; +err_read: +	os_close(fd); +err_open: +	os_free(state->state_fdt); +	state->state_fdt = NULL; + +	return ret; +} + +/*** + * sandbox_read_state_nodes() - Read state associated with a driver + * + * This looks through all compatible nodes and calls the read function on + * each one, to read in the state. + * + * If nothing is found, it still calls the read function once, to set up a + * single global state for that driver. + * + * @state: Sandbox state + * @io: Method to use for reading state + * @blob: FDT containing state + * @return 0 if OK, -EINVAL if the read function returned failure + */ +int sandbox_read_state_nodes(struct sandbox_state *state, +			     struct sandbox_state_io *io, const void *blob) +{ +	int count; +	int node; +	int ret; + +	debug("   - read %s\n", io->name); +	if (!io->read) +		return 0; + +	node = -1; +	count = 0; +	while (blob) { +		node = fdt_node_offset_by_compatible(blob, node, io->compat); +		if (node < 0) +			return 0;	/* No more */ +		debug("   - read node '%s'\n", fdt_get_name(blob, node, NULL)); +		ret = io->read(blob, node); +		if (ret) { +			printf("Unable to read state for '%s'\n", io->compat); +			return -EINVAL; +		} +		count++; +	} + +	/* +	 * If we got no saved state, call the read function once without a +	 * node, to set up the global state. +	 */ +	if (count == 0) { +		debug("   - read global\n"); +		ret = io->read(NULL, -1); +		if (ret) { +			printf("Unable to read global state for '%s'\n", +			       io->name); +			return -EINVAL; +		} +	} + +	return 0; +} + +int sandbox_read_state(struct sandbox_state *state, const char *fname) +{ +	struct sandbox_state_io *io; +	const void *blob; +	bool got_err; +	int ret; + +	if (state->read_state && fname) { +		ret = state_read_file(state, fname); +		if (ret == -ENOENT && state->ignore_missing_state_on_read) +			ret = 0; +		if (ret) +			return ret; +	} + +	/* Call all the state read funtcions */ +	got_err = false; +	blob = state->state_fdt; +	io = ll_entry_start(struct sandbox_state_io, state_io); +	for (; io < ll_entry_end(struct sandbox_state_io, state_io); io++) { +		ret = sandbox_read_state_nodes(state, io, blob); +		if (ret < 0) +			got_err = true; +	} + +	if (state->read_state && fname) { +		debug("Read sandbox state from '%s'%s\n", fname, +		      got_err ? " (with errors)" : ""); +	} + +	return got_err ? -1 : 0; +} + +/*** + * sandbox_write_state_node() - Write state associated with a driver + * + * This calls the write function to write out global state for that driver. + * + * TODO(sjg@chromium.org): Support writing out state from multiple drivers + * of the same time. We don't need this yet,and it will be much easier to + * do when driver model is available. + * + * @state: Sandbox state + * @io: Method to use for writing state + * @return 0 if OK, -EIO if there is a fatal error (such as out of space + * for adding the data), -EINVAL if the write function failed. + */ +int sandbox_write_state_node(struct sandbox_state *state, +			     struct sandbox_state_io *io) +{ +	void *blob; +	int node; +	int ret; + +	if (!io->write) +		return 0; + +	ret = state_ensure_space(SANDBOX_STATE_MIN_SPACE); +	if (ret) { +		printf("Failed to add more space for state\n"); +		return -EIO; +	} + +	/* The blob location can change when the size increases */ +	blob = state->state_fdt; +	node = fdt_node_offset_by_compatible(blob, -1, io->compat); +	if (node == -FDT_ERR_NOTFOUND) { +		node = fdt_add_subnode(blob, 0, io->name); +		if (node < 0) { +			printf("Cannot create node '%s': %s\n", io->name, +			       fdt_strerror(node)); +			return -EIO; +		} + +		if (fdt_setprop_string(blob, node, "compatible", io->compat)) { +			puts("Cannot set compatible\n"); +			return -EIO; +		} +	} else if (node < 0) { +		printf("Cannot access node '%s': %s\n", io->name, +		       fdt_strerror(node)); +		return -EIO; +	} +	debug("Write state for '%s' to node %d\n", io->compat, node); +	ret = io->write(blob, node); +	if (ret) { +		printf("Unable to write state for '%s'\n", io->compat); +		return -EINVAL; +	} + +	return 0; +} + +int sandbox_write_state(struct sandbox_state *state, const char *fname) +{ +	struct sandbox_state_io *io; +	bool got_err; +	int size; +	int ret; +	int fd; + +	/* Create a state FDT if we don't have one */ +	if (!state->state_fdt) { +		size = 0x4000; +		state->state_fdt = os_malloc(size); +		if (!state->state_fdt) { +			puts("No memory to create FDT\n"); +			return -ENOMEM; +		} +		ret = fdt_create_empty_tree(state->state_fdt, size); +		if (ret < 0) { +			printf("Cannot create empty state FDT: %s\n", +			       fdt_strerror(ret)); +			ret = -EIO; +			goto err_create; +		} +	} + +	/* Call all the state write funtcions */ +	got_err = false; +	io = ll_entry_start(struct sandbox_state_io, state_io); +	ret = 0; +	for (; io < ll_entry_end(struct sandbox_state_io, state_io); io++) { +		ret = sandbox_write_state_node(state, io); +		if (ret == -EIO) +			break; +		else if (ret) +			got_err = true; +	} + +	if (ret == -EIO) { +		printf("Could not write sandbox state\n"); +		goto err_create; +	} + +	ret = fdt_pack(state->state_fdt); +	if (ret < 0) { +		printf("Cannot pack state FDT: %s\n", fdt_strerror(ret)); +		ret = -EINVAL; +		goto err_create; +	} +	size = fdt_totalsize(state->state_fdt); +	fd = os_open(fname, OS_O_WRONLY | OS_O_CREAT); +	if (fd < 0) { +		printf("Cannot open sandbox state file '%s'\n", fname); +		ret = -EIO; +		goto err_create; +	} +	if (os_write(fd, state->state_fdt, size) != size) { +		printf("Cannot write sandbox state file '%s'\n", fname); +		ret = -EIO; +		goto err_write; +	} +	os_close(fd); + +	debug("Wrote sandbox state to '%s'%s\n", fname, +	      got_err ? " (with errors)" : ""); + +	return 0; +err_write: +	os_close(fd); +err_create: +	os_free(state->state_fdt); + +	return ret; +} + +int state_setprop(int node, const char *prop_name, const void *data, int size) +{ +	void *blob; +	int len; +	int ret; + +	fdt_getprop(state->state_fdt, node, prop_name, &len); + +	/* Add space for the new property, its name and some overhead */ +	ret = state_ensure_space(size - len + strlen(prop_name) + 32); +	if (ret) +		return ret; + +	/* This should succeed, barring a mutiny */ +	blob = state->state_fdt; +	ret = fdt_setprop(blob, node, prop_name, data, size); +	if (ret) { +		printf("%s: Unable to set property '%s' in node '%s': %s\n", +		       __func__, prop_name, fdt_get_name(blob, node, NULL), +			fdt_strerror(ret)); +		return -ENOSPC; +	} + +	return 0; +} +  struct sandbox_state *state_get_current(void)  {  	assert(state); @@ -25,6 +346,10 @@ int state_init(void)  {  	state = &main_state; +	state->ram_size = CONFIG_SYS_SDRAM_SIZE; +	state->ram_buf = os_malloc(state->ram_size); +	assert(state->ram_buf); +  	/*  	 * Example of how to use GPIOs:  	 * @@ -33,3 +358,31 @@ int state_init(void)  	 */  	return 0;  } + +int state_uninit(void) +{ +	int err; + +	state = &main_state; + +	if (state->write_ram_buf) { +		err = os_write_ram_buf(state->ram_buf_fname); +		if (err) { +			printf("Failed to write RAM buffer\n"); +			return err; +		} +	} + +	if (state->write_state) { +		if (sandbox_write_state(state, state->state_fname)) { +			printf("Failed to write sandbox state\n"); +			return -1; +		} +	} + +	if (state->state_fdt) +		os_free(state->state_fdt); +	memset(state, '\0', sizeof(*state)); + +	return 0; +} diff --git a/arch/sandbox/include/asm/global_data.h b/arch/sandbox/include/asm/global_data.h index d70532aa4..b2e9b488f 100644 --- a/arch/sandbox/include/asm/global_data.h +++ b/arch/sandbox/include/asm/global_data.h @@ -12,7 +12,7 @@  /* Architecture-specific global data */  struct arch_global_data { -	u8		*ram_buf;	/* emulated RAM buffer */ +	uint8_t		*ram_buf;	/* emulated RAM buffer */  };  #include <asm-generic/global_data.h> diff --git a/arch/sandbox/include/asm/state.h b/arch/sandbox/include/asm/state.h index a38820bde..e8e4fea1b 100644 --- a/arch/sandbox/include/asm/state.h +++ b/arch/sandbox/include/asm/state.h @@ -7,6 +7,8 @@  #define __SANDBOX_STATE_H  #include <config.h> +#include <stdbool.h> +#include <linux/stringify.h>  /* How we exited U-Boot */  enum exit_type_id { @@ -23,17 +25,92 @@ struct sandbox_spi_info {  /* The complete state of the test system */  struct sandbox_state {  	const char *cmd;		/* Command to execute */ +	bool interactive;		/* Enable cmdline after execute */  	const char *fdt_fname;		/* Filename of FDT binary */  	enum exit_type_id exit_type;	/* How we exited U-Boot */  	const char *parse_err;		/* Error to report from parsing */  	int argc;			/* Program arguments */  	char **argv; +	uint8_t *ram_buf;		/* Emulated RAM buffer */ +	unsigned int ram_size;		/* Size of RAM buffer */ +	const char *ram_buf_fname;	/* Filename to use for RAM buffer */ +	bool write_ram_buf;		/* Write RAM buffer on exit */ +	const char *state_fname;	/* File containing sandbox state */ +	void *state_fdt;		/* Holds saved state for sandbox */ +	bool read_state;		/* Read sandbox state on startup */ +	bool write_state;		/* Write sandbox state on exit */ +	bool ignore_missing_state_on_read;	/* No error if state missing */  	/* Pointer to information for each SPI bus/cs */  	struct sandbox_spi_info spi[CONFIG_SANDBOX_SPI_MAX_BUS]  					[CONFIG_SANDBOX_SPI_MAX_CS];  }; +/* Minimum space we guarantee in the state FDT when calling read/write*/ +#define SANDBOX_STATE_MIN_SPACE		0x1000 + +/** + * struct sandbox_state_io - methods to saved/restore sandbox state + * @name: Name of of the device tree node, also the name of the variable + *	holding this data so it should be an identifier (use underscore + *	instead of minus) + * @compat: Compatible string for the node containing this state + * + * @read: Function to read state from FDT + *	If data is available, then blob and node will provide access to it. If + *	not (blob == NULL and node == -1) this function should set up an empty + *	data set for start-of-day. + *	@param blob: Pointer to device tree blob, or NULL if no data to read + *	@param node: Node offset to read from + *	@return 0 if OK, -ve on error + * + * @write: Function to write state to FDT + *	The caller will ensure that there is a node ready for the state. The + *	node may already contain the old state, in which case it should be + *	overridden. There is guaranteed to be SANDBOX_STATE_MIN_SPACE bytes + *	of free space, so error checking is not required for fdt_setprop...() + *	calls which add up to less than this much space. + * + *	For adding larger properties, use state_setprop(). + * + * @param blob: Device tree blob holding state + * @param node: Node to write our state into + * + * Note that it is possible to save data as large blobs or as individual + * hierarchical properties. However, unless you intend to keep state files + * around for a long time and be able to run an old state file on a new + * sandbox, it might not be worth using individual properties for everything. + * This is certainly supported, it is just a matter of the effort you wish + * to put into the state read/write feature. + */ +struct sandbox_state_io { +	const char *name; +	const char *compat; +	int (*write)(void *blob, int node); +	int (*read)(const void *blob, int node); +}; + +/** + * SANDBOX_STATE_IO - Declare sandbox state to read/write + * + * Sandbox permits saving state from one run and restoring it in another. This + * allows the test system to retain state between runs and thus better + * emulate a real system. Examples of state that might be useful to save are + * the emulated GPIOs pin settings, flash memory contents and TPM private + * data. U-Boot memory contents is dealth with separately since it is large + * and it is not normally useful to save it (since a normal system does not + * preserve DRAM between runs). See the '-m' option for this. + * + * See struct sandbox_state_io above for member documentation. + */ +#define SANDBOX_STATE_IO(_name, _compat, _read, _write) \ +	ll_entry_declare(struct sandbox_state_io, _name, state_io) = { \ +		.name = __stringify(_name), \ +		.read = _read, \ +		.write = _write, \ +		.compat = _compat, \ +	} +  /**   * Record the exit type to be reported by the test program.   * @@ -49,8 +126,59 @@ void state_record_exit(enum exit_type_id exit_type);  struct sandbox_state *state_get_current(void);  /** + * Read the sandbox state from the supplied device tree file + * + * This calls all registered state handlers to read in the sandbox state + * from a previous test run. + * + * @param state		Sandbox state to update + * @param fname		Filename of device tree file to read from + * @return 0 if OK, -ve on error + */ +int sandbox_read_state(struct sandbox_state *state, const char *fname); + +/** + * Write the sandbox state to the supplied device tree file + * + * This calls all registered state handlers to write out the sandbox state + * so that it can be preserved for a future test run. + * + * If the file exists it is overwritten. + * + * @param state		Sandbox state to update + * @param fname		Filename of device tree file to write to + * @return 0 if OK, -ve on error + */ +int sandbox_write_state(struct sandbox_state *state, const char *fname); + +/** + * Add a property to a sandbox state node + * + * This is equivalent to fdt_setprop except that it automatically enlarges + * the device tree if necessary. That means it is safe to write any amount + * of data here. + * + * This function can only be called from within struct sandbox_state_io's + * ->write method, i.e. within state I/O drivers. + * + * @param node		Device tree node to write to + * @param prop_name	Property to write + * @param data		Data to write into property + * @param size		Size of data to write into property + */ +int state_setprop(int node, const char *prop_name, const void *data, int size); + +/**   * Initialize the test system state   */  int state_init(void); +/** + * Uninitialize the test system state, writing out state if configured to + * do so. + * + * @return 0 if OK, -ve on error + */ +int state_uninit(void); +  #endif diff --git a/arch/sandbox/include/asm/u-boot-sandbox.h b/arch/sandbox/include/asm/u-boot-sandbox.h index bed720cf8..5707c2710 100644 --- a/arch/sandbox/include/asm/u-boot-sandbox.h +++ b/arch/sandbox/include/asm/u-boot-sandbox.h @@ -23,4 +23,6 @@ int dram_init(void);  int sandbox_early_getopt_check(void);  int sandbox_main_loop_init(void); +int cleanup_before_linux(void); +  #endif	/* _U_BOOT_SANDBOX_H_ */ diff --git a/arch/sh/cpu/sh2/config.mk b/arch/sh/cpu/sh2/config.mk index 8a0de9671..69273b4f3 100644 --- a/arch/sh/cpu/sh2/config.mk +++ b/arch/sh/cpu/sh2/config.mk @@ -12,7 +12,7 @@ PLATFORM_CPPFLAGS += -m2a -m2a-nofpu -mb -ffreestanding  else # SH2  PLATFORM_CPPFLAGS += -m3e -mb  endif -PLATFORM_CPPFLAGS += $(call cc-option,-mno-fdpic) +PLATFORM_CPPFLAGS += -DCONFIG_SH2 $(call cc-option,-mno-fdpic)  PLATFORM_RELFLAGS += -ffixed-r13  PLATFORM_LDFLAGS += $(ENDIANNESS) diff --git a/arch/sh/cpu/sh2/cpu.c b/arch/sh/cpu/sh2/cpu.c index 18479a4c4..a2f856f45 100644 --- a/arch/sh/cpu/sh2/cpu.c +++ b/arch/sh/cpu/sh2/cpu.c @@ -23,11 +23,7 @@  int checkcpu(void)  { -#if defined(CONFIG_SH2A) -	puts("CPU: SH2A\n"); -#else  	puts("CPU: SH2\n"); -#endif  	return 0;  } diff --git a/arch/sh/cpu/sh3/config.mk b/arch/sh/cpu/sh3/config.mk index 5c77e5c32..abd4b8d2b 100644 --- a/arch/sh/cpu/sh3/config.mk +++ b/arch/sh/cpu/sh3/config.mk @@ -11,5 +11,5 @@  # SPDX-License-Identifier:	GPL-2.0+  #  # -PLATFORM_CPPFLAGS += -m3 +PLATFORM_CPPFLAGS += -DCONFIG_SH3 -m3  PLATFORM_RELFLAGS += -ffixed-r13 diff --git a/arch/sh/cpu/sh4/config.mk b/arch/sh/cpu/sh4/config.mk index c3575570e..753580beb 100644 --- a/arch/sh/cpu/sh4/config.mk +++ b/arch/sh/cpu/sh4/config.mk @@ -8,5 +8,5 @@  # SPDX-License-Identifier:	GPL-2.0+  #  # -PLATFORM_CPPFLAGS += -m4-nofpu +PLATFORM_CPPFLAGS += -DCONFIG_SH4 -m4-nofpu  PLATFORM_RELFLAGS += -ffixed-r13 diff --git a/arch/sh/cpu/sh4/cpu.c b/arch/sh/cpu/sh4/cpu.c index 91133a38a..e8ee0a45a 100644 --- a/arch/sh/cpu/sh4/cpu.c +++ b/arch/sh/cpu/sh4/cpu.c @@ -13,11 +13,7 @@  int checkcpu(void)  { -#ifdef CONFIG_SH4A -	puts("CPU: SH-4A\n"); -#else  	puts("CPU: SH4\n"); -#endif  	return 0;  } diff --git a/arch/sh/include/asm/cache.h b/arch/sh/include/asm/cache.h index b21dc4422..0698a3775 100644 --- a/arch/sh/include/asm/cache.h +++ b/arch/sh/include/asm/cache.h @@ -1,7 +1,7 @@  #ifndef __ASM_SH_CACHE_H  #define __ASM_SH_CACHE_H -#if defined(CONFIG_SH4) || defined(CONFIG_SH4A) +#if defined(CONFIG_SH4)  int cache_control(unsigned int cmd); @@ -18,7 +18,7 @@ struct __large_struct { unsigned long buf[100]; };   */  #define ARCH_DMA_MINALIGN	32 -#endif /* CONFIG_SH4 || CONFIG_SH4A */ +#endif /* CONFIG_SH4 */  /*   * Use the L1 data cache line size value for the minimum DMA buffer alignment diff --git a/arch/sh/include/asm/cpu_sh4.h b/arch/sh/include/asm/cpu_sh4.h index 9181d59a9..9f48e4fe0 100644 --- a/arch/sh/include/asm/cpu_sh4.h +++ b/arch/sh/include/asm/cpu_sh4.h @@ -37,6 +37,8 @@  # include <asm/cpu_sh7734.h>  #elif defined (CONFIG_CPU_SH7752)  # include <asm/cpu_sh7752.h> +#elif defined (CONFIG_CPU_SH7753) +# include <asm/cpu_sh7753.h>  #elif defined (CONFIG_CPU_SH7757)  # include <asm/cpu_sh7757.h>  #elif defined (CONFIG_CPU_SH7763) diff --git a/arch/sh/include/asm/cpu_sh7753.h b/arch/sh/include/asm/cpu_sh7753.h new file mode 100644 index 000000000..cd0e0bba6 --- /dev/null +++ b/arch/sh/include/asm/cpu_sh7753.h @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2012  Renesas Solutions Corp. + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _ASM_CPU_SH7753_H_ +#define _ASM_CPU_SH7753_H_ + +#define CCR		0xFF00001C +#define WTCNT		0xFFCC0000 +#define CCR_CACHE_INIT	0x0000090b +#define CACHE_OC_NUM_WAYS	1 + +#ifndef __ASSEMBLY__		/* put C only stuff in this section */ +/* MMU */ +struct mmu_regs { +	unsigned int	reserved[4]; +	unsigned int	mmucr; +}; +#define MMU_BASE	((struct mmu_regs *)0xff000000) + +/* Watchdog */ +#define WTCSR0		0xffcc0002 +#define WRSTCSR_R	0xffcc0003 +#define WRSTCSR_W	0xffcc0002 +#define WTCSR_PREFIX		0xa500 +#define WRSTCSR_PREFIX		0x6900 +#define WRSTCSR_WOVF_PREFIX	0x9600 + +/* SCIF */ +#define SCIF0_BASE	0xfe4b0000	/* The real name is SCIF2 */ +#define SCIF1_BASE	0xfe4c0000	/* The real name is SCIF3 */ +#define SCIF2_BASE	0xfe4d0000	/* The real name is SCIF4 */ + +/* TMU0 */ +#define TMU_BASE	 0xFE430000 + +/* ETHER, GETHER MAC address */ +struct ether_mac_regs { +	unsigned int	reserved[114]; +	unsigned int	mahr; +	unsigned int	reserved2; +	unsigned int	malr; +}; +#define GETHER0_MAC_BASE	((struct ether_mac_regs *)0xfee0400) +#define GETHER1_MAC_BASE	((struct ether_mac_regs *)0xfee0c00) +#define ETHER0_MAC_BASE		((struct ether_mac_regs *)0xfef0000) +#define ETHER1_MAC_BASE		((struct ether_mac_regs *)0xfef0800) + +/* GETHER */ +struct gether_control_regs { +	unsigned int	gbecont; +}; +#define GETHER_CONTROL_BASE	((struct gether_control_regs *)0xffc10100) +#define GBECONT_RMII1		0x00020000 +#define GBECONT_RMII0		0x00010000 + +/* SerMux */ +struct sermux_regs { +	unsigned char	smr0; +	unsigned char	smr1; +	unsigned char	smr2; +	unsigned char	smr3; +	unsigned char	smr4; +	unsigned char	smr5; +}; +#define SERMUX_BASE	((struct sermux_regs *)0xfe470000) + + +/* USB0/1 */ +struct usb_common_regs { +	unsigned short	reserved[129]; +	unsigned short	suspmode; +}; +#define USB0_COMMON_BASE	((struct usb_common_regs *)0xfe450000) +#define USB1_COMMON_BASE	((struct usb_common_regs *)0xfe4f0000) + +struct usb0_phy_regs { +	unsigned short	reset; +	unsigned short	reserved[4]; +	unsigned short	portsel; +}; +#define USB0_PHY_BASE		((struct usb0_phy_regs *)0xfe5f0000) + +struct usb1_port_regs { +	unsigned int	port1sel; +	unsigned int	reserved; +	unsigned int	usb1intsts; +}; +#define USB1_PORT_BASE		((struct usb1_port_regs *)0xfe4f2000) + +struct usb1_alignment_regs { +	unsigned int	ehcidatac;	/* 0xfe4fe018 */ +	unsigned int	reserved[63]; +	unsigned int	ohcidatac; +}; +#define USB1_ALIGNMENT_BASE	((struct usb1_alignment_regs *)0xfe4fe018) + +/* GPIO */ +struct gpio_regs { +	unsigned short	pacr; +	unsigned short	pbcr; +	unsigned short	pccr; +	unsigned short	pdcr; +	unsigned short	pecr; +	unsigned short	pfcr; +	unsigned short	pgcr; +	unsigned short	phcr; +	unsigned short	picr; +	unsigned short	pjcr; +	unsigned short	pkcr; +	unsigned short	plcr; +	unsigned short	pmcr; +	unsigned short	pncr; +	unsigned short	pocr; +	unsigned short	reserved; +	unsigned short	pqcr; +	unsigned short	prcr; +	unsigned short	pscr; +	unsigned short	ptcr; +	unsigned short	pucr; +	unsigned short	pvcr; +	unsigned short	pwcr; +	unsigned short	pxcr; +	unsigned short	pycr; +	unsigned short	pzcr; +	unsigned char	padr; +	unsigned char	reserved_a; +	unsigned char	pbdr; +	unsigned char	reserved_b; +	unsigned char	pcdr; +	unsigned char	reserved_c; +	unsigned char	pddr; +	unsigned char	reserved_d; +	unsigned char	pedr; +	unsigned char	reserved_e; +	unsigned char	pfdr; +	unsigned char	reserved_f; +	unsigned char	pgdr; +	unsigned char	reserved_g; +	unsigned char	phdr; +	unsigned char	reserved_h; +	unsigned char	pidr; +	unsigned char	reserved_i; +	unsigned char	pjdr; +	unsigned char	reserved_j; +	unsigned char	pkdr; +	unsigned char	reserved_k; +	unsigned char	pldr; +	unsigned char	reserved_l; +	unsigned char	pmdr; +	unsigned char	reserved_m; +	unsigned char	pndr; +	unsigned char	reserved_n; +	unsigned char	podr; +	unsigned char	reserved_o; +	unsigned char	ppdr; +	unsigned char	reserved_p; +	unsigned char	pqdr; +	unsigned char	reserved_q; +	unsigned char	prdr; +	unsigned char	reserved_r; +	unsigned char	psdr; +	unsigned char	reserved_s; +	unsigned char	ptdr; +	unsigned char	reserved_t; +	unsigned char	pudr; +	unsigned char	reserved_u; +	unsigned char	pvdr; +	unsigned char	reserved_v; +	unsigned char	pwdr; +	unsigned char	reserved_w; +	unsigned char	pxdr; +	unsigned char	reserved_x; +	unsigned char	pydr; +	unsigned char	reserved_y; +	unsigned char	pzdr; +	unsigned char	reserved_z; +	unsigned short	ncer; +	unsigned short	ncmcr; +	unsigned short	nccsr; +	unsigned char	reserved2[2]; +	unsigned short	psel0;		/* +0x70 */ +	unsigned short	psel1; +	unsigned short	psel2; +	unsigned short	psel3; +	unsigned short	psel4; +	unsigned short	psel5; +	unsigned short	psel6; +	unsigned short	reserved3[2]; +	unsigned short	psel7; +}; +#define GPIO_BASE	((struct gpio_regs *)0xffec0000) + +#endif	/* ifndef __ASSEMBLY__ */ +#endif	/* _ASM_CPU_SH7753_H_ */ diff --git a/arch/sh/include/asm/processor.h b/arch/sh/include/asm/processor.h index 938a89cff..b8677da95 100644 --- a/arch/sh/include/asm/processor.h +++ b/arch/sh/include/asm/processor.h @@ -1,12 +1,10 @@  #ifndef _ASM_SH_PROCESSOR_H_  #define _ASM_SH_PROCESSOR_H_ -#if defined(CONFIG_SH2) || \ -	defined (CONFIG_SH2A) +#if defined(CONFIG_SH2)  # include <asm/cpu_sh2.h> -#elif defined (CONFIG_SH3) +#elif defined(CONFIG_SH3)  # include <asm/cpu_sh3.h> -#elif defined (CONFIG_SH4) || \ -	defined (CONFIG_SH4A) +#elif defined(CONFIG_SH4)  # include <asm/cpu_sh4.h>  #endif  #endif diff --git a/arch/sh/lib/time_sh2.c b/arch/sh/lib/time_sh2.c index be3896c3e..4b1f47b6a 100644 --- a/arch/sh/lib/time_sh2.c +++ b/arch/sh/lib/time_sh2.c @@ -84,5 +84,5 @@ void __udelay(unsigned long usec)  unsigned long get_tbclk(void)  { -	return CONFIG_SYS_HZ; +	return CONFIG_SH_CMT_CLK_FREQ;  } |