]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - arch/arm/cpu/armv7/omap-common/boot-common.c
Merge branch 'master' of git://git.denx.de/u-boot-atmel
[karo-tx-uboot.git] / arch / arm / cpu / armv7 / omap-common / boot-common.c
index 69fff323d3602163784da3898b6c2e0c16ba0dc9..17500f2315ee9d3d5a8a5868c3e3e75f46a7148b 100644 (file)
@@ -9,12 +9,14 @@
  */
 
 #include <common.h>
+#include <ahci.h>
 #include <spl.h>
 #include <asm/omap_common.h>
 #include <asm/arch/omap.h>
 #include <asm/arch/mmc_host_def.h>
 #include <asm/arch/sys_proto.h>
 #include <watchdog.h>
+#include <scsi.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -33,8 +35,19 @@ void save_omap_boot_params(void)
         * used. But it not correct to assume that romcode structure
         * encoding would be same as u-boot. So use the defined offsets.
         */
-       gd->arch.omap_boot_params.omap_bootdevice = boot_device =
-                                  *((u8 *)(rom_params + BOOT_DEVICE_OFFSET));
+       boot_device = *((u8 *)(rom_params + BOOT_DEVICE_OFFSET));
+
+#if defined(BOOT_DEVICE_NAND_I2C)
+       /*
+        * Re-map NAND&I2C boot-device to the "normal" NAND boot-device.
+        * Otherwise the SPL boot IF can't handle this device correctly.
+        * Somehow booting with Hynix 4GBit NAND H27U4G8 on Siemens
+        * Draco leads to this boot-device passed to SPL from the BootROM.
+        */
+       if (boot_device == BOOT_DEVICE_NAND_I2C)
+               boot_device = BOOT_DEVICE_NAND;
+#endif
+       gd->arch.omap_boot_params.omap_bootdevice = boot_device;
 
        gd->arch.omap_boot_params.ch_flags =
                                *((u8 *)(rom_params + CH_FLAGS_OFFSET));
@@ -56,6 +69,17 @@ void save_omap_boot_params(void)
                                        *((u32 *)(dev_data + BOOT_MODE_OFFSET));
                }
        }
+
+#if defined(CONFIG_DRA7XX) || defined(CONFIG_AM57XX)
+       /*
+        * We get different values for QSPI_1 and QSPI_4 being used, but
+        * don't actually care about this difference.  Rather than
+        * mangle the later code, if we're coming in as QSPI_4 just
+        * change to the QSPI_1 value.
+        */
+       if (gd->arch.omap_boot_params.omap_bootdevice == 11)
+               gd->arch.omap_boot_params.omap_bootdevice = BOOT_DEVICE_SPI;
+#endif
 }
 
 #ifdef CONFIG_SPL_BUILD
@@ -66,11 +90,32 @@ u32 spl_boot_device(void)
 
 u32 spl_boot_mode(void)
 {
-       return gd->arch.omap_boot_params.omap_bootmode;
+       u32 val = gd->arch.omap_boot_params.omap_bootmode;
+
+       if (val == MMCSD_MODE_RAW)
+               return MMCSD_MODE_RAW;
+       else if (val == MMCSD_MODE_FS)
+               return MMCSD_MODE_FS;
+       else
+#ifdef CONFIG_SUPPORT_EMMC_BOOT
+               return MMCSD_MODE_EMMCBOOT;
+#else
+               return MMCSD_MODE_UNDEFINED;
+#endif
 }
 
 void spl_board_init(void)
 {
+       /*
+        * Save the boot parameters passed from romcode.
+        * We cannot delay the saving further than this,
+        * to prevent overwrites.
+        */
+       save_omap_boot_params();
+
+       /* Prepare console output */
+       preloader_console_init();
+
 #ifdef CONFIG_SPL_NAND_SUPPORT
        gpmc_init();
 #endif
@@ -110,3 +155,10 @@ void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
        image_entry((u32 *)&gd->arch.omap_boot_params);
 }
 #endif
+
+#ifdef CONFIG_SCSI_AHCI_PLAT
+void arch_preboot_os(void)
+{
+       ahci_reset(DWC_AHSATA_BASE);
+}
+#endif