watchdog: Implement generic watchdog_reset() version
[oweals/u-boot.git] / common / spl / spl_mmc.c
index d95f94ca15e0b4b07c4a894247044391be816c9d..324d91c88404b6e86d4e58f5ee0b77c8e00300b4 100644 (file)
@@ -1,10 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * (C) Copyright 2010
  * Texas Instruments, <www.ti.com>
  *
  * Aneesh V <aneesh@ti.com>
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 #include <common.h>
 #include <dm.h>
@@ -16,8 +15,6 @@
 #include <mmc.h>
 #include <image.h>
 
-DECLARE_GLOBAL_DATA_PTR;
-
 static int mmc_load_legacy(struct spl_image_info *spl_image, struct mmc *mmc,
                           ulong sector, struct image_header *header)
 {
@@ -52,18 +49,19 @@ static ulong h_spl_load_read(struct spl_load_info *load, ulong sector,
        return blk_dread(mmc_get_blk_desc(mmc), sector, count, buf);
 }
 
-static int mmc_load_image_raw_sector(struct spl_image_info *spl_image,
-                                    struct mmc *mmc, unsigned long sector)
+static __maybe_unused
+int mmc_load_image_raw_sector(struct spl_image_info *spl_image,
+                             struct mmc *mmc, unsigned long sector)
 {
        unsigned long count;
        struct image_header *header;
+       struct blk_desc *bd = mmc_get_blk_desc(mmc);
        int ret = 0;
 
-       header = (struct image_header *)(CONFIG_SYS_TEXT_BASE -
-                                        sizeof(struct image_header));
+       header = spl_get_load_buffer(-sizeof(*header), bd->blksz);
 
        /* read image header to find the image size & load address */
-       count = blk_dread(mmc_get_blk_desc(mmc), sector, 1, header);
+       count = blk_dread(bd, sector, 1, header);
        debug("hdr read sector %lx, count=%lu\n", sector, count);
        if (count == 0) {
                ret = -EIO;
@@ -142,7 +140,8 @@ static int spl_mmc_find_device(struct mmc **mmcp, u32 boot_device)
 #endif
        if (err) {
 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
-               printf("spl: could not find mmc device. error: %d\n", err);
+               printf("spl: could not find mmc device %d. error: %d\n",
+                      mmc_dev, err);
 #endif
                return err;
        }
@@ -193,19 +192,22 @@ static int mmc_load_image_raw_partition(struct spl_image_info *spl_image,
 static int mmc_load_image_raw_os(struct spl_image_info *spl_image,
                                 struct mmc *mmc)
 {
-       unsigned long count;
        int ret;
 
+#if defined(CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR)
+       unsigned long count;
+
        count = blk_dread(mmc_get_blk_desc(mmc),
                CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR,
                CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS,
                (void *) CONFIG_SYS_SPL_ARGS_ADDR);
-       if (count == 0) {
+       if (count != CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS) {
 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
                puts("mmc_load_image_raw_os: mmc block read error\n");
 #endif
                return -1;
        }
+#endif /* CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR */
 
        ret = mmc_load_image_raw_sector(spl_image, mmc,
                CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR);
@@ -236,7 +238,7 @@ static int spl_mmc_do_fs_boot(struct spl_image_info *spl_image, struct mmc *mmc)
 {
        int err = -ENOSYS;
 
-#ifdef CONFIG_SPL_FAT_SUPPORT
+#ifdef CONFIG_SPL_FS_FAT
        if (!spl_start_uboot()) {
                err = spl_load_image_fat_os(spl_image, mmc_get_blk_desc(mmc),
                        CONFIG_SYS_MMCSD_FS_BOOT_PARTITION);
@@ -251,7 +253,7 @@ static int spl_mmc_do_fs_boot(struct spl_image_info *spl_image, struct mmc *mmc)
                return err;
 #endif
 #endif
-#ifdef CONFIG_SPL_EXT_SUPPORT
+#ifdef CONFIG_SPL_FS_EXT4
        if (!spl_start_uboot()) {
                err = spl_load_image_ext_os(spl_image, mmc_get_blk_desc(mmc),
                        CONFIG_SYS_MMCSD_FS_BOOT_PARTITION);
@@ -267,7 +269,7 @@ static int spl_mmc_do_fs_boot(struct spl_image_info *spl_image, struct mmc *mmc)
 #endif
 #endif
 
-#if defined(CONFIG_SPL_FAT_SUPPORT) || defined(CONFIG_SPL_EXT_SUPPORT)
+#if defined(CONFIG_SPL_FS_FAT) || defined(CONFIG_SPL_FS_EXT4)
        err = -ENOENT;
 #endif
 
@@ -280,6 +282,25 @@ static int spl_mmc_do_fs_boot(struct spl_image_info *spl_image, struct mmc *mmc)
 }
 #endif
 
+u32 __weak spl_boot_mode(const u32 boot_device)
+{
+#if defined(CONFIG_SPL_FS_FAT) || defined(CONFIG_SPL_FS_EXT4)
+       return MMCSD_MODE_FS;
+#elif defined(CONFIG_SUPPORT_EMMC_BOOT)
+       return MMCSD_MODE_EMMCBOOT;
+#else
+       return MMCSD_MODE_RAW;
+#endif
+}
+
+#ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
+__weak
+int spl_boot_partition(const u32 boot_device)
+{
+       return CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION;
+}
+#endif
+
 int spl_mmc_load_image(struct spl_image_info *spl_image,
                       struct spl_boot_device *bootdev)
 {
@@ -335,8 +356,11 @@ int spl_mmc_load_image(struct spl_image_info *spl_image,
                                return err;
                }
 #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
-               err = mmc_load_image_raw_partition(spl_image, mmc,
-                       CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION);
+               err = spl_boot_partition(bootdev->boot_device);
+               if (!err)
+                       return err;
+
+               err = mmc_load_image_raw_partition(spl_image, mmc, err);
                if (!err)
                        return err;
 #endif