X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=common%2Fspl%2Fspl_sata.c;h=d03f86344e05e77b3d29adb4e89aa6c10dc42189;hb=d498c670541a010899b25f9653713a804575606e;hp=357f8e5bd960688a83e6f06aa78478736e8975ab;hpb=d024236e5a31a2b4b82cbcc98b31b8170fc88d28;p=platform%2Fkernel%2Fu-boot.git diff --git a/common/spl/spl_sata.c b/common/spl/spl_sata.c index 357f8e5..d03f863 100644 --- a/common/spl/spl_sata.c +++ b/common/spl/spl_sata.c @@ -1,11 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * (C) Copyright 2013 * Texas Instruments, * * Dan Murphy * - * SPDX-License-Identifier: GPL-2.0+ - * * Derived work from spl_usb.c */ @@ -18,35 +17,84 @@ #include #include +#ifndef CONFIG_SYS_SATA_FAT_BOOT_PARTITION +#define CONFIG_SYS_SATA_FAT_BOOT_PARTITION 1 +#endif + +#ifndef CONFIG_SPL_FS_LOAD_PAYLOAD_NAME +#define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME "u-boot.img" +#endif + +#ifndef CONFIG_SPL_SATA_RAW_U_BOOT_SECTOR +/* Dummy value to make the compiler happy */ +#define CONFIG_SPL_SATA_RAW_U_BOOT_SECTOR 0x100 +#endif + +static int spl_sata_load_image_raw(struct spl_image_info *spl_image, + struct spl_boot_device *bootdev, + struct blk_desc *stor_dev, unsigned long sector) +{ + struct image_header *header; + unsigned long count; + u32 image_size_sectors; + u32 image_offset_sectors; + u32 image_offset; + int ret; + + header = spl_get_load_buffer(-sizeof(*header), stor_dev->blksz); + count = blk_dread(stor_dev, sector, 1, header); + if (count == 0) + return -EIO; + + ret = spl_parse_image_header(spl_image, bootdev, header); + if (ret) + return ret; + + image_size_sectors = DIV_ROUND_UP(spl_image->size, stor_dev->blksz); + image_offset_sectors = spl_image->offset / stor_dev->blksz; + image_offset = spl_image->offset % stor_dev->blksz; + count = blk_dread(stor_dev, sector + image_offset_sectors, + image_size_sectors, + (void *)spl_image->load_addr); + if (count != image_size_sectors) + return -EIO; + + if (image_offset) + memmove((void *)spl_image->load_addr, + (void *)spl_image->load_addr + image_offset, + spl_image->size); + + return 0; +} + static int spl_sata_load_image(struct spl_image_info *spl_image, struct spl_boot_device *bootdev) { - int err; + int err = 0; struct blk_desc *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 - return err; - } else { - /* try to recognize storage devices immediately */ - scsi_scan(false); - stor_dev = blk_get_devnum_by_type(IF_TYPE_SCSI, 0); - if (!stor_dev) - return -ENODEV; - } + /* try to recognize storage devices immediately */ + scsi_scan(false); + stor_dev = blk_get_devnum_by_type(IF_TYPE_SCSI, 0); + if (!stor_dev) + return -ENODEV; -#ifdef CONFIG_SPL_OS_BOOT +#if CONFIG_IS_ENABLED(OS_BOOT) if (spl_start_uboot() || - spl_load_image_fat_os(spl_image, stor_dev, + spl_load_image_fat_os(spl_image, bootdev, stor_dev, CONFIG_SYS_SATA_FAT_BOOT_PARTITION)) #endif { - err = spl_load_image_fat(spl_image, stor_dev, + err = -ENOSYS; + + if (IS_ENABLED(CONFIG_SPL_FS_FAT)) { + err = spl_load_image_fat(spl_image, bootdev, stor_dev, CONFIG_SYS_SATA_FAT_BOOT_PARTITION, - CONFIG_SPL_FS_LOAD_PAYLOAD_NAME); + CONFIG_SPL_FS_LOAD_PAYLOAD_NAME); + } else if (IS_ENABLED(CONFIG_SPL_SATA_RAW_U_BOOT_USE_SECTOR)) { + err = spl_sata_load_image_raw(spl_image, bootdev, stor_dev, + CONFIG_SPL_SATA_RAW_U_BOOT_SECTOR); + } } if (err) { puts("Error loading sata device\n");