diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /roms/u-boot/common/spl | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip  | |
Diffstat (limited to 'roms/u-boot/common/spl')
| -rw-r--r-- | roms/u-boot/common/spl/Makefile | 22 | ||||
| -rw-r--r-- | roms/u-boot/common/spl/spl.c | 257 | ||||
| -rw-r--r-- | roms/u-boot/common/spl/spl_fat.c | 123 | ||||
| -rw-r--r-- | roms/u-boot/common/spl/spl_mmc.c | 147 | ||||
| -rw-r--r-- | roms/u-boot/common/spl/spl_nand.c | 84 | ||||
| -rw-r--r-- | roms/u-boot/common/spl/spl_net.c | 37 | ||||
| -rw-r--r-- | roms/u-boot/common/spl/spl_nor.c | 51 | ||||
| -rw-r--r-- | roms/u-boot/common/spl/spl_onenand.c | 31 | ||||
| -rw-r--r-- | roms/u-boot/common/spl/spl_sata.c | 49 | ||||
| -rw-r--r-- | roms/u-boot/common/spl/spl_usb.c | 58 | ||||
| -rw-r--r-- | roms/u-boot/common/spl/spl_ymodem.c | 59 | 
11 files changed, 918 insertions, 0 deletions
diff --git a/roms/u-boot/common/spl/Makefile b/roms/u-boot/common/spl/Makefile new file mode 100644 index 00000000..64569c2c --- /dev/null +++ b/roms/u-boot/common/spl/Makefile @@ -0,0 +1,22 @@ +# +# (C) Copyright 2012 +# Texas Instruments Incorporated - http://www.ti.com/ +# Aneesh V <aneesh@ti.com> +# +# SPDX-License-Identifier:	GPL-2.0+ +# +# Based on common/Makefile. +# + +ifdef CONFIG_SPL_BUILD +obj-$(CONFIG_SPL_FRAMEWORK) += spl.o +obj-$(CONFIG_SPL_NOR_SUPPORT) += spl_nor.o +obj-$(CONFIG_SPL_YMODEM_SUPPORT) += spl_ymodem.o +obj-$(CONFIG_SPL_NAND_SUPPORT) += spl_nand.o +obj-$(CONFIG_SPL_ONENAND_SUPPORT) += spl_onenand.o +obj-$(CONFIG_SPL_NET_SUPPORT) += spl_net.o +obj-$(CONFIG_SPL_MMC_SUPPORT) += spl_mmc.o +obj-$(CONFIG_SPL_USB_SUPPORT) += spl_usb.o +obj-$(CONFIG_SPL_FAT_SUPPORT) += spl_fat.o +obj-$(CONFIG_SPL_SATA_SUPPORT) += spl_sata.o +endif diff --git a/roms/u-boot/common/spl/spl.c b/roms/u-boot/common/spl/spl.c new file mode 100644 index 00000000..774fdad2 --- /dev/null +++ b/roms/u-boot/common/spl/spl.c @@ -0,0 +1,257 @@ +/* + * (C) Copyright 2010 + * Texas Instruments, <www.ti.com> + * + * Aneesh V <aneesh@ti.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ +#include <common.h> +#include <spl.h> +#include <asm/u-boot.h> +#include <nand.h> +#include <fat.h> +#include <version.h> +#include <i2c.h> +#include <image.h> +#include <malloc.h> +#include <linux/compiler.h> + +DECLARE_GLOBAL_DATA_PTR; + +#ifndef CONFIG_SYS_UBOOT_START +#define CONFIG_SYS_UBOOT_START	CONFIG_SYS_TEXT_BASE +#endif +#ifndef CONFIG_SYS_MONITOR_LEN +#define CONFIG_SYS_MONITOR_LEN	(200 * 1024) +#endif + +u32 *boot_params_ptr = NULL; +struct spl_image_info spl_image; + +/* Define board data structure */ +static bd_t bdata __attribute__ ((section(".data"))); + +/* + * Default function to determine if u-boot or the OS should + * be started. This implementation always returns 1. + * + * Please implement your own board specific funcion to do this. + * + * RETURN + * 0 to not start u-boot + * positive if u-boot should start + */ +#ifdef CONFIG_SPL_OS_BOOT +__weak int spl_start_uboot(void) +{ +	puts("SPL: Please implement spl_start_uboot() for your board\n"); +	puts("SPL: Direct Linux boot not active!\n"); +	return 1; +} +#endif + +/* + * Weak default function for board specific cleanup/preparation before + * Linux boot. Some boards/platforms might not need it, so just provide + * an empty stub here. + */ +__weak void spl_board_prepare_for_linux(void) +{ +	/* Nothing to do! */ +} + +void spl_parse_image_header(const struct image_header *header) +{ +	u32 header_size = sizeof(struct image_header); + +	if (image_get_magic(header) == IH_MAGIC) { +		if (spl_image.flags & SPL_COPY_PAYLOAD_ONLY) { +			/* +			 * On some system (e.g. powerpc), the load-address and +			 * entry-point is located at address 0. We can't load +			 * to 0-0x40. So skip header in this case. +			 */ +			spl_image.load_addr = image_get_load(header); +			spl_image.entry_point = image_get_ep(header); +			spl_image.size = image_get_data_size(header); +		} else { +			spl_image.entry_point = image_get_load(header); +			/* Load including the header */ +			spl_image.load_addr = spl_image.entry_point - +				header_size; +			spl_image.size = image_get_data_size(header) + +				header_size; +		} +		spl_image.os = image_get_os(header); +		spl_image.name = image_get_name(header); +		debug("spl: payload image: %.*s load addr: 0x%x size: %d\n", +			sizeof(spl_image.name), spl_image.name, +			spl_image.load_addr, spl_image.size); +	} else { +		/* Signature not found - assume u-boot.bin */ +		debug("mkimage signature not found - ih_magic = %x\n", +			header->ih_magic); +		/* Let's assume U-Boot will not be more than 200 KB */ +		spl_image.size = CONFIG_SYS_MONITOR_LEN; +		spl_image.entry_point = CONFIG_SYS_UBOOT_START; +		spl_image.load_addr = CONFIG_SYS_TEXT_BASE; +		spl_image.os = IH_OS_U_BOOT; +		spl_image.name = "U-Boot"; +	} +} + +__weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image) +{ +	typedef void __noreturn (*image_entry_noargs_t)(void); + +	image_entry_noargs_t image_entry = +			(image_entry_noargs_t) spl_image->entry_point; + +	debug("image entry point: 0x%X\n", spl_image->entry_point); +	image_entry(); +} + +#ifdef CONFIG_SPL_RAM_DEVICE +static void spl_ram_load_image(void) +{ +	const struct image_header *header; + +	/* +	 * Get the header.  It will point to an address defined by handoff +	 * which will tell where the image located inside the flash. For +	 * now, it will temporary fixed to address pointed by U-Boot. +	 */ +	header = (struct image_header *) +		(CONFIG_SYS_TEXT_BASE -	sizeof(struct image_header)); + +	spl_parse_image_header(header); +} +#endif + +void board_init_r(gd_t *dummy1, ulong dummy2) +{ +	u32 boot_device; +	debug(">>spl:board_init_r()\n"); + +#ifdef CONFIG_SYS_SPL_MALLOC_START +	mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START, +			CONFIG_SYS_SPL_MALLOC_SIZE); +#endif + +#ifndef CONFIG_PPC +	/* +	 * timer_init() does not exist on PPC systems. The timer is initialized +	 * and enabled (decrementer) in interrupt_init() here. +	 */ +	timer_init(); +#endif + +#ifdef CONFIG_SPL_BOARD_INIT +	spl_board_init(); +#endif + +	boot_device = spl_boot_device(); +	debug("boot device - %d\n", boot_device); +	switch (boot_device) { +#ifdef CONFIG_SPL_RAM_DEVICE +	case BOOT_DEVICE_RAM: +		spl_ram_load_image(); +		break; +#endif +#ifdef CONFIG_SPL_MMC_SUPPORT +	case BOOT_DEVICE_MMC1: +	case BOOT_DEVICE_MMC2: +	case BOOT_DEVICE_MMC2_2: +		spl_mmc_load_image(); +		break; +#endif +#ifdef CONFIG_SPL_NAND_SUPPORT +	case BOOT_DEVICE_NAND: +		spl_nand_load_image(); +		break; +#endif +#ifdef CONFIG_SPL_ONENAND_SUPPORT +	case BOOT_DEVICE_ONENAND: +		spl_onenand_load_image(); +		break; +#endif +#ifdef CONFIG_SPL_NOR_SUPPORT +	case BOOT_DEVICE_NOR: +		spl_nor_load_image(); +		break; +#endif +#ifdef CONFIG_SPL_YMODEM_SUPPORT +	case BOOT_DEVICE_UART: +		spl_ymodem_load_image(); +		break; +#endif +#ifdef CONFIG_SPL_SPI_SUPPORT +	case BOOT_DEVICE_SPI: +		spl_spi_load_image(); +		break; +#endif +#ifdef CONFIG_SPL_ETH_SUPPORT +	case BOOT_DEVICE_CPGMAC: +#ifdef CONFIG_SPL_ETH_DEVICE +		spl_net_load_image(CONFIG_SPL_ETH_DEVICE); +#else +		spl_net_load_image(NULL); +#endif +		break; +#endif +#ifdef CONFIG_SPL_USBETH_SUPPORT +	case BOOT_DEVICE_USBETH: +		spl_net_load_image("usb_ether"); +		break; +#endif +#ifdef CONFIG_SPL_USB_SUPPORT +	case BOOT_DEVICE_USB: +		spl_usb_load_image(); +		break; +#endif +#ifdef CONFIG_SPL_SATA_SUPPORT +	case BOOT_DEVICE_SATA: +		spl_sata_load_image(); +		break; +#endif +	default: +		debug("SPL: Un-supported Boot Device\n"); +		hang(); +	} + +	switch (spl_image.os) { +	case IH_OS_U_BOOT: +		debug("Jumping to U-Boot\n"); +		break; +#ifdef CONFIG_SPL_OS_BOOT +	case IH_OS_LINUX: +		debug("Jumping to Linux\n"); +		spl_board_prepare_for_linux(); +		jump_to_image_linux((void *)CONFIG_SYS_SPL_ARGS_ADDR); +#endif +	default: +		debug("Unsupported OS image.. Jumping nevertheless..\n"); +	} +	jump_to_image_no_args(&spl_image); +} + +/* + * This requires UART clocks to be enabled.  In order for this to work the + * caller must ensure that the gd pointer is valid. + */ +void preloader_console_init(void) +{ +	gd->bd = &bdata; +	gd->baudrate = CONFIG_BAUDRATE; + +	serial_init();		/* serial communications setup */ + +	gd->have_console = 1; + +	puts("\nU-Boot SPL " PLAIN_VERSION " (" U_BOOT_DATE " - " \ +			U_BOOT_TIME ")\n"); +#ifdef CONFIG_SPL_DISPLAY_PRINT +	spl_display_print(); +#endif +} diff --git a/roms/u-boot/common/spl/spl_fat.c b/roms/u-boot/common/spl/spl_fat.c new file mode 100644 index 00000000..56be9438 --- /dev/null +++ b/roms/u-boot/common/spl/spl_fat.c @@ -0,0 +1,123 @@ +/* + * (C) Copyright 2014 + * Texas Instruments, <www.ti.com> + * + * Dan Murphy <dmurphy@ti.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + * + * FAT Image Functions copied from spl_mmc.c + */ + +#include <common.h> +#include <spl.h> +#include <asm/u-boot.h> +#include <fat.h> +#include <image.h> + +static int fat_registered; + +#ifdef CONFIG_SPL_FAT_SUPPORT +static int spl_register_fat_device(block_dev_desc_t *block_dev, int partition) +{ +	int err = 0; + +	if (fat_registered) +		return err; + +	err = fat_register_device(block_dev, partition); +	if (err) { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT +		printf("%s: fat register err - %d\n", __func__, err); +#endif +		hang(); +	} + +	fat_registered = 1; + +	return err; +} + +int spl_load_image_fat(block_dev_desc_t *block_dev, +						int partition, +						const char *filename) +{ +	int err; +	struct image_header *header; + +	err = spl_register_fat_device(block_dev, partition); +	if (err) +		goto end; + +	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: +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT +	if (err <= 0) +		printf("%s: error reading image %s, err - %d\n", +		       __func__, filename, err); +#endif + +	return (err <= 0); +} + +#ifdef CONFIG_SPL_OS_BOOT +int spl_load_image_fat_os(block_dev_desc_t *block_dev, int partition) +{ +	int err; +	__maybe_unused char *file; + +	err = spl_register_fat_device(block_dev, partition); +	if (err) +		return err; + +#if defined(CONFIG_SPL_ENV_SUPPORT) && defined(CONFIG_SPL_OS_BOOT) +	file = getenv("falcon_args_file"); +	if (file) { +		err = file_fat_read(file, (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0); +		if (err <= 0) { +			printf("spl: error reading image %s, err - %d, falling back to default\n", +			       file, err); +			goto defaults; +		} +		file = getenv("falcon_image_file"); +		if (file) { +			err = spl_load_image_fat(block_dev, partition, file); +			if (err != 0) { +				puts("spl: falling back to default\n"); +				goto defaults; +			} + +			return 0; +		} else +			puts("spl: falcon_image_file not set in environment, falling back to default\n"); +	} else +		puts("spl: falcon_args_file not set in environment, falling back to default\n"); + +defaults: +#endif + +	err = file_fat_read(CONFIG_SPL_FAT_LOAD_ARGS_NAME, +			    (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0); +	if (err <= 0) { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT +		printf("%s: error reading image %s, err - %d\n", +		       __func__, CONFIG_SPL_FAT_LOAD_ARGS_NAME, err); +#endif +		return -1; +	} + +	return spl_load_image_fat(block_dev, partition, +			CONFIG_SPL_FAT_LOAD_KERNEL_NAME); +} +#endif +#endif diff --git a/roms/u-boot/common/spl/spl_mmc.c b/roms/u-boot/common/spl/spl_mmc.c new file mode 100644 index 00000000..fa6f891b --- /dev/null +++ b/roms/u-boot/common/spl/spl_mmc.c @@ -0,0 +1,147 @@ +/* + * (C) Copyright 2010 + * Texas Instruments, <www.ti.com> + * + * Aneesh V <aneesh@ti.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ +#include <common.h> +#include <spl.h> +#include <asm/u-boot.h> +#include <mmc.h> +#include <version.h> +#include <image.h> + +DECLARE_GLOBAL_DATA_PTR; + +static int mmc_load_image_raw(struct mmc *mmc, unsigned long sector) +{ +	unsigned long err; +	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 */ +	err = mmc->block_dev.block_read(0, sector, 1, header); +	if (err == 0) +		goto end; + +	if (image_get_magic(header) != IH_MAGIC) +		return -1; + +	spl_parse_image_header(header); + +	/* convert size to sectors - round up */ +	image_size_sectors = (spl_image.size + mmc->read_bl_len - 1) / +				mmc->read_bl_len; + +	/* Read the header too to avoid extra memcpy */ +	err = mmc->block_dev.block_read(0, sector, image_size_sectors, +					(void *)spl_image.load_addr); + +end: +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT +	if (err == 0) +		printf("spl: mmc blk read err - %lu\n", err); +#endif + +	return (err == 0); +} + +#ifdef CONFIG_SPL_OS_BOOT +static int mmc_load_image_raw_os(struct mmc *mmc) +{ +	if (!mmc->block_dev.block_read(0, +				       CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR, +				       CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS, +				       (void *)CONFIG_SYS_SPL_ARGS_ADDR)) { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT +		printf("mmc args blk read error\n"); +#endif +		return -1; +	} + +	return mmc_load_image_raw(mmc, CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR); +} +#endif + +void spl_mmc_load_image(void) +{ +	struct mmc *mmc; +	int err; +	u32 boot_mode; + +	mmc_initialize(gd->bd); +	/* We register only one device. So, the dev id is always 0 */ +	mmc = find_mmc_device(0); +	if (!mmc) { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT +		puts("spl: mmc device not found!!\n"); +#endif +		hang(); +	} + +	err = mmc_init(mmc); +	if (err) { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT +		printf("spl: mmc init failed: err - %d\n", err); +#endif +		hang(); +	} + +	boot_mode = spl_boot_mode(); +	if (boot_mode == MMCSD_MODE_RAW) { +		debug("boot mode - RAW\n"); +#ifdef CONFIG_SPL_OS_BOOT +		if (spl_start_uboot() || mmc_load_image_raw_os(mmc)) +#endif +		err = mmc_load_image_raw(mmc, +			CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR); +#ifdef CONFIG_SPL_FAT_SUPPORT +	} else if (boot_mode == MMCSD_MODE_FAT) { +		debug("boot mode - FAT\n"); +#ifdef CONFIG_SPL_OS_BOOT +		if (spl_start_uboot() || spl_load_image_fat_os(&mmc->block_dev, +								CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION)) +#endif +		err = spl_load_image_fat(&mmc->block_dev, +					CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION, +					CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME); +#endif +#ifdef CONFIG_SUPPORT_EMMC_BOOT +	} else if (boot_mode == MMCSD_MODE_EMMCBOOT) { +		/* +		 * We need to check what the partition is configured to. +		 * 1 and 2 match up to boot0 / boot1 and 7 is user data +		 * which is the first physical partition (0). +		 */ +		int part = (mmc->part_config >> 3) & PART_ACCESS_MASK; + +		if (part == 7) +			part = 0; + +		if (mmc_switch_part(0, part)) { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT +			puts("MMC partition switch failed\n"); +#endif +			hang(); +		} +#ifdef CONFIG_SPL_OS_BOOT +		if (spl_start_uboot() || mmc_load_image_raw_os(mmc)) +#endif +		err = mmc_load_image_raw(mmc, +			CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR); +#endif +	} else { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT +		puts("spl: wrong MMC boot mode\n"); +#endif +		hang(); +	} + +	if (err) +		hang(); +} diff --git a/roms/u-boot/common/spl/spl_nand.c b/roms/u-boot/common/spl/spl_nand.c new file mode 100644 index 00000000..9da02186 --- /dev/null +++ b/roms/u-boot/common/spl/spl_nand.c @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2011 + * Corscience GmbH & Co. KG - Simon Schwarz <schwarz@corscience.de> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ +#include <common.h> +#include <config.h> +#include <spl.h> +#include <asm/io.h> +#include <nand.h> + +void spl_nand_load_image(void) +{ +	struct image_header *header; +	int *src __attribute__((unused)); +	int *dst __attribute__((unused)); + +	debug("spl: nand - using hw ecc\n"); +	nand_init(); + +	/*use CONFIG_SYS_TEXT_BASE as temporary storage area */ +	header = (struct image_header *)(CONFIG_SYS_TEXT_BASE); +#ifdef CONFIG_SPL_OS_BOOT +	if (!spl_start_uboot()) { +		/* +		 * load parameter image +		 * load to temp position since nand_spl_load_image reads +		 * a whole block which is typically larger than +		 * CONFIG_CMD_SPL_WRITE_SIZE therefore may overwrite +		 * following sections like BSS +		 */ +		nand_spl_load_image(CONFIG_CMD_SPL_NAND_OFS, +			CONFIG_CMD_SPL_WRITE_SIZE, +			(void *)CONFIG_SYS_TEXT_BASE); +		/* copy to destintion */ +		for (dst = (int *)CONFIG_SYS_SPL_ARGS_ADDR, +				src = (int *)CONFIG_SYS_TEXT_BASE; +				src < (int *)(CONFIG_SYS_TEXT_BASE + +				CONFIG_CMD_SPL_WRITE_SIZE); +				src++, dst++) { +			writel(readl(src), dst); +		} + +		/* load linux */ +		nand_spl_load_image(CONFIG_SYS_NAND_SPL_KERNEL_OFFS, +			CONFIG_SYS_NAND_PAGE_SIZE, (void *)header); +		spl_parse_image_header(header); +		if (header->ih_os == IH_OS_LINUX) { +			/* happy - was a linux */ +			nand_spl_load_image(CONFIG_SYS_NAND_SPL_KERNEL_OFFS, +				spl_image.size, (void *)spl_image.load_addr); +			nand_deselect(); +			return; +		} else { +			puts("The Expected Linux image was not " +				"found. Please check your NAND " +				"configuration.\n"); +			puts("Trying to start u-boot now...\n"); +		} +	} +#endif +#ifdef CONFIG_NAND_ENV_DST +	nand_spl_load_image(CONFIG_ENV_OFFSET, +		CONFIG_SYS_NAND_PAGE_SIZE, (void *)header); +	spl_parse_image_header(header); +	nand_spl_load_image(CONFIG_ENV_OFFSET, spl_image.size, +		(void *)spl_image.load_addr); +#ifdef CONFIG_ENV_OFFSET_REDUND +	nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND, +		CONFIG_SYS_NAND_PAGE_SIZE, (void *)header); +	spl_parse_image_header(header); +	nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND, spl_image.size, +		(void *)spl_image.load_addr); +#endif +#endif +	/* Load u-boot */ +	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS, +		CONFIG_SYS_NAND_PAGE_SIZE, (void *)header); +	spl_parse_image_header(header); +	nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS, +		spl_image.size, (void *)spl_image.load_addr); +	nand_deselect(); +} diff --git a/roms/u-boot/common/spl/spl_net.c b/roms/u-boot/common/spl/spl_net.c new file mode 100644 index 00000000..ff537059 --- /dev/null +++ b/roms/u-boot/common/spl/spl_net.c @@ -0,0 +1,37 @@ +/* + * (C) Copyright 2000-2004 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * (C) Copyright 2012 + * Ilya Yanok <ilya.yanok@gmail.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ +#include <common.h> +#include <spl.h> +#include <net.h> + +DECLARE_GLOBAL_DATA_PTR; + +void spl_net_load_image(const char *device) +{ +	int rv; + +	env_init(); +	env_relocate(); +	setenv("autoload", "yes"); +	load_addr = CONFIG_SYS_TEXT_BASE - sizeof(struct image_header); +	rv = eth_initialize(gd->bd); +	if (rv == 0) { +		printf("No Ethernet devices found\n"); +		hang(); +	} +	if (device) +		setenv("ethact", device); +	rv = NetLoop(BOOTP); +	if (rv < 0) { +		printf("Problem booting with BOOTP\n"); +		hang(); +	} +	spl_parse_image_header((struct image_header *)load_addr); +} diff --git a/roms/u-boot/common/spl/spl_nor.c b/roms/u-boot/common/spl/spl_nor.c new file mode 100644 index 00000000..b444a3ea --- /dev/null +++ b/roms/u-boot/common/spl/spl_nor.c @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2012 Stefan Roese <sr@denx.de> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <common.h> +#include <spl.h> + +void spl_nor_load_image(void) +{ +	/* +	 * Loading of the payload to SDRAM is done with skipping of +	 * the mkimage header in this SPL NOR driver +	 */ +	spl_image.flags |= SPL_COPY_PAYLOAD_ONLY; + +	if (spl_start_uboot()) { +		/* +		 * Load real U-Boot from its location in NOR flash to its +		 * defined location in SDRAM +		 */ +		spl_parse_image_header( +			(const struct image_header *)CONFIG_SYS_UBOOT_BASE); + +		memcpy((void *)spl_image.load_addr, +		       (void *)(CONFIG_SYS_UBOOT_BASE + +				sizeof(struct image_header)), +		       spl_image.size); +	} else { +		/* +		 * Load Linux from its location in NOR flash to its defined +		 * location in SDRAM +		 */ +		spl_parse_image_header( +			(const struct image_header *)CONFIG_SYS_OS_BASE); + +		memcpy((void *)spl_image.load_addr, +		       (void *)(CONFIG_SYS_OS_BASE + +				sizeof(struct image_header)), +		       spl_image.size); + +		/* +		 * Copy DT blob (fdt) to SDRAM. Passing pointer to flash +		 * doesn't work (16 KiB should be enough for DT) +		 */ +		memcpy((void *)CONFIG_SYS_SPL_ARGS_ADDR, +		       (void *)(CONFIG_SYS_FDT_BASE), +		       (16 << 10)); +	} +} diff --git a/roms/u-boot/common/spl/spl_onenand.c b/roms/u-boot/common/spl/spl_onenand.c new file mode 100644 index 00000000..d8d80974 --- /dev/null +++ b/roms/u-boot/common/spl/spl_onenand.c @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2013 + * ISEE 2007 SL - Enric Balletbo i Serra <eballetbo@iseebcn.com> + * + * Based on common/spl/spl_nand.c + * Copyright (C) 2011 + * Corscience GmbH & Co. KG - Simon Schwarz <schwarz@corscience.de> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ +#include <common.h> +#include <config.h> +#include <spl.h> +#include <asm/io.h> +#include <onenand_uboot.h> + +void spl_onenand_load_image(void) +{ +	struct image_header *header; + +	debug("spl: onenand\n"); + +	/*use CONFIG_SYS_TEXT_BASE as temporary storage area */ +	header = (struct image_header *)(CONFIG_SYS_TEXT_BASE); +	/* Load u-boot */ +	onenand_spl_load_image(CONFIG_SYS_ONENAND_U_BOOT_OFFS, +		CONFIG_SYS_ONENAND_PAGE_SIZE, (void *)header); +	spl_parse_image_header(header); +	onenand_spl_load_image(CONFIG_SYS_ONENAND_U_BOOT_OFFS, +		spl_image.size, (void *)spl_image.load_addr); +} diff --git a/roms/u-boot/common/spl/spl_sata.c b/roms/u-boot/common/spl/spl_sata.c new file mode 100644 index 00000000..2e7adca0 --- /dev/null +++ b/roms/u-boot/common/spl/spl_sata.c @@ -0,0 +1,49 @@ +/* + * (C) Copyright 2013 + * Texas Instruments, <www.ti.com> + * + * Dan Murphy <dmurphy@ti.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + * + * Derived work from spl_usb.c + */ + +#include <common.h> +#include <spl.h> +#include <asm/u-boot.h> +#include <sata.h> +#include <fat.h> +#include <version.h> +#include <image.h> + +DECLARE_GLOBAL_DATA_PTR; + +void spl_sata_load_image(void) +{ +	int err; +	block_dev_desc_t *stor_dev; + +	err = init_sata(CONFIG_SPL_SATA_BOOT_DEVICE); +	if (err) { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT +		printf("spl: sata init failed: err - %d\n", err); +#endif +		hang(); +	} else { +		/* try to recognize storage devices immediately */ +		stor_dev = scsi_get_dev(0); +	} + +#ifdef CONFIG_SPL_OS_BOOT +	if (spl_start_uboot() || spl_load_image_fat_os(stor_dev, +									CONFIG_SYS_SATA_FAT_BOOT_PARTITION)) +#endif +	err = spl_load_image_fat(stor_dev, +				CONFIG_SYS_SATA_FAT_BOOT_PARTITION, +				CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME); +	if (err) { +		puts("Error loading sata device\n"); +		hang(); +	} +} diff --git a/roms/u-boot/common/spl/spl_usb.c b/roms/u-boot/common/spl/spl_usb.c new file mode 100644 index 00000000..53a90437 --- /dev/null +++ b/roms/u-boot/common/spl/spl_usb.c @@ -0,0 +1,58 @@ +/* + * (C) Copyright 2014 + * Texas Instruments, <www.ti.com> + * + * Dan Murphy <dmurphy@ti.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + * + * Derived work from spl_mmc.c + */ + +#include <common.h> +#include <spl.h> +#include <asm/u-boot.h> +#include <usb.h> +#include <fat.h> + +DECLARE_GLOBAL_DATA_PTR; + +#ifdef CONFIG_USB_STORAGE +static int usb_stor_curr_dev = -1; /* current device */ +#endif + +void spl_usb_load_image(void) +{ +	int err; +	block_dev_desc_t *stor_dev; + +	usb_stop(); +	err = usb_init(); +	if (err) { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT +		printf("%s: usb init failed: err - %d\n", __func__, err); +#endif +		hang(); +	} + +#ifdef CONFIG_USB_STORAGE +	/* try to recognize storage devices immediately */ +	usb_stor_curr_dev = usb_stor_scan(1); +	stor_dev = usb_stor_get_dev(usb_stor_curr_dev); +#endif + +	debug("boot mode - FAT\n"); + +#ifdef CONFIG_SPL_OS_BOOT +		if (spl_start_uboot() || spl_load_image_fat_os(stor_dev, +								CONFIG_SYS_USB_FAT_BOOT_PARTITION)) +#endif +		err = spl_load_image_fat(stor_dev, +				CONFIG_SYS_USB_FAT_BOOT_PARTITION, +				CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME); + +		if (err) { +			puts("Error loading USB device\n"); +			hang(); +		} +} diff --git a/roms/u-boot/common/spl/spl_ymodem.c b/roms/u-boot/common/spl/spl_ymodem.c new file mode 100644 index 00000000..0f1e9970 --- /dev/null +++ b/roms/u-boot/common/spl/spl_ymodem.c @@ -0,0 +1,59 @@ +/* + * (C) Copyright 2000-2004 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * (C) Copyright 2011 + * Texas Instruments, <www.ti.com> + * + * Matt Porter <mporter@ti.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ +#include <common.h> +#include <spl.h> +#include <xyzModem.h> +#include <asm/u-boot.h> +#include <asm/utils.h> + +#define BUF_SIZE 1024 + +static int getcymodem(void) { +	if (tstc()) +		return (getc()); +	return -1; +} + +void spl_ymodem_load_image(void) +{ +	int size = 0; +	int err; +	int res; +	int ret; +	connection_info_t info; +	char buf[BUF_SIZE]; +	ulong store_addr = ~0; +	ulong addr = 0; + +	info.mode = xyzModem_ymodem; +	ret = xyzModem_stream_open(&info, &err); + +	if (!ret) { +		while ((res = +			xyzModem_stream_read(buf, BUF_SIZE, &err)) > 0) { +			if (addr == 0) +				spl_parse_image_header((struct image_header *)buf); +			store_addr = addr + spl_image.load_addr; +			size += res; +			addr += res; +			memcpy((char *)(store_addr), buf, res); +		} +	} else { +		printf("spl: ymodem err - %s\n", xyzModem_error(err)); +		hang(); +	} + +	xyzModem_stream_close(&err); +	xyzModem_stream_terminate(false, &getcymodem); + +	printf("Loaded %d bytes\n", size); +}  | 
