[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/app/blxboot/blxboot.c b/src/bsp/lk/app/blxboot/blxboot.c
new file mode 100644
index 0000000..5b154ef
--- /dev/null
+++ b/src/bsp/lk/app/blxboot/blxboot.c
@@ -0,0 +1,248 @@
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <app.h>
+#include <assert.h>
+#include <boot_mode.h>
+#include <err.h>
+#include <errno.h>
+#include <fit.h>
+#include <kernel/event.h>
+#include <kernel/thread.h>
+#include <kernel/vm.h>
+#include <libfdt.h>
+#include <lib/dl_commands.h>        /* [TODO] separate rpmb define from fastboot */
+#include <lib/mempool.h>
+#include <platform.h>
+#include <rpmb/include/rpmb_mac.h> /* [TODO] #include <lib/rpmb_mac.h> */
+#include <trace.h>
+
+#include "blx_common.h"
+#include "blxboot_ab.h"
+#include "blxboot_plat.h"
+#include "dto.h"
+#include "imageinfo.h"
+
+#define LOCAL_TRACE 0
+
+extern void ext_boot(void);
+extern struct imageinfo_t imagelist[];
+
+static int load_all_images(struct blxboot *obj)
+{
+    int rc;
+    int load_idx;
+    struct imageinfo_t *img;
+    const char *part_name[3];
+    uint32_t *boot_mode = &(obj->bootcfg.boot_mode);
+
+    img = &imagelist[0];
+    while (img->type != IMGTYPE_NONE) {
+        LTRACEF("image load: %s\n", img->imgdata->part_name);
+
+        ASSERT((img->load != NULL) && (img->imgdata != NULL));
+
+        /* setup the load retry sequence: fastboot -> normal -> recovery */
+        if (*boot_mode == NORMAL_BOOT)
+            load_idx = 1;
+        else if (*boot_mode == RECOVERY_BOOT)
+            load_idx = 0;
+        else /* FASTBOOT_BOOT */
+            load_idx = 2;
+
+        part_name[2] = img->imgdata->membdev_name;
+        part_name[1] = img->imgdata->part_name;
+        part_name[0] = img->imgdata->recovery_part_name;
+
+        /* for non recovery boot partition, no need to try recovery partition
+         * if its name is the same with normal boot partition */
+        if (*boot_mode != RECOVERY_BOOT) {
+            if ((part_name[0] != NULL) && (part_name[1] != NULL) &&
+                (!strcmp(part_name[0], part_name[1])))
+                part_name[0] = NULL;
+        }
+
+        rc = -ENODEV;
+        while (load_idx >= 0) {
+            if (part_name[load_idx] != NULL) {
+                rc = img->load(part_name[load_idx], img);
+                if (rc == 0)
+                    break;
+            }
+
+            load_idx--;
+        }
+
+        if (rc == 0) {
+            if (obj->ops.notify)
+                obj->ops.notify(obj, img);
+        } else {
+            LTRACEF("load part: %s, type=%d failed\n",
+                    img->imgdata->part_name, img->type);
+            if ((img->type != IMGTYPE_DTBO) && (img->type != IMGTYPE_VPD))
+                return -1;
+
+            /* dtbo/vpd image: allow partition not exist or no valid data.
+             * Other cases, boot fail */
+            if ((rc != -ENODEV) && (rc != -ENOTSUP))
+                return -1;
+        }
+        img++;
+    }
+
+    return 0;
+}
+
+static void append_suffix(const char **name, const char *suffix, int suffix_len)
+{
+    char *new_name;
+    int len;
+
+    len = strlen(*name) + suffix_len + 1;
+    new_name = mempool_alloc(len, MEMPOOL_ANY);
+    ASSERT(new_name != NULL);
+    sprintf(new_name, "%s%s", *name, suffix);
+    *name = new_name;
+}
+
+static void update_image_partition_name(const char *suffix)
+{
+    struct imageinfo_t *img;
+    struct image_load_data *imgdata;
+    int suffix_len;
+
+    suffix_len = strlen(suffix);
+    for (img = &imagelist[0]; img->type != IMGTYPE_NONE; img++) {
+        ASSERT((img != NULL) && (img->imgdata != NULL));
+        imgdata = img->imgdata;
+        if (!imgdata->has_slot)
+            continue;
+
+        append_suffix(&imgdata->part_name, suffix, suffix_len);
+        if (imgdata->recovery_part_name)
+            append_suffix(&imgdata->recovery_part_name, suffix, suffix_len);
+    }
+}
+
+static void blxboot_task(const struct app_descriptor *app, void *args)
+{
+    struct blxboot *blxobj;
+    struct boot_param bprm;
+    bool fastboot_on_fail;
+    uint32_t *boot_mode;
+    void *fdt_dtb, *dtbo, *vpd;
+    int rc;
+
+#if (defined AVB_ENABLE_ANTIROLLBACK) || (defined AVB_ENABLE_DEVICE_STATE_CHANGE)
+    rpmb_init();
+#endif
+
+    if (plat_fixup_init() != NO_ERROR)
+        return;
+
+    blxobj = blxboot_create();
+    if (!blxobj)
+        return;
+
+    boot_mode = &(blxobj->bootcfg.boot_mode);
+    *boot_mode = get_boot_mode();
+    assert(*boot_mode <= FASTBOOT_BOOT);
+
+    if (blxobj->ops.init) {
+        rc = blxobj->ops.init();
+        /*
+         * if init fails, and boot mode is
+         *   - fastboot mode: enter fastboot mode
+         *   - non fastboot mode:
+         *       . AB OTA updater enabled: reboot,
+         *       . non AB OTA updater: enter fastboot mode
+         */
+        if (rc && (*boot_mode != FASTBOOT_BOOT)) {
+            if (is_enabled_ab_ota_updater())
+                platform_halt(HALT_ACTION_REBOOT, HALT_REASON_SW_RESET);
+            else
+                *boot_mode = FASTBOOT_BOOT;
+        }
+    }
+
+    blxobj->bootcfg.ab_suffix = get_suffix();
+    if (blxobj->bootcfg.ab_suffix != NULL)
+        update_image_partition_name(blxobj->bootcfg.ab_suffix);
+
+    if (is_enabled_ab_ota_updater())
+        fastboot_on_fail = false;
+    else
+        fastboot_on_fail = true; /* enter fastboot mode if load fail */
+
+    do {
+        if (*boot_mode == FASTBOOT_BOOT) {
+            ext_boot();
+            fastboot_on_fail = false;
+        }
+
+        if ((rc = load_all_images(blxobj)) == 0)
+            break;
+
+        if (fastboot_on_fail)
+            *boot_mode = FASTBOOT_BOOT;
+    } while (fastboot_on_fail);
+
+    if (rc != 0) {
+        if (is_enabled_ab_ota_updater())
+            platform_halt(HALT_ACTION_REBOOT, HALT_REASON_SW_RESET);
+
+        return;
+    }
+
+    /* dtbo may contains kernel bootargs, do overlay_fdt before fixup_image */
+    blxobj->ops.get_overlay_image(blxobj, &fdt_dtb, &dtbo, &vpd);
+    if (fdt_dtb && (dtbo || vpd)) {
+        rc = overlay_fdt(fdt_dtb, dtbo, vpd);
+        if (rc) {
+            LTRACEF_LEVEL(CRITICAL, "dtbo overlay failed\n");
+            return;
+        }
+    }
+
+    if (blxobj->ops.fixup_image)
+        blxobj->ops.fixup_image(blxobj, fdt_dtb);
+
+    plat_fixup_hook(*boot_mode, blxobj->bootcfg.ab_suffix,
+                    fdt_dtb, MAX_DTB_SIZE);
+
+    if (blxobj->ops.setup_boot_param) {
+        blxobj->ops.setup_boot_param(blxobj, &bprm);
+    }
+
+    dprintf(ALWAYS, "LK run time: %lld (us)\n", current_time_hires());
+    dprintf(ALWAYS, "jump to next ep %p, arg (0x%lx)\n",
+            (void *)bprm.arg1, bprm.arg2);
+
+    arch_chain_load((void *)blxobj->ops.exit,
+                    bprm.arg0, bprm.arg1, bprm.arg2, bprm.arg3);
+}
+
+APP_START(blxboot)
+.entry = blxboot_task,
+ .flags = 0,
+  APP_END