···77 */
8899#include <part.h>
1010+#include <fs.h>
1011#include <linux/arm-smccc.h>
1112#include "fw.h"
12131314#define EMMC_IFACE "mmc"
1415#define EMMC_DEV_NUM 0
1616+#define LDFW_RAW_PART "ldfw"
1717+#define LDFW_FAT_PART "esp"
1818+#define LDFW_FAT_PATH "/EFI/firmware/ldfw.bin"
15191616-/* LDFW constants */
1717-#define LDFW_PART_NAME "ldfw"
1820#define LDFW_NWD_ADDR 0x88000000
1921#define LDFW_MAGIC 0x10adab1e
2022#define SMC_CMD_LOAD_LDFW -0x500
···3638 char fw_name[16];
3739};
38403939-static int read_fw(const char *part_name, void *buf)
4141+/* Load LDFW binary as a file from FAT partition */
4242+static int read_fw_from_fat(const char *part_name, const char *path, void *buf)
4343+{
4444+ char dev_part_str[8];
4545+ loff_t len_read;
4646+ int err;
4747+4848+ snprintf(dev_part_str, sizeof(dev_part_str), "%d#%s", EMMC_DEV_NUM,
4949+ LDFW_FAT_PART);
5050+5151+ err = fs_set_blk_dev(EMMC_IFACE, dev_part_str, FS_TYPE_FAT);
5252+ if (err) {
5353+ debug("%s: Can't set block device\n", __func__);
5454+ return -ENODEV;
5555+ }
5656+5757+ err = fs_read(path, (ulong)buf, 0, 0, &len_read);
5858+ if (err) {
5959+ debug("%s: Can't read LDFW file\n", __func__);
6060+ return -EIO;
6161+ }
6262+6363+ return 0;
6464+}
6565+6666+/* Load LDFW binary from raw partition on block device into RAM buffer */
6767+static int read_fw_from_raw(const char *part_name, void *buf)
4068{
4169 struct blk_desc *blk_desc;
4270 struct disk_partition part;
···73101 u64 size = 0;
74102 int err, i;
751037676- /* Load LDFW from the block device partition into RAM buffer */
7777- err = read_fw(LDFW_PART_NAME, buf);
7878- if (err)
7979- return err;
104104+ /* First try to read LDFW from EFI partition, then from the raw one */
105105+ err = read_fw_from_fat(LDFW_FAT_PART, LDFW_FAT_PATH, buf);
106106+ if (err) {
107107+ err = read_fw_from_raw(LDFW_RAW_PART, buf);
108108+ if (err)
109109+ return err;
110110+ }
8011181112 /* Validate LDFW by magic number in its header */
82113 hdr = buf;
+20-3
configs/e850-96_defconfig
···88CONFIG_ARCH_EXYNOS9=y
99CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
1010CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xf8c00000
1111+CONFIG_ENV_SIZE=0x10000
1212+CONFIG_ENV_OFFSET=0x0
1113CONFIG_DEFAULT_DEVICE_TREE="exynos/exynos850-e850-96"
1214CONFIG_SYS_LOAD_ADDR=0x80000000
1515+CONFIG_ENV_OFFSET_REDUND=0x10000
1316# CONFIG_PSCI_RESET is not set
1717+CONFIG_EFI_SET_TIME=y
1418CONFIG_ANDROID_BOOT_IMAGE=y
1515-# CONFIG_AUTOBOOT is not set
1919+CONFIG_BOOTSTD_FULL=y
2020+CONFIG_DEFAULT_FDT_FILE="exynos850-e850-96.dtb"
1621# CONFIG_DISPLAY_CPUINFO is not set
1717-CONFIG_HUSH_PARSER=y
2222+CONFIG_CMD_BOOTEFI_SELFTEST=y
1823CONFIG_CMD_ABOOTIMG=y
2424+CONFIG_CMD_NVEDIT_EFI=y
1925CONFIG_CMD_CLK=y
2026CONFIG_CMD_GPT=y
2127CONFIG_CMD_MMC=y
2222-CONFIG_CMD_PART=y
2828+CONFIG_CMD_EFIDEBUG=y
2929+# CONFIG_CMD_DATE is not set
3030+CONFIG_CMD_RTC=y
2331CONFIG_CMD_TIME=y
2432CONFIG_CMD_RNG=y
3333+CONFIG_PARTITION_TYPE_GUID=y
3434+CONFIG_ENV_OVERWRITE=y
3535+CONFIG_ENV_IS_IN_MMC=y
3636+CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
3737+CONFIG_SYS_RELOC_GD_ENV_ADDR=y
3838+CONFIG_SYS_MMC_ENV_PART=2
2539CONFIG_NO_NET=y
2640CONFIG_CLK_EXYNOS850=y
4141+CONFIG_SUPPORT_EMMC_BOOT=y
2742CONFIG_MMC_DW=y
4343+CONFIG_DM_RTC=y
4444+CONFIG_RTC_EMULATION=y
2845CONFIG_SOC_SAMSUNG=y
2946CONFIG_EXYNOS_PMU=y
3047CONFIG_EXYNOS_USI=y