[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/lib/android_bootimg/boot_info.c b/src/bsp/lk/lib/android_bootimg/boot_info.c
new file mode 100644
index 0000000..86542cd
--- /dev/null
+++ b/src/bsp/lk/lib/android_bootimg/boot_info.c
@@ -0,0 +1,199 @@
+/*
+ * Copyright (c) 2019 MediaTek Inc.
+ *
+ * Use of this source code is governed by a MIT-style
+ * license that can be found in the LICENSE file or at
+ * https://opensource.org/licenses/MIT
+ */
+
+#include <assert.h>
+#include <lib/boot_info.h>
+#include <stdbool.h>
+#include <string.h>
+#include <trace.h>
+
+#define LOCAL_TRACE 0
+
+static struct bootimg_hdr g_bootimg_hdr;
+static struct boot_info g_boot_info;
+
+static uint32_t bootimg_hdr_valid(uint8_t *buf)
+{
+ if (strncmp((char *)buf, BOOTIMG_MAGIC, BOOTIMG_MAGIC_SZ) == 0)
+ return 1;
+ else
+ return 0;
+}
+
+int load_bootinfo_bootimg_hdr(struct bootimg_hdr *buf)
+{
+ assert(buf);
+ if (g_boot_info.hdr_loaded)
+ return 0;
+
+ if (!bootimg_hdr_valid((uint8_t *)buf)) {
+ LTRACEF_LEVEL(CRITICAL, "invalid boot image header\n");
+ return -1;
+ }
+ memcpy(&g_bootimg_hdr, buf, sizeof(struct bootimg_hdr));
+ g_boot_info.hdr_loaded = 1;
+ return 0;
+}
+
+vaddr_t get_dtb_addr(void)
+{
+ vaddr_t dtb_addr;
+
+ ASSERT(g_boot_info.hdr_loaded);
+
+ dtb_addr = get_kernel_addr()
+ + get_kernel_sz()
+ + get_ramdisk_sz()
+ + get_recovery_dtbo_sz();
+
+ return dtb_addr;
+}
+
+uint32_t get_dtb_size(void)
+{
+ ASSERT(g_boot_info.hdr_loaded);
+
+ return g_bootimg_hdr.dtb_size;
+}
+
+uint64_t get_dtb_target_addr(void)
+{
+ ASSERT(g_boot_info.hdr_loaded);
+
+ return g_bootimg_hdr.dtb_addr;
+}
+
+uint32_t get_recovery_dtbo_sz(void)
+{
+ uint32_t page_sz;
+ uint32_t recovery_dtbo_size;
+ uint32_t out_recovery_dtbo_size;
+
+ ASSERT(g_boot_info.hdr_loaded);
+
+ recovery_dtbo_size = g_bootimg_hdr.recovery_dtbo_size;
+ page_sz = g_bootimg_hdr.page_sz;
+
+ out_recovery_dtbo_size =
+ (((recovery_dtbo_size + page_sz - 1) / page_sz) * page_sz);
+
+ return out_recovery_dtbo_size;
+}
+
+uint32_t get_page_sz(void)
+{
+ ASSERT(g_boot_info.hdr_loaded);
+
+ return g_bootimg_hdr.page_sz;
+}
+
+/* get final kernel image location (after relocation) */
+uint32_t get_kernel_target_addr(void)
+{
+ ASSERT(g_boot_info.hdr_loaded);
+
+ return g_bootimg_hdr.kernel_addr;
+}
+
+/* get kernel image address when it's loaded */
+vaddr_t get_kernel_addr(void)
+{
+ vaddr_t kernel_addr;
+
+ ASSERT(g_boot_info.hdr_loaded);
+ ASSERT(g_boot_info.img_loaded);
+
+ kernel_addr = g_boot_info.bootimg_load_addr + g_bootimg_hdr.page_sz;
+
+ return kernel_addr;
+}
+
+uint32_t get_kernel_sz(void)
+{
+ uint32_t page_sz;
+ uint32_t kernel_sz;
+ uint32_t out_kernel_sz;
+
+ ASSERT(g_boot_info.hdr_loaded);
+
+ kernel_sz = g_bootimg_hdr.kernel_sz;
+ page_sz = g_bootimg_hdr.page_sz;
+
+ out_kernel_sz = (((kernel_sz + page_sz - 1) / page_sz) * page_sz);
+
+ return out_kernel_sz;
+}
+
+uint32_t get_kernel_real_sz(void)
+{
+ ASSERT(g_boot_info.hdr_loaded);
+ return g_bootimg_hdr.kernel_sz;
+}
+
+/* get final ramdisk image location (after relocation) */
+uint32_t get_ramdisk_target_addr(void)
+{
+ ASSERT(g_boot_info.hdr_loaded);
+
+ return g_bootimg_hdr.ramdisk_addr;
+}
+
+/* get ramdisk image address when it's loaded */
+vaddr_t get_ramdisk_addr(void)
+{
+ uint32_t kernel_sz;
+ vaddr_t ramdisk_addr;
+
+ ASSERT(g_boot_info.hdr_loaded);
+ ASSERT(g_boot_info.img_loaded);
+
+ kernel_sz = get_kernel_sz();
+ if (kernel_sz == 0)
+ return 0;
+
+ ramdisk_addr = g_boot_info.bootimg_load_addr + g_bootimg_hdr.page_sz +
+ kernel_sz;
+
+ return ramdisk_addr;
+}
+
+uint32_t get_ramdisk_sz(void)
+{
+ uint32_t page_sz;
+ uint32_t ramdisk_sz;
+ uint32_t out_ramdisk_sz;
+
+ ASSERT(g_boot_info.hdr_loaded);
+
+ ramdisk_sz = g_bootimg_hdr.ramdisk_sz;
+ page_sz = g_bootimg_hdr.page_sz;
+
+ out_ramdisk_sz = (((ramdisk_sz + page_sz - 1) / page_sz) * page_sz);
+
+ return out_ramdisk_sz;
+}
+
+uint32_t get_ramdisk_real_sz(void)
+{
+ ASSERT(g_boot_info.hdr_loaded);
+ return g_bootimg_hdr.ramdisk_sz;
+}
+
+uint32_t get_header_version(void)
+{
+ ASSERT(g_boot_info.hdr_loaded);
+ return g_bootimg_hdr.header_version;
+}
+
+void set_bootimg_loaded(vaddr_t addr)
+{
+ ASSERT(g_boot_info.hdr_loaded);
+
+ g_boot_info.img_loaded = 1;
+ g_boot_info.bootimg_load_addr = addr;
+}