]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/sunxi/board.c
sunxi: FEL - Add the ability to recognize and auto-import uEnv-style data
[karo-tx-uboot.git] / board / sunxi / board.c
index 3cf36147b241b4e55ae0770384f4871de7e4ad03..78dfda5a991983466cecb4a46997d4f23bb43962 100644 (file)
@@ -133,15 +133,6 @@ int dram_init(void)
        return 0;
 }
 
-#ifdef CONFIG_MACH_SUN50I
-void dram_init_banksize(void)
-{
-       /* We need to reserve the first 16MB of RAM for ATF */
-       gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE + (16 * 1024 * 1024);
-       gd->bd->bi_dram[0].size = get_effective_memsize() - (16 * 1024 * 1024);
-}
-#endif
-
 #if defined(CONFIG_NAND_SUNXI) && defined(CONFIG_SPL_BUILD)
 static void nand_pinmux_setup(void)
 {
@@ -483,10 +474,12 @@ void sunxi_board_init(void)
 #endif
 
 #if defined CONFIG_AXP152_POWER || defined CONFIG_AXP209_POWER || \
-       defined CONFIG_AXP221_POWER || defined CONFIG_AXP818_POWER
+       defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || \
+       defined CONFIG_AXP818_POWER
        power_failed = axp_init();
 
-#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP818_POWER
+#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || \
+       defined CONFIG_AXP818_POWER
        power_failed |= axp_set_dcdc1(CONFIG_AXP_DCDC1_VOLT);
 #endif
        power_failed |= axp_set_dcdc2(CONFIG_AXP_DCDC2_VOLT);
@@ -494,11 +487,13 @@ void sunxi_board_init(void)
 #if !defined(CONFIG_AXP209_POWER) && !defined(CONFIG_AXP818_POWER)
        power_failed |= axp_set_dcdc4(CONFIG_AXP_DCDC4_VOLT);
 #endif
-#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP818_POWER
+#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || \
+       defined CONFIG_AXP818_POWER
        power_failed |= axp_set_dcdc5(CONFIG_AXP_DCDC5_VOLT);
 #endif
 
-#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP818_POWER
+#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || \
+       defined CONFIG_AXP818_POWER
        power_failed |= axp_set_aldo1(CONFIG_AXP_ALDO1_VOLT);
 #endif
        power_failed |= axp_set_aldo2(CONFIG_AXP_ALDO2_VOLT);
@@ -509,11 +504,14 @@ void sunxi_board_init(void)
        power_failed |= axp_set_aldo4(CONFIG_AXP_ALDO4_VOLT);
 #endif
 
-#if defined(CONFIG_AXP221_POWER) || defined(CONFIG_AXP818_POWER)
+#if defined(CONFIG_AXP221_POWER) || defined(CONFIG_AXP809_POWER) || \
+       defined(CONFIG_AXP818_POWER)
        power_failed |= axp_set_dldo(1, CONFIG_AXP_DLDO1_VOLT);
        power_failed |= axp_set_dldo(2, CONFIG_AXP_DLDO2_VOLT);
+#if !defined CONFIG_AXP809_POWER
        power_failed |= axp_set_dldo(3, CONFIG_AXP_DLDO3_VOLT);
        power_failed |= axp_set_dldo(4, CONFIG_AXP_DLDO4_VOLT);
+#endif
        power_failed |= axp_set_eldo(1, CONFIG_AXP_ELDO1_VOLT);
        power_failed |= axp_set_eldo(2, CONFIG_AXP_ELDO2_VOLT);
        power_failed |= axp_set_eldo(3, CONFIG_AXP_ELDO3_VOLT);
@@ -524,10 +522,14 @@ void sunxi_board_init(void)
        power_failed |= axp_set_fldo(2, CONFIG_AXP_FLDO2_VOLT);
        power_failed |= axp_set_fldo(3, CONFIG_AXP_FLDO3_VOLT);
 #endif
+
+#if defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER
+       power_failed |= axp_set_sw(IS_ENABLED(CONFIG_AXP_SW_ON));
+#endif
 #endif
        printf("DRAM:");
        ramsize = sunxi_dram_init();
-       printf(" %lu MiB\n", ramsize >> 20);
+       printf(" %d MiB\n", (int)(ramsize >> 20));
        if (!ramsize)
                hang();
 
@@ -571,6 +573,7 @@ void get_board_serial(struct tag_serialnr *serialnr)
 
 #if !defined(CONFIG_SPL_BUILD)
 #include <asm/arch/spl.h>
+#include <environment.h>
 
 /*
  * Check the SPL header for the "sunxi" variant. If found: parse values
@@ -580,17 +583,29 @@ void get_board_serial(struct tag_serialnr *serialnr)
 static void parse_spl_header(const uint32_t spl_addr)
 {
        struct boot_file_head *spl = (void *)(ulong)spl_addr;
-       if (memcmp(spl->spl_signature, SPL_SIGNATURE, 3) == 0) {
-               uint8_t spl_header_version = spl->spl_signature[3];
-               if (spl_header_version == SPL_HEADER_VERSION) {
-                       if (spl->fel_script_address)
-                               setenv_hex("fel_scriptaddr",
-                                          spl->fel_script_address);
-                       return;
-               }
+       if (memcmp(spl->spl_signature, SPL_SIGNATURE, 3) != 0)
+               return; /* signature mismatch, no usable header */
+
+       uint8_t spl_header_version = spl->spl_signature[3];
+       if (spl_header_version != SPL_HEADER_VERSION) {
                printf("sunxi SPL version mismatch: expected %u, got %u\n",
                       SPL_HEADER_VERSION, spl_header_version);
+               return;
+       }
+       if (!spl->fel_script_address)
+               return;
+
+       if (spl->fel_uEnv_length != 0) {
+               /*
+                * data is expected in uEnv.txt compatible format, so "env
+                * import -t" the string(s) at fel_script_address right away.
+                */
+               himport_r(&env_htab, (char *)spl->fel_script_address,
+                         spl->fel_uEnv_length, '\n', H_NOCLEAR, 0, 0, NULL);
+               return;
        }
+       /* otherwise assume .scr format (mkimage-type script) */
+       setenv_hex("fel_scriptaddr", spl->fel_script_address);
 }
 #endif