Initial commit
This commit is contained in:
		
							
								
								
									
										36
									
								
								package/boot/uboot-oxnas/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								package/boot/uboot-oxnas/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| # | ||||
| # Copyright (C) 2012 OpenWrt.org | ||||
| # | ||||
| # This is free software, licensed under the GNU General Public License v2. | ||||
| # See /LICENSE for more information. | ||||
| # | ||||
|  | ||||
| include $(TOPDIR)/rules.mk | ||||
| include $(INCLUDE_DIR)/kernel.mk | ||||
|  | ||||
| PKG_VERSION:=2014.10 | ||||
| PKG_RELEASE:=1 | ||||
|  | ||||
| PKG_HASH:=d3b132a7a9b3f3182b7aad71c2dfbd4fc15bea83e12c76134eb3ffefc07d1c71 | ||||
|  | ||||
| include $(INCLUDE_DIR)/u-boot.mk | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| define U-Boot/Default | ||||
|   BUILD_TARGET:=oxnas | ||||
|   BUILD_DEVICES:=Default | ||||
|   HIDDEN:=y | ||||
| endef | ||||
|  | ||||
| define U-Boot/ox820 | ||||
|   NAME:=Oxford/PLX NAS7820 | ||||
| endef | ||||
|  | ||||
| UBOOT_TARGETS:=ox820 | ||||
|  | ||||
| define Build/InstallDev | ||||
| 	$(INSTALL_DIR) $(STAGING_DIR_IMAGE) | ||||
| 	$(CP) $(PKG_BUILD_DIR)/u-boot.bin $(STAGING_DIR_IMAGE)/u-boot.bin | ||||
| endef | ||||
|  | ||||
| $(eval $(call BuildPackage/U-Boot)) | ||||
| @@ -0,0 +1,37 @@ | ||||
| From df9fb90120423c4c55b66a5dc09af23f605a406b Mon Sep 17 00:00:00 2001 | ||||
| From: Daniel Golle <daniel@makrotopia.org> | ||||
| Date: Mon, 1 Dec 2014 21:37:25 +0100 | ||||
| Subject: [PATCH] disk/part.c: use unsigned format when printing capacity | ||||
| To: u-boot@lists.denx.de | ||||
|  | ||||
| Large disks otherwise produce highly unplausible output such as | ||||
|         Capacity: 1907729.0 MB = 1863.0 GB (-387938128 x 512) | ||||
|  | ||||
| As supposedly all size-related decimals are unsigned, use unsigned | ||||
| format in printf statement, resulting in a correct capacity being | ||||
| displayed: | ||||
|         Capacity: 1907729.0 MB = 1863.0 GB (3907029168 x 512) | ||||
|  | ||||
| Signed-off-by: Daniel Golle <daniel@makrotopia.org> | ||||
| --- | ||||
|  disk/part.c | 4 ++-- | ||||
|  1 file changed, 2 insertions(+), 2 deletions(-) | ||||
|  | ||||
| --- a/disk/part.c | ||||
| +++ b/disk/part.c | ||||
| @@ -229,13 +229,13 @@ void dev_print (block_dev_desc_t *dev_de | ||||
|  			printf ("            Supports 48-bit addressing\n"); | ||||
|  #endif | ||||
|  #if defined(CONFIG_SYS_64BIT_LBA) | ||||
| -		printf ("            Capacity: %ld.%ld MB = %ld.%ld GB (%Ld x %ld)\n", | ||||
| +		printf ("            Capacity: %lu.%lu MB = %lu.%lu GB (%Lu x %lu)\n", | ||||
|  			mb_quot, mb_rem, | ||||
|  			gb_quot, gb_rem, | ||||
|  			lba, | ||||
|  			dev_desc->blksz); | ||||
|  #else | ||||
| -		printf ("            Capacity: %ld.%ld MB = %ld.%ld GB (%ld x %ld)\n", | ||||
| +		printf ("            Capacity: %lu.%lu MB = %lu.%lu GB (%lu x %lu)\n", | ||||
|  			mb_quot, mb_rem, | ||||
|  			gb_quot, gb_rem, | ||||
|  			(ulong)lba, | ||||
| @@ -0,0 +1,52 @@ | ||||
| --- a/tools/socfpgaimage.c | ||||
| +++ b/tools/socfpgaimage.c | ||||
| @@ -74,12 +74,12 @@ static uint16_t hdr_checksum(struct socf | ||||
|  static void build_header(uint8_t *buf, uint8_t version, uint8_t flags, | ||||
|  			 uint16_t length_bytes) | ||||
|  { | ||||
| -	header.validation = htole32(VALIDATION_WORD); | ||||
| +	header.validation = cpu_to_le32(VALIDATION_WORD); | ||||
|  	header.version = version; | ||||
|  	header.flags = flags; | ||||
| -	header.length_u32 = htole16(length_bytes/4); | ||||
| +	header.length_u32 = cpu_to_le16(length_bytes/4); | ||||
|  	header.zero = 0; | ||||
| -	header.checksum = htole16(hdr_checksum(&header)); | ||||
| +	header.checksum = cpu_to_le16(hdr_checksum(&header)); | ||||
|   | ||||
|  	memcpy(buf, &header, sizeof(header)); | ||||
|  } | ||||
| @@ -92,12 +92,12 @@ static int verify_header(const uint8_t * | ||||
|  { | ||||
|  	memcpy(&header, buf, sizeof(header)); | ||||
|   | ||||
| -	if (le32toh(header.validation) != VALIDATION_WORD) | ||||
| +	if (le32_to_cpu(header.validation) != VALIDATION_WORD) | ||||
|  		return -1; | ||||
| -	if (le16toh(header.checksum) != hdr_checksum(&header)) | ||||
| +	if (le16_to_cpu(header.checksum) != hdr_checksum(&header)) | ||||
|  		return -1; | ||||
|   | ||||
| -	return le16toh(header.length_u32) * 4; | ||||
| +	return le16_to_cpu(header.length_u32) * 4; | ||||
|  } | ||||
|   | ||||
|  /* Sign the buffer and return the signed buffer size */ | ||||
| @@ -116,7 +116,7 @@ static int sign_buffer(uint8_t *buf, | ||||
|  	/* Calculate and apply the CRC */ | ||||
|  	calc_crc = ~pbl_crc32(0, (char *)buf, len); | ||||
|   | ||||
| -	*((uint32_t *)(buf + len)) = htole32(calc_crc); | ||||
| +	*((uint32_t *)(buf + len)) = cpu_to_le32(calc_crc); | ||||
|   | ||||
|  	if (!pad_64k) | ||||
|  		return len + 4; | ||||
| @@ -150,7 +150,7 @@ static int verify_buffer(const uint8_t * | ||||
|   | ||||
|  	calc_crc = ~pbl_crc32(0, (const char *)buf, len); | ||||
|   | ||||
| -	buf_crc = le32toh(*((uint32_t *)(buf + len))); | ||||
| +	buf_crc = le32_to_cpu(*((uint32_t *)(buf + len))); | ||||
|   | ||||
|  	if (buf_crc != calc_crc) { | ||||
|  		fprintf(stderr, "CRC32 does not match (%08x != %08x)\n", | ||||
							
								
								
									
										54
									
								
								package/boot/uboot-oxnas/patches/150-spl-block.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								package/boot/uboot-oxnas/patches/150-spl-block.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| --- a/common/spl/Makefile | ||||
| +++ b/common/spl/Makefile | ||||
| @@ -19,4 +19,5 @@ obj-$(CONFIG_SPL_MMC_SUPPORT) += spl_mmc | ||||
|  obj-$(CONFIG_SPL_USB_SUPPORT) += spl_usb.o | ||||
|  obj-$(CONFIG_SPL_FAT_SUPPORT) += spl_fat.o | ||||
|  obj-$(CONFIG_SPL_SATA_SUPPORT) += spl_sata.o | ||||
| +obj-$(CONFIG_SPL_BLOCK_SUPPORT) += spl_block.o | ||||
|  endif | ||||
| --- a/common/spl/spl.c | ||||
| +++ b/common/spl/spl.c | ||||
| @@ -191,6 +191,14 @@ void board_init_r(gd_t *dummy1, ulong du | ||||
|  		spl_spi_load_image(); | ||||
|  		break; | ||||
|  #endif | ||||
| +#ifdef CONFIG_SPL_BLOCK_SUPPORT | ||||
| +	case BOOT_DEVICE_BLOCK: | ||||
| +	{ | ||||
| +		extern void spl_block_load_image(void); | ||||
| +		spl_block_load_image(); | ||||
| +		break; | ||||
| +	} | ||||
| +#endif | ||||
|  #ifdef CONFIG_SPL_ETH_SUPPORT | ||||
|  	case BOOT_DEVICE_CPGMAC: | ||||
|  #ifdef CONFIG_SPL_ETH_DEVICE | ||||
| --- a/common/cmd_nvedit.c | ||||
| +++ b/common/cmd_nvedit.c | ||||
| @@ -49,6 +49,7 @@ DECLARE_GLOBAL_DATA_PTR; | ||||
|  	!defined(CONFIG_ENV_IS_IN_SPI_FLASH)	&& \ | ||||
|  	!defined(CONFIG_ENV_IS_IN_REMOTE)	&& \ | ||||
|  	!defined(CONFIG_ENV_IS_IN_UBI)		&& \ | ||||
| +	!defined(CONFIG_ENV_IS_IN_EXT4)		&& \ | ||||
|  	!defined(CONFIG_ENV_IS_NOWHERE) | ||||
|  # error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|DATAFLASH|ONENAND|\ | ||||
|  SPI_FLASH|NVRAM|MMC|FAT|REMOTE|UBI} or CONFIG_ENV_IS_NOWHERE | ||||
| --- a/common/Makefile | ||||
| +++ b/common/Makefile | ||||
| @@ -63,6 +63,7 @@ obj-$(CONFIG_ENV_IS_IN_ONENAND) += env_o | ||||
|  obj-$(CONFIG_ENV_IS_IN_SPI_FLASH) += env_sf.o | ||||
|  obj-$(CONFIG_ENV_IS_IN_REMOTE) += env_remote.o | ||||
|  obj-$(CONFIG_ENV_IS_IN_UBI) += env_ubi.o | ||||
| +obj-$(CONFIG_ENV_IS_IN_EXT4) += env_ext4.o | ||||
|  obj-$(CONFIG_ENV_IS_NOWHERE) += env_nowhere.o | ||||
|   | ||||
|  # command | ||||
| @@ -213,6 +214,8 @@ obj-$(CONFIG_UPDATE_TFTP) += update.o | ||||
|  obj-$(CONFIG_USB_KEYBOARD) += usb_kbd.o | ||||
|  obj-$(CONFIG_CMD_DFU) += cmd_dfu.o | ||||
|  obj-$(CONFIG_CMD_GPT) += cmd_gpt.o | ||||
| +else | ||||
| +obj-$(CONFIG_SPL_BLOCK_SUPPORT) += cmd_ide.o | ||||
|  endif | ||||
|   | ||||
|  ifdef CONFIG_SPL_BUILD | ||||
							
								
								
									
										142
									
								
								package/boot/uboot-oxnas/patches/200-icplus-phy.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								package/boot/uboot-oxnas/patches/200-icplus-phy.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | ||||
| From e719404ee1241af679a51879eaad291bc27e4817 Mon Sep 17 00:00:00 2001 | ||||
| From: Daniel Golle <daniel@makrotopia.org> | ||||
| Date: Tue, 2 Dec 2014 14:46:05 +0100 | ||||
| Subject: [PATCH] net/phy: add back icplus driver | ||||
|  | ||||
| IC+ phy driver was removed due to the lack of users some time ago. | ||||
| Add it back, so we can use it. | ||||
| --- | ||||
|  drivers/net/phy/Makefile |  1 + | ||||
|  drivers/net/phy/icplus.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++ | ||||
|  drivers/net/phy/phy.c    |  3 ++ | ||||
|  3 files changed, 84 insertions(+) | ||||
|  create mode 100644 drivers/net/phy/icplus.c | ||||
|  | ||||
| --- a/drivers/net/phy/Makefile | ||||
| +++ b/drivers/net/phy/Makefile | ||||
| @@ -15,6 +15,7 @@ obj-$(CONFIG_PHY_ATHEROS) += atheros.o | ||||
|  obj-$(CONFIG_PHY_BROADCOM) += broadcom.o | ||||
|  obj-$(CONFIG_PHY_DAVICOM) += davicom.o | ||||
|  obj-$(CONFIG_PHY_ET1011C) += et1011c.o | ||||
| +obj-$(CONFIG_PHY_ICPLUS) += icplus.o | ||||
|  obj-$(CONFIG_PHY_LXT) += lxt.o | ||||
|  obj-$(CONFIG_PHY_MARVELL) += marvell.o | ||||
|  obj-$(CONFIG_PHY_MICREL) += micrel.o | ||||
| --- /dev/null | ||||
| +++ b/drivers/net/phy/icplus.c | ||||
| @@ -0,0 +1,93 @@ | ||||
| +/* | ||||
| + * ICPlus PHY drivers | ||||
| + * | ||||
| + * SPDX-License-Identifier:	GPL-2.0+ | ||||
| + * | ||||
| + * Copyright (c) 2007 Freescale Semiconductor, Inc. | ||||
| + */ | ||||
| +#include <phy.h> | ||||
| + | ||||
| +/* IP101A/G - IP1001 */ | ||||
| +#define IP10XX_SPEC_CTRL_STATUS         16      /* Spec. Control Register */ | ||||
| +#define IP1001_SPEC_CTRL_STATUS_2       20      /* IP1001 Spec. Control Reg 2 */ | ||||
| +#define IP1001_PHASE_SEL_MASK           3       /* IP1001 RX/TXPHASE_SEL */ | ||||
| +#define IP1001_APS_ON                   11      /* IP1001 APS Mode  bit */ | ||||
| +#define IP101A_G_APS_ON                 2       /* IP101A/G APS Mode bit */ | ||||
| +#define IP101A_G_IRQ_CONF_STATUS        0x11    /* Conf Info IRQ & Status Reg */ | ||||
| +#define IP101A_G_IRQ_PIN_USED           (1<<15) /* INTR pin used */ | ||||
| +#define IP101A_G_IRQ_DEFAULT            IP101A_G_IRQ_PIN_USED | ||||
| +#define IP1001LF_DRIVE_MASK     (15 << 5) | ||||
| +#define IP1001LF_RXCLKDRIVE_HI  (2  << 5) | ||||
| +#define IP1001LF_RXDDRIVE_HI    (2  << 7) | ||||
| +#define IP1001LF_RXCLKDRIVE_M   (1  << 5) | ||||
| +#define IP1001LF_RXDDRIVE_M     (1  << 7) | ||||
| +#define IP1001LF_RXCLKDRIVE_L   (0  << 5) | ||||
| +#define IP1001LF_RXDDRIVE_L     (0  << 7) | ||||
| +#define IP1001LF_RXCLKDRIVE_VL  (3  << 5) | ||||
| +#define IP1001LF_RXDDRIVE_VL    (3  << 7) | ||||
| + | ||||
| +static int ip1001_config(struct phy_device *phydev) | ||||
| +{ | ||||
| +	int c; | ||||
| + | ||||
| +	/* Enable Auto Power Saving mode */ | ||||
| +	c = phy_read(phydev, MDIO_DEVAD_NONE, IP1001_SPEC_CTRL_STATUS_2); | ||||
| +	if (c < 0) | ||||
| +		return c; | ||||
| +	c |= IP1001_APS_ON; | ||||
| +	c = phy_write(phydev, MDIO_DEVAD_NONE, IP1001_SPEC_CTRL_STATUS_2, c); | ||||
| +	if (c < 0) | ||||
| +		return c; | ||||
| + | ||||
| +	/* INTR pin used: speed/link/duplex will cause an interrupt */ | ||||
| +	c = phy_write(phydev, MDIO_DEVAD_NONE, IP101A_G_IRQ_CONF_STATUS, | ||||
| +		      IP101A_G_IRQ_DEFAULT); | ||||
| +	if (c < 0) | ||||
| +		return c; | ||||
| + | ||||
| +	if (phydev->interface == PHY_INTERFACE_MODE_RGMII) { | ||||
| +		/* | ||||
| +		 * Additional delay (2ns) used to adjust RX clock phase | ||||
| +		 * at RGMII interface | ||||
| +		 */ | ||||
| +		c = phy_read(phydev, MDIO_DEVAD_NONE, IP10XX_SPEC_CTRL_STATUS); | ||||
| +		if (c < 0) | ||||
| +			return c; | ||||
| + | ||||
| +		c |= IP1001_PHASE_SEL_MASK; | ||||
| +		/* adjust digtial drive strength */ | ||||
| +		c &= ~IP1001LF_DRIVE_MASK; | ||||
| +		c |=  IP1001LF_RXCLKDRIVE_M; | ||||
| +		c |=  IP1001LF_RXDDRIVE_M; | ||||
| +		c = phy_write(phydev, MDIO_DEVAD_NONE, IP10XX_SPEC_CTRL_STATUS, | ||||
| +			      c); | ||||
| +		if (c < 0) | ||||
| +			return c; | ||||
| +	} | ||||
| + | ||||
| +	return 0; | ||||
| +} | ||||
| + | ||||
| +static int ip1001_startup(struct phy_device *phydev) | ||||
| +{ | ||||
| +	genphy_update_link(phydev); | ||||
| +	genphy_parse_link(phydev); | ||||
| + | ||||
| +	return 0; | ||||
| +} | ||||
| +static struct phy_driver IP1001_driver = { | ||||
| +	.name = "ICPlus IP1001", | ||||
| +	.uid = 0x02430d90, | ||||
| +	.mask = 0x0ffffff0, | ||||
| +	.features = PHY_GBIT_FEATURES, | ||||
| +	.config = &ip1001_config, | ||||
| +	.startup = &ip1001_startup, | ||||
| +	.shutdown = &genphy_shutdown, | ||||
| +}; | ||||
| + | ||||
| +int phy_icplus_init(void) | ||||
| +{ | ||||
| +	phy_register(&IP1001_driver); | ||||
| + | ||||
| +	return 0; | ||||
| +} | ||||
| --- a/drivers/net/phy/phy.c | ||||
| +++ b/drivers/net/phy/phy.c | ||||
| @@ -454,6 +454,9 @@ int phy_init(void) | ||||
|  #ifdef CONFIG_PHY_ET1011C | ||||
|  	phy_et1011c_init(); | ||||
|  #endif | ||||
| +#ifdef CONFIG_PHY_ICPLUS | ||||
| +	phy_icplus_init(); | ||||
| +#endif | ||||
|  #ifdef CONFIG_PHY_LXT | ||||
|  	phy_lxt_init(); | ||||
|  #endif | ||||
| --- a/include/phy.h | ||||
| +++ b/include/phy.h | ||||
| @@ -225,6 +225,7 @@ int phy_atheros_init(void); | ||||
|  int phy_broadcom_init(void); | ||||
|  int phy_davicom_init(void); | ||||
|  int phy_et1011c_init(void); | ||||
| +int phy_icplus_init(void); | ||||
|  int phy_lxt_init(void); | ||||
|  int phy_marvell_init(void); | ||||
|  int phy_micrel_init(void); | ||||
							
								
								
									
										101
									
								
								package/boot/uboot-oxnas/patches/300-oxnas-target.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								package/boot/uboot-oxnas/patches/300-oxnas-target.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| --- a/arch/arm/include/asm/mach-types.h | ||||
| +++ b/arch/arm/include/asm/mach-types.h | ||||
| @@ -212,6 +212,7 @@ extern unsigned int __machine_arch_type; | ||||
|  #define MACH_TYPE_EDB9307A             1128 | ||||
|  #define MACH_TYPE_OMAP_3430SDP         1138 | ||||
|  #define MACH_TYPE_VSTMS                1140 | ||||
| +#define MACH_TYPE_OXNAS                1152 | ||||
|  #define MACH_TYPE_MICRO9M              1169 | ||||
|  #define MACH_TYPE_BUG                  1179 | ||||
|  #define MACH_TYPE_AT91SAM9263EK        1202 | ||||
| --- a/drivers/block/Makefile | ||||
| +++ b/drivers/block/Makefile | ||||
| @@ -21,3 +21,4 @@ obj-$(CONFIG_IDE_SIL680) += sil680.o | ||||
|  obj-$(CONFIG_SANDBOX) += sandbox.o | ||||
|  obj-$(CONFIG_SCSI_SYM53C8XX) += sym53c8xx.o | ||||
|  obj-$(CONFIG_SYSTEMACE) += systemace.o | ||||
| +obj-$(CONFIG_IDE_PLX) += plxsata_ide.o | ||||
| --- a/drivers/usb/host/Makefile | ||||
| +++ b/drivers/usb/host/Makefile | ||||
| @@ -33,6 +33,7 @@ obj-$(CONFIG_USB_EHCI_MX6) += ehci-mx6.o | ||||
|  obj-$(CONFIG_USB_EHCI_OMAP) += ehci-omap.o | ||||
|  obj-$(CONFIG_USB_EHCI_PPC4XX) += ehci-ppc4xx.o | ||||
|  obj-$(CONFIG_USB_EHCI_MARVELL) += ehci-marvell.o | ||||
| +obj-$(CONFIG_USB_EHCI_OXNAS) += ehci-oxnas.o | ||||
|  obj-$(CONFIG_USB_EHCI_PCI) += ehci-pci.o | ||||
|  obj-$(CONFIG_USB_EHCI_SPEAR) += ehci-spear.o | ||||
|  obj-$(CONFIG_USB_EHCI_SUNXI) += ehci-sunxi.o | ||||
| --- a/tools/.gitignore | ||||
| +++ b/tools/.gitignore | ||||
| @@ -9,6 +9,7 @@ | ||||
|  /mkenvimage | ||||
|  /mkimage | ||||
|  /mkexynosspl | ||||
| +/mkox820crc | ||||
|  /mpc86x_clk | ||||
|  /mxsboot | ||||
|  /mksunxiboot | ||||
| --- a/tools/Makefile | ||||
| +++ b/tools/Makefile | ||||
| @@ -143,6 +143,12 @@ hostprogs-$(CONFIG_KIRKWOOD) += kwboot | ||||
|  hostprogs-y += proftool | ||||
|  hostprogs-$(CONFIG_STATIC_RELA) += relocate-rela | ||||
|   | ||||
| + | ||||
| +hostprogs-$(CONFIG_OX820) += mkox820crc$(SFX) | ||||
| + | ||||
| +mkox820crc$(SFX)-objs := mkox820crc.o lib/crc32.o | ||||
| + | ||||
| + | ||||
|  # We build some files with extra pedantic flags to try to minimize things | ||||
|  # that won't build on some weird host compiler -- though there are lots of | ||||
|  # exceptions for files that aren't complaint. | ||||
| --- a/drivers/serial/ns16550.c | ||||
| +++ b/drivers/serial/ns16550.c | ||||
| @@ -118,6 +118,14 @@ int ns16550_calc_divisor(NS16550_t port, | ||||
|  	} | ||||
|  	port->osc_12m_sel = 0;			/* clear if previsouly set */ | ||||
|  #endif | ||||
| +#ifdef CONFIG_OX820 | ||||
| +	{ | ||||
| +		/* with additional 3 bit fractional */ | ||||
| +		u32 div = (CONFIG_SYS_NS16550_CLK + baudrate) / (baudrate * 2); | ||||
| +		port->reg9 = (div & 7) << 5; | ||||
| +		return (div >> 3); | ||||
| +	} | ||||
| +#endif | ||||
|   | ||||
|  	return DIV_ROUND_CLOSEST(clock, mode_x_div * baudrate); | ||||
|  } | ||||
| --- a/scripts/Makefile.spl | ||||
| +++ b/scripts/Makefile.spl | ||||
| @@ -202,6 +202,9 @@ OBJCOPYFLAGS_$(SPL_BIN).bin = $(SPL_OBJC | ||||
|   | ||||
|  $(obj)/$(SPL_BIN).bin: $(obj)/$(SPL_BIN) FORCE | ||||
|  	$(call if_changed,objcopy) | ||||
| +ifdef CONFIG_OX820 | ||||
| +	$(OBJTREE)/tools/mkox820crc $@ | ||||
| +endif | ||||
|   | ||||
|  LDFLAGS_$(SPL_BIN) += -T u-boot-spl.lds $(LDFLAGS_FINAL) | ||||
|  ifneq ($(CONFIG_SPL_TEXT_BASE),) | ||||
| --- a/arch/arm/Kconfig | ||||
| +++ b/arch/arm/Kconfig | ||||
| @@ -488,6 +488,9 @@ config TARGET_BALLOON3 | ||||
|  config TARGET_H2200 | ||||
|  	bool "Support h2200" | ||||
|   | ||||
| +config TARGET_OX820 | ||||
| +	bool "Support ox820" | ||||
| + | ||||
|  config TARGET_PALMLD | ||||
|  	bool "Support palmld" | ||||
|   | ||||
| @@ -650,6 +653,7 @@ source "board/logicpd/imx27lite/Kconfig" | ||||
|  source "board/logicpd/imx31_litekit/Kconfig" | ||||
|  source "board/mpl/vcma9/Kconfig" | ||||
|  source "board/olimex/mx23_olinuxino/Kconfig" | ||||
| +source "board/ox820/Kconfig" | ||||
|  source "board/palmld/Kconfig" | ||||
|  source "board/palmtc/Kconfig" | ||||
|  source "board/palmtreo680/Kconfig" | ||||
							
								
								
									
										87
									
								
								package/boot/uboot-oxnas/patches/400-gcc-5-compiler.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								package/boot/uboot-oxnas/patches/400-gcc-5-compiler.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| From: Hans de Goede <hdegoede@redhat.com> | ||||
| Date: Sat, 7 Feb 2015 21:52:40 +0000 (+0100) | ||||
| Subject: Add linux/compiler-gcc5.h to fix builds with gcc5 | ||||
| X-Git-Tag: v2015.04-rc2~31 | ||||
| X-Git-Url: http://git.denx.de/?p=u-boot.git;a=commitdiff_plain;h=478b02f1a7043b673565075ea5016376f3293b23 | ||||
|  | ||||
| Add linux/compiler-gcc5.h to fix builds with gcc5 | ||||
|  | ||||
| Add linux/compiler-gcc5/h from the kernel sources at: | ||||
|  | ||||
| commit 5631b8fba640a4ab2f8a954f63a603fa34eda96b | ||||
| Author: Steven Noonan <steven@uplinklabs.net> | ||||
| Date:   Sat Oct 25 15:09:42 2014 -0700 | ||||
|  | ||||
|     compiler/gcc4+: Remove inaccurate comment about 'asm goto' miscompiles | ||||
|  | ||||
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> | ||||
| --- | ||||
|  | ||||
| --- /dev/null | ||||
| +++ b/include/linux/compiler-gcc5.h | ||||
| @@ -0,0 +1,65 @@ | ||||
| +#ifndef __LINUX_COMPILER_H | ||||
| +#error "Please don't include <linux/compiler-gcc5.h> directly, include <linux/compiler.h> instead." | ||||
| +#endif | ||||
| + | ||||
| +#define __used				__attribute__((__used__)) | ||||
| +#define __must_check			__attribute__((warn_unused_result)) | ||||
| +#define __compiler_offsetof(a, b)	__builtin_offsetof(a, b) | ||||
| + | ||||
| +/* Mark functions as cold. gcc will assume any path leading to a call | ||||
| +   to them will be unlikely.  This means a lot of manual unlikely()s | ||||
| +   are unnecessary now for any paths leading to the usual suspects | ||||
| +   like BUG(), printk(), panic() etc. [but let's keep them for now for | ||||
| +   older compilers] | ||||
| + | ||||
| +   Early snapshots of gcc 4.3 don't support this and we can't detect this | ||||
| +   in the preprocessor, but we can live with this because they're unreleased. | ||||
| +   Maketime probing would be overkill here. | ||||
| + | ||||
| +   gcc also has a __attribute__((__hot__)) to move hot functions into | ||||
| +   a special section, but I don't see any sense in this right now in | ||||
| +   the kernel context */ | ||||
| +#define __cold			__attribute__((__cold__)) | ||||
| + | ||||
| +#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) | ||||
| + | ||||
| +#ifndef __CHECKER__ | ||||
| +# define __compiletime_warning(message) __attribute__((warning(message))) | ||||
| +# define __compiletime_error(message) __attribute__((error(message))) | ||||
| +#endif /* __CHECKER__ */ | ||||
| + | ||||
| +/* | ||||
| + * Mark a position in code as unreachable.  This can be used to | ||||
| + * suppress control flow warnings after asm blocks that transfer | ||||
| + * control elsewhere. | ||||
| + * | ||||
| + * Early snapshots of gcc 4.5 don't support this and we can't detect | ||||
| + * this in the preprocessor, but we can live with this because they're | ||||
| + * unreleased.  Really, we need to have autoconf for the kernel. | ||||
| + */ | ||||
| +#define unreachable() __builtin_unreachable() | ||||
| + | ||||
| +/* Mark a function definition as prohibited from being cloned. */ | ||||
| +#define __noclone	__attribute__((__noclone__)) | ||||
| + | ||||
| +/* | ||||
| + * Tell the optimizer that something else uses this function or variable. | ||||
| + */ | ||||
| +#define __visible __attribute__((externally_visible)) | ||||
| + | ||||
| +/* | ||||
| + * GCC 'asm goto' miscompiles certain code sequences: | ||||
| + * | ||||
| + *   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 | ||||
| + * | ||||
| + * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. | ||||
| + * | ||||
| + * (asm goto is automatically volatile - the naming reflects this.) | ||||
| + */ | ||||
| +#define asm_volatile_goto(x...)	do { asm goto(x); asm (""); } while (0) | ||||
| + | ||||
| +#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP | ||||
| +#define __HAVE_BUILTIN_BSWAP32__ | ||||
| +#define __HAVE_BUILTIN_BSWAP64__ | ||||
| +#define __HAVE_BUILTIN_BSWAP16__ | ||||
| +#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ | ||||
							
								
								
									
										306
									
								
								package/boot/uboot-oxnas/patches/410-gcc-6-compiler.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								package/boot/uboot-oxnas/patches/410-gcc-6-compiler.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,306 @@ | ||||
| From: Hans de Goede <hdegoede@redhat.com> | ||||
| Date: Sat, 7 Feb 2015 21:52:40 +0000 (+0100) | ||||
| Subject: Add linux/compiler-gcc6.h to fix builds with gcc6 | ||||
| X-Git-Tag: v2015.04-rc2~31 | ||||
| X-Git-Url: http://git.denx.de/?p=u-boot.git;a=commitdiff_plain;h=478b02f1a7043b673565075ea5016376f3293b23 | ||||
|  | ||||
| Add linux/compiler-gcc6.h to fix builds with gcc6 | ||||
|  | ||||
| Add linux/compiler-gcc6/h from the kernel sources at: | ||||
|  | ||||
| commit 5631b8fba640a4ab2f8a954f63a603fa34eda96b | ||||
| Author: Steven Noonan <steven@uplinklabs.net> | ||||
| Date:   Sat Oct 25 15:09:42 2014 -0700 | ||||
|  | ||||
|     compiler/gcc4+: Remove inaccurate comment about 'asm goto' miscompiles | ||||
|  | ||||
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> | ||||
| --- | ||||
|  | ||||
| --- /dev/null | ||||
| +++ b/include/linux/compiler-gcc6.h | ||||
| @@ -0,0 +1,284 @@ | ||||
| +#ifndef __LINUX_COMPILER_H | ||||
| +#error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead." | ||||
| +#endif | ||||
| + | ||||
| +/* | ||||
| + * Common definitions for all gcc versions go here. | ||||
| + */ | ||||
| +#define GCC_VERSION (__GNUC__ * 10000		\ | ||||
| +		     + __GNUC_MINOR__ * 100	\ | ||||
| +		     + __GNUC_PATCHLEVEL__) | ||||
| + | ||||
| +/* Optimization barrier */ | ||||
| + | ||||
| +/* The "volatile" is due to gcc bugs */ | ||||
| +#define barrier() __asm__ __volatile__("": : :"memory") | ||||
| +/* | ||||
| + * This version is i.e. to prevent dead stores elimination on @ptr | ||||
| + * where gcc and llvm may behave differently when otherwise using | ||||
| + * normal barrier(): while gcc behavior gets along with a normal | ||||
| + * barrier(), llvm needs an explicit input variable to be assumed | ||||
| + * clobbered. The issue is as follows: while the inline asm might | ||||
| + * access any memory it wants, the compiler could have fit all of | ||||
| + * @ptr into memory registers instead, and since @ptr never escaped | ||||
| + * from that, it proofed that the inline asm wasn't touching any of | ||||
| + * it. This version works well with both compilers, i.e. we're telling | ||||
| + * the compiler that the inline asm absolutely may see the contents | ||||
| + * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495 | ||||
| + */ | ||||
| +#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory") | ||||
| + | ||||
| +/* | ||||
| + * This macro obfuscates arithmetic on a variable address so that gcc | ||||
| + * shouldn't recognize the original var, and make assumptions about it. | ||||
| + * | ||||
| + * This is needed because the C standard makes it undefined to do | ||||
| + * pointer arithmetic on "objects" outside their boundaries and the | ||||
| + * gcc optimizers assume this is the case. In particular they | ||||
| + * assume such arithmetic does not wrap. | ||||
| + * | ||||
| + * A miscompilation has been observed because of this on PPC. | ||||
| + * To work around it we hide the relationship of the pointer and the object | ||||
| + * using this macro. | ||||
| + * | ||||
| + * Versions of the ppc64 compiler before 4.1 had a bug where use of | ||||
| + * RELOC_HIDE could trash r30. The bug can be worked around by changing | ||||
| + * the inline assembly constraint from =g to =r, in this particular | ||||
| + * case either is valid. | ||||
| + */ | ||||
| +#define RELOC_HIDE(ptr, off)						\ | ||||
| +({									\ | ||||
| +	unsigned long __ptr;						\ | ||||
| +	__asm__ ("" : "=r"(__ptr) : "0"(ptr));				\ | ||||
| +	(typeof(ptr)) (__ptr + (off));					\ | ||||
| +}) | ||||
| + | ||||
| +/* Make the optimizer believe the variable can be manipulated arbitrarily. */ | ||||
| +#define OPTIMIZER_HIDE_VAR(var)						\ | ||||
| +	__asm__ ("" : "=r" (var) : "0" (var)) | ||||
| + | ||||
| +#ifdef __CHECKER__ | ||||
| +#define __must_be_array(a)	0 | ||||
| +#else | ||||
| +/* &a[0] degrades to a pointer: a different type from an array */ | ||||
| +#define __must_be_array(a)	BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) | ||||
| +#endif | ||||
| + | ||||
| +/* | ||||
| + * Force always-inline if the user requests it so via the .config, | ||||
| + * or if gcc is too old: | ||||
| + */ | ||||
| +#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) ||		\ | ||||
| +    !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) | ||||
| +#define inline		inline		__attribute__((always_inline)) notrace | ||||
| +#define __inline__	__inline__	__attribute__((always_inline)) notrace | ||||
| +#define __inline	__inline	__attribute__((always_inline)) notrace | ||||
| +#else | ||||
| +/* A lot of inline functions can cause havoc with function tracing */ | ||||
| +#define inline		inline		notrace | ||||
| +#define __inline__	__inline__	notrace | ||||
| +#define __inline	__inline	notrace | ||||
| +#endif | ||||
| + | ||||
| +#define __always_inline	inline __attribute__((always_inline)) | ||||
| +#define  noinline	__attribute__((noinline)) | ||||
| + | ||||
| +#define __deprecated	__attribute__((deprecated)) | ||||
| +#define __packed	__attribute__((packed)) | ||||
| +#define __weak		__attribute__((weak)) | ||||
| +#define __alias(symbol)	__attribute__((alias(#symbol))) | ||||
| + | ||||
| +/* | ||||
| + * it doesn't make sense on ARM (currently the only user of __naked) | ||||
| + * to trace naked functions because then mcount is called without | ||||
| + * stack and frame pointer being set up and there is no chance to | ||||
| + * restore the lr register to the value before mcount was called. | ||||
| + * | ||||
| + * The asm() bodies of naked functions often depend on standard calling | ||||
| + * conventions, therefore they must be noinline and noclone. | ||||
| + * | ||||
| + * GCC 4.[56] currently fail to enforce this, so we must do so ourselves. | ||||
| + * See GCC PR44290. | ||||
| + */ | ||||
| +#define __naked		__attribute__((naked)) noinline __noclone notrace | ||||
| + | ||||
| +#define __noreturn	__attribute__((noreturn)) | ||||
| + | ||||
| +/* | ||||
| + * From the GCC manual: | ||||
| + * | ||||
| + * Many functions have no effects except the return value and their | ||||
| + * return value depends only on the parameters and/or global | ||||
| + * variables.  Such a function can be subject to common subexpression | ||||
| + * elimination and loop optimization just as an arithmetic operator | ||||
| + * would be. | ||||
| + * [...] | ||||
| + */ | ||||
| +#define __pure			__attribute__((pure)) | ||||
| +#define __aligned(x)		__attribute__((aligned(x))) | ||||
| +#define __printf(a, b)		__attribute__((format(printf, a, b))) | ||||
| +#define __scanf(a, b)		__attribute__((format(scanf, a, b))) | ||||
| +#define __attribute_const__	__attribute__((__const__)) | ||||
| +#define __maybe_unused		__attribute__((unused)) | ||||
| +#define __always_unused		__attribute__((unused)) | ||||
| + | ||||
| +/* gcc version specific checks */ | ||||
| + | ||||
| +#if GCC_VERSION < 30200 | ||||
| +# error Sorry, your compiler is too old - please upgrade it. | ||||
| +#endif | ||||
| + | ||||
| +#if GCC_VERSION < 30300 | ||||
| +# define __used			__attribute__((__unused__)) | ||||
| +#else | ||||
| +# define __used			__attribute__((__used__)) | ||||
| +#endif | ||||
| + | ||||
| +#ifdef CONFIG_GCOV_KERNEL | ||||
| +# if GCC_VERSION < 30400 | ||||
| +#   error "GCOV profiling support for gcc versions below 3.4 not included" | ||||
| +# endif /* __GNUC_MINOR__ */ | ||||
| +#endif /* CONFIG_GCOV_KERNEL */ | ||||
| + | ||||
| +#if GCC_VERSION >= 30400 | ||||
| +#define __must_check		__attribute__((warn_unused_result)) | ||||
| +#define __malloc		__attribute__((__malloc__)) | ||||
| +#endif | ||||
| + | ||||
| +#if GCC_VERSION >= 40000 | ||||
| + | ||||
| +/* GCC 4.1.[01] miscompiles __weak */ | ||||
| +#ifdef __KERNEL__ | ||||
| +# if GCC_VERSION >= 40100 &&  GCC_VERSION <= 40101 | ||||
| +#  error Your version of gcc miscompiles the __weak directive | ||||
| +# endif | ||||
| +#endif | ||||
| + | ||||
| +#define __used			__attribute__((__used__)) | ||||
| +#define __compiler_offsetof(a, b)					\ | ||||
| +	__builtin_offsetof(a, b) | ||||
| + | ||||
| +#if GCC_VERSION >= 40100 && GCC_VERSION < 40600 | ||||
| +# define __compiletime_object_size(obj) __builtin_object_size(obj, 0) | ||||
| +#endif | ||||
| + | ||||
| +#if GCC_VERSION >= 40300 | ||||
| +/* Mark functions as cold. gcc will assume any path leading to a call | ||||
| + * to them will be unlikely.  This means a lot of manual unlikely()s | ||||
| + * are unnecessary now for any paths leading to the usual suspects | ||||
| + * like BUG(), printk(), panic() etc. [but let's keep them for now for | ||||
| + * older compilers] | ||||
| + * | ||||
| + * Early snapshots of gcc 4.3 don't support this and we can't detect this | ||||
| + * in the preprocessor, but we can live with this because they're unreleased. | ||||
| + * Maketime probing would be overkill here. | ||||
| + * | ||||
| + * gcc also has a __attribute__((__hot__)) to move hot functions into | ||||
| + * a special section, but I don't see any sense in this right now in | ||||
| + * the kernel context | ||||
| + */ | ||||
| +#define __cold			__attribute__((__cold__)) | ||||
| + | ||||
| +#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) | ||||
| + | ||||
| +#ifndef __CHECKER__ | ||||
| +# define __compiletime_warning(message) __attribute__((warning(message))) | ||||
| +# define __compiletime_error(message) __attribute__((error(message))) | ||||
| +#endif /* __CHECKER__ */ | ||||
| +#endif /* GCC_VERSION >= 40300 */ | ||||
| + | ||||
| +#if GCC_VERSION >= 40500 | ||||
| +/* | ||||
| + * Mark a position in code as unreachable.  This can be used to | ||||
| + * suppress control flow warnings after asm blocks that transfer | ||||
| + * control elsewhere. | ||||
| + * | ||||
| + * Early snapshots of gcc 4.5 don't support this and we can't detect | ||||
| + * this in the preprocessor, but we can live with this because they're | ||||
| + * unreleased.  Really, we need to have autoconf for the kernel. | ||||
| + */ | ||||
| +#define unreachable() __builtin_unreachable() | ||||
| + | ||||
| +/* Mark a function definition as prohibited from being cloned. */ | ||||
| +#define __noclone	__attribute__((__noclone__, __optimize__("no-tracer"))) | ||||
| + | ||||
| +#endif /* GCC_VERSION >= 40500 */ | ||||
| + | ||||
| +#if GCC_VERSION >= 40600 | ||||
| +/* | ||||
| + * When used with Link Time Optimization, gcc can optimize away C functions or | ||||
| + * variables which are referenced only from assembly code.  __visible tells the | ||||
| + * optimizer that something else uses this function or variable, thus preventing | ||||
| + * this. | ||||
| + */ | ||||
| +#define __visible	__attribute__((externally_visible)) | ||||
| +#endif | ||||
| + | ||||
| + | ||||
| +#if GCC_VERSION >= 40900 && !defined(__CHECKER__) | ||||
| +/* | ||||
| + * __assume_aligned(n, k): Tell the optimizer that the returned | ||||
| + * pointer can be assumed to be k modulo n. The second argument is | ||||
| + * optional (default 0), so we use a variadic macro to make the | ||||
| + * shorthand. | ||||
| + * | ||||
| + * Beware: Do not apply this to functions which may return | ||||
| + * ERR_PTRs. Also, it is probably unwise to apply it to functions | ||||
| + * returning extra information in the low bits (but in that case the | ||||
| + * compiler should see some alignment anyway, when the return value is | ||||
| + * massaged by 'flags = ptr & 3; ptr &= ~3;'). | ||||
| + */ | ||||
| +#define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__))) | ||||
| +#endif | ||||
| + | ||||
| +/* | ||||
| + * GCC 'asm goto' miscompiles certain code sequences: | ||||
| + * | ||||
| + *   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 | ||||
| + * | ||||
| + * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. | ||||
| + * | ||||
| + * (asm goto is automatically volatile - the naming reflects this.) | ||||
| + */ | ||||
| +#define asm_volatile_goto(x...)	do { asm goto(x); asm (""); } while (0) | ||||
| + | ||||
| +#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP | ||||
| +#if GCC_VERSION >= 40400 | ||||
| +#define __HAVE_BUILTIN_BSWAP32__ | ||||
| +#define __HAVE_BUILTIN_BSWAP64__ | ||||
| +#endif | ||||
| +#if GCC_VERSION >= 40800 | ||||
| +#define __HAVE_BUILTIN_BSWAP16__ | ||||
| +#endif | ||||
| +#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ | ||||
| + | ||||
| +#if GCC_VERSION >= 50000 | ||||
| +#define KASAN_ABI_VERSION 4 | ||||
| +#elif GCC_VERSION >= 40902 | ||||
| +#define KASAN_ABI_VERSION 3 | ||||
| +#endif | ||||
| + | ||||
| +#if GCC_VERSION >= 40902 | ||||
| +/* | ||||
| + * Tell the compiler that address safety instrumentation (KASAN) | ||||
| + * should not be applied to that function. | ||||
| + * Conflicts with inlining: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368 | ||||
| + */ | ||||
| +#define __no_sanitize_address __attribute__((no_sanitize_address)) | ||||
| +#endif | ||||
| + | ||||
| +#endif	/* gcc version >= 40000 specific checks */ | ||||
| + | ||||
| +#if !defined(__noclone) | ||||
| +#define __noclone	/* not needed */ | ||||
| +#endif | ||||
| + | ||||
| +#if !defined(__no_sanitize_address) | ||||
| +#define __no_sanitize_address | ||||
| +#endif | ||||
| + | ||||
| +/* | ||||
| + * A trick to suppress uninitialized variable warning without generating any | ||||
| + * code | ||||
| + */ | ||||
| +#define uninitialized_var(x) x = x | ||||
							
								
								
									
										287
									
								
								package/boot/uboot-oxnas/patches/420-gcc-7-compiler.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										287
									
								
								package/boot/uboot-oxnas/patches/420-gcc-7-compiler.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,287 @@ | ||||
| --- /dev/null | ||||
| +++ b/include/linux/compiler-gcc7.h | ||||
| @@ -0,0 +1,284 @@ | ||||
| +#ifndef __LINUX_COMPILER_H | ||||
| +#error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead." | ||||
| +#endif | ||||
| + | ||||
| +/* | ||||
| + * Common definitions for all gcc versions go here. | ||||
| + */ | ||||
| +#define GCC_VERSION (__GNUC__ * 10000		\ | ||||
| +		     + __GNUC_MINOR__ * 100	\ | ||||
| +		     + __GNUC_PATCHLEVEL__) | ||||
| + | ||||
| +/* Optimization barrier */ | ||||
| + | ||||
| +/* The "volatile" is due to gcc bugs */ | ||||
| +#define barrier() __asm__ __volatile__("": : :"memory") | ||||
| +/* | ||||
| + * This version is i.e. to prevent dead stores elimination on @ptr | ||||
| + * where gcc and llvm may behave differently when otherwise using | ||||
| + * normal barrier(): while gcc behavior gets along with a normal | ||||
| + * barrier(), llvm needs an explicit input variable to be assumed | ||||
| + * clobbered. The issue is as follows: while the inline asm might | ||||
| + * access any memory it wants, the compiler could have fit all of | ||||
| + * @ptr into memory registers instead, and since @ptr never escaped | ||||
| + * from that, it proofed that the inline asm wasn't touching any of | ||||
| + * it. This version works well with both compilers, i.e. we're telling | ||||
| + * the compiler that the inline asm absolutely may see the contents | ||||
| + * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495 | ||||
| + */ | ||||
| +#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory") | ||||
| + | ||||
| +/* | ||||
| + * This macro obfuscates arithmetic on a variable address so that gcc | ||||
| + * shouldn't recognize the original var, and make assumptions about it. | ||||
| + * | ||||
| + * This is needed because the C standard makes it undefined to do | ||||
| + * pointer arithmetic on "objects" outside their boundaries and the | ||||
| + * gcc optimizers assume this is the case. In particular they | ||||
| + * assume such arithmetic does not wrap. | ||||
| + * | ||||
| + * A miscompilation has been observed because of this on PPC. | ||||
| + * To work around it we hide the relationship of the pointer and the object | ||||
| + * using this macro. | ||||
| + * | ||||
| + * Versions of the ppc64 compiler before 4.1 had a bug where use of | ||||
| + * RELOC_HIDE could trash r30. The bug can be worked around by changing | ||||
| + * the inline assembly constraint from =g to =r, in this particular | ||||
| + * case either is valid. | ||||
| + */ | ||||
| +#define RELOC_HIDE(ptr, off)						\ | ||||
| +({									\ | ||||
| +	unsigned long __ptr;						\ | ||||
| +	__asm__ ("" : "=r"(__ptr) : "0"(ptr));				\ | ||||
| +	(typeof(ptr)) (__ptr + (off));					\ | ||||
| +}) | ||||
| + | ||||
| +/* Make the optimizer believe the variable can be manipulated arbitrarily. */ | ||||
| +#define OPTIMIZER_HIDE_VAR(var)						\ | ||||
| +	__asm__ ("" : "=r" (var) : "0" (var)) | ||||
| + | ||||
| +#ifdef __CHECKER__ | ||||
| +#define __must_be_array(a)	0 | ||||
| +#else | ||||
| +/* &a[0] degrades to a pointer: a different type from an array */ | ||||
| +#define __must_be_array(a)	BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) | ||||
| +#endif | ||||
| + | ||||
| +/* | ||||
| + * Force always-inline if the user requests it so via the .config, | ||||
| + * or if gcc is too old: | ||||
| + */ | ||||
| +#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) ||		\ | ||||
| +    !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) | ||||
| +#define inline		inline		__attribute__((always_inline)) notrace | ||||
| +#define __inline__	__inline__	__attribute__((always_inline)) notrace | ||||
| +#define __inline	__inline	__attribute__((always_inline)) notrace | ||||
| +#else | ||||
| +/* A lot of inline functions can cause havoc with function tracing */ | ||||
| +#define inline		inline		notrace | ||||
| +#define __inline__	__inline__	notrace | ||||
| +#define __inline	__inline	notrace | ||||
| +#endif | ||||
| + | ||||
| +#define __always_inline	inline __attribute__((always_inline)) | ||||
| +#define  noinline	__attribute__((noinline)) | ||||
| + | ||||
| +#define __deprecated	__attribute__((deprecated)) | ||||
| +#define __packed	__attribute__((packed)) | ||||
| +#define __weak		__attribute__((weak)) | ||||
| +#define __alias(symbol)	__attribute__((alias(#symbol))) | ||||
| + | ||||
| +/* | ||||
| + * it doesn't make sense on ARM (currently the only user of __naked) | ||||
| + * to trace naked functions because then mcount is called without | ||||
| + * stack and frame pointer being set up and there is no chance to | ||||
| + * restore the lr register to the value before mcount was called. | ||||
| + * | ||||
| + * The asm() bodies of naked functions often depend on standard calling | ||||
| + * conventions, therefore they must be noinline and noclone. | ||||
| + * | ||||
| + * GCC 4.[56] currently fail to enforce this, so we must do so ourselves. | ||||
| + * See GCC PR44290. | ||||
| + */ | ||||
| +#define __naked		__attribute__((naked)) noinline __noclone notrace | ||||
| + | ||||
| +#define __noreturn	__attribute__((noreturn)) | ||||
| + | ||||
| +/* | ||||
| + * From the GCC manual: | ||||
| + * | ||||
| + * Many functions have no effects except the return value and their | ||||
| + * return value depends only on the parameters and/or global | ||||
| + * variables.  Such a function can be subject to common subexpression | ||||
| + * elimination and loop optimization just as an arithmetic operator | ||||
| + * would be. | ||||
| + * [...] | ||||
| + */ | ||||
| +#define __pure			__attribute__((pure)) | ||||
| +#define __aligned(x)		__attribute__((aligned(x))) | ||||
| +#define __printf(a, b)		__attribute__((format(printf, a, b))) | ||||
| +#define __scanf(a, b)		__attribute__((format(scanf, a, b))) | ||||
| +#define __attribute_const__	__attribute__((__const__)) | ||||
| +#define __maybe_unused		__attribute__((unused)) | ||||
| +#define __always_unused		__attribute__((unused)) | ||||
| + | ||||
| +/* gcc version specific checks */ | ||||
| + | ||||
| +#if GCC_VERSION < 30200 | ||||
| +# error Sorry, your compiler is too old - please upgrade it. | ||||
| +#endif | ||||
| + | ||||
| +#if GCC_VERSION < 30300 | ||||
| +# define __used			__attribute__((__unused__)) | ||||
| +#else | ||||
| +# define __used			__attribute__((__used__)) | ||||
| +#endif | ||||
| + | ||||
| +#ifdef CONFIG_GCOV_KERNEL | ||||
| +# if GCC_VERSION < 30400 | ||||
| +#   error "GCOV profiling support for gcc versions below 3.4 not included" | ||||
| +# endif /* __GNUC_MINOR__ */ | ||||
| +#endif /* CONFIG_GCOV_KERNEL */ | ||||
| + | ||||
| +#if GCC_VERSION >= 30400 | ||||
| +#define __must_check		__attribute__((warn_unused_result)) | ||||
| +#define __malloc		__attribute__((__malloc__)) | ||||
| +#endif | ||||
| + | ||||
| +#if GCC_VERSION >= 40000 | ||||
| + | ||||
| +/* GCC 4.1.[01] miscompiles __weak */ | ||||
| +#ifdef __KERNEL__ | ||||
| +# if GCC_VERSION >= 40100 &&  GCC_VERSION <= 40101 | ||||
| +#  error Your version of gcc miscompiles the __weak directive | ||||
| +# endif | ||||
| +#endif | ||||
| + | ||||
| +#define __used			__attribute__((__used__)) | ||||
| +#define __compiler_offsetof(a, b)					\ | ||||
| +	__builtin_offsetof(a, b) | ||||
| + | ||||
| +#if GCC_VERSION >= 40100 && GCC_VERSION < 40600 | ||||
| +# define __compiletime_object_size(obj) __builtin_object_size(obj, 0) | ||||
| +#endif | ||||
| + | ||||
| +#if GCC_VERSION >= 40300 | ||||
| +/* Mark functions as cold. gcc will assume any path leading to a call | ||||
| + * to them will be unlikely.  This means a lot of manual unlikely()s | ||||
| + * are unnecessary now for any paths leading to the usual suspects | ||||
| + * like BUG(), printk(), panic() etc. [but let's keep them for now for | ||||
| + * older compilers] | ||||
| + * | ||||
| + * Early snapshots of gcc 4.3 don't support this and we can't detect this | ||||
| + * in the preprocessor, but we can live with this because they're unreleased. | ||||
| + * Maketime probing would be overkill here. | ||||
| + * | ||||
| + * gcc also has a __attribute__((__hot__)) to move hot functions into | ||||
| + * a special section, but I don't see any sense in this right now in | ||||
| + * the kernel context | ||||
| + */ | ||||
| +#define __cold			__attribute__((__cold__)) | ||||
| + | ||||
| +#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) | ||||
| + | ||||
| +#ifndef __CHECKER__ | ||||
| +# define __compiletime_warning(message) __attribute__((warning(message))) | ||||
| +# define __compiletime_error(message) __attribute__((error(message))) | ||||
| +#endif /* __CHECKER__ */ | ||||
| +#endif /* GCC_VERSION >= 40300 */ | ||||
| + | ||||
| +#if GCC_VERSION >= 40500 | ||||
| +/* | ||||
| + * Mark a position in code as unreachable.  This can be used to | ||||
| + * suppress control flow warnings after asm blocks that transfer | ||||
| + * control elsewhere. | ||||
| + * | ||||
| + * Early snapshots of gcc 4.5 don't support this and we can't detect | ||||
| + * this in the preprocessor, but we can live with this because they're | ||||
| + * unreleased.  Really, we need to have autoconf for the kernel. | ||||
| + */ | ||||
| +#define unreachable() __builtin_unreachable() | ||||
| + | ||||
| +/* Mark a function definition as prohibited from being cloned. */ | ||||
| +#define __noclone	__attribute__((__noclone__, __optimize__("no-tracer"))) | ||||
| + | ||||
| +#endif /* GCC_VERSION >= 40500 */ | ||||
| + | ||||
| +#if GCC_VERSION >= 40600 | ||||
| +/* | ||||
| + * When used with Link Time Optimization, gcc can optimize away C functions or | ||||
| + * variables which are referenced only from assembly code.  __visible tells the | ||||
| + * optimizer that something else uses this function or variable, thus preventing | ||||
| + * this. | ||||
| + */ | ||||
| +#define __visible	__attribute__((externally_visible)) | ||||
| +#endif | ||||
| + | ||||
| + | ||||
| +#if GCC_VERSION >= 40900 && !defined(__CHECKER__) | ||||
| +/* | ||||
| + * __assume_aligned(n, k): Tell the optimizer that the returned | ||||
| + * pointer can be assumed to be k modulo n. The second argument is | ||||
| + * optional (default 0), so we use a variadic macro to make the | ||||
| + * shorthand. | ||||
| + * | ||||
| + * Beware: Do not apply this to functions which may return | ||||
| + * ERR_PTRs. Also, it is probably unwise to apply it to functions | ||||
| + * returning extra information in the low bits (but in that case the | ||||
| + * compiler should see some alignment anyway, when the return value is | ||||
| + * massaged by 'flags = ptr & 3; ptr &= ~3;'). | ||||
| + */ | ||||
| +#define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__))) | ||||
| +#endif | ||||
| + | ||||
| +/* | ||||
| + * GCC 'asm goto' miscompiles certain code sequences: | ||||
| + * | ||||
| + *   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 | ||||
| + * | ||||
| + * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. | ||||
| + * | ||||
| + * (asm goto is automatically volatile - the naming reflects this.) | ||||
| + */ | ||||
| +#define asm_volatile_goto(x...)	do { asm goto(x); asm (""); } while (0) | ||||
| + | ||||
| +#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP | ||||
| +#if GCC_VERSION >= 40400 | ||||
| +#define __HAVE_BUILTIN_BSWAP32__ | ||||
| +#define __HAVE_BUILTIN_BSWAP64__ | ||||
| +#endif | ||||
| +#if GCC_VERSION >= 40800 | ||||
| +#define __HAVE_BUILTIN_BSWAP16__ | ||||
| +#endif | ||||
| +#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ | ||||
| + | ||||
| +#if GCC_VERSION >= 50000 | ||||
| +#define KASAN_ABI_VERSION 4 | ||||
| +#elif GCC_VERSION >= 40902 | ||||
| +#define KASAN_ABI_VERSION 3 | ||||
| +#endif | ||||
| + | ||||
| +#if GCC_VERSION >= 40902 | ||||
| +/* | ||||
| + * Tell the compiler that address safety instrumentation (KASAN) | ||||
| + * should not be applied to that function. | ||||
| + * Conflicts with inlining: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368 | ||||
| + */ | ||||
| +#define __no_sanitize_address __attribute__((no_sanitize_address)) | ||||
| +#endif | ||||
| + | ||||
| +#endif	/* gcc version >= 40000 specific checks */ | ||||
| + | ||||
| +#if !defined(__noclone) | ||||
| +#define __noclone	/* not needed */ | ||||
| +#endif | ||||
| + | ||||
| +#if !defined(__no_sanitize_address) | ||||
| +#define __no_sanitize_address | ||||
| +#endif | ||||
| + | ||||
| +/* | ||||
| + * A trick to suppress uninitialized variable warning without generating any | ||||
| + * code | ||||
| + */ | ||||
| +#define uninitialized_var(x) x = x | ||||
| @@ -0,0 +1,11 @@ | ||||
| --- a/common/cmd_bootm.c | ||||
| +++ b/common/cmd_bootm.c | ||||
| @@ -77,7 +77,7 @@ static int do_bootm_subcommand(cmd_tbl_t | ||||
|  		return CMD_RET_USAGE; | ||||
|  	} | ||||
|   | ||||
| -	if (state != BOOTM_STATE_START && images.state >= state) { | ||||
| +	if (!(state & BOOTM_STATE_START) && images.state >= state) { | ||||
|  		printf("Trying to execute a command out of order\n"); | ||||
|  		return CMD_RET_USAGE; | ||||
|  	} | ||||
| @@ -0,0 +1,13 @@ | ||||
| # | ||||
| # (C) Copyright 2000-2006 | ||||
| # Wolfgang Denk, DENX Software Engineering, wd@denx.de. | ||||
| # | ||||
| # (C) Copyright 2008-2009 Freescale Semiconductor, Inc. | ||||
| # | ||||
| # SPDX-License-Identifier:	GPL-2.0+ | ||||
| # | ||||
|  | ||||
| obj-y	+= reset.o | ||||
| obj-y	+= timer.o | ||||
| obj-y	+= clock.o | ||||
| obj-y	+= pinmux.o | ||||
| @@ -0,0 +1,97 @@ | ||||
| #include <common.h> | ||||
| #include <asm/arch/sysctl.h> | ||||
| #include <asm/arch/cpu.h> | ||||
| #include <asm/arch/clock.h> | ||||
|  | ||||
| typedef struct { | ||||
| 	unsigned short mhz; | ||||
| 	unsigned char refdiv; | ||||
| 	unsigned char outdiv; | ||||
| 	unsigned int fbdiv; | ||||
| 	unsigned short bwadj; | ||||
| 	unsigned short sfreq; | ||||
| 	unsigned int sslope; | ||||
| } PLL_CONFIG; | ||||
|  | ||||
| const PLL_CONFIG C_PLL_CONFIG[] = { | ||||
| 	{ 500, 1, 2, 3932160, 119, 208, 189 }, //  500 MHz | ||||
| 	{ 525, 2, 1, 4128768, 125, 139, 297 }, //  525 MHz | ||||
| 	{ 550, 2, 1, 4325376, 131, 139, 311 }, //  550 MHz | ||||
| 	{ 575, 2, 1, 4521984, 137, 139, 326 }, //  575 MHz | ||||
| 	{ 600, 2, 1, 4718592, 143, 138, 339 }, //  600 MHz | ||||
| 	{ 625, 1, 1, 3276800, 99, 208, 157 }, //  625 MHz | ||||
| 	{ 650, 1, 1, 3407872, 103, 208, 164 }, //  650 MHz | ||||
| 	{ 675, 1, 1, 3538944, 107, 208, 170 }, //  675 MHz | ||||
| 	{ 700, 0, 0, 917504, 27, 416, 22 }, //  700 MHz | ||||
| 	{ 725, 1, 1, 3801088, 115, 208, 182 }, //  725 MHz | ||||
| 	{ 750, 0, 0, 983040, 29, 416, 23 }, //  750 MHz | ||||
| 	{ 775, 3, 0, 4063232, 123, 104, 390 }, //  775 MHz | ||||
| 	{ 800, 3, 0, 4194304, 127, 104, 403 }, //  800 MHz | ||||
| 	{ 825, 3, 0, 4325376, 131, 104, 415 }, //  825 MHz | ||||
| 	{ 850, 2, 0, 3342336, 101, 139, 241 }, //  850 MHz | ||||
| 	{ 875, 2, 0, 3440640, 104, 139, 248 }, //  875 MHz | ||||
| 	{ 900, 2, 0, 3538944, 107, 139, 255 }, //  900 MHz | ||||
| 	{ 925, 2, 0, 3637248, 110, 139, 262 }, //  925 MHz | ||||
| 	{ 950, 2, 0, 3735552, 113, 139, 269 }, //  950 MHz | ||||
| 	{ 975, 2, 0, 3833856, 116, 139, 276 }, //  975 MHz | ||||
| 	{ 1000, 2, 0, 3932160, 119, 139, 283 }, // 1000 MHz | ||||
| }; | ||||
|  | ||||
| #define PLL_BYPASS (1<<1) | ||||
| #define SAT_ENABLE (1<<3) | ||||
|  | ||||
| #define PLL_OUTDIV_SHIFT	4 | ||||
| #define PLL_REFDIV_SHIFT	8 | ||||
| #define PLL_BWADJ_SHIFT		16 | ||||
|  | ||||
| #define PLL_LOW_FREQ	500 | ||||
| #define PLL_FREQ_STEP	25 | ||||
| static void plla_configure(int outdiv, int refdiv, int fbdiv, int bwadj, | ||||
|                            int sfreq, int sslope) | ||||
| { | ||||
| 	setbits_le32(SYS_CTRL_PLLA_CTRL0, PLL_BYPASS); | ||||
| 	udelay(10); | ||||
| 	reset_block(SYS_CTRL_RST_PLLA, 1); | ||||
| 	udelay(10); | ||||
|  | ||||
| 	writel((refdiv << PLL_REFDIV_SHIFT) | (outdiv << PLL_OUTDIV_SHIFT) | | ||||
| 	       SAT_ENABLE | PLL_BYPASS, | ||||
| 	       SYS_CTRL_PLLA_CTRL0); | ||||
|  | ||||
| 	writel(fbdiv, SYS_CTRL_PLLA_CTRL1); | ||||
| 	writel((bwadj << PLL_BWADJ_SHIFT) | sfreq, SYS_CTRL_PLLA_CTRL2); | ||||
| 	writel(sslope, SYS_CTRL_PLLA_CTRL3); | ||||
|  | ||||
| 	udelay(10); // 5us delay required (from TCI datasheet), use 10us | ||||
|  | ||||
| 	reset_block(SYS_CTRL_RST_PLLA, 0); | ||||
|  | ||||
| 	udelay(100); // Delay for PLL to lock | ||||
|  | ||||
| 	printf("  plla_ctrl0 : %08x\n", readl(SYS_CTRL_PLLA_CTRL0)); | ||||
| 	printf("  plla_ctrl1 : %08x\n", readl(SYS_CTRL_PLLA_CTRL1)); | ||||
| 	printf("  plla_ctrl2 : %08x\n", readl(SYS_CTRL_PLLA_CTRL2)); | ||||
| 	printf("  plla_ctrl3 : %08x\n", readl(SYS_CTRL_PLLA_CTRL3)); | ||||
|  | ||||
| 	clrbits_le32(SYS_CTRL_PLLA_CTRL0, PLL_BYPASS); // Take PLL out of bypass | ||||
| 	puts("\nPLLA Set\n"); | ||||
| } | ||||
|  | ||||
| int plla_set_config(int mhz) | ||||
| { | ||||
| 	int index = (mhz - PLL_LOW_FREQ) / PLL_FREQ_STEP; | ||||
| 	const PLL_CONFIG *cfg; | ||||
|  | ||||
| 	if (index < 0 || index > ARRAY_SIZE(C_PLL_CONFIG)) { | ||||
| 		debug("Freq %d MHz out of range, default to lowest\n", mhz); | ||||
| 		index = 0; | ||||
| 	} | ||||
| 	cfg = &C_PLL_CONFIG[index]; | ||||
|  | ||||
| 	printf("Attempting to set PLLA to %d MHz ...\n", (unsigned) cfg->mhz); | ||||
| 	plla_configure(cfg->outdiv, cfg->refdiv, cfg->fbdiv, cfg->bwadj, | ||||
| 	               cfg->sfreq, cfg->sslope); | ||||
|  | ||||
| 	return cfg->mhz; | ||||
| } | ||||
|  | ||||
| @@ -0,0 +1,43 @@ | ||||
| #include <common.h> | ||||
| #include <asm/arch/pinmux.h> | ||||
|  | ||||
| void pinmux_set(int bank, int pin, int func) | ||||
| { | ||||
| 	u32 reg; | ||||
| 	u32 base; | ||||
| 	/* TODO: check parameters */ | ||||
|  | ||||
| 	if (bank == PINMUX_BANK_MFA) | ||||
| 		base = SYS_CONTROL_BASE; | ||||
| 	else | ||||
| 		base = SEC_CONTROL_BASE; | ||||
|  | ||||
| 	clrbits_le32(base + PINMUX_SECONDARY_SEL, BIT(pin)); | ||||
| 	clrbits_le32(base + PINMUX_TERTIARY_SEL, BIT(pin)); | ||||
| 	clrbits_le32(base + PINMUX_QUATERNARY_SEL, BIT(pin)); | ||||
| 	clrbits_le32(base + PINMUX_DEBUG_SEL, BIT(pin)); | ||||
| 	clrbits_le32(base + PINMUX_ALTERNATIVE_SEL, BIT(pin)); | ||||
|  | ||||
| 	switch (func) { | ||||
| 	case PINMUX_GPIO: | ||||
| 	default: | ||||
| 		return; | ||||
| 		break; | ||||
| 	case PINMUX_2: | ||||
| 		reg = base + PINMUX_SECONDARY_SEL; | ||||
| 		break; | ||||
| 	case PINMUX_3: | ||||
| 		reg = base + PINMUX_TERTIARY_SEL; | ||||
| 		break; | ||||
| 	case PINMUX_4: | ||||
| 		reg = base + PINMUX_QUATERNARY_SEL; | ||||
| 		break; | ||||
| 	case PINMUX_DEBUG: | ||||
| 		reg = base + PINMUX_DEBUG_SEL; | ||||
| 		break; | ||||
| 	case PINMUX_ALT: | ||||
| 		reg = base + PINMUX_ALTERNATIVE_SEL; | ||||
| 		break; | ||||
| 	} | ||||
| 	setbits_le32(reg, BIT(pin)); | ||||
| } | ||||
| @@ -0,0 +1,91 @@ | ||||
| #include <common.h> | ||||
| #include <asm/arch/sysctl.h> | ||||
| #include <asm/arch/pinmux.h> | ||||
| #include <asm/arch/clock.h> | ||||
|  | ||||
| void reset_cpu(ulong addr) | ||||
| { | ||||
| 	u32 value; | ||||
|  | ||||
| 	// Assert reset to cores as per power on defaults | ||||
| 	// Don't touch the DDR interface as things will come to an impromptu stop | ||||
| 	// NB Possibly should be asserting reset for PLLB, but there are timing | ||||
| 	//    concerns here according to the docs | ||||
|  | ||||
| 	value = | ||||
| 		BIT(SYS_CTRL_RST_COPRO     ) | | ||||
| 		BIT(SYS_CTRL_RST_USBHS     ) | | ||||
| 		BIT(SYS_CTRL_RST_USBHSPHYA ) | | ||||
| 		BIT(SYS_CTRL_RST_MACA      ) | | ||||
| 		BIT(SYS_CTRL_RST_PCIEA     ) | | ||||
| 		BIT(SYS_CTRL_RST_SGDMA     ) | | ||||
| 		BIT(SYS_CTRL_RST_CIPHER    ) | | ||||
| 		BIT(SYS_CTRL_RST_SATA      ) | | ||||
| 		BIT(SYS_CTRL_RST_SATA_LINK ) | | ||||
| 		BIT(SYS_CTRL_RST_SATA_PHY  ) | | ||||
| 		BIT(SYS_CTRL_RST_PCIEPHY   ) | | ||||
| 		BIT(SYS_CTRL_RST_STATIC    ) | | ||||
| 		BIT(SYS_CTRL_RST_UART1     ) | | ||||
| 		BIT(SYS_CTRL_RST_UART2     ) | | ||||
| 		BIT(SYS_CTRL_RST_MISC      ) | | ||||
| 		BIT(SYS_CTRL_RST_I2S       ) | | ||||
| 		BIT(SYS_CTRL_RST_SD        ) | | ||||
| 		BIT(SYS_CTRL_RST_MACB      ) | | ||||
| 		BIT(SYS_CTRL_RST_PCIEB     ) | | ||||
| 		BIT(SYS_CTRL_RST_VIDEO     ) | | ||||
| 		BIT(SYS_CTRL_RST_USBHSPHYB ) | | ||||
| 		BIT(SYS_CTRL_RST_USBDEV    ); | ||||
|  | ||||
| 	writel(value, SYS_CTRL_RST_SET_CTRL); | ||||
|  | ||||
| 	// Release reset to cores as per power on defaults | ||||
| 	writel(BIT(SYS_CTRL_RST_GPIO), SYS_CTRL_RST_CLR_CTRL); | ||||
|  | ||||
| 	// Disable clocks to cores as per power-on defaults - must leave DDR | ||||
| 	// related clocks enabled otherwise we'll stop rather abruptly. | ||||
| 	value = | ||||
| 		BIT(SYS_CTRL_CLK_COPRO) 	| | ||||
| 		BIT(SYS_CTRL_CLK_DMA)   	| | ||||
| 		BIT(SYS_CTRL_CLK_CIPHER)	| | ||||
| 		BIT(SYS_CTRL_CLK_SD)  		| | ||||
| 		BIT(SYS_CTRL_CLK_SATA)  	| | ||||
| 		BIT(SYS_CTRL_CLK_I2S)   	| | ||||
| 		BIT(SYS_CTRL_CLK_USBHS) 	| | ||||
| 		BIT(SYS_CTRL_CLK_MAC)   	| | ||||
| 		BIT(SYS_CTRL_CLK_PCIEA)   	| | ||||
| 		BIT(SYS_CTRL_CLK_STATIC)	| | ||||
| 		BIT(SYS_CTRL_CLK_MACB)		| | ||||
| 		BIT(SYS_CTRL_CLK_PCIEB)		| | ||||
| 		BIT(SYS_CTRL_CLK_REF600)	| | ||||
| 		BIT(SYS_CTRL_CLK_USBDEV); | ||||
|  | ||||
| 	writel(value, SYS_CTRL_CLK_CLR_CTRL); | ||||
|  | ||||
| 	// Enable clocks to cores as per power-on defaults | ||||
|  | ||||
| 	// Set sys-control pin mux'ing as per power-on defaults | ||||
|  | ||||
| 	writel(0, SYS_CONTROL_BASE + PINMUX_SECONDARY_SEL); | ||||
| 	writel(0, SYS_CONTROL_BASE + PINMUX_TERTIARY_SEL); | ||||
| 	writel(0, SYS_CONTROL_BASE + PINMUX_QUATERNARY_SEL); | ||||
| 	writel(0, SYS_CONTROL_BASE + PINMUX_DEBUG_SEL); | ||||
| 	writel(0, SYS_CONTROL_BASE + PINMUX_ALTERNATIVE_SEL); | ||||
| 	writel(0, SYS_CONTROL_BASE + PINMUX_PULLUP_SEL); | ||||
|  | ||||
| 	writel(0, SEC_CONTROL_BASE + PINMUX_SECONDARY_SEL); | ||||
| 	writel(0, SEC_CONTROL_BASE + PINMUX_TERTIARY_SEL); | ||||
| 	writel(0, SEC_CONTROL_BASE + PINMUX_QUATERNARY_SEL); | ||||
| 	writel(0, SEC_CONTROL_BASE + PINMUX_DEBUG_SEL); | ||||
| 	writel(0, SEC_CONTROL_BASE + PINMUX_ALTERNATIVE_SEL); | ||||
| 	writel(0, SEC_CONTROL_BASE + PINMUX_PULLUP_SEL); | ||||
|  | ||||
| 	// No need to save any state, as the ROM loader can determine whether reset | ||||
| 	// is due to power cycling or programatic action, just hit the (self- | ||||
| 	// clearing) CPU reset bit of the block reset register | ||||
| 	value = | ||||
| 		BIT(SYS_CTRL_RST_SCU) | | ||||
| 		BIT(SYS_CTRL_RST_ARM0) | | ||||
| 		BIT(SYS_CTRL_RST_ARM1); | ||||
|  | ||||
| 	writel(value, SYS_CTRL_RST_SET_CTRL); | ||||
| } | ||||
| @@ -0,0 +1,129 @@ | ||||
| /* | ||||
|  * (C) Copyright 2004 | ||||
|  * Texas Instruments | ||||
|  * Richard Woodruff <r-woodruff2@ti.com> | ||||
|  * | ||||
|  * (C) Copyright 2002 | ||||
|  * Sysgo Real-Time Solutions, GmbH <www.elinos.com> | ||||
|  * Marius Groeger <mgroeger@sysgo.de> | ||||
|  * Alex Zuepke <azu@sysgo.de> | ||||
|  * | ||||
|  * (C) Copyright 2002 | ||||
|  * Gary Jennejohn, DENX Software Engineering, <garyj@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 <asm/io.h> | ||||
|  | ||||
| #define TIMER_CLOCK	(CONFIG_SYS_CLK_FREQ / (1 << (CONFIG_TIMER_PRESCALE * 4))) | ||||
| #define TIMER_LOAD_VAL 0xFFFFFF | ||||
|  | ||||
| /* macro to read the 32 bit timer */ | ||||
| #define READ_TIMER	(TIMER_LOAD_VAL - readl(CONFIG_SYS_TIMERBASE + TIMER_CURR)) \ | ||||
| 			/ (TIMER_CLOCK / CONFIG_SYS_HZ) | ||||
|  | ||||
| #define READ_TIMER_HW	(TIMER_LOAD_VAL - readl(CONFIG_SYS_TIMERBASE + TIMER_CURR)) | ||||
|  | ||||
| DECLARE_GLOBAL_DATA_PTR; | ||||
|  | ||||
| int timer_init (void) | ||||
| { | ||||
| 	int32_t val; | ||||
|  | ||||
| 	/* Start the counter ticking up */ | ||||
| 	writel(TIMER_LOAD_VAL, CONFIG_SYS_TIMERBASE + TIMER_LOAD);	/* reload value on overflow*/ | ||||
|  | ||||
| 	val = (CONFIG_TIMER_PRESCALE << TIMER_PRESCALE_SHIFT) | | ||||
| 			(TIMER_MODE_PERIODIC << TIMER_MODE_SHIFT) | | ||||
| 			(TIMER_ENABLE << TIMER_ENABLE_SHIFT);		/* mask to enable timer*/ | ||||
| 	writel(val, CONFIG_SYS_TIMERBASE + TIMER_CTRL);	/* start timer */ | ||||
|  | ||||
| 	/* reset time */ | ||||
| 	gd->arch.lastinc = READ_TIMER;	/* capture current incrementer value */ | ||||
| 	gd->arch.tbl = 0;		/* start "advancing" time stamp */ | ||||
|  | ||||
| 	return(0); | ||||
| } | ||||
| /* | ||||
|  * timer without interrupts | ||||
|  */ | ||||
| ulong get_timer (ulong base) | ||||
| { | ||||
| 	return get_timer_masked () - base; | ||||
| } | ||||
|  | ||||
| /* delay x useconds AND preserve advance timestamp value */ | ||||
| void __udelay (unsigned long usec) | ||||
| { | ||||
| 	ulong tmo, tmp; | ||||
|  | ||||
| 	if (usec > 100000) {		/* if "big" number, spread normalization to seconds */ | ||||
| 		tmo = usec / 1000;	/* start to normalize for usec to ticks per sec */ | ||||
| 		tmo *= CONFIG_SYS_HZ;	/* find number of "ticks" to wait to achieve target */ | ||||
| 		tmo /= 1000;		/* finish normalize. */ | ||||
|  | ||||
| 		tmp = get_timer (0);		/* get current timestamp */ | ||||
| 		while (get_timer (tmp) < tmo)/* loop till event */ | ||||
| 			/*NOP*/; | ||||
| 	} else {			/* else small number, convert to hw ticks */ | ||||
| 		tmo = usec * (TIMER_CLOCK / 1000) / 1000; | ||||
| 		/* timeout is no more than 0.1s, and the hw timer will roll over at most once */ | ||||
| 		tmp = READ_TIMER_HW; | ||||
| 		while (((READ_TIMER_HW -tmp) & TIMER_LOAD_VAL) < tmo)/* loop till event */ | ||||
| 			/*NOP*/; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| ulong get_timer_masked (void) | ||||
| { | ||||
| 	ulong now = READ_TIMER;		/* current tick value */ | ||||
|  | ||||
| 	if (now >= gd->arch.lastinc) {		/* normal mode (non roll) */ | ||||
| 		/* move stamp fordward with absoulte diff ticks */ | ||||
| 		gd->arch.tbl += (now - gd->arch.lastinc); | ||||
| 	} else { | ||||
| 		/* we have rollover of incrementer */ | ||||
| 		gd->arch.tbl += ((TIMER_LOAD_VAL / (TIMER_CLOCK / CONFIG_SYS_HZ)) | ||||
| 				 - gd->arch.lastinc) + now; | ||||
| 	} | ||||
| 	gd->arch.lastinc = now; | ||||
| 	return gd->arch.tbl; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * This function is derived from PowerPC code (read timebase as long long). | ||||
|  * On ARM it just returns the timer value. | ||||
|  */ | ||||
| unsigned long long get_ticks(void) | ||||
| { | ||||
| 	return get_timer(0); | ||||
| } | ||||
| /* | ||||
|  * This function is derived from PowerPC code (timebase clock frequency). | ||||
|  * On ARM it returns the number of timer ticks per second. | ||||
|  */ | ||||
| ulong get_tbclk (void) | ||||
| { | ||||
| 	ulong tbclk; | ||||
| 	tbclk = CONFIG_SYS_HZ; | ||||
| 	return tbclk; | ||||
| } | ||||
| @@ -0,0 +1,84 @@ | ||||
| #ifndef _NAS782X_CLOCK_H | ||||
| #define _NAS782X_CLOCK_H | ||||
|  | ||||
| #include <asm/arch/sysctl.h> | ||||
| #include <asm/arch/cpu.h> | ||||
|  | ||||
| /* bit numbers of clock control register */ | ||||
| #define SYS_CTRL_CLK_COPRO  0 | ||||
| #define SYS_CTRL_CLK_DMA    1 | ||||
| #define SYS_CTRL_CLK_CIPHER 2 | ||||
| #define SYS_CTRL_CLK_SD     3 | ||||
| #define SYS_CTRL_CLK_SATA   4 | ||||
| #define SYS_CTRL_CLK_I2S    5 | ||||
| #define SYS_CTRL_CLK_USBHS  6 | ||||
| #define SYS_CTRL_CLK_MACA   7 | ||||
| #define SYS_CTRL_CLK_MAC   SYS_CTRL_CLK_MACA | ||||
| #define SYS_CTRL_CLK_PCIEA  8 | ||||
| #define SYS_CTRL_CLK_STATIC 9 | ||||
| #define SYS_CTRL_CLK_MACB   10 | ||||
| #define SYS_CTRL_CLK_PCIEB  11 | ||||
| #define SYS_CTRL_CLK_REF600 12 | ||||
| #define SYS_CTRL_CLK_USBDEV 13 | ||||
| #define SYS_CTRL_CLK_DDR    14 | ||||
| #define SYS_CTRL_CLK_DDRPHY 15 | ||||
| #define SYS_CTRL_CLK_DDRCK  16 | ||||
|  | ||||
| /* bit numbers of reset control register */ | ||||
| #define SYS_CTRL_RST_SCU          0 | ||||
| #define SYS_CTRL_RST_COPRO        1 | ||||
| #define SYS_CTRL_RST_ARM0         2 | ||||
| #define SYS_CTRL_RST_ARM1         3 | ||||
| #define SYS_CTRL_RST_USBHS        4 | ||||
| #define SYS_CTRL_RST_USBHSPHYA    5 | ||||
| #define SYS_CTRL_RST_MACA         6 | ||||
| #define SYS_CTRL_RST_MAC	SYS_CTRL_RST_MACA | ||||
| #define SYS_CTRL_RST_PCIEA        7 | ||||
| #define SYS_CTRL_RST_SGDMA        8 | ||||
| #define SYS_CTRL_RST_CIPHER       9 | ||||
| #define SYS_CTRL_RST_DDR          10 | ||||
| #define SYS_CTRL_RST_SATA         11 | ||||
| #define SYS_CTRL_RST_SATA_LINK    12 | ||||
| #define SYS_CTRL_RST_SATA_PHY     13 | ||||
| #define SYS_CTRL_RST_PCIEPHY      14 | ||||
| #define SYS_CTRL_RST_STATIC       15 | ||||
| #define SYS_CTRL_RST_GPIO         16 | ||||
| #define SYS_CTRL_RST_UART1        17 | ||||
| #define SYS_CTRL_RST_UART2        18 | ||||
| #define SYS_CTRL_RST_MISC         19 | ||||
| #define SYS_CTRL_RST_I2S          20 | ||||
| #define SYS_CTRL_RST_SD           21 | ||||
| #define SYS_CTRL_RST_MACB         22 | ||||
| #define SYS_CTRL_RST_PCIEB        23 | ||||
| #define SYS_CTRL_RST_VIDEO        24 | ||||
| #define SYS_CTRL_RST_DDR_PHY      25 | ||||
| #define SYS_CTRL_RST_USBHSPHYB    26 | ||||
| #define SYS_CTRL_RST_USBDEV       27 | ||||
| #define SYS_CTRL_RST_ARMDBG       29 | ||||
| #define SYS_CTRL_RST_PLLA         30 | ||||
| #define SYS_CTRL_RST_PLLB         31 | ||||
|  | ||||
| static inline void reset_block(int block, int reset) | ||||
| { | ||||
| 	u32 reg; | ||||
| 	if (reset) | ||||
| 		reg = SYS_CTRL_RST_SET_CTRL; | ||||
| 	else | ||||
| 		reg = SYS_CTRL_RST_CLR_CTRL; | ||||
|  | ||||
| 	writel(BIT(block), reg); | ||||
| } | ||||
|  | ||||
| static inline void enable_clock(int block) | ||||
| { | ||||
| 	writel(BIT(block), SYS_CTRL_CLK_SET_CTRL); | ||||
| } | ||||
|  | ||||
| static inline void disable_clock(int block) | ||||
| { | ||||
| 	writel(BIT(block), SYS_CTRL_CLK_CLR_CTRL); | ||||
| } | ||||
|  | ||||
| int plla_set_config(int idx); | ||||
|  | ||||
| #endif /* _NAS782X_CLOCK_H */ | ||||
| @@ -0,0 +1,26 @@ | ||||
| #ifndef _NAS782X_CPU_H | ||||
| #define _NAS782X_CPU_H | ||||
|  | ||||
| #if !(defined(__KERNEL_STRICT_NAMES) || defined(__ASSEMBLY__)) | ||||
| #include <asm/types.h> | ||||
| #include <asm/io.h> | ||||
| #endif /* !(__KERNEL_STRICT_NAMES || __ASSEMBLY__) */ | ||||
|  | ||||
| #include <asm/arch/hardware.h> | ||||
| #include <asm/arch/timer.h> | ||||
|  | ||||
| #ifndef __KERNEL_STRICT_NAMES | ||||
| #ifndef __ASSEMBLY__ | ||||
|  | ||||
| #define BIT(x)                  (1 << (x)) | ||||
|  | ||||
| /* fix "implicit declaration of function" warnning */ | ||||
| void *memalign(size_t alignment, size_t bytes); | ||||
| void free(void* mem); | ||||
| void *malloc(size_t bytes); | ||||
| void *calloc(size_t n, size_t elem_size); | ||||
|  | ||||
| #endif /* __ASSEMBLY__ */ | ||||
| #endif /* __KERNEL_STRICT_NAMES */ | ||||
|  | ||||
| #endif /* _NAS782X_CPU_H */ | ||||
| @@ -0,0 +1,30 @@ | ||||
| #ifndef _NAS782X_HARDWARE_H | ||||
| #define _NAS782X_HARDWARE_H | ||||
|  | ||||
| /* Core addresses */ | ||||
| #define USB_HOST_BASE		0x40200000 | ||||
| #define MACA_BASE		0x40400000 | ||||
| #define MACB_BASE		0x40800000 | ||||
| #define MAC_BASE		MACA_BASE | ||||
| #define STATIC_CS0_BASE		0x41000000 | ||||
| #define STATIC_CS1_BASE		0x41400000 | ||||
| #define STATIC_CONTROL_BASE	0x41C00000 | ||||
| #define SATA_DATA_BASE		0x42000000 /* non-functional, DMA just needs an address */ | ||||
| #define GPIO_1_BASE		0x44000000 | ||||
| #define GPIO_2_BASE		0x44100000 | ||||
| #define UART_1_BASE		0x44200000 | ||||
| #define UART_2_BASE		0x44300000 | ||||
| #define SYS_CONTROL_BASE	0x44e00000 | ||||
| #define SEC_CONTROL_BASE	0x44f00000 | ||||
| #define RPSA_BASE		0x44400000 | ||||
| #define RPSC_BASE		0x44500000 | ||||
| #define DDR_BASE		0x44700000 | ||||
|  | ||||
| #define SATA_BASE		0x45900000 | ||||
| #define SATA_0_REGS_BASE	0x45900000 | ||||
| #define SATA_1_REGS_BASE	0x45910000 | ||||
| #define SATA_DMA_REGS_BASE	0x459a0000 | ||||
| #define SATA_SGDMA_REGS_BASE	0x459b0000 | ||||
| #define SATA_HOST_REGS_BASE	0x459e0000 | ||||
|  | ||||
| #endif /* _NAS782X_HARDWARE_H */ | ||||
| @@ -0,0 +1,46 @@ | ||||
| #ifndef _NAS782X_PINMUX_H | ||||
| #define _NAS782X_PINMUX_H | ||||
|  | ||||
| #include <asm/arch/cpu.h> | ||||
|  | ||||
| #define PINMUX_GPIO		0 | ||||
| #define PINMUX_2		1 | ||||
| #define PINMUX_3		2 | ||||
| #define PINMUX_4		3 | ||||
| #define PINMUX_DEBUG		4 | ||||
| #define PINMUX_ALT		5 | ||||
|  | ||||
| #define PINMUX_BANK_MFA		0 | ||||
| #define PINMUX_BANK_MFB		1 | ||||
|  | ||||
| /* System control multi-function pin function selection */ | ||||
| #define PINMUX_SECONDARY_SEL		0x14 | ||||
| #define PINMUX_TERTIARY_SEL		0x8c | ||||
| #define PINMUX_QUATERNARY_SEL		0x94 | ||||
| #define PINMUX_DEBUG_SEL		0x9c | ||||
| #define PINMUX_ALTERNATIVE_SEL		0xa4 | ||||
| #define PINMUX_PULLUP_SEL		0xac | ||||
|  | ||||
| #define PINMUX_UARTA_SIN		PINMUX_ALT | ||||
| #define PINMUX_UARTA_SOUT		PINMUX_ALT | ||||
|  | ||||
| #define PINMUX_STATIC_DATA0		PINMUX_2 | ||||
| #define PINMUX_STATIC_DATA1		PINMUX_2 | ||||
| #define PINMUX_STATIC_DATA2		PINMUX_2 | ||||
| #define PINMUX_STATIC_DATA3		PINMUX_2 | ||||
| #define PINMUX_STATIC_DATA4		PINMUX_2 | ||||
| #define PINMUX_STATIC_DATA5		PINMUX_2 | ||||
| #define PINMUX_STATIC_DATA6		PINMUX_2 | ||||
| #define PINMUX_STATIC_DATA7		PINMUX_2 | ||||
| #define PINMUX_STATIC_NWE		PINMUX_2 | ||||
| #define PINMUX_STATIC_NOE		PINMUX_2 | ||||
| #define PINMUX_STATIC_NCS		PINMUX_2 | ||||
| #define PINMUX_STATIC_ADDR18		PINMUX_2 | ||||
| #define PINMUX_STATIC_ADDR19		PINMUX_2 | ||||
|  | ||||
| #define PINMUX_MACA_MDC			PINMUX_2 | ||||
| #define PINMUX_MACA_MDIO		PINMUX_2 | ||||
|  | ||||
| extern void pinmux_set(int bank, int pin, int func); | ||||
|  | ||||
| #endif /* _NAS782X_PINMUX_H */ | ||||
| @@ -0,0 +1,6 @@ | ||||
| #ifndef _NAS782X_SPL_H | ||||
| #define _NAS782X_SPL_H | ||||
|  | ||||
| #include <asm/arch/cpu.h> | ||||
|  | ||||
| #endif /* _NAS782X_SPL_H */ | ||||
| @@ -0,0 +1,125 @@ | ||||
| #ifndef _NAS782X_SYSCTL_H | ||||
| #define _NAS782X_SYSCTL_H | ||||
|  | ||||
| #if !(defined(__KERNEL_STRICT_NAMES) || defined(__ASSEMBLY__)) | ||||
| #include <asm/types.h> | ||||
| #endif /* !(__KERNEL_STRICT_NAMES || __ASSEMBLY__) */ | ||||
|  | ||||
| #include <asm/arch/hardware.h> | ||||
|  | ||||
| /** | ||||
|  * System block reset and clock control | ||||
|  */ | ||||
| #define SYS_CTRL_PCI_STAT		(SYS_CONTROL_BASE + 0x20) | ||||
| #define SYS_CTRL_CLK_SET_CTRL		(SYS_CONTROL_BASE + 0x2C) | ||||
| #define SYS_CTRL_CLK_CLR_CTRL		(SYS_CONTROL_BASE + 0x30) | ||||
| #define SYS_CTRL_RST_SET_CTRL		(SYS_CONTROL_BASE + 0x34) | ||||
| #define SYS_CTRL_RST_CLR_CTRL		(SYS_CONTROL_BASE + 0x38) | ||||
| #define SYS_CTRL_PLLSYS_CTRL		(SYS_CONTROL_BASE + 0x48) | ||||
| #define SYS_CTRL_PLLSYS_KEY_CTRL	(SYS_CONTROL_BASE + 0x6C) | ||||
| #define SYS_CTRL_GMAC_CTRL		(SYS_CONTROL_BASE + 0x78) | ||||
|  | ||||
| /* Scratch registers */ | ||||
| #define SYS_CTRL_SCRATCHWORD0		(SYS_CONTROL_BASE + 0xc4) | ||||
| #define SYS_CTRL_SCRATCHWORD1		(SYS_CONTROL_BASE + 0xc8) | ||||
| #define SYS_CTRL_SCRATCHWORD2		(SYS_CONTROL_BASE + 0xcc) | ||||
| #define SYS_CTRL_SCRATCHWORD3		(SYS_CONTROL_BASE + 0xd0) | ||||
|  | ||||
| #define SYS_CTRL_PLLA_CTRL0		(SYS_CONTROL_BASE + 0x1F0) | ||||
| #define SYS_CTRL_PLLA_CTRL1		(SYS_CONTROL_BASE + 0x1F4) | ||||
| #define SYS_CTRL_PLLA_CTRL2		(SYS_CONTROL_BASE + 0x1F8) | ||||
| #define SYS_CTRL_PLLA_CTRL3		(SYS_CONTROL_BASE + 0x1FC) | ||||
|  | ||||
| #define SYS_CTRL_GMAC_AUTOSPEED		3 | ||||
| #define SYS_CTRL_GMAC_RGMII		2 | ||||
| #define SYS_CTRL_GMAC_SIMPLE_MUX	1 | ||||
| #define SYS_CTRL_GMAC_CKEN_GTX		0 | ||||
|  | ||||
| #define SYS_CTRL_CKCTRL_CTRL_ADDR	(SYS_CONTROL_BASE + 0x64) | ||||
|  | ||||
| #define SYS_CTRL_CKCTRL_PCI_DIV_BIT	0 | ||||
| #define SYS_CTRL_CKCTRL_SLOW_BIT	8 | ||||
|  | ||||
|  | ||||
| #define SYS_CTRL_USBHSMPH_CTRL		(SYS_CONTROL_BASE + 0x40) | ||||
| #define SYS_CTRL_USBHSMPH_STAT		(SYS_CONTROL_BASE + 0x44) | ||||
| #define SYS_CTRL_REF300_DIV		(SYS_CONTROL_BASE + 0xF8) | ||||
| #define SYS_CTRL_USBHSPHY_CTRL		(SYS_CONTROL_BASE + 0x84) | ||||
| #define SYS_CTRL_USB_CTRL		(SYS_CONTROL_BASE + 0x90) | ||||
|  | ||||
| /* System control multi-function pin function selection */ | ||||
| #define SYS_CTRL_SECONDARY_SEL		(SYS_CONTROL_BASE + 0x14) | ||||
| #define SYS_CTRL_TERTIARY_SEL		(SYS_CONTROL_BASE + 0x8c) | ||||
| #define SYS_CTRL_QUATERNARY_SEL		(SYS_CONTROL_BASE + 0x94) | ||||
| #define SYS_CTRL_DEBUG_SEL		(SYS_CONTROL_BASE + 0x9c) | ||||
| #define SYS_CTRL_ALTERNATIVE_SEL	(SYS_CONTROL_BASE + 0xa4) | ||||
| #define SYS_CTRL_PULLUP_SEL		(SYS_CONTROL_BASE + 0xac) | ||||
|  | ||||
| /* Secure control multi-function pin function selection */ | ||||
| #define SEC_CTRL_SECONDARY_SEL		(SEC_CONTROL_BASE + 0x14) | ||||
| #define SEC_CTRL_TERTIARY_SEL		(SEC_CONTROL_BASE + 0x8c) | ||||
| #define SEC_CTRL_QUATERNARY_SEL		(SEC_CONTROL_BASE + 0x94) | ||||
| #define SEC_CTRL_DEBUG_SEL		(SEC_CONTROL_BASE + 0x9c) | ||||
| #define SEC_CTRL_ALTERNATIVE_SEL	(SEC_CONTROL_BASE + 0xa4) | ||||
| #define SEC_CTRL_PULLUP_SEL		(SEC_CONTROL_BASE + 0xac) | ||||
|  | ||||
| #define SEC_CTRL_COPRO_CTRL		(SEC_CONTROL_BASE + 0x68) | ||||
| #define SEC_CTRL_SECURE_CTRL		(SEC_CONTROL_BASE + 0x98) | ||||
| #define SEC_CTRL_LEON_DEBUG		(SEC_CONTROL_BASE + 0xF0) | ||||
| #define SEC_CTRL_PLLB_DIV_CTRL		(SEC_CONTROL_BASE + 0xF8) | ||||
| #define SEC_CTRL_PLLB_CTRL0		(SEC_CONTROL_BASE + 0x1F0) | ||||
| #define SEC_CTRL_PLLB_CTRL1		(SEC_CONTROL_BASE + 0x1F4) | ||||
| #define SEC_CTRL_PLLB_CTRL8		(SEC_CONTROL_BASE + 0x1F4) | ||||
|  | ||||
| #define REF300_DIV_INT_SHIFT		8 | ||||
| #define REF300_DIV_FRAC_SHIFT		0 | ||||
| #define REF300_DIV_INT(val)		((val) << REF300_DIV_INT_SHIFT) | ||||
| #define REF300_DIV_FRAC(val)		((val) << REF300_DIV_FRAC_SHIFT) | ||||
|  | ||||
| #define USBHSPHY_SUSPENDM_MANUAL_ENABLE		16 | ||||
| #define USBHSPHY_SUSPENDM_MANUAL_STATE		15 | ||||
| #define USBHSPHY_ATE_ESET			14 | ||||
| #define USBHSPHY_TEST_DIN			6 | ||||
| #define USBHSPHY_TEST_ADD			2 | ||||
| #define USBHSPHY_TEST_DOUT_SEL			1 | ||||
| #define USBHSPHY_TEST_CLK			0 | ||||
|  | ||||
| #define USB_CTRL_USBAPHY_CKSEL_SHIFT	5 | ||||
| #define USB_CLK_XTAL0_XTAL1		(0 << USB_CTRL_USBAPHY_CKSEL_SHIFT) | ||||
| #define USB_CLK_XTAL0			(1 << USB_CTRL_USBAPHY_CKSEL_SHIFT) | ||||
| #define USB_CLK_INTERNAL		(2 << USB_CTRL_USBAPHY_CKSEL_SHIFT) | ||||
|  | ||||
| #define USBAMUX_DEVICE			BIT(4) | ||||
|  | ||||
| #define USBPHY_REFCLKDIV_SHIFT		2 | ||||
| #define USB_PHY_REF_12MHZ		(0 << USBPHY_REFCLKDIV_SHIFT) | ||||
| #define USB_PHY_REF_24MHZ		(1 << USBPHY_REFCLKDIV_SHIFT) | ||||
| #define USB_PHY_REF_48MHZ		(2 << USBPHY_REFCLKDIV_SHIFT) | ||||
|  | ||||
| #define USB_CTRL_USB_CKO_SEL_BIT	0 | ||||
|  | ||||
| #define USB_INT_CLK_XTAL 		0 | ||||
| #define USB_INT_CLK_REF300		2 | ||||
| #define USB_INT_CLK_PLLB		3 | ||||
|  | ||||
| #define SYS_CTRL_GMAC_AUTOSPEED		3 | ||||
| #define SYS_CTRL_GMAC_RGMII		2 | ||||
| #define SYS_CTRL_GMAC_SIMPLE_MUX	1 | ||||
| #define SYS_CTRL_GMAC_CKEN_GTX		0 | ||||
|  | ||||
|  | ||||
| #define PLLB_ENSAT			3 | ||||
| #define PLLB_OUTDIV			4 | ||||
| #define PLLB_REFDIV			8 | ||||
| #define PLLB_DIV_INT_SHIFT		8 | ||||
| #define PLLB_DIV_FRAC_SHIFT		0 | ||||
| #define PLLB_DIV_INT(val)		((val) << PLLB_DIV_INT_SHIFT) | ||||
| #define PLLB_DIV_FRAC(val)		((val) << PLLB_DIV_FRAC_SHIFT) | ||||
|  | ||||
| #ifndef __KERNEL_STRICT_NAMES | ||||
| #ifndef __ASSEMBLY__ | ||||
|  | ||||
| #endif /* __ASSEMBLY__ */ | ||||
| #endif /* __KERNEL_STRICT_NAMES */ | ||||
|  | ||||
| #endif /* _NAS782X_SYSCTL_H */ | ||||
| @@ -0,0 +1,23 @@ | ||||
| #ifndef _NAS782X_TIMER_H | ||||
| #define _NAS782X_TIMER_H | ||||
|  | ||||
| #define TIMER1_BASE		(RPSA_BASE + 0x200) | ||||
| #define TIMER2_BASE		(RPSA_BASE + 0x220) | ||||
|  | ||||
| #define TIMER_LOAD		0 | ||||
| #define TIMER_CURR		4 | ||||
| #define TIMER_CTRL		8 | ||||
| #define	TIMER_INTR		0x0C | ||||
|  | ||||
| #define TIMER_PRESCALE_SHIFT		2 | ||||
| #define TIMER_PRESCALE_1		0 | ||||
| #define TIMER_PRESCALE_16		1 | ||||
| #define TIMER_PRESCALE_256		2 | ||||
| #define TIMER_MODE_SHIFT		6 | ||||
| #define TIMER_MODE_FREE_RUNNING		0 | ||||
| #define TIMER_MODE_PERIODIC		1 | ||||
| #define TIMER_ENABLE_SHIFT		7 | ||||
| #define TIMER_DISABLE			0 | ||||
| #define TIMER_ENABLE			1 | ||||
|  | ||||
| #endif /* _NAS782X_TIMER_H */ | ||||
							
								
								
									
										15
									
								
								package/boot/uboot-oxnas/src/board/ox820/Kconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								package/boot/uboot-oxnas/src/board/ox820/Kconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| if TARGET_OX820 | ||||
|  | ||||
| config SYS_CPU | ||||
| 	default "arm1136" | ||||
|  | ||||
| config SYS_SOC | ||||
| 	default "nas782x" | ||||
|  | ||||
| config SYS_BOARD | ||||
| 	default "ox820" | ||||
|  | ||||
| config SYS_CONFIG_NAME | ||||
| 	default "ox820" | ||||
|  | ||||
| endif | ||||
							
								
								
									
										6
									
								
								package/boot/uboot-oxnas/src/board/ox820/MAINTAINERS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								package/boot/uboot-oxnas/src/board/ox820/MAINTAINERS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| SHEEVAPLUG BOARD | ||||
| M:	Daniel Golle <daniel@makrotopia.org> | ||||
| S:	Maintained | ||||
| F:	board/ox820/ | ||||
| F:	include/configs/ox820.h | ||||
| F:	configs/ox820_defconfig | ||||
							
								
								
									
										15
									
								
								package/boot/uboot-oxnas/src/board/ox820/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								package/boot/uboot-oxnas/src/board/ox820/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| # | ||||
| # (C) Copyright 2000-2006 | ||||
| # Wolfgang Denk, DENX Software Engineering, wd@denx.de. | ||||
| # | ||||
| # (C) Copyright 2008-2009 Freescale Semiconductor, Inc. | ||||
| # | ||||
| # SPDX-License-Identifier:	GPL-2.0+ | ||||
| # | ||||
|  | ||||
| obj-y += ox820.o | ||||
| obj-y += lowlevel_init.o | ||||
|  | ||||
| obj-$(CONFIG_SPL_BUILD) += spl_start.o | ||||
| obj-$(CONFIG_SPL_BUILD) += ddr.o | ||||
|  | ||||
							
								
								
									
										477
									
								
								package/boot/uboot-oxnas/src/board/ox820/ddr.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										477
									
								
								package/boot/uboot-oxnas/src/board/ox820/ddr.c
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,477 @@ | ||||
| /******************************************************************* | ||||
|  * | ||||
|  * File:            ddr_oxsemi.c | ||||
|  * | ||||
|  * Description:     Declarations for DDR routines and data objects | ||||
|  * | ||||
|  * Author:          Julien Margetts | ||||
|  * | ||||
|  * Copyright:       Oxford Semiconductor Ltd, 2009 | ||||
|  */ | ||||
| #include <common.h> | ||||
| #include <asm/arch/clock.h> | ||||
|  | ||||
| #include "ddr.h" | ||||
|  | ||||
| typedef unsigned int UINT; | ||||
|  | ||||
| // DDR TIMING PARAMETERS | ||||
| typedef struct { | ||||
| 	unsigned int holdoff_cmd_A; | ||||
| 	unsigned int holdoff_cmd_ARW; | ||||
| 	unsigned int holdoff_cmd_N; | ||||
| 	unsigned int holdoff_cmd_LM; | ||||
| 	unsigned int holdoff_cmd_R; | ||||
| 	unsigned int holdoff_cmd_W; | ||||
| 	unsigned int holdoff_cmd_PC; | ||||
| 	unsigned int holdoff_cmd_RF; | ||||
| 	unsigned int holdoff_bank_R; | ||||
| 	unsigned int holdoff_bank_W; | ||||
| 	unsigned int holdoff_dir_RW; | ||||
| 	unsigned int holdoff_dir_WR; | ||||
| 	unsigned int holdoff_FAW; | ||||
| 	unsigned int latency_CAS; | ||||
| 	unsigned int latency_WL; | ||||
| 	unsigned int recovery_WR; | ||||
| 	unsigned int width_update; | ||||
| 	unsigned int odt_offset; | ||||
| 	unsigned int odt_drive_all; | ||||
| 	unsigned int use_fixed_re; | ||||
| 	unsigned int delay_wr_to_re; | ||||
| 	unsigned int wr_slave_ratio; | ||||
| 	unsigned int rd_slave_ratio0; | ||||
| 	unsigned int rd_slave_ratio1; | ||||
| } T_DDR_TIMING_PARAMETERS; | ||||
|  | ||||
| // DDR CONFIG PARAMETERS | ||||
|  | ||||
| typedef struct { | ||||
| 	unsigned int ddr_mode; | ||||
| 	unsigned int width; | ||||
| 	unsigned int blocs; | ||||
| 	unsigned int banks8; | ||||
| 	unsigned int rams; | ||||
| 	unsigned int asize; | ||||
| 	unsigned int speed; | ||||
| 	unsigned int cmd_mode_wr_cl_bl; | ||||
| } T_DDR_CONFIG_PARAMETERS; | ||||
|  | ||||
| //cmd_mode_wr_cl_bl | ||||
| //when SDR : cmd_mode_wr_cl_bl = 0x80200002 + (latency_CAS_RAM * 16) + (recovery_WR - 1) * 512; -- Sets write rec XX, CL=XX; BL=8 | ||||
| //else       cmd_mode_wr_cl_bl = 0x80200003 + (latency_CAS_RAM * 16) + (recovery_WR - 1) * 512; -- Sets write rec XX, CL=XX; BL=8 | ||||
|  | ||||
| //                                                            cmd_                    bank_ dir_     lat_  rec_ width_ odt_   odt_ fix delay     ratio | ||||
| //                                                                A                                F  C         update offset all  re  re_to_we  w  r0  r1 | ||||
| //                                                                R     L        P  R        R  W  A  A  W  W | ||||
| //Timing Parameters                                            A  W  N  M  R  W  C  F  R  W  W  R  W  S  L  R | ||||
| static const T_DDR_TIMING_PARAMETERS C_TP_DDR2_25E_CL5_1GB = { 4, 5, 0, 2, 4, 4, | ||||
| 	5, 51, 23, 24, 9, 11, 18, 5, 4, 6, 3, 2, 0, 1, 2, 75, 56, 56 }; //elida device. | ||||
| static const T_DDR_TIMING_PARAMETERS C_TP_DDR2_25E_CL5_2GB = { 4, 5, 0, 2, 4, 4, | ||||
| 	5, 79, 22, 24, 9, 11, 20, 5, 4, 6, 3, 2, 0, 1, 2, 75, 56, 56 }; | ||||
| static const T_DDR_TIMING_PARAMETERS C_TP_DDR2_25_CL6_1GB = { 4, 5, 0, 2, 4, 4, | ||||
| 	4, 51, 22, 26, 10, 12, 18, 6, 5, 6, 3, 2, 0, 1, 2, 75, 56, 56 }; // 400MHz, Speedgrade 25 timings (1Gb parts) | ||||
|  | ||||
| //                                                          D     B  B  R  A   S | ||||
| //                                                          D  W  L  K  A  S   P | ||||
| //Config Parameters                                         R  D  C  8  M  Z   D CMD_MODE | ||||
| //static const T_DDR_CONFIG_PARAMETERS C_CP_DDR2_25E_CL5  = { 2,16, 1, 0, 1, 32,25,0x80200A53}; // 64 MByte | ||||
| static const T_DDR_CONFIG_PARAMETERS C_CP_DDR2_25E_CL5 = { 2, 16, 1, 1, 1, 64, | ||||
| 	25, 0x80200A53 }; // 128 MByte | ||||
| static const T_DDR_CONFIG_PARAMETERS C_CP_DDR2_25_CL6 = { 2, 16, 1, 1, 1, 128, | ||||
| 	25, 0x80200A63 }; // 256 MByte | ||||
|  | ||||
| static void ddr_phy_poll_until_locked(void) | ||||
| { | ||||
| 	volatile UINT reg_tmp = 0; | ||||
| 	volatile UINT locked = 0; | ||||
|  | ||||
| 	//Extra read to put in delay before starting to poll... | ||||
| 	reg_tmp = *(volatile UINT *) C_DDR_REG_PHY2;      // read | ||||
|  | ||||
| 	//POLL C_DDR_PHY2_REG register until clock and flock | ||||
| 	//!!! Ideally have a timeout on this. | ||||
| 	while (locked == 0) { | ||||
| 		reg_tmp = *(volatile UINT *) C_DDR_REG_PHY2;      // read | ||||
|  | ||||
| 		//locked when bits 30 and 31 are set | ||||
| 		if (reg_tmp & 0xC0000000) { | ||||
| 			locked = 1; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static void ddr_poll_until_not_busy(void) | ||||
| { | ||||
| 	volatile UINT reg_tmp = 0; | ||||
| 	volatile UINT busy = 1; | ||||
|  | ||||
| 	//Extra read to put in delay before starting to poll... | ||||
| 	reg_tmp = *(volatile UINT *) C_DDR_STAT_REG;      // read | ||||
|  | ||||
| 	//POLL DDR_STAT register until no longer busy | ||||
| 	//!!! Ideally have a timeout on this. | ||||
| 	while (busy == 1) { | ||||
| 		reg_tmp = *(volatile UINT *) C_DDR_STAT_REG;      // read | ||||
|  | ||||
| 		//when bit 31 is clear - core is no longer busy | ||||
| 		if ((reg_tmp & 0x80000000) == 0x00000000) { | ||||
| 			busy = 0; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static void ddr_issue_command(int commmand) | ||||
| { | ||||
| 	*(volatile UINT *) C_DDR_CMD_REG = commmand; | ||||
| 	ddr_poll_until_not_busy(); | ||||
| } | ||||
|  | ||||
| static void ddr_timing_initialisation( | ||||
| 	const T_DDR_TIMING_PARAMETERS *ddr_timing_parameters) | ||||
| { | ||||
| 	volatile UINT reg_tmp = 0; | ||||
| 	/* update the DDR controller registers for timing parameters */ | ||||
| 	reg_tmp = (ddr_timing_parameters->holdoff_cmd_A << 0); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->holdoff_cmd_ARW << 4); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->holdoff_cmd_N << 8); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->holdoff_cmd_LM << 12); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->holdoff_cmd_R << 16); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->holdoff_cmd_W << 20); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->holdoff_cmd_PC << 24); | ||||
| 	*(volatile UINT *) C_DDR_REG_TIMING0 = reg_tmp; | ||||
|  | ||||
| 	reg_tmp = (ddr_timing_parameters->holdoff_cmd_RF << 0); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->holdoff_bank_R << 8); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->holdoff_bank_W << 16); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->holdoff_dir_RW << 24); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->holdoff_dir_WR << 28); | ||||
| 	*(volatile UINT *) C_DDR_REG_TIMING1 = reg_tmp; | ||||
|  | ||||
| 	reg_tmp = (ddr_timing_parameters->latency_CAS << 0); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->latency_WL << 4); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->holdoff_FAW << 8); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->width_update << 16); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->odt_offset << 21); | ||||
| 	reg_tmp = reg_tmp + (ddr_timing_parameters->odt_drive_all << 24); | ||||
|  | ||||
| 	*(volatile UINT *) C_DDR_REG_TIMING2 = reg_tmp; | ||||
|  | ||||
| 	/* Program the timing parameters in the PHY too */ | ||||
| 	reg_tmp = (ddr_timing_parameters->use_fixed_re << 16) | ||||
| 			| (ddr_timing_parameters->delay_wr_to_re << 8) | ||||
| 			| (ddr_timing_parameters->latency_WL << 4) | ||||
| 			| (ddr_timing_parameters->latency_CAS << 0); | ||||
|  | ||||
| 	*(volatile UINT *) C_DDR_REG_PHY_TIMING = reg_tmp; | ||||
|  | ||||
| 	reg_tmp = ddr_timing_parameters->wr_slave_ratio; | ||||
|  | ||||
| 	*(volatile UINT *) C_DDR_REG_PHY_WR_RATIO = reg_tmp; | ||||
|  | ||||
| 	reg_tmp = ddr_timing_parameters->rd_slave_ratio0; | ||||
| 	reg_tmp += ddr_timing_parameters->rd_slave_ratio1 << 8; | ||||
|  | ||||
| 	*(volatile UINT *) C_DDR_REG_PHY_RD_RATIO = reg_tmp; | ||||
|  | ||||
| } | ||||
|  | ||||
| static void ddr_normal_initialisation( | ||||
| 	const T_DDR_CONFIG_PARAMETERS *ddr_config_parameters, int mhz) | ||||
| { | ||||
| 	int i; | ||||
| 	volatile UINT tmp = 0; | ||||
| 	volatile UINT reg_tmp = 0; | ||||
| 	volatile UINT emr_cmd = 0; | ||||
| 	UINT refresh; | ||||
|  | ||||
| 	//Total size of memory in Mbits... | ||||
| 	tmp = ddr_config_parameters->rams * ddr_config_parameters->asize | ||||
| 		* ddr_config_parameters->width; | ||||
| 	//Deduce value to program into DDR_CFG register... | ||||
| 	switch (tmp) { | ||||
| 	case 16: | ||||
| 		reg_tmp = 0x00020000 * 1; | ||||
| 		break; | ||||
| 	case 32: | ||||
| 		reg_tmp = 0x00020000 * 2; | ||||
| 		break; | ||||
| 	case 64: | ||||
| 		reg_tmp = 0x00020000 * 3; | ||||
| 		break; | ||||
| 	case 128: | ||||
| 		reg_tmp = 0x00020000 * 4; | ||||
| 		break; | ||||
| 	case 256: | ||||
| 		reg_tmp = 0x00020000 * 5; | ||||
| 		break; | ||||
| 	case 512: | ||||
| 		reg_tmp = 0x00020000 * 6; | ||||
| 		break; | ||||
| 	case 1024: | ||||
| 		reg_tmp = 0x00020000 * 7; | ||||
| 		break; | ||||
| 	case 2048: | ||||
| 		reg_tmp = 0x00020000 * 8; | ||||
| 		break; | ||||
| 	default: | ||||
| 		reg_tmp = 0; //forces sims not to work if badly configured | ||||
| 	} | ||||
|  | ||||
| 	//Memory width | ||||
| 	tmp = ddr_config_parameters->rams * ddr_config_parameters->width; | ||||
| 	switch (tmp) { | ||||
| 	case 8: | ||||
| 		reg_tmp = reg_tmp + 0x00400000; | ||||
| 		break; | ||||
| 	case 16: | ||||
| 		reg_tmp = reg_tmp + 0x00200000; | ||||
| 		break; | ||||
| 	case 32: | ||||
| 		reg_tmp = reg_tmp + 0x00000000; | ||||
| 		break; | ||||
| 	default: | ||||
| 		reg_tmp = 0; //forces sims not to work if badly configured | ||||
| 	} | ||||
|  | ||||
| 	//Setup DDR Mode | ||||
| 	switch (ddr_config_parameters->ddr_mode) { | ||||
| 	case 0: | ||||
| 		reg_tmp = reg_tmp + 0x00000000; | ||||
| 		break;   //SDR | ||||
| 	case 1: | ||||
| 		reg_tmp = reg_tmp + 0x40000000; | ||||
| 		break;   //DDR | ||||
| 	case 2: | ||||
| 		reg_tmp = reg_tmp + 0x80000000; | ||||
| 		break;   //DDR2 | ||||
| 	default: | ||||
| 		reg_tmp = 0; //forces sims not to work if badly configured | ||||
| 	} | ||||
|  | ||||
| 	//Setup Banks | ||||
| 	if (ddr_config_parameters->banks8 == 1) { | ||||
| 		reg_tmp = reg_tmp + 0x00800000; | ||||
| 	} | ||||
|  | ||||
| 	//Program DDR_CFG register... | ||||
| 	*(volatile UINT *) C_DDR_CFG_REG = reg_tmp; | ||||
|  | ||||
| 	//Configure PHY0 reg - se_mode is bit 1, | ||||
| 	//needs to be 1 for DDR (single_ended drive) | ||||
| 	switch (ddr_config_parameters->ddr_mode) { | ||||
| 	case 0: | ||||
| 		reg_tmp = 2 + (0 << 4); | ||||
| 		break;   //SDR | ||||
| 	case 1: | ||||
| 		reg_tmp = 2 + (4 << 4); | ||||
| 		break;   //DDR | ||||
| 	case 2: | ||||
| 		reg_tmp = 0 + (4 << 4); | ||||
| 		break;   //DDR2 | ||||
| 	default: | ||||
| 		reg_tmp = 0; | ||||
| 	} | ||||
|  | ||||
| 	//Program DDR_PHY0 register... | ||||
| 	*(volatile UINT *) C_DDR_REG_PHY0 = reg_tmp; | ||||
|  | ||||
| 	//Read DDR_PHY* registers to exercise paths for vcd | ||||
| 	reg_tmp = *(volatile UINT *) C_DDR_REG_PHY3; | ||||
| 	reg_tmp = *(volatile UINT *) C_DDR_REG_PHY2; | ||||
| 	reg_tmp = *(volatile UINT *) C_DDR_REG_PHY1; | ||||
| 	reg_tmp = *(volatile UINT *) C_DDR_REG_PHY0; | ||||
|  | ||||
| 	//Start up sequences - Different dependant on DDR mode | ||||
| 	switch (ddr_config_parameters->ddr_mode) { | ||||
| 	case 2:   //DDR2 | ||||
| 		//Start-up sequence: follows procedure described in Micron datasheet. | ||||
| 		//start up DDR PHY DLL | ||||
| 		reg_tmp = 0x00022828;       // dll on, start point and inc = h28 | ||||
| 		*(volatile UINT *) C_DDR_REG_PHY2 = reg_tmp; | ||||
|  | ||||
| 		reg_tmp = 0x00032828; // start on, dll on, start point and inc = h28 | ||||
| 		*(volatile UINT *) C_DDR_REG_PHY2 = reg_tmp; | ||||
|  | ||||
| 		ddr_phy_poll_until_locked(); | ||||
|  | ||||
| 		udelay(200);   //200us | ||||
|  | ||||
| 		//Startup SDRAM... | ||||
| 		//!!! Software: CK should be running for 200us before wake-up | ||||
| 		ddr_issue_command( C_CMD_WAKE_UP); | ||||
| 		ddr_issue_command( C_CMD_NOP); | ||||
| 		ddr_issue_command( C_CMD_PRECHARGE_ALL); | ||||
| 		ddr_issue_command( C_CMD_DDR2_EMR2); | ||||
| 		ddr_issue_command( C_CMD_DDR2_EMR3); | ||||
|  | ||||
| 		emr_cmd = C_CMD_DDR2_EMR1 + C_CMD_ODT_75 + C_CMD_REDUCED_DRIVE | ||||
| 			+ C_CMD_ENABLE_DLL; | ||||
|  | ||||
| 		ddr_issue_command(emr_cmd); | ||||
| 		//Sets CL=3; BL=8 but also reset DLL to trigger a DLL initialisation... | ||||
| 		udelay(1);   //1us | ||||
| 		ddr_issue_command( | ||||
| 			ddr_config_parameters->cmd_mode_wr_cl_bl | ||||
| 			+ C_CMD_RESET_DLL); | ||||
| 		udelay(1);   //1us | ||||
|  | ||||
| 		//!!! Software: Wait 200 CK cycles before... | ||||
| 		//for(i=1; i<=2; i++) { | ||||
| 		ddr_issue_command(C_CMD_PRECHARGE_ALL); | ||||
| 		// !!! Software: Wait here at least 8 CK cycles | ||||
| 		//} | ||||
| 		//need a wait here to ensure PHY DLL lock before the refresh is issued | ||||
| 		udelay(1);   //1us | ||||
| 		for (i = 1; i <= 2; i++) { | ||||
| 			ddr_issue_command( C_CMD_AUTO_REFRESH); | ||||
| 			//!!! Software: Wait here at least 8 CK cycles to satify tRFC | ||||
| 			udelay(1);   //1us | ||||
| 		} | ||||
| 		//As before but without 'RESET_DLL' bit set... | ||||
| 		ddr_issue_command(ddr_config_parameters->cmd_mode_wr_cl_bl); | ||||
| 		udelay(1);   //1us | ||||
| 		// OCD commands | ||||
| 		ddr_issue_command(emr_cmd + C_CMD_MODE_DDR2_OCD_DFLT); | ||||
| 		ddr_issue_command(emr_cmd + C_CMD_MODE_DDR2_OCD_EXIT); | ||||
| 		break; | ||||
|  | ||||
| 	default: | ||||
| 		break;  //Do nothing | ||||
| 	} | ||||
|  | ||||
| 	//Enable auto-refresh | ||||
|  | ||||
| 	// 8192 Refreshes required every 64ms, so maximum refresh period is 7.8125 us | ||||
| 	// We have a 400 MHz DDR clock (2.5ns period) so max period is 3125 cycles | ||||
| 	// Our core now does 8 refreshes in a go, so we multiply this period by 8 | ||||
|  | ||||
| 	refresh = (64000 * mhz) / 8192; // Refresh period in clocks | ||||
|  | ||||
| 	reg_tmp = *(volatile UINT *) C_DDR_CFG_REG;      // read | ||||
| #ifdef BURST_REFRESH_ENABLE | ||||
| 	reg_tmp |= C_CFG_REFRESH_ENABLE | (refresh * 8); | ||||
| 	reg_tmp |= C_CFG_BURST_REFRESH_ENABLE; | ||||
| #else | ||||
| 	reg_tmp |= C_CFG_REFRESH_ENABLE | (refresh * 1); | ||||
| 	reg_tmp &= ~C_CFG_BURST_REFRESH_ENABLE; | ||||
| #endif | ||||
| 	*(volatile UINT *) C_DDR_CFG_REG = reg_tmp; | ||||
|  | ||||
| 	//Verify register contents | ||||
| 	reg_tmp = *(volatile UINT *) C_DDR_REG_PHY2;      // read | ||||
| 	//printf("Warning XXXXXXXXXXXXXXXXXXXXXX - get bad read data from C_DDR_PHY2_REG, though it looks OK on bus XXXXXXXXXXXXXXXXXX"); | ||||
| 	//TBD   Check_data (read_data,  dll_reg, "Error: bad C_DDR_PHY2_REG read", tb_pass); | ||||
| 	reg_tmp = *(volatile UINT *) C_DDR_CFG_REG;      // read | ||||
| 	//TBD   Check_data (read_data,  cfg_reg, "Error: bad DDR_CFG read", tb_pass); | ||||
|  | ||||
| 	//disable optimised wrapping | ||||
| 	if (ddr_config_parameters->ddr_mode == 2) { | ||||
| 		reg_tmp = 0xFFFF0000; | ||||
| 		*(volatile UINT *) C_DDR_REG_IGNORE = reg_tmp; | ||||
| 	} | ||||
|  | ||||
| 	//enable midbuffer followon | ||||
| 	reg_tmp = *(volatile UINT *) C_DDR_ARB_REG;      // read | ||||
| 	reg_tmp = 0xFFFF0000 | reg_tmp; | ||||
| 	*(volatile UINT *) C_DDR_ARB_REG = reg_tmp; | ||||
|  | ||||
| 	// Enable write behind coherency checking for all clients | ||||
|  | ||||
| 	reg_tmp = 0xFFFF0000; | ||||
| 	*(volatile UINT *) C_DDR_AHB4_REG = reg_tmp; | ||||
|  | ||||
| 	//Wait for 200 clock cycles for SDRAM DLL to lock... | ||||
| 	udelay(1);   //1us | ||||
| } | ||||
|  | ||||
| // Function used to Setup DDR core | ||||
|  | ||||
| void ddr_setup(int mhz) | ||||
| { | ||||
| 	static const T_DDR_TIMING_PARAMETERS *ddr_timing_parameters = | ||||
| 		&C_TP_DDR2_25_CL6_1GB; | ||||
| 	static const T_DDR_CONFIG_PARAMETERS *ddr_config_parameters = | ||||
| 		&C_CP_DDR2_25_CL6; | ||||
|  | ||||
| 	//Bring core out of Reset | ||||
| 	*(volatile UINT *) C_DDR_BLKEN_REG = C_BLKEN_DDR_ON; | ||||
|  | ||||
| 	//DDR TIMING INITIALISTION | ||||
| 	ddr_timing_initialisation(ddr_timing_parameters); | ||||
|  | ||||
| 	//DDR NORMAL INITIALISATION | ||||
| 	ddr_normal_initialisation(ddr_config_parameters, mhz); | ||||
|  | ||||
| 	// route all writes through one client | ||||
| 	*(volatile UINT *) C_DDR_TRANSACTION_ROUTING = (0 | ||||
| 		<< DDR_ROUTE_CPU0_INSTR_SHIFT) | ||||
| 		| (1 << DDR_ROUTE_CPU0_RDDATA_SHIFT) | ||||
| 		| (3 << DDR_ROUTE_CPU0_WRDATA_SHIFT) | ||||
| 		| (2 << DDR_ROUTE_CPU1_INSTR_SHIFT) | ||||
| 		| (3 << DDR_ROUTE_CPU1_RDDATA_SHIFT) | ||||
| 		| (3 << DDR_ROUTE_CPU1_WRDATA_SHIFT); | ||||
|  | ||||
| 	//Bring all clients out of reset | ||||
| 	*(volatile UINT *) C_DDR_BLKEN_REG = C_BLKEN_DDR_ON + 0x0000FFFF; | ||||
|  | ||||
| } | ||||
|  | ||||
| void set_ddr_timing(unsigned int w, unsigned int i) | ||||
| { | ||||
| 	unsigned int reg; | ||||
| 	unsigned int wnow = 16; | ||||
| 	unsigned int inow = 32; | ||||
|  | ||||
| 	/* reset all timing controls to known value (31) */ | ||||
| 	writel(DDR_PHY_TIMING_W_RST | DDR_PHY_TIMING_I_RST, DDR_PHY_TIMING); | ||||
| 	writel(DDR_PHY_TIMING_W_RST | DDR_PHY_TIMING_I_RST | DDR_PHY_TIMING_CK, | ||||
| 	       DDR_PHY_TIMING); | ||||
| 	writel(DDR_PHY_TIMING_W_RST | DDR_PHY_TIMING_I_RST, DDR_PHY_TIMING); | ||||
|  | ||||
| 	/* step up or down read delay to the requested value */ | ||||
| 	while (wnow != w) { | ||||
| 		if (wnow < w) { | ||||
| 			reg = DDR_PHY_TIMING_INC; | ||||
| 			wnow++; | ||||
| 		} else { | ||||
| 			reg = 0; | ||||
| 			wnow--; | ||||
| 		} | ||||
| 		writel(DDR_PHY_TIMING_W_CE | reg, DDR_PHY_TIMING); | ||||
| 		writel(DDR_PHY_TIMING_CK | DDR_PHY_TIMING_W_CE | reg, | ||||
| 		       DDR_PHY_TIMING); | ||||
| 		writel(DDR_PHY_TIMING_W_CE | reg, DDR_PHY_TIMING); | ||||
| 	} | ||||
|  | ||||
| 	/* now write delay */ | ||||
| 	while (inow != i) { | ||||
| 		if (inow < i) { | ||||
| 			reg = DDR_PHY_TIMING_INC; | ||||
| 			inow++; | ||||
| 		} else { | ||||
| 			reg = 0; | ||||
| 			inow--; | ||||
| 		} | ||||
| 		writel(DDR_PHY_TIMING_I_CE | reg, DDR_PHY_TIMING); | ||||
| 		writel(DDR_PHY_TIMING_CK | DDR_PHY_TIMING_I_CE | reg, | ||||
| 		       DDR_PHY_TIMING); | ||||
| 		writel(DDR_PHY_TIMING_I_CE | reg, DDR_PHY_TIMING); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| //Function used to Setup SDRAM in DDR/SDR mode | ||||
| void init_ddr(int mhz) | ||||
| { | ||||
| 	/* start clocks */ | ||||
| 	enable_clock(SYS_CTRL_CLK_DDRPHY); | ||||
| 	enable_clock(SYS_CTRL_CLK_DDR); | ||||
| 	enable_clock(SYS_CTRL_CLK_DDRCK); | ||||
|  | ||||
| 	/* bring phy and core out of reset */ | ||||
| 	reset_block(SYS_CTRL_RST_DDR_PHY, 0); | ||||
| 	reset_block(SYS_CTRL_RST_DDR, 0); | ||||
|  | ||||
| 	/* DDR runs at half the speed of the CPU */ | ||||
| 	ddr_setup(mhz >> 1); | ||||
| 	return; | ||||
| } | ||||
							
								
								
									
										148
									
								
								package/boot/uboot-oxnas/src/board/ox820/ddr.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								package/boot/uboot-oxnas/src/board/ox820/ddr.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,148 @@ | ||||
| /******************************************************************* | ||||
| * | ||||
| * File:			ddr_oxsemi.h | ||||
| * | ||||
| * Description:		Declarations for DDR routines and data objects | ||||
| * | ||||
| * Author:		Julien Margetts | ||||
| * | ||||
| * Copyright:		Oxford Semiconductor Ltd, 2009 | ||||
| */ | ||||
|  | ||||
| void ddr_oxsemi_setup(int mhz); | ||||
|  | ||||
| /* define to refresh in bursts of 8 */ | ||||
| #define BURST_REFRESH_ENABLE | ||||
|  | ||||
| #define DDR_BASE			0x44700000 | ||||
|  | ||||
| #define C_DDR_CFG_REG			(DDR_BASE + 0x00) | ||||
| #define C_CFG_DDR			0x80000000 | ||||
| #define C_CFG_SDR			0x00000000 | ||||
| #define C_CFG_WIDTH8			0x00200000 | ||||
| #define C_CFG_WIDTH16			0x00100000 | ||||
| #define C_CFG_WIDTH32			0x00000000 | ||||
| #define C_CFG_SIZE_FACTOR		0x00020000 | ||||
| #define C_CFG_REFRESH_ENABLE		0x00010000 | ||||
| #define C_CFG_BURST_REFRESH_ENABLE	0x01000000 | ||||
| #define C_CFG_SIZE(x)			(x << 17) | ||||
| #define CFG_SIZE_2MB			1 | ||||
| #define CFG_SIZE_4MB			2 | ||||
| #define CFG_SIZE_8MB			3 | ||||
| #define CFG_SIZE_16MB			4 | ||||
| #define CFG_SIZE_32MB			5 | ||||
| #define CFG_SIZE_64MB			6 | ||||
| #define CFG_SIZE_128MB			7 | ||||
|  | ||||
| #define C_DDR_BLKEN_REG			(DDR_BASE + 0x04) | ||||
| #define C_BLKEN_DDR_ON			0x80000000 | ||||
|  | ||||
| #define C_DDR_STAT_REG			(DDR_BASE + 0x08) | ||||
|  | ||||
| #define C_DDR_CMD_REG			(DDR_BASE + 0x0C) | ||||
| #define C_CMD_SEND_COMMAND		(1UL << 31) | (1 << 21) // RAS/CAS/WE/CS all low(active), CKE High, indicates | ||||
| #define C_CMD_WAKE_UP			0x80FC0000 // Asserts CKE | ||||
| #define C_CMD_MODE_SDR			0x80200022 // Sets CL=2 BL=4 | ||||
| #define C_CMD_MODE_DDR			0x80200063 // Sets CL=2.5 BL=8 | ||||
| #define C_CMD_RESET_DLL			0x00000100 // A8=1 Use in conjunction with C_CMD_MODE_DDR | ||||
| #define C_CMD_PRECHARGE_ALL		0x80280400 | ||||
| #define C_CMD_AUTO_REFRESH		0x80240000 | ||||
| #define C_CMD_SELF_REFRESH		0x80040000 // As AUTO-REFRESH but with CKE low | ||||
| #define C_CMD_NOP			0x803C0000 // NOP just to insert guaranteed delay | ||||
| #define C_CMD_DDR2_EMR1			0x80210000 // Load extended mode register 1 with zeros (for init), CKE still set | ||||
| //#define C_CMD_DDR2_EMR1		0x80210400 // Load extended mode register 1 with zeros (for init), CKE still set | ||||
| #define C_CMD_ENABLE_DLL		0x00000000 // Values used in conjuction with C_CMD_DDR2_EMR1 | ||||
| #define C_CMD_DISABLE_DLL		0x00000001 | ||||
| #define C_CMD_REDUCED_DRIVE		0x00000002 | ||||
| #define C_CMD_ODT_DISABLED		0x00000000 | ||||
| #define C_CMD_ODT_50			0x00000044 | ||||
| #define C_CMD_ODT_75			0x00000004 | ||||
| #define C_CMD_ODT_150			0x00000040 | ||||
| #define C_CMD_MODE_DDR2_OCD_DFLT	0x00000380 | ||||
| #define C_CMD_MODE_DDR2_OCD_EXIT	0x00000000 | ||||
|  | ||||
| #define C_CMD_DDR2_EMR2			0x80220000 // Load extended mode register 2 with zeros (for init), CKE still set | ||||
| #define C_CMD_DDR2_EMR3			0x80230000 // Load extended mode register 3 with zeros (for init), CKE still set | ||||
|  | ||||
| #define C_DDR_AHB_REG			(DDR_BASE + 0x10) | ||||
| #define C_AHB_NO_RCACHES		0xFFFF0000 | ||||
| #define C_AHB_FLUSH_ALL_RCACHES		0x0000FFFF | ||||
| #define C_AHB_FLUSH_AHB0_RCACHE		0x00000001 | ||||
| #define C_AHB_FLUSH_AHB1_RCACHE		0x00000002 | ||||
|  | ||||
| #define C_DDR_DLL_REG			(DDR_BASE + 0x14) | ||||
| #define C_DLL_DISABLED			0x00000000 | ||||
| #define C_DLL_MANUAL			0x80000000 | ||||
| #define C_DLL_AUTO_OFFSET		0xA0000000 | ||||
| #define C_DLL_AUTO_IN_REFRESH		0xC0000000 | ||||
| #define C_DLL_AUTOMATIC			0xE0000000 | ||||
|  | ||||
| #define C_DDR_MON_REG			(DDR_BASE + 0x18) | ||||
| #define C_MON_ALL			0x00000010 | ||||
| #define C_MON_CLIENT			0x00000000 | ||||
|  | ||||
| #define C_DDR_DIAG_REG			(DDR_BASE + 0x1C) | ||||
| #define C_DDR_DIAG2_REG			(DDR_BASE + 0x20) | ||||
|  | ||||
| #define C_DDR_IOC_REG			(DDR_BASE + 0x24) | ||||
| #define C_DDR_IOC_PWR_DWN		(1 << 10) | ||||
| #define C_DDR_IOC_SEL_SSTL		(1 << 9) | ||||
| #define C_DDR_IOC_CK_DRIVE(x)		((x) << 6) | ||||
| #define C_DDR_IOC_DQ_DRIVE(x)		((x) << 3) | ||||
| #define C_DDR_IOC_XX_DRIVE(x)		((x) << 0) | ||||
|  | ||||
| #define C_DDR_ARB_REG			(DDR_BASE + 0x28) | ||||
| #define C_DDR_ARB_MIDBUF		(1 << 4) | ||||
| #define C_DDR_ARB_LRUBANK		(1 << 3) | ||||
| #define C_DDR_ARB_REQAGE		(1 << 2) | ||||
| #define C_DDR_ARB_DATDIR		(1 << 1) | ||||
| #define C_DDR_ARB_DATDIR_NC		(1 << 0) | ||||
|  | ||||
| #define C_TOP_ADDRESS_BIT_TEST		22 | ||||
| #define C_MEM_BASE			C_SDRAM_BASE | ||||
|  | ||||
| #define C_MEM_TEST_BASE			0 | ||||
| #define C_MEM_TEST_LEN			1920 | ||||
| #define C_MAX_RAND_ACCESS_LEN		16 | ||||
|  | ||||
| #define C_DDR_REG_IGNORE		(DDR_BASE + 0x2C) | ||||
| #define C_DDR_AHB4_REG			(DDR_BASE + 0x44) | ||||
|  | ||||
| #define C_DDR_REG_TIMING0		(DDR_BASE + 0x34) | ||||
| #define C_DDR_REG_TIMING1		(DDR_BASE + 0x38) | ||||
| #define C_DDR_REG_TIMING2		(DDR_BASE + 0x3C) | ||||
|  | ||||
| #define C_DDR_REG_PHY0			(DDR_BASE + 0x48) | ||||
| #define C_DDR_REG_PHY1			(DDR_BASE + 0x4C) | ||||
| #define C_DDR_REG_PHY2			(DDR_BASE + 0x50) | ||||
| #define C_DDR_REG_PHY3			(DDR_BASE + 0x54) | ||||
|  | ||||
| #define C_DDR_REG_GENERIC		(DDR_BASE + 0x60) | ||||
|  | ||||
| #define C_OXSEMI_DDRC_SIGNATURE		0x054415AA | ||||
|  | ||||
| #define DDR_PHY_BASE			(DDR_BASE + 0x80000) | ||||
| #define DDR_PHY_TIMING			(DDR_PHY_BASE + 0x48) | ||||
| #define DDR_PHY_TIMING_CK		(1 << 12) | ||||
| #define DDR_PHY_TIMING_INC		(1 << 13) | ||||
| #define DDR_PHY_TIMING_W_CE		(1 << 14) | ||||
| #define DDR_PHY_TIMING_W_RST		(1 << 15) | ||||
| #define DDR_PHY_TIMING_I_CE		(1 << 16) | ||||
| #define DDR_PHY_TIMING_I_RST		(1 << 17) | ||||
|  | ||||
| #define C_DDR_REG_PHY_TIMING		(DDR_PHY_BASE + 0x50) | ||||
| #define C_DDR_REG_PHY_WR_RATIO		(DDR_PHY_BASE + 0x74) | ||||
| #define C_DDR_REG_PHY_RD_RATIO		(DDR_PHY_BASE + 0x78) | ||||
|  | ||||
| #define C_DDR_TRANSACTION_ROUTING	(DDR_PHY_BASE + 0xC8) | ||||
| #define DDR_ROUTE_CPU0_INSTR_SHIFT	0 | ||||
| #define DDR_ROUTE_CPU0_RDDATA_SHIFT	4 | ||||
| #define DDR_ROUTE_CPU0_WRDATA_SHIFT	6 | ||||
| #define DDR_ROUTE_CPU1_INSTR_SHIFT	8 | ||||
| #define DDR_ROUTE_CPU1_RDDATA_SHIFT	12 | ||||
| #define DDR_ROUTE_CPU1_WRDATA_SHIFT	14 | ||||
|  | ||||
| unsigned int ddrc_signature(void); | ||||
| void set_ddr_timing(unsigned int w, unsigned int i); | ||||
| int pause(unsigned int us); | ||||
| void set_ddr_sel(int val); | ||||
							
								
								
									
										20
									
								
								package/boot/uboot-oxnas/src/board/ox820/lowlevel_init.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								package/boot/uboot-oxnas/src/board/ox820/lowlevel_init.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| #include <config.h> | ||||
| #ifndef CONFIG_SPL_BUILD | ||||
|  | ||||
| .globl lowlevel_init | ||||
| lowlevel_init: | ||||
| 	/* | ||||
| 	 * Copy exception table to relocated address in internal SRAM | ||||
| 	 */ | ||||
| 	ldr	r0, src		/* Address of exception table in flash */ | ||||
| 	ldr	r1, dest	/* Relocated address of exception table */ | ||||
| 	ldmia	r0!, {r3-r10}	/* Copy exception table and jump values from */ | ||||
| 	stmia	r1!, {r3-r10}	/* FLASH to relocated address */ | ||||
| 	ldmia	r0!, {r3-r10} | ||||
| 	stmia	r1!, {r3-r10} | ||||
| 	mov	pc, lr | ||||
|  | ||||
| src:	.word CONFIG_SYS_TEXT_BASE | ||||
| dest:	.word CONFIG_SRAM_BASE | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										374
									
								
								package/boot/uboot-oxnas/src/board/ox820/ox820.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										374
									
								
								package/boot/uboot-oxnas/src/board/ox820/ox820.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,374 @@ | ||||
| #include <common.h> | ||||
| #include <spl.h> | ||||
| #include <phy.h> | ||||
| #include <netdev.h> | ||||
| #include <ide.h> | ||||
| #include <nand.h> | ||||
| #include <asm/arch/spl.h> | ||||
| #include <asm/arch/pinmux.h> | ||||
| #include <asm/arch/clock.h> | ||||
| #include <asm/arch/sysctl.h> | ||||
|  | ||||
| DECLARE_GLOBAL_DATA_PTR; | ||||
|  | ||||
| #ifdef CONFIG_SPL_BUILD | ||||
|  | ||||
| #ifdef DEBUG | ||||
| #define DILIGENCE (1048576/4) | ||||
| static int test_memory(u32 memory) | ||||
| { | ||||
| 	volatile u32 *read; | ||||
| 	volatile u32 *write; | ||||
| 	const u32 INIT_PATTERN = 0xAA55AA55; | ||||
| 	const u32 INC_PATTERN = 0x01030507; | ||||
| 	u32 pattern; | ||||
| 	int check; | ||||
| 	int i; | ||||
|  | ||||
| 	check = 0; | ||||
| 	read = write = (volatile u32 *) memory; | ||||
| 	pattern = INIT_PATTERN; | ||||
| 	for (i = 0; i < DILIGENCE; i++) { | ||||
| 		*write++ = pattern; | ||||
| 		pattern += INC_PATTERN; | ||||
| 	} | ||||
| 	puts("testing\n"); | ||||
| 	pattern = INIT_PATTERN; | ||||
| 	for (i = 0; i < DILIGENCE; i++) { | ||||
| 		check += (pattern == *read++) ? 1 : 0; | ||||
| 		pattern += INC_PATTERN; | ||||
| 	} | ||||
| 	return (check == DILIGENCE) ? 0 : -1; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| void uart_init(void) | ||||
| { | ||||
| 	/* Reset UART1 */ | ||||
| 	reset_block(SYS_CTRL_RST_UART1, 1); | ||||
| 	udelay(100); | ||||
| 	reset_block(SYS_CTRL_RST_UART1, 0); | ||||
| 	udelay(100); | ||||
|  | ||||
| 	/* Setup pin mux'ing for UART1 */ | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 30, PINMUX_UARTA_SIN); | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 31, PINMUX_UARTA_SOUT); | ||||
| } | ||||
|  | ||||
| extern void init_ddr(int mhz); | ||||
|  | ||||
| void board_inithw(void) | ||||
| { | ||||
| 	int plla_freq; | ||||
| #ifdef DEBUG | ||||
| 	int i; | ||||
| #endif	/* DEBUG */ | ||||
|  | ||||
| 	timer_init(); | ||||
| 	uart_init(); | ||||
| 	preloader_console_init(); | ||||
|  | ||||
| 	plla_freq = plla_set_config(CONFIG_PLLA_FREQ_MHZ); | ||||
| 	init_ddr(plla_freq); | ||||
|  | ||||
| #ifdef DEBUG | ||||
| 	if(test_memory(CONFIG_SYS_SDRAM_BASE)) { | ||||
| 		puts("memory test failed\n"); | ||||
| 	} else { | ||||
| 		puts("memory test done\n"); | ||||
| 	} | ||||
| #endif /* DEBUG */ | ||||
| #ifdef CONFIG_SPL_BSS_DRAM_START | ||||
| 	extern char __bss_dram_start[]; | ||||
| 	extern char __bss_dram_end[]; | ||||
| 	memset(&__bss_dram_start, 0, __bss_dram_end - __bss_dram_start); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void board_init_f(ulong dummy) | ||||
| { | ||||
| 	/* Set the stack pointer. */ | ||||
| 	asm volatile("mov sp, %0\n" : : "r"(CONFIG_SPL_STACK)); | ||||
|  | ||||
| 	/* Clear the BSS. */ | ||||
| 	memset(__bss_start, 0, __bss_end - __bss_start); | ||||
|  | ||||
| 	/* Set global data pointer. */ | ||||
| 	gd = &gdata; | ||||
|  | ||||
| 	board_inithw(); | ||||
|  | ||||
| 	board_init_r(NULL, 0); | ||||
| } | ||||
|  | ||||
| u32 spl_boot_device(void) | ||||
| { | ||||
| 	return CONFIG_SPL_BOOT_DEVICE; | ||||
| } | ||||
|  | ||||
| #ifdef CONFIG_SPL_BLOCK_SUPPORT | ||||
| void spl_block_device_init(void) | ||||
| { | ||||
| 	ide_init(); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #ifdef CONFIG_SPL_OS_BOOT | ||||
| int spl_start_uboot(void) | ||||
| { | ||||
|         /* break into full u-boot on 'c' */ | ||||
|         return (serial_tstc() && serial_getc() == 'c'); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| void spl_display_print(void) | ||||
| { | ||||
| 	/* print a hint, so that we will not use the wrong SPL by mistake */ | ||||
| 	puts("  Boot device: " BOOT_DEVICE_TYPE "\n" ); | ||||
| } | ||||
|  | ||||
| void lowlevel_init(void) | ||||
| { | ||||
| } | ||||
|  | ||||
| #ifdef USE_DL_PREFIX | ||||
| /* quick and dirty memory allocation */ | ||||
| static ulong next_mem = CONFIG_SPL_MALLOC_START; | ||||
|  | ||||
| void *memalign(size_t alignment, size_t bytes) | ||||
| { | ||||
| 	ulong mem = ALIGN(next_mem, alignment); | ||||
|  | ||||
| 	next_mem = mem + bytes; | ||||
|  | ||||
| 	if (next_mem > CONFIG_SYS_SDRAM_BASE + CONFIG_MIN_SDRAM_SIZE) { | ||||
| 		printf("spl: out of memory\n"); | ||||
| 		hang(); | ||||
| 	} | ||||
|  | ||||
| 	return (void *)mem; | ||||
| } | ||||
|  | ||||
| void free(void* mem) | ||||
| { | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* CONFIG_SPL_BUILD */ | ||||
|  | ||||
| int board_early_init_f(void) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| #define STATIC_CTL_BANK0		(STATIC_CONTROL_BASE + 4) | ||||
| #define STATIC_READ_CYCLE_SHIFT		0 | ||||
| #define STATIC_DELAYED_OE		(1 << 7) | ||||
| #define STATIC_WRITE_CYCLE_SHIFT	8 | ||||
| #define STATIC_WRITE_PULSE_SHIFT	16 | ||||
| #define STATIC_WRITE_BURST_EN		(1 << 23) | ||||
| #define STATIC_TURN_AROUND_SHIFT	24 | ||||
| #define STATIC_BUFFER_PRESENT		(1 << 28) | ||||
| #define STATIC_READ_BURST_EN		(1 << 29) | ||||
| #define STATIC_BUS_WIDTH8		(0 << 30) | ||||
| #define STATIC_BUS_WIDTH16		(1 << 30) | ||||
| #define STATIC_BUS_WIDTH32		(2 << 30) | ||||
|  | ||||
| void nand_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl) | ||||
| { | ||||
| 	struct nand_chip *this = mtd->priv; | ||||
| 	unsigned long nandaddr = (unsigned long) this->IO_ADDR_W; | ||||
|  | ||||
| 	if (ctrl & NAND_CTRL_CHANGE) { | ||||
| 		nandaddr &= ~(BIT(NAND_ALE_ADDR_PIN) | BIT(NAND_CLE_ADDR_PIN)); | ||||
| 		if (ctrl & NAND_CLE) | ||||
| 			nandaddr |= BIT(NAND_CLE_ADDR_PIN); | ||||
| 		else if (ctrl & NAND_ALE) | ||||
| 			nandaddr |= BIT(NAND_ALE_ADDR_PIN); | ||||
| 		this->IO_ADDR_W = (void __iomem *) nandaddr; | ||||
| 	} | ||||
|  | ||||
| 	if (cmd != NAND_CMD_NONE) | ||||
| 		writeb(cmd, (void __iomem *) nandaddr); | ||||
| } | ||||
|  | ||||
| #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_BOOT_FROM_NAND) | ||||
|  | ||||
| int nand_dev_ready(struct mtd_info *mtd) | ||||
| { | ||||
| 	struct nand_chip *chip = mtd->priv; | ||||
|  | ||||
| 	udelay(chip->chip_delay); | ||||
|  | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) | ||||
| { | ||||
| 	int i; | ||||
| 	struct nand_chip *chip = mtd->priv; | ||||
|  | ||||
| 	for (i = 0; i < len; i++) | ||||
| 		buf[i] = readb(chip->IO_ADDR_R); | ||||
| } | ||||
|  | ||||
| void nand_dev_reset(struct nand_chip *chip) | ||||
| { | ||||
| 	writeb(NAND_CMD_RESET, chip->IO_ADDR_W + BIT(NAND_CLE_ADDR_PIN)); | ||||
| 	udelay(chip->chip_delay); | ||||
| 	writeb(NAND_CMD_STATUS, chip->IO_ADDR_W + BIT(NAND_CLE_ADDR_PIN)); | ||||
| 	while (!(readb(chip->IO_ADDR_R) & NAND_STATUS_READY)) { | ||||
| 		; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| #else | ||||
|  | ||||
| #define nand_dev_reset(chip)	/* framework will reset the chip anyway */ | ||||
| #define nand_read_buf		NULL /* framework will provide a default one */ | ||||
| #define nand_dev_ready		NULL /* dev_ready is optional */ | ||||
|  | ||||
| #endif | ||||
|  | ||||
| int board_nand_init(struct nand_chip *chip) | ||||
| { | ||||
| 	/* Block reset Static core */ | ||||
| 	reset_block(SYS_CTRL_RST_STATIC, 1); | ||||
| 	reset_block(SYS_CTRL_RST_STATIC, 0); | ||||
|  | ||||
| 	/* Enable clock to Static core */ | ||||
| 	enable_clock(SYS_CTRL_CLK_STATIC); | ||||
|  | ||||
| 	/* enable flash support on static bus. | ||||
| 	 * Enable static bus onto GPIOs, only CS0 */ | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 12, PINMUX_STATIC_DATA0); | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 13, PINMUX_STATIC_DATA1); | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 14, PINMUX_STATIC_DATA2); | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 15, PINMUX_STATIC_DATA3); | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 16, PINMUX_STATIC_DATA4); | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 17, PINMUX_STATIC_DATA5); | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 18, PINMUX_STATIC_DATA6); | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 19, PINMUX_STATIC_DATA7); | ||||
|  | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 20, PINMUX_STATIC_NWE); | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 21, PINMUX_STATIC_NOE); | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 22, PINMUX_STATIC_NCS); | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 23, PINMUX_STATIC_ADDR18); | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 24, PINMUX_STATIC_ADDR19); | ||||
|  | ||||
| 	/* Setup the static bus CS0 to access FLASH */ | ||||
|  | ||||
| 	writel((0x3f << STATIC_READ_CYCLE_SHIFT) | ||||
| 			| (0x3f << STATIC_WRITE_CYCLE_SHIFT) | ||||
| 			| (0x1f << STATIC_WRITE_PULSE_SHIFT) | ||||
| 			| (0x03 << STATIC_TURN_AROUND_SHIFT) | | ||||
| 			STATIC_BUS_WIDTH16, | ||||
| 		STATIC_CTL_BANK0); | ||||
|  | ||||
| 	chip->cmd_ctrl = nand_hwcontrol; | ||||
| 	chip->ecc.mode = NAND_ECC_SOFT; | ||||
| 	chip->chip_delay = 30; | ||||
| 	chip->dev_ready = nand_dev_ready; | ||||
| 	chip->read_buf = nand_read_buf; | ||||
|  | ||||
| 	nand_dev_reset(chip); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int board_init(void) | ||||
| { | ||||
| 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; | ||||
| 	gd->bd->bi_arch_number = MACH_TYPE_OXNAS; | ||||
|  | ||||
| 	/* assume uart is already initialized by SPL */ | ||||
|  | ||||
| #if defined(CONFIG_START_IDE) | ||||
| 	puts("IDE:   "); | ||||
| 	ide_init(); | ||||
| #endif | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* copied from board/evb64260/sdram_init.c */ | ||||
| /* | ||||
|  * Check memory range for valid RAM. A simple memory test determines | ||||
|  * the actually available RAM size between addresses `base' and | ||||
|  * `base + maxsize'. Some (not all) hardware errors are detected: | ||||
|  * - short between address lines | ||||
|  * - short between data lines | ||||
|  */ | ||||
| static long int dram_size (long int *base, long int maxsize) | ||||
| { | ||||
| 	volatile long int *addr, *b = base; | ||||
| 	long int cnt, val, save1, save2; | ||||
|  | ||||
| #define STARTVAL (CONFIG_MIN_SDRAM_SIZE / 2)	/* start test at half size */ | ||||
| 	for (cnt = STARTVAL / sizeof (long); cnt < maxsize / sizeof (long); | ||||
| 	     cnt <<= 1) { | ||||
| 		addr = base + cnt;	/* pointer arith! */ | ||||
|  | ||||
| 		save1 = *addr;	/* save contents of addr */ | ||||
| 		save2 = *b;	/* save contents of base */ | ||||
|  | ||||
| 		*addr = cnt;	/* write cnt to addr */ | ||||
| 		*b = 0;		/* put null at base */ | ||||
|  | ||||
| 		/* check at base address */ | ||||
| 		if ((*b) != 0) { | ||||
| 			*addr = save1;	/* restore *addr */ | ||||
| 			*b = save2;	/* restore *b */ | ||||
| 			return (0); | ||||
| 		} | ||||
| 		val = *addr;	/* read *addr */ | ||||
|  | ||||
| 		*addr = save1; | ||||
| 		*b = save2; | ||||
|  | ||||
| 		if (val != cnt) { | ||||
| 			/* fix boundary condition.. STARTVAL means zero */ | ||||
| 			if (cnt == STARTVAL / sizeof (long)) | ||||
| 				cnt = 0; | ||||
| 			return (cnt * sizeof (long)); | ||||
| 		} | ||||
| 	} | ||||
| 	return maxsize; | ||||
| } | ||||
|  | ||||
| int dram_init(void) | ||||
| { | ||||
| 	gd->ram_size = dram_size((long int *)CONFIG_SYS_SDRAM_BASE, | ||||
| 					CONFIG_MAX_SDRAM_SIZE); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int board_eth_init(bd_t *bis) | ||||
| { | ||||
| 	u32 value; | ||||
|  | ||||
| 	/* set the pin multiplexers to enable talking to Ethernent Phys */ | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 3, PINMUX_MACA_MDC); | ||||
| 	pinmux_set(PINMUX_BANK_MFA, 4, PINMUX_MACA_MDIO); | ||||
|  | ||||
| 	// Ensure the MAC block is properly reset | ||||
| 	reset_block(SYS_CTRL_RST_MAC, 1); | ||||
| 	udelay(10); | ||||
| 	reset_block(SYS_CTRL_RST_MAC, 0); | ||||
|  | ||||
| 	// Enable the clock to the MAC block | ||||
| 	enable_clock(SYS_CTRL_CLK_MAC); | ||||
|  | ||||
| 	value = readl(SYS_CTRL_GMAC_CTRL); | ||||
| 	/* Use simple mux for 25/125 Mhz clock switching */ | ||||
| 	value |= BIT(SYS_CTRL_GMAC_SIMPLE_MUX); | ||||
| 	/* Enable GMII_GTXCLK to follow GMII_REFCLK - required for gigabit PHY */ | ||||
| 	value |= BIT(SYS_CTRL_GMAC_CKEN_GTX); | ||||
| 	/* set auto tx speed */ | ||||
| 	value |= BIT(SYS_CTRL_GMAC_AUTOSPEED); | ||||
|  | ||||
| 	writel(value, SYS_CTRL_GMAC_CTRL); | ||||
|  | ||||
| 	return designware_initialize(MAC_BASE, PHY_INTERFACE_MODE_RGMII); | ||||
| } | ||||
|  | ||||
							
								
								
									
										21
									
								
								package/boot/uboot-oxnas/src/board/ox820/spl_start.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								package/boot/uboot-oxnas/src/board/ox820/spl_start.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| .section .init | ||||
| .globl _spl_start | ||||
| _spl_start: | ||||
| 	b	_start | ||||
| 	b	_start+0x4 | ||||
| 	b	_start+0x8 | ||||
| 	b	_start+0xc | ||||
| 	b	_start+0x10 | ||||
| 	b	_start+0x14 | ||||
| 	b	_start+0x18 | ||||
| 	b	_start+0x1c | ||||
| 	.space	0x30 - (. - _spl_start) | ||||
| 	.ascii	"BOOT"		/* 0x30 signature*/ | ||||
| 	.word	0x50		/* 0x34 header size itself */ | ||||
| 	.word	0		/* 0x38 */ | ||||
| 	.word	0x5000f000	/* boot report location */ | ||||
| 	.word	_start		/* 0x40 */ | ||||
|  | ||||
| main_crc_size:	.word	code_size	/* 0x44 filled by linker */ | ||||
| main_crc:	.word	0		/* 0x48 fill later */ | ||||
| header_crc:	.word	0		/* 0x4C header crc*/ | ||||
							
								
								
									
										101
									
								
								package/boot/uboot-oxnas/src/board/ox820/u-boot-spl.lds
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								package/boot/uboot-oxnas/src/board/ox820/u-boot-spl.lds
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| /* | ||||
|  * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com> | ||||
|  * on behalf of DENX Software Engineering GmbH | ||||
|  * | ||||
|  * January 2004 - Changed to support H4 device | ||||
|  * Copyright (c) 2004-2008 Texas Instruments | ||||
|  * | ||||
|  * (C) Copyright 2002 | ||||
|  * Gary Jennejohn, DENX Software Engineering, <garyj@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 | ||||
|  */ | ||||
|  | ||||
| MEMORY | ||||
| { | ||||
| 	 sram (rwx) : ORIGIN = CONFIG_SPL_TEXT_BASE, LENGTH = CONFIG_SPL_MAX_SIZE | ||||
| 	 dram : ORIGIN = CONFIG_SPL_BSS_DRAM_START, LENGTH = CONFIG_SPL_BSS_DRAM_SIZE | ||||
| } | ||||
|  | ||||
| OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") | ||||
| OUTPUT_ARCH(arm) | ||||
| ENTRY(_spl_start) | ||||
| SECTIONS | ||||
| { | ||||
| 	.text.0	: | ||||
| 	{ | ||||
| 		*(.init*) | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	/* Start of the rest of the SPL */ | ||||
| 	code_start = . ; | ||||
|  | ||||
| 	.text.1	: | ||||
| 	{ | ||||
| 		*(.text*) | ||||
| 	} | ||||
|  | ||||
| 	. = ALIGN(4); | ||||
| 	.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } | ||||
|  | ||||
| 	. = ALIGN(4); | ||||
| 	.data : { | ||||
| 		*(.data*) | ||||
| 	} | ||||
|  | ||||
| 	. = ALIGN(4); | ||||
|  | ||||
| 	__image_copy_end = .; | ||||
| 	code_size = . - code_start; | ||||
|  | ||||
| 	.rel.dyn : { | ||||
| 		__rel_dyn_start = .; | ||||
| 		*(.rel*) | ||||
| 		__rel_dyn_end = .; | ||||
| 	} | ||||
|  | ||||
| 	. = ALIGN(0x800); | ||||
|  | ||||
| 	_end = .; | ||||
|  | ||||
| 	.bss.sram __rel_dyn_start (OVERLAY) : { | ||||
| 		__bss_start = .; | ||||
| 		*(.bss.stdio_devices) | ||||
| 		*(.bss.serial_current) | ||||
| 		 . = ALIGN(4); | ||||
| 		__bss_end = .; | ||||
| 	} | ||||
|  | ||||
| 	.bss : { | ||||
| 		__bss_dram_start = .; | ||||
| 		*(.bss*) | ||||
| 		__bss_dram_end = .; | ||||
| 	} > dram | ||||
|  | ||||
| 	/DISCARD/ : { *(.bss*) } | ||||
| 	/DISCARD/ : { *(.dynsym) } | ||||
| 	/DISCARD/ : { *(.dynstr*) } | ||||
| 	/DISCARD/ : { *(.dynsym*) } | ||||
| 	/DISCARD/ : { *(.dynamic*) } | ||||
| 	/DISCARD/ : { *(.hash*) } | ||||
| 	/DISCARD/ : { *(.plt*) } | ||||
| 	/DISCARD/ : { *(.interp*) } | ||||
| 	/DISCARD/ : { *(.gnu*) } | ||||
| } | ||||
							
								
								
									
										116
									
								
								package/boot/uboot-oxnas/src/common/env_ext4.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								package/boot/uboot-oxnas/src/common/env_ext4.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | ||||
| /* | ||||
|  * (c) Copyright 2011 by Tigris Elektronik GmbH | ||||
|  * | ||||
|  * Author: | ||||
|  *  Maximilian Schwerin <mvs@tigris.de> | ||||
|  * | ||||
|  * SPDX-License-Identifier:	GPL-2.0+ | ||||
|  */ | ||||
|  | ||||
| #include <common.h> | ||||
|  | ||||
| #include <command.h> | ||||
| #include <environment.h> | ||||
| #include <linux/stddef.h> | ||||
| #include <malloc.h> | ||||
| #include <search.h> | ||||
| #include <errno.h> | ||||
| #include <ext4fs.h> | ||||
|  | ||||
| char *env_name_spec = "EXT4"; | ||||
|  | ||||
| env_t *env_ptr; | ||||
|  | ||||
| DECLARE_GLOBAL_DATA_PTR; | ||||
|  | ||||
| int env_init(void) | ||||
| { | ||||
| 	/* use default */ | ||||
| 	gd->env_addr = (ulong)&default_environment[0]; | ||||
| 	gd->env_valid = 1; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| #ifdef CONFIG_CMD_SAVEENV | ||||
| int saveenv(void) | ||||
| { | ||||
| 	env_t	env_new; | ||||
| 	ssize_t	len; | ||||
| 	char	*res; | ||||
| 	block_dev_desc_t *dev_desc = NULL; | ||||
| 	int dev = EXT4_ENV_DEVICE; | ||||
| 	int part = EXT4_ENV_PART; | ||||
| 	int err; | ||||
|  | ||||
| 	res = (char *)&env_new.data; | ||||
| 	len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL); | ||||
| 	if (len < 0) { | ||||
| 		error("Cannot export environment: errno = %d\n", errno); | ||||
| 		return 1; | ||||
| 	} | ||||
|  | ||||
| 	dev_desc = get_dev(EXT4_ENV_INTERFACE, dev); | ||||
| 	if (dev_desc == NULL) { | ||||
| 		printf("Failed to find %s%d\n", | ||||
| 			EXT4_ENV_INTERFACE, dev); | ||||
| 		return 1; | ||||
| 	} | ||||
|  | ||||
| 	err = ext4_register_device(dev_desc, part); | ||||
| 	if (err) { | ||||
| 		printf("Failed to register %s%d:%d\n", | ||||
| 			EXT4_ENV_INTERFACE, dev, part); | ||||
| 		return 1; | ||||
| 	} | ||||
|  | ||||
| 	env_new.crc = crc32(0, env_new.data, ENV_SIZE); | ||||
| 	err = ext4fs_write(EXT4_ENV_FILE, (void *)&env_new, sizeof(env_t)); | ||||
| 	ext4fs_close(); | ||||
| 	if (err == -1) { | ||||
| 		printf("\n** Unable to write \"%s\" from %s%d:%d **\n", | ||||
| 			EXT4_ENV_FILE, EXT4_ENV_INTERFACE, dev, part); | ||||
| 		return 1; | ||||
| 	} | ||||
|  | ||||
| 	puts("done\n"); | ||||
| 	return 0; | ||||
| } | ||||
| #endif /* CONFIG_CMD_SAVEENV */ | ||||
|  | ||||
| void env_relocate_spec(void) | ||||
| { | ||||
| 	char buf[CONFIG_ENV_SIZE]; | ||||
| 	block_dev_desc_t *dev_desc = NULL; | ||||
| 	int dev = EXT4_ENV_DEVICE; | ||||
| 	int part = EXT4_ENV_PART; | ||||
| 	int err; | ||||
|  | ||||
| 	dev_desc = get_dev(EXT4_ENV_INTERFACE, dev); | ||||
| 	if (dev_desc == NULL) { | ||||
| 		printf("Failed to find %s%d\n", | ||||
| 			EXT4_ENV_INTERFACE, dev); | ||||
| 		set_default_env(NULL); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	err = ext4_register_device(dev_desc, part); | ||||
| 	if (err) { | ||||
| 		printf("Failed to register %s%d:%d\n", | ||||
| 			EXT4_ENV_INTERFACE, dev, part); | ||||
| 		set_default_env(NULL); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	err = ext4_read_file(EXT4_ENV_FILE, (uchar *)&buf, 0, CONFIG_ENV_SIZE); | ||||
| 	ext4fs_close(); | ||||
|  | ||||
| 	if (err == -1) { | ||||
| 		printf("\n** Unable to read \"%s\" from %s%d:%d **\n", | ||||
| 			EXT4_ENV_FILE, EXT4_ENV_INTERFACE, dev, part); | ||||
| 		set_default_env(NULL); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	env_import(buf, 1); | ||||
| } | ||||
							
								
								
									
										236
									
								
								package/boot/uboot-oxnas/src/common/spl/spl_block.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										236
									
								
								package/boot/uboot-oxnas/src/common/spl/spl_block.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,236 @@ | ||||
| /* | ||||
|  * (C) Copyright 2013 | ||||
|  * | ||||
|  * Ma Haijun <mahaijuns@gmail.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 <spl.h> | ||||
| #include <asm/u-boot.h> | ||||
| #include <asm/utils.h> | ||||
| #include <version.h> | ||||
| #include <part.h> | ||||
| #include <fat.h> | ||||
| #include <ext4fs.h> | ||||
|  | ||||
| /* should be implemented by board */ | ||||
| extern void spl_block_device_init(void); | ||||
|  | ||||
| block_dev_desc_t * spl_get_block_device(void) | ||||
| { | ||||
| 	block_dev_desc_t * device; | ||||
|  | ||||
| 	spl_block_device_init(); | ||||
|  | ||||
| 	device = get_dev(CONFIG_SPL_BLOCKDEV_INTERFACE, CONFIG_SPL_BLOCKDEV_ID); | ||||
| 	if (!device) { | ||||
| 		printf("blk device %s%d not exists\n", | ||||
| 			CONFIG_SPL_BLOCKDEV_INTERFACE, | ||||
| 			CONFIG_SPL_BLOCKDEV_ID); | ||||
| 		hang(); | ||||
| 	} | ||||
|  | ||||
| 	return device; | ||||
| } | ||||
|  | ||||
| #ifdef CONFIG_SPL_FAT_SUPPORT | ||||
| static int block_load_image_fat(const char *filename) | ||||
| { | ||||
| 	int err; | ||||
| 	struct image_header *header; | ||||
|  | ||||
| 	header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - | ||||
| 						sizeof(struct image_header)); | ||||
|  | ||||
| 	err = file_fat_read(filename, header, sizeof(struct image_header)); | ||||
| 	if (err <= 0) | ||||
| 		goto end; | ||||
|  | ||||
| 	spl_parse_image_header(header); | ||||
|  | ||||
| 	err = file_fat_read(filename, (u8 *)spl_image.load_addr, 0); | ||||
|  | ||||
| end: | ||||
| 	if (err <= 0) | ||||
| 		printf("spl: error reading image %s, err - %d\n", | ||||
| 		       filename, err); | ||||
|  | ||||
| 	return (err <= 0); | ||||
| } | ||||
|  | ||||
| #ifdef CONFIG_SPL_OS_BOOT | ||||
| static int block_load_image_fat_os(void) | ||||
| { | ||||
| 	int err; | ||||
|  | ||||
| 	err = file_fat_read(CONFIG_SPL_FAT_LOAD_ARGS_NAME, | ||||
| 			    (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0); | ||||
| 	if (err <= 0) { | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return block_load_image_fat(CONFIG_SPL_FAT_LOAD_KERNEL_NAME); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| void spl_block_load_image(void) | ||||
| { | ||||
| 	int err; | ||||
| 	block_dev_desc_t * device; | ||||
|  | ||||
| 	device = spl_get_block_device(); | ||||
| 	err = fat_register_device(device, CONFIG_BLOCKDEV_FAT_BOOT_PARTITION); | ||||
| 	if (err) { | ||||
| 		printf("spl: fat register err - %d\n", err); | ||||
| 		hang(); | ||||
| 	} | ||||
| #ifdef CONFIG_SPL_OS_BOOT | ||||
| 	if (spl_start_uboot() || block_load_image_fat_os()) | ||||
| #endif | ||||
| 	{ | ||||
| 		err = block_load_image_fat(CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME); | ||||
| 		if (err) | ||||
| 			hang(); | ||||
| 	} | ||||
| } | ||||
| #elif defined(CONFIG_SPL_EXT4_SUPPORT) /* end CONFIG_SPL_FAT_SUPPORT */ | ||||
| static int block_load_image_ext4(const char *filename) | ||||
| { | ||||
| 	int err; | ||||
| 	struct image_header *header; | ||||
|  | ||||
| 	header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - | ||||
| 						sizeof(struct image_header)); | ||||
|  | ||||
| 	err = ext4_read_file(filename, header, 0, sizeof(struct image_header)); | ||||
| 	if (err <= 0) | ||||
| 		goto end; | ||||
|  | ||||
| 	spl_parse_image_header(header); | ||||
|  | ||||
| 	err = ext4_read_file(filename, (u8 *)spl_image.load_addr, 0, 0); | ||||
|  | ||||
| end: | ||||
| 	return (err <= 0); | ||||
| } | ||||
|  | ||||
| #ifdef CONFIG_SPL_OS_BOOT | ||||
| static int block_load_image_ext4_os(void) | ||||
| { | ||||
| 	int err; | ||||
|  | ||||
| 	err = ext4_read_file(CONFIG_SPL_EXT4_LOAD_ARGS_NAME, | ||||
| 			    (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0, 0); | ||||
| 	if (err <= 0) { | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return block_load_image_ext4(CONFIG_SPL_EXT4_LOAD_KERNEL_NAME); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| void spl_block_load_image(void) | ||||
| { | ||||
| 	int err; | ||||
| 	block_dev_desc_t * device; | ||||
|  | ||||
| 	device = spl_get_block_device(); | ||||
| 	err = ext4_register_device(device, CONFIG_BLOCKDEV_EXT4_BOOT_PARTITION); | ||||
| 	if (err) { | ||||
| 		hang(); | ||||
| 	} | ||||
| #ifdef CONFIG_SPL_OS_BOOT | ||||
| 	if (spl_start_uboot() || block_load_image_ext4_os()) | ||||
| #endif | ||||
| 	{ | ||||
| 		err = block_load_image_ext4(CONFIG_SPL_EXT4_LOAD_PAYLOAD_NAME); | ||||
| 		if (err) | ||||
| 			hang(); | ||||
| 	} | ||||
| } | ||||
| #else /* end CONFIG_SPL_EXT4_SUPPORT */ | ||||
| static int block_load_image_raw(block_dev_desc_t * device, lbaint_t sector) | ||||
| { | ||||
| 	int n; | ||||
| 	u32 image_size_sectors; | ||||
| 	struct image_header *header; | ||||
|  | ||||
| 	header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - | ||||
| 						sizeof(struct image_header)); | ||||
|  | ||||
| 	/* read image header to find the image size & load address */ | ||||
| 	n = device->block_read(device->dev, sector, 1, header); | ||||
|  | ||||
| 	if (n != 1) { | ||||
| 		printf("spl: blk read err\n"); | ||||
| 		return 1; | ||||
| 	} | ||||
|  | ||||
| 	spl_parse_image_header(header); | ||||
|  | ||||
| 	/* convert size to sectors - round up */ | ||||
| 	image_size_sectors = (spl_image.size + 512 - 1) / 512; | ||||
| 	n = device->block_read(device->dev, sector, image_size_sectors, | ||||
| 					(void *)spl_image.load_addr); | ||||
|  | ||||
| 	if (n != image_size_sectors) { | ||||
| 		printf("spl: blk read err\n"); | ||||
| 		return 1; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| #ifdef CONFIG_SPL_OS_BOOT | ||||
| static int block_load_image_raw_os(block_dev_desc_t * device) | ||||
| { | ||||
| 	int n; | ||||
|  | ||||
| 	n = device->block_read(device->dev, CONFIG_SYS_BLOCK_RAW_MODE_ARGS_SECTOR, | ||||
| 					CONFIG_SYS_BLOCK_RAW_MODE_ARGS_SECTORS, | ||||
| 					(u32 *)CONFIG_SYS_SPL_ARGS_ADDR); | ||||
| 	/* flush cache after read */ | ||||
| 	flush_cache(addr, CONFIG_SYS_BLOCK_RAW_MODE_ARGS_SECTORS * 512); | ||||
|  | ||||
| 	if (n != CONFIG_SYS_BLOCK_RAW_MODE_ARGS_SECTORS) { | ||||
| 		printf("args blk read error\n"); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return block_load_image_raw(device, CONFIG_SYS_BLOCK_RAW_MODE_KERNEL_SECTOR); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| void spl_block_load_image(void) | ||||
| { | ||||
| 	int err; | ||||
| 	block_dev_desc_t * device; | ||||
|  | ||||
| 	device = spl_get_block_device(); | ||||
| #ifdef CONFIG_SPL_OS_BOOT | ||||
| 	if (spl_start_uboot() || block_load_image_raw_os(device)) | ||||
| #endif | ||||
| 	{ | ||||
| 		err = block_load_image_raw(device, | ||||
| 					 CONFIG_SYS_BLOCK_RAW_MODE_U_BOOT_SECTOR); | ||||
| 		if (err) | ||||
| 			hang(); | ||||
| 	} | ||||
| } | ||||
| #endif /* CONFIG_SPL_FAT_SUPPORT */ | ||||
							
								
								
									
										3
									
								
								package/boot/uboot-oxnas/src/configs/ox820_defconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								package/boot/uboot-oxnas/src/configs/ox820_defconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| CONFIG_ARM=y | ||||
| CONFIG_OX820=y | ||||
| CONFIG_TARGET_OX820=y | ||||
							
								
								
									
										1170
									
								
								package/boot/uboot-oxnas/src/drivers/block/plxsata_ide.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1170
									
								
								package/boot/uboot-oxnas/src/drivers/block/plxsata_ide.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										105
									
								
								package/boot/uboot-oxnas/src/drivers/usb/host/ehci-oxnas.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								package/boot/uboot-oxnas/src/drivers/usb/host/ehci-oxnas.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| /* | ||||
|  * drivers/usb/host/ehci-oxnas.c | ||||
|  * | ||||
|  * Tzachi Perelstein <tzachi@marvell.com> | ||||
|  * | ||||
|  * This file is licensed under  the terms of the GNU General Public | ||||
|  * License version 2. This program is licensed "as is" without any | ||||
|  * warranty of any kind, whether express or implied. | ||||
|  */ | ||||
| #include <common.h> | ||||
| #include <asm/arch/hardware.h> | ||||
| #include <asm/arch/sysctl.h> | ||||
| #include <asm/arch/clock.h> | ||||
|  | ||||
| #include "ehci.h" | ||||
|  | ||||
| static struct ehci_hcor *ghcor; | ||||
|  | ||||
| static int start_oxnas_usb_ehci(void) | ||||
| { | ||||
| #ifdef CONFIG_USB_PLLB_CLK | ||||
| 	reset_block(SYS_CTRL_RST_PLLB, 0); | ||||
| 	enable_clock(SYS_CTRL_CLK_REF600); | ||||
|  | ||||
| 	writel((1 << PLLB_ENSAT) | (1 << PLLB_OUTDIV) | (2 << PLLB_REFDIV), | ||||
| 			SEC_CTRL_PLLB_CTRL0); | ||||
| 	/* 600MHz pllb divider for 12MHz */ | ||||
| 	writel(PLLB_DIV_INT(50) | PLLB_DIV_FRAC(0), SEC_CTRL_PLLB_DIV_CTRL); | ||||
| #else | ||||
| 	/* ref 300 divider for 12MHz */ | ||||
| 	writel(REF300_DIV_INT(25) | REF300_DIV_FRAC(0), SYS_CTRL_REF300_DIV); | ||||
| #endif | ||||
|  | ||||
| 	/* Ensure the USB block is properly reset */ | ||||
| 	reset_block(SYS_CTRL_RST_USBHS, 1); | ||||
| 	reset_block(SYS_CTRL_RST_USBHS, 0); | ||||
|  | ||||
| 	reset_block(SYS_CTRL_RST_USBHSPHYA, 1); | ||||
| 	reset_block(SYS_CTRL_RST_USBHSPHYA, 0); | ||||
|  | ||||
| 	reset_block(SYS_CTRL_RST_USBHSPHYB, 1); | ||||
| 	reset_block(SYS_CTRL_RST_USBHSPHYB, 0); | ||||
|  | ||||
| 	/* Force the high speed clock to be generated all the time, via serial | ||||
| 	 programming of the USB HS PHY */ | ||||
| 	writel((2UL << USBHSPHY_TEST_ADD) | | ||||
| 		   (0xe0UL << USBHSPHY_TEST_DIN), SYS_CTRL_USBHSPHY_CTRL); | ||||
|  | ||||
| 	writel((1UL << USBHSPHY_TEST_CLK) | | ||||
| 		   (2UL << USBHSPHY_TEST_ADD) | | ||||
| 		   (0xe0UL << USBHSPHY_TEST_DIN), SYS_CTRL_USBHSPHY_CTRL); | ||||
|  | ||||
| 	writel((0xfUL << USBHSPHY_TEST_ADD) | | ||||
| 		   (0xaaUL << USBHSPHY_TEST_DIN), SYS_CTRL_USBHSPHY_CTRL); | ||||
|  | ||||
| 	writel((1UL << USBHSPHY_TEST_CLK) | | ||||
| 		   (0xfUL << USBHSPHY_TEST_ADD) | | ||||
| 		   (0xaaUL << USBHSPHY_TEST_DIN), SYS_CTRL_USBHSPHY_CTRL); | ||||
|  | ||||
| #ifdef CONFIG_USB_PLLB_CLK /* use pllb clock */ | ||||
| 		writel(USB_CLK_INTERNAL | USB_INT_CLK_PLLB, SYS_CTRL_USB_CTRL); | ||||
| #else /* use ref300 derived clock */ | ||||
| 		writel(USB_CLK_INTERNAL | USB_INT_CLK_REF300, SYS_CTRL_USB_CTRL); | ||||
| #endif | ||||
| 	/* Enable the clock to the USB block */ | ||||
| 	enable_clock(SYS_CTRL_CLK_USBHS); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
| int ehci_hcd_init(int index, enum usb_init_type init, struct ehci_hccr **hccr, | ||||
| 		  struct ehci_hcor **hcor) | ||||
| { | ||||
| 	start_oxnas_usb_ehci(); | ||||
| 	*hccr = (struct ehci_hccr *)(USB_HOST_BASE + 0x100); | ||||
| 	*hcor = (struct ehci_hcor *)((uint32_t)*hccr + | ||||
| 			HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase))); | ||||
| 	ghcor = *hcor; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int ehci_hcd_stop(int index) | ||||
| { | ||||
| 	reset_block(SYS_CTRL_RST_USBHS, 1); | ||||
| 	disable_clock(SYS_CTRL_CLK_USBHS); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| extern void __ehci_set_usbmode(int index); | ||||
| void ehci_set_usbmode(int index) | ||||
| { | ||||
| 	#define  or_txttfill_tuning	_reserved_1_[0] | ||||
| 	u32 tmp; | ||||
|  | ||||
| 	__ehci_set_usbmode(index); | ||||
|  | ||||
| 	tmp = ehci_readl(&ghcor->or_txfilltuning); | ||||
| 	tmp &= ~0x00ff0000; | ||||
| 	tmp |= 0x003f0000; /* set burst pre load count to 0x40 (63 * 4 bytes)  */ | ||||
| 	tmp |= 0x16; /* set sheduler overhead to 22 * 1.267us (HS) or 22 * 6.33us (FS/LS)*/ | ||||
| 	ehci_writel(&ghcor->or_txfilltuning, tmp); | ||||
|  | ||||
| 	tmp = ehci_readl(&ghcor->or_txttfill_tuning); | ||||
| 	tmp |= 0x2; /* set sheduler overhead to 2 * 6.333us */ | ||||
| 	ehci_writel(&ghcor->or_txttfill_tuning, tmp); | ||||
| } | ||||
							
								
								
									
										384
									
								
								package/boot/uboot-oxnas/src/include/configs/ox820.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										384
									
								
								package/boot/uboot-oxnas/src/include/configs/ox820.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,384 @@ | ||||
| #ifndef __CONFIG_H | ||||
| #define __CONFIG_H | ||||
|  | ||||
| /* High Level Configuration Options */ | ||||
| #define CONFIG_ARM1136 | ||||
| #define CONFIG_OX820 | ||||
| #define CONFIG_SYS_GENERIC_BOARD | ||||
| #define CONFIG_BOARD_EARLY_INIT_F | ||||
|  | ||||
| #include <asm/arch/cpu.h>	/* get chip and board defs */ | ||||
|  | ||||
| /* make cmd_ide.c quiet when compile */ | ||||
| #define __io | ||||
|  | ||||
| /*#define CONFIG_ARCH_CPU_INIT*/ | ||||
| /*#define CONFIG_DISPLAY_CPUINFO*/ | ||||
| /*#define CONFIG_DISPLAY_BOARDINFO*/ | ||||
| /*#define CONFIG_BOARD_EARLY_INIT_F*/ | ||||
| /*#define CONFIG_SKIP_LOWLEVEL_INIT*/ | ||||
|  | ||||
| /* mem */ | ||||
| #define CONFIG_SYS_SDRAM_BASE		0x60000000 | ||||
| #define CONFIG_NR_DRAM_BANKS		1 | ||||
| #define CONFIG_MIN_SDRAM_SIZE		(128 * 1024 * 1024)	/* 128 MB */ | ||||
| #define CONFIG_MAX_SDRAM_SIZE		(512 * 1024 * 1024)	/* 512 MB */ | ||||
| #define CONFIG_SRAM_BASE		0x50000000 | ||||
| #define CONFIG_SRAM_SIZE		(64 * 1024) | ||||
|  | ||||
| /* need do dma so better keep dcache off */ | ||||
| #define CONFIG_SYS_DCACHE_OFF | ||||
|  | ||||
| /* clock */ | ||||
| #define CONFIG_PLLA_FREQ_MHZ		800 | ||||
| #define CONFIG_RPSCLK			6250000 | ||||
| #define CONFIG_SYS_HZ			1000 | ||||
| #define CONFIG_SYS_CLK_FREQ		CONFIG_RPSCLK | ||||
| #define CONFIG_SYS_TIMERBASE		TIMER1_BASE | ||||
| #define CONFIG_TIMER_PRESCALE		TIMER_PRESCALE_16 | ||||
|  | ||||
| /* serial */ | ||||
| #define CONFIG_SYS_NS16550 | ||||
| #define CONFIG_SYS_NS16550_SERIAL | ||||
| #define CONFIG_SYS_NS16550_CLK		CONFIG_RPSCLK | ||||
| #define CONFIG_SYS_NS16550_REG_SIZE	1 | ||||
| #define CONFIG_BAUDRATE			115200 | ||||
| #define CONFIG_SYS_NS16550_COM1		UART_1_BASE | ||||
| #define CONFIG_CONS_INDEX		1 | ||||
|  | ||||
| /* ide */ | ||||
| #define CONFIG_SYS_ATA_BASE_ADDR	0 | ||||
| #define CONFIG_SYS_ATA_DATA_OFFSET	0 | ||||
| #define CONFIG_SYS_ATA_REG_OFFSET	0 | ||||
| #define CONFIG_SYS_ATA_ALT_OFFSET	0 | ||||
| #define CONFIG_IDE_PLX | ||||
| #define CONFIG_SYS_IDE_MAXDEVICE	2 | ||||
| #define CONFIG_SYS_IDE_MAXBUS		1 | ||||
| #define CONFIG_IDE_PREINIT | ||||
| #define CONFIG_LBA48 | ||||
|  | ||||
| /* nand */ | ||||
| #define CONFIG_NAND | ||||
| #define CONFIG_SYS_MAX_NAND_DEVICE	1 | ||||
| #define CONFIG_SYS_NAND_BASE		STATIC_CS0_BASE | ||||
| #define NAND_CLE_ADDR_PIN		19 | ||||
| #define NAND_ALE_ADDR_PIN		18 | ||||
| #define MTDPARTS_DEFAULT		"mtdparts=41000000.nand:" \ | ||||
| 						"14m(boot)," \ | ||||
|                                                 "-(ubi)" | ||||
| #define MTDIDS_DEFAULT			"nand0=41000000.nand" | ||||
| #define UBIPART_DEFAULT			"ubi" | ||||
|  | ||||
| /* net */ | ||||
| #define CONFIG_DESIGNWARE_ETH | ||||
| #define CONFIG_DW_ALTDESCRIPTOR | ||||
| #define CONFIG_MII | ||||
| #define CONFIG_CMD_MII | ||||
| #define CONFIG_PHYLIB | ||||
| #define CONFIG_PHY_REALTEK | ||||
| #define CONFIG_PHY_ICPLUS | ||||
|  | ||||
| /* spl */ | ||||
| #ifdef CONFIG_SPL_BUILD | ||||
| #define USE_DL_PREFIX	/* rename malloc free etc, so we can override them */ | ||||
| #endif | ||||
|  | ||||
| #if defined(CONFIG_BOOT_FROM_NAND) || defined(CONFIG_BOOT_FROM_SATA) | ||||
| #define CONFIG_SPL | ||||
| #define CONFIG_SPL_FRAMEWORK | ||||
| #define CONFIG_SPL_LIBCOMMON_SUPPORT | ||||
| #define CONFIG_SPL_SERIAL_SUPPORT | ||||
| #define CONFIG_SPL_LIBGENERIC_SUPPORT | ||||
| #define CONFIG_SPL_TEXT_BASE			0x50000000 | ||||
| #define CONFIG_SPL_STACK			(CONFIG_SRAM_BASE + (48 * 1024)) | ||||
| #define CONFIG_SPL_DISPLAY_PRINT | ||||
| #define CONFIG_SPL_BSS_DRAM_START			0x65000000 | ||||
| #define CONFIG_SPL_BSS_DRAM_SIZE			0x01000000 | ||||
| #define CONFIG_SPL_MALLOC_START				0x66000000 | ||||
| #endif | ||||
|  | ||||
| #if defined(CONFIG_BOOT_FROM_NAND) | ||||
| #define CONFIG_SPL_NAND_SUPPORT | ||||
| #define BOOT_DEVICE_TYPE			"NAND" | ||||
| #define BOOT_DEVICE_NAND			0xfeedbacc | ||||
| #define CONFIG_SPL_BOOT_DEVICE			BOOT_DEVICE_NAND | ||||
| #define CONFIG_SPL_NAND_SIMPLE | ||||
| #define CONFIG_SPL_NAND_ECC | ||||
| #define CONFIG_SPL_NAND_SOFTECC | ||||
| #define CONFIG_SYS_NAND_ECCSIZE			512 | ||||
| #define CONFIG_SYS_NAND_ECCBYTES		6 | ||||
| #define CONFIG_SYS_NAND_ECCPOS			{40, 41, 42, 43, 44, 45, 46, 47, \ | ||||
| 						48, 49, 50, 51, 52, 53, 54, 55, \ | ||||
| 						56, 57, 58, 59, 60, 61, 62, 63} | ||||
| #define CONFIG_SYS_NAND_PAGE_SIZE		2048 | ||||
| #define CONFIG_SYS_NAND_OOBSIZE			64 | ||||
| #define CONFIG_SYS_NAND_BLOCK_SIZE		(128 * 1024) | ||||
| #define CONFIG_SYS_NAND_BAD_BLOCK_POS		0 | ||||
| /* pages per erase block */ | ||||
| #define CONFIG_SYS_NAND_PAGE_COUNT		(CONFIG_SYS_NAND_BLOCK_SIZE / CONFIG_SYS_NAND_PAGE_SIZE) | ||||
| /* nand spl use 1 erase block, and use bit to byte encode for reliability */ | ||||
| #define CONFIG_SPL_MAX_SIZE			(128 * 1024 / 8) | ||||
| #define CONFIG_SYS_NAND_U_BOOT_OFFS		0x00040000 | ||||
| /* spl kernel load is not enabled */ | ||||
| #define CONFIG_SYS_NAND_SPL_KERNEL_OFFS		0x00200000 | ||||
| #define CONFIG_CMD_SPL_NAND_OFS			0 | ||||
| #define CONFIG_CMD_SPL_WRITE_SIZE		1024 | ||||
| #define CONFIG_SYS_SPL_ARGS_ADDR		(CONFIG_SYS_SDRAM_BASE + 0x100) | ||||
| /* CONFIG_BOOT_FROM_NAND end */ | ||||
|  | ||||
| #elif defined(CONFIG_BOOT_FROM_SATA) | ||||
| #define CONFIG_SPL_BLOCK_SUPPORT | ||||
| #define BOOT_DEVICE_TYPE				"SATA" | ||||
| #define BOOT_DEVICE_BLOCK				860202 | ||||
| #define CONFIG_SPL_BOOT_DEVICE				BOOT_DEVICE_BLOCK | ||||
| #define CONFIG_SPL_MAX_SIZE				(36 * 1024) | ||||
| #define CONFIG_SPL_LIBDISK_SUPPORT | ||||
| #define CONFIG_SPL_BLOCKDEV_INTERFACE			"ide" | ||||
| #define CONFIG_SPL_BLOCKDEV_ID				0 | ||||
|  | ||||
| #ifdef CONFIG_BOOT_FROM_FAT /* u-boot in fat partition */ | ||||
|  | ||||
| #define CONFIG_SPL_FAT_SUPPORT | ||||
|  | ||||
| #define CONFIG_BLOCKDEV_FAT_BOOT_PARTITION		1 /* first partition */ | ||||
| #define CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME		"u-boot.img" /* u-boot file name */ | ||||
| /* enable U-Boot Falcon Mode */ | ||||
| #define CONFIG_CMD_SPL | ||||
| #define CONFIG_SPL_OS_BOOT | ||||
| #define CONFIG_SPL_FAT_LOAD_ARGS_NAME			"bootargs.bin" /* boot parameters */ | ||||
| #define CONFIG_SPL_FAT_LOAD_KERNEL_NAME			"falcon.img" /* kernel */ | ||||
| #define CONFIG_SYS_SPL_ARGS_ADDR			(CONFIG_SYS_SDRAM_BASE + 0x100) | ||||
|  | ||||
| #elif CONFIG_BOOT_FROM_EXT4 | ||||
|  | ||||
| #define CONFIG_SPL_EXT4_SUPPORT | ||||
| #define CONFIG_BLOCKDEV_EXT4_BOOT_PARTITION		1 /* first partition */ | ||||
| #define CONFIG_SPL_EXT4_LOAD_PAYLOAD_NAME		"/boot/u-boot.img" /* u-boot file name */ | ||||
| /* enable U-Boot Falcon Mode */ | ||||
| #define CONFIG_CMD_SPL | ||||
| #define CONFIG_SPL_OS_BOOT | ||||
| #define CONFIG_SPL_EXT4_LOAD_ARGS_NAME			"/boot/bootargs.bin" /* boot parameters */ | ||||
| #define CONFIG_SPL_EXT4_LOAD_KERNEL_NAME		"/boot/falcon.img" /* kernel */ | ||||
| #define CONFIG_SYS_SPL_ARGS_ADDR			(CONFIG_SYS_SDRAM_BASE + 0x100) | ||||
|  | ||||
| #else /* u-boot in raw sectors */ | ||||
|  | ||||
| #define CONFIG_SYS_BLOCK_RAW_MODE_U_BOOT_SECTOR		1024 | ||||
| /* spl kernel load is not enabled */ | ||||
| #define CONFIG_SYS_BLOCK_RAW_MODE_KERNEL_SECTOR		4096 | ||||
| #define CONFIG_SYS_BLOCK_RAW_MODE_ARGS_SECTOR		0 | ||||
| #define CONFIG_SYS_BLOCK_RAW_MODE_ARGS_SECTORS		(1024 / 512) | ||||
| #define CONFIG_SYS_SPL_ARGS_ADDR			(CONFIG_SYS_SDRAM_BASE + 0x100) | ||||
|  | ||||
| #endif /* CONFIG_BOOT_FROM_FAT */ | ||||
| /* CONFIG_BOOT_FROM_SATA end */ | ||||
|  | ||||
| #else | ||||
| /* generic, no spl support */ | ||||
| #endif | ||||
|  | ||||
| /* boot */ | ||||
| #define CONFIG_IDENT_STRING		" for OXNAS" | ||||
| #define CONFIG_MACH_TYPE		MACH_TYPE_OXNAS | ||||
| #ifndef CONFIG_SPL_BUILD | ||||
| /* Enable devicetree support */ | ||||
| #define CONFIG_OF_LIBFDT | ||||
| #endif | ||||
| #define CONFIG_SETUP_MEMORY_TAGS | ||||
| #define CONFIG_CMDLINE_TAG | ||||
| #define CONFIG_INITRD_TAG | ||||
| #define CONFIG_BOOTDELAY		1 | ||||
| #define CONFIG_ZERO_BOOTDELAY_CHECK | ||||
| #define CONFIG_DEFAULT_CONSOLE_PARM	"console=ttyS0,115200n8 earlyprintk=serial" | ||||
| /* Boot Argument Buffer Size */ | ||||
| #define CONFIG_SYS_BARGSIZE		CONFIG_SYS_CBSIZE | ||||
| /* memtest works on */ | ||||
| #define CONFIG_SYS_LOAD_ADDR		(CONFIG_SYS_SDRAM_BASE) | ||||
| #define CONFIG_SYS_AUTOLOAD		"no" | ||||
|  | ||||
| #define CONFIG_DEFAULT_CONSOLE		CONFIG_DEFAULT_CONSOLE_PARM "\0" | ||||
| #define CONFIG_BOOTARGS			CONFIG_DEFAULT_CONSOLE_PARM | ||||
| #define CONFIG_BOOTCOMMAND		"run nandboot" | ||||
| #define CONFIG_BOOT_RETRY_TIME		-1 | ||||
| #define CONFIG_RESET_TO_RETRY		60 | ||||
|  | ||||
| #define CONFIG_NETCONSOLE | ||||
| #define CONFIG_IPADDR			192.168.50.100 | ||||
| #define CONFIG_SERVERIP			192.168.50.59 | ||||
|  | ||||
| /* A sane default configuration... | ||||
|  * When booting without a valid environment in ubi, first to loading and booting | ||||
|  * the kernel image directly above U-Boot, maybe both were loaded there by | ||||
|  * another bootloader. | ||||
|  * Also use that same offset (0x90000) to load the rescue image later on (by | ||||
|  * adding it onto the flash address where U-Boot is supposed to be stored by | ||||
|  * the legacy loader, 0x440000, resulting in offset 0x4d0000 on the flash). | ||||
|  * When coming up with a valid environment in ubi, first try to load the | ||||
|  * kernel from a ubi volume kernel, if that fails, fallback to the rescue | ||||
|  * image stored in boot partition. As a last resort try booting via | ||||
|  * DHCP/TFTP. | ||||
|  * In case there is no valid environment, first probe for a uimage in ram left | ||||
|  * behind by the first bootloader on a tftp boot. | ||||
|  * If that fails, switch to normal boot order and save environment. | ||||
|  * The loader is supposed to be written to flash at offset 0x440000 and loaded to | ||||
|  * RAM at 0x64000000 | ||||
|  */ | ||||
| #define CONFIG_EXTRA_ENV_SETTINGS	\ | ||||
| 	"load_kernel_ubi=ubi readvol 0x62000000 kernel;\0" \ | ||||
| 	"load_kernel_rescue=nand read 0x62000000 0x4e0000 0x400000;\0" \ | ||||
| 	"load_kernel_dhcp=dhcp 0x62000000 oxnas-rescue.bin;\0" \ | ||||
| 	"boot_kernel=bootm 0x62000000;\0" \ | ||||
| 	"boot_ubi=run load_kernel_ubi && run boot_kernel;\0" \ | ||||
| 	"boot_rescue=run load_kernel_rescue && run boot_kernel;\0" \ | ||||
| 	"boot_dhcp=run load_kernel_dhcp && run boot_kernel;\0" \ | ||||
| 	"normalboot=run boot_ubi; run boot_rescue; run boot_dhcp;\0" \ | ||||
| 	"firstboot=bootm 0x640a0000; setenv bootcmd run normalboot; " \ | ||||
| 	"setenv firstboot; saveenv; run bootcmd; \0" \ | ||||
| 	"bootcmd=run firstboot; \0" \ | ||||
| 	"console=" CONFIG_DEFAULT_CONSOLE \ | ||||
| 	"bootargs=" CONFIG_BOOTARGS "\0" \ | ||||
| 	"mtdids=" MTDIDS_DEFAULT "\0" \ | ||||
| 	"mtdparts=" MTDPARTS_DEFAULT "\0" \ | ||||
|  | ||||
| /* env */ | ||||
| #if defined(CONFIG_BOOT_FROM_NAND) | ||||
| #define CONFIG_ENV_IS_IN_NAND | ||||
| #define CONFIG_ENV_OFFSET		0x000C0000 | ||||
| #define CONFIG_ENV_SIZE			0x00020000 | ||||
| #define CONFIG_ENV_OFFSET_REDUND	0x00100000 | ||||
| #define CONFIG_ENV_SIZE_REDUND		0x00020000 | ||||
| #define CONFIG_ENV_RANGE		(CONFIG_ENV_SIZE * 2) | ||||
| /* CONFIG_BOOT_FROM_NAND end */ | ||||
|  | ||||
| #elif defined(CONFIG_BOOT_FROM_SATA) | ||||
| #ifdef CONFIG_BOOT_FROM_EXT4 | ||||
| #define CONFIG_ENV_IS_IN_EXT4 | ||||
| #define CONFIG_START_IDE | ||||
| #define EXT4_ENV_INTERFACE 		"ide" | ||||
| #define EXT4_ENV_DEVICE			0 | ||||
| #define EXT4_ENV_PART			1 | ||||
| #define EXT4_ENV_FILE			"/boot/u-boot.env" | ||||
| #define CONFIG_ENV_SIZE			(16 * 1024) | ||||
| #else | ||||
| #define CONFIG_ENV_IS_IN_FAT | ||||
| #define CONFIG_START_IDE | ||||
| #define FAT_ENV_INTERFACE 		"ide" | ||||
| #define FAT_ENV_DEVICE			0 | ||||
| #define FAT_ENV_PART			1 | ||||
| #define FAT_ENV_FILE			"u-boot.env" | ||||
| #define CONFIG_ENV_SIZE			(16 * 1024) | ||||
| #endif | ||||
| /* CONFIG_BOOT_FROM_SATA end */ | ||||
| #elif defined(CONFIG_BOOT_FROM_SATA) | ||||
|  | ||||
| #else | ||||
| /* generic */ | ||||
| #define CONFIG_ENV_IS_IN_UBI		1 | ||||
| #define CONFIG_ENV_UBI_PART		UBIPART_DEFAULT | ||||
| #define CONFIG_ENV_UBI_VOLUME		"ubootenv" | ||||
| #define CONFIG_ENV_UBI_VOLUME_REDUND	"ubootenv2" | ||||
| #define CONFIG_ENV_SIZE			(16 * 1024) | ||||
| #endif | ||||
|  | ||||
| /* allow to overwrite serial and ethaddr */ | ||||
| #define CONFIG_ENV_OVERWRITE | ||||
|  | ||||
| #define CONFIG_SYS_MONITOR_LEN		(512 * 1024) | ||||
| #define CONFIG_SYS_TEXT_BASE		0x64000000 | ||||
| #define CONFIG_SYS_INIT_SP_ADDR		0x65000000 | ||||
| /* Size of malloc() pool */ | ||||
| #define CONFIG_SYS_MALLOC_LEN		(1 * 1024 * 1024) | ||||
|  | ||||
| /* Miscellaneous configurable options */ | ||||
| #define CONFIG_SYS_LONGHELP		/* undef to save memory */ | ||||
| #define CONFIG_SYS_HUSH_PARSER		/* use "hush" command parser	*/ | ||||
| #define CONFIG_SYS_PROMPT		"OX820 # " | ||||
| #define CONFIG_SYS_CBSIZE		1024	/* Console I/O Buffer Size*/ | ||||
| #define CONFIG_SYS_PBSIZE		1024	/* Print Buffer Size */ | ||||
| #define CONFIG_SYS_MAXARGS		32	/* max number of command args */ | ||||
| #define CONFIG_CMDLINE_EDITING | ||||
| #define CONFIG_AUTO_COMPLETE | ||||
|  | ||||
| /* usb */ | ||||
| #define CONFIG_USB_MAX_CONTROLLER_COUNT	1 | ||||
| #define CONFIG_USB_EHCI | ||||
| #define CONFIG_EHCI_IS_TDI | ||||
| /* #define CONFIG_USB_EHCI_TXFIFO_THRESH	0x3F */ | ||||
| #define CONFIG_USB_PLLB_CLK | ||||
| #define CONFIG_USB_EHCI_OXNAS | ||||
| #ifndef CONFIG_SPL_BUILD | ||||
| #define CONFIG_USB_STORAGE | ||||
| #endif | ||||
| #define CONFIG_CMD_USB | ||||
|  | ||||
| /* cmds */ | ||||
| #define CONFIG_SYS_NO_FLASH | ||||
| #include <config_cmd_default.h> | ||||
|  | ||||
| #define CONFIG_CMD_SAVEENV | ||||
| #define CONFIG_CMD_ASKENV | ||||
| #define CONFIG_CMD_GREPENV | ||||
| #define CONFIG_CMD_ENV_FLAGS | ||||
|  | ||||
| #define CONFIG_CMD_NET | ||||
| #define CONFIG_CMD_DHCP | ||||
| #define CONFIG_CMD_NFS | ||||
| #define CONFIG_CMD_PING | ||||
| #define CONFIG_CMD_PXE | ||||
|  | ||||
| #define CONFIG_CMD_NAND | ||||
| #define CONFIG_CMD_MTDPARTS | ||||
| #define CONFIG_CMD_UBI | ||||
| #define CONFIG_CMD_UBIFS | ||||
|  | ||||
| #define CONFIG_CMD_IDE | ||||
| #define CONFIG_CMD_FAT | ||||
| #define CONFIG_FAT_WRITE | ||||
| #define CONFIG_CMD_EXT2 | ||||
| #define CONFIG_CMD_EXT4 | ||||
| #ifndef CONFIG_SPL_BUILD | ||||
| #define CONFIG_CMD_EXT4_WRITE | ||||
| #endif | ||||
|  | ||||
| #define CONFIG_CMD_ZIP | ||||
| #define CONFIG_CMD_UNZIP | ||||
| #define CONFIG_CMD_TIME | ||||
| #define CONFIG_CMD_SETEXPR | ||||
| #define CONFIG_CMD_MD5SUM | ||||
| #define CONFIG_CMD_HASH | ||||
| #define CONFIG_CMD_INI | ||||
| #define CONFIG_CMD_GETTIME | ||||
| #define CONFIG_CMD_BOOTMENU | ||||
| #define CONFIG_CMD_ELF | ||||
| #define CONFIG_CMD_BOOTZ | ||||
|  | ||||
| #define CONFIG_DOS_PARTITION | ||||
| #define CONFIG_EFI_PARTITION | ||||
|  | ||||
| /* for CONFIG_CMD_MTDPARTS */ | ||||
| #define CONFIG_MTD_DEVICE | ||||
| /* for CONFIG_CMD_UBI */ | ||||
| #define CONFIG_MTD_PARTITIONS | ||||
| /* for CONFIG_CMD_UBI */ | ||||
| #define CONFIG_RBTREE | ||||
|  | ||||
| /* optional, for CONFIG_CMD_BOOTM & required by CONFIG_CMD_UBIFS */ | ||||
| #define CONFIG_LZO | ||||
| #define CONFIG_LZMA | ||||
| #define CONFIG_BZIP2 | ||||
|  | ||||
| /* for CONFIG_CMD_ZIP */ | ||||
| #define CONFIG_GZIP_COMPRESSED | ||||
| /* for CONFIG_CMD_MD5SUM */ | ||||
| #define CONFIG_MD5 | ||||
| #define CONFIG_MD5SUM_VERIFY | ||||
| /* enable CONFIG_CMD_HASH's verification feature */ | ||||
| #define CONFIG_HASH_VERIFY | ||||
| #define CONFIG_REGEX | ||||
| /* for CONFIG_CMD_BOOTMENU & CONFIG_CMD_PXE */ | ||||
| #define CONFIG_MENU | ||||
|  | ||||
| /* for new FIT uImage format generated in OpenWrt */ | ||||
| #define CONFIG_FIT | ||||
|  | ||||
| #endif	/* __CONFIG_H */ | ||||
							
								
								
									
										123
									
								
								package/boot/uboot-oxnas/src/tools/mkox820crc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								package/boot/uboot-oxnas/src/tools/mkox820crc.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,123 @@ | ||||
| /* J J Larworthy 27 September 2006 */ | ||||
|  | ||||
| /* file to read the boot sector of a dis and the loaded image and report | ||||
|  * if the boot rom would accept the data as intact and suitable for use | ||||
|  */ | ||||
|  | ||||
| #include <sys/types.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/errno.h> | ||||
|  | ||||
| #include <fcntl.h> | ||||
| #include <unistd.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <assert.h> | ||||
|  | ||||
| extern uint32_t crc32(uint32_t, const unsigned char *, unsigned int); | ||||
|  | ||||
| #define NUMBER_VECTORS   12 | ||||
| struct { | ||||
| 	unsigned int start_vector[NUMBER_VECTORS]; | ||||
| 	char code[4]; | ||||
| 	unsigned int header_length; | ||||
| 	unsigned int reserved[3]; | ||||
| 	unsigned int length; | ||||
| 	unsigned int img_CRC; | ||||
| 	unsigned int CRC; | ||||
| } img_header; | ||||
|  | ||||
| void print_usage(void) | ||||
| { | ||||
| 	printf("update_header file.bin\n"); | ||||
| } | ||||
|  | ||||
| void print_header(void) | ||||
| { | ||||
| 	int i; | ||||
|  | ||||
| 	printf("vectors in header\n"); | ||||
| 	for (i = 0; i < NUMBER_VECTORS; i++) { | ||||
| 		printf("%d:0x%08x\n", i, img_header.start_vector[i]); | ||||
| 	} | ||||
| 	printf("length:%8x\nimg_CRC:0x%08x\nHeader CRC:0x%08x\n", | ||||
| 		img_header.length, img_header.img_CRC, img_header.CRC); | ||||
| } | ||||
|  | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
| 	int in_file; | ||||
| 	int status; | ||||
| 	int unsigned crc; | ||||
| 	int file_length; | ||||
| 	int len; | ||||
|  | ||||
| 	struct stat file_stat; | ||||
|  | ||||
| 	void *executable; | ||||
|  | ||||
| 	in_file = open(argv[1], O_RDWR); | ||||
|  | ||||
| 	if (in_file < 0) { | ||||
| 		printf("failed to open file:%s\n", argv[optind]); | ||||
| 		return -ENOENT; | ||||
| 	} | ||||
|  | ||||
| 	status = fstat(in_file, &file_stat); | ||||
|  | ||||
| 	/* read header and obtain size of image */ | ||||
| 	status = read(in_file, &img_header, sizeof(img_header)); | ||||
|  | ||||
| 	file_length = file_stat.st_size - sizeof(img_header); | ||||
|  | ||||
| 	if (img_header.length != file_length) { | ||||
| 		printf("size in header:%d, size of file: %d\n", | ||||
| 			img_header.length, file_length); | ||||
| 	} | ||||
| 	img_header.length = file_length; | ||||
|  | ||||
| 	/* read working image and CRC */ | ||||
| 	executable = malloc(file_length); | ||||
|  | ||||
| 	status = read(in_file, executable, file_length); | ||||
|  | ||||
| 	if (status != file_length) { | ||||
| 		printf("Failed to load image\n"); | ||||
| 		return -ENOENT; | ||||
| 	} | ||||
|  | ||||
| 	/* verify image CRC */ | ||||
| 	crc = crc32(0, (const unsigned char *) executable, img_header.length); | ||||
|  | ||||
| 	if (crc != img_header.img_CRC) { | ||||
| 		printf("New Image CRC:0x%08x, hdr:0x%08x\n", crc, | ||||
| 			img_header.img_CRC); | ||||
| 		img_header.img_CRC = crc; | ||||
| 	} | ||||
| 	memcpy(img_header.code, "BOOT", 4); | ||||
| 	img_header.header_length = sizeof(img_header); | ||||
|  | ||||
| 	/* check header CRC */ | ||||
| 	crc = crc32(0, (const unsigned char *) &img_header, | ||||
| 			sizeof(img_header) - sizeof(unsigned int)); | ||||
| 	if (crc != img_header.CRC) { | ||||
| 		printf("New header CRC - crc:0x%08x hdr:0x%08x\n", crc, | ||||
| 			img_header.CRC); | ||||
| 		img_header.CRC = crc; | ||||
| 	} | ||||
|  | ||||
| 	/* re-write the file */ | ||||
| 	status = lseek(in_file, 0, SEEK_SET); | ||||
| 	if (status != 0) { | ||||
| 		printf("failed to rewind\n"); | ||||
| 		return 1; | ||||
| 	} | ||||
| 	len = write(in_file, &img_header, sizeof(img_header)); | ||||
| 	assert(len == sizeof(img_header)); | ||||
| 	len = write(in_file, executable, file_length); | ||||
| 	assert(len == file_length); | ||||
| 	close(in_file); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 domenico
					domenico