fdto: fix VtsFirmwareDtboVerification error [1/1]

PD#SWPL-158689

Problem:
VtsFirmwareDtboVerification 1 fail
failed to verify overlay node

Solution:
Enable fdt overlay
porting form 2019

Verify:
s7

Change-Id: Ia4f65fc8791ab555819f2abe365bc31de34f48f6
Signed-off-by: Bo Lv <bo.lv@amlogic.com>
diff --git a/arch/arm/include/asm/amlogic/arch-a4/cpu.h b/arch/arm/include/asm/amlogic/arch-a4/cpu.h
index 43606de..5eebed7 100644
--- a/arch/arm/include/asm/amlogic/arch-a4/cpu.h
+++ b/arch/arm/include/asm/amlogic/arch-a4/cpu.h
@@ -52,7 +52,6 @@
 
 #define AML_CUSTOMER_ID  (0)
 
-#define CONFIG_OF_LIBFDT_OVERLAY 1
 //#define CONFIG_SILENT_CONSOLE
 //#define CONFIG_SILENT_CONSOLE_UPDATE_ON_RELOC
 //#define CONFIG_SILENT_U_BOOT_ONLY
diff --git a/arch/arm/include/asm/amlogic/arch-s1a/cpu.h b/arch/arm/include/asm/amlogic/arch-s1a/cpu.h
index 4f823ef..2926ef2 100644
--- a/arch/arm/include/asm/amlogic/arch-s1a/cpu.h
+++ b/arch/arm/include/asm/amlogic/arch-s1a/cpu.h
@@ -52,9 +52,6 @@
 
 #define AML_CUSTOMER_ID  (0)
 
-#define CONFIG_OF_LIBFDT_OVERLAY 1
-//#define CONFIG_CMD_DTIMG 1
-
 //#define CONFIG_SILENT_CONSOLE
 //#define CONFIG_SILENT_CONSOLE_UPDATE_ON_RELOC
 //#define CONFIG_SILENT_U_BOOT_ONLY
diff --git a/arch/arm/include/asm/amlogic/arch-s4/cpu.h b/arch/arm/include/asm/amlogic/arch-s4/cpu.h
index f6ae9ca..c257c21 100644
--- a/arch/arm/include/asm/amlogic/arch-s4/cpu.h
+++ b/arch/arm/include/asm/amlogic/arch-s4/cpu.h
@@ -52,9 +52,6 @@
 
 #define AML_CUSTOMER_ID  (0)
 
-#define CONFIG_OF_LIBFDT_OVERLAY 1
-//#define CONFIG_CMD_DTIMG 1
-
 //#define CONFIG_SILENT_CONSOLE
 //#define CONFIG_SILENT_CONSOLE_UPDATE_ON_RELOC
 //#define CONFIG_SILENT_U_BOOT_ONLY
diff --git a/arch/arm/include/asm/amlogic/arch-s7/cpu.h b/arch/arm/include/asm/amlogic/arch-s7/cpu.h
index eac9886..cb2e596 100644
--- a/arch/arm/include/asm/amlogic/arch-s7/cpu.h
+++ b/arch/arm/include/asm/amlogic/arch-s7/cpu.h
@@ -52,7 +52,6 @@
 
 #define AML_CUSTOMER_ID  (0)
 
-#define CONFIG_OF_LIBFDT_OVERLAY 1
 //#define CONFIG_SILENT_CONSOLE
 //#define CONFIG_SILENT_CONSOLE_UPDATE_ON_RELOC
 //#define CONFIG_SILENT_U_BOOT_ONLY
diff --git a/boot/bootm.c b/boot/bootm.c
index e667140..018bbab 100644
--- a/boot/bootm.c
+++ b/boot/bootm.c
@@ -34,6 +34,11 @@
 #include <image.h>
 #include <version.h>
 
+#if defined(CONFIG_OF_LIBFDT_OVERLAY) && defined(CONFIG_AMLOGIC_MODIFY)
+#include <dt_table.h>
+#include <image-android-dt.h>
+#endif
+
 #define MAX_CMDLINE_SIZE	SZ_4K
 
 #define IH_INITRD_ARCH IH_ARCH_DEFAULT
@@ -292,6 +297,147 @@
 	return 0;
 }
 
+/*
+ * load dtb overlay partition to mem
+*/
+#if defined(CONFIG_OF_LIBFDT_OVERLAY) && defined(CONFIG_AMLOGIC_MODIFY)
+static int read_fdto_partition(void)
+{
+	char cmd[128];
+	void *dtbo_mem_addr = NULL;
+	char dtbo_partition[32] = {0};
+	char *s1;
+	struct	dt_table_header hdr;
+
+	//run_command("get_valid_slot;", 0);
+	s1 = env_get("active_slot");
+	if (s1 && (strcmp(s1, "normal") == 0))
+		strcpy(dtbo_partition, "dtbo");
+	else if (s1 && (strcmp(s1, "_a") == 0))
+		strcpy(dtbo_partition, "dtbo_a");
+	else if (s1 && (strcmp(s1, "_b") == 0))
+		strcpy(dtbo_partition, "dtbo_b");
+
+	/*
+	* Though it is really no need to parse the adtimg infos
+	* here, but wasting time to read the whole dtbo image
+	* partition is unacceptable
+	*/
+	pr_info("Start read %s partition datas!\n", dtbo_partition);
+	extern int store_read(const char *name, loff_t off, size_t size, void *buf);
+	if (store_read(dtbo_partition, 0,
+		sizeof(struct dt_table_header), &hdr) < 0) {
+		pr_err("Fail to read header of DTBO partition\n");
+		return -1;
+	}
+
+#ifdef CONFIG_CMD_ADTIMG
+	if (!android_dt_check_header((ulong)&hdr)) {
+		printf("DTBO partition header is incorrect\n");
+		return -1;
+	}
+#endif
+
+	dtbo_mem_addr = malloc(fdt32_to_cpu(hdr.total_size));
+	if (!dtbo_mem_addr) {
+		printf("out of memory\n");
+		return -1;
+	} else {
+		if (store_read(dtbo_partition, 0,
+			fdt32_to_cpu(hdr.total_size), dtbo_mem_addr) < 0) {
+			printf("Fail to read DTBO partition\n");
+			free(dtbo_mem_addr);
+			return -1;
+		}
+		else {
+			sprintf(cmd, "0x%p", dtbo_mem_addr);
+			env_set("dtbo_mem_addr",cmd);
+		}
+	}
+
+	return 0;
+}
+
+static int get_fdto_totalsize(u32 *tz)
+{
+#ifdef CONFIG_CMD_ADTIMG
+	unsigned long long dtbo_mem_addr = 0x0;
+#endif
+	int ret;
+
+	ret = read_fdto_partition();
+	if (ret != 0)
+		return ret;
+
+#ifdef CONFIG_CMD_ADTIMG
+	dtbo_mem_addr = simple_strtoul(env_get("dtbo_mem_addr"), NULL, 16);
+	*tz = android_dt_get_totalsize(dtbo_mem_addr);
+#endif
+	return 0;
+}
+
+static int do_fdt_overlay(void)
+{
+	unsigned long long dtbo_mem_addr = 0x0;
+	int dtbo_num = 0;
+	int i;
+	char cmd[128];
+	unsigned long long dtbo_start;
+	char *dtbo_idx = NULL;
+	char idx[32];
+
+	if (!env_get("dtbo_mem_addr")) {
+		pr_err("No valid dtbo image found\n");
+		return -1;
+	}
+
+	dtbo_mem_addr = simple_strtoul(env_get("dtbo_mem_addr"), NULL, 16);
+#ifdef CONFIG_CMD_ADTIMG
+	if (!android_dt_check_header(dtbo_mem_addr)) {
+		pr_err("Error: DTBO image header is incorrect\n");
+		return -1;
+	}
+#endif
+
+	/* android_dt_print_contents(dtbo_mem_addr); */
+	dtbo_num = fdt32_to_cpu((
+		(const struct dt_table_header *)dtbo_mem_addr)->dt_entry_count);
+	pr_info("find %d dtbos\n", dtbo_num);
+
+	dtbo_idx = env_get("androidboot.dtbo_idx");
+	if (!dtbo_idx) {
+		pr_info("No androidboot.dtbo_idx configured\n");
+		pr_info("And no dtbos will be applied\n");
+		return -1;
+	}
+	pr_info("dtbos to be applied: %s\n", dtbo_idx);
+
+	#ifndef CONFIG_CMD_ADTIMG
+	pr_info("Error: No adtimg support found\n");
+	return -1;
+	#endif
+
+	for (i = 0; i < dtbo_num; i++) {
+		memset(idx, 0x00, sizeof(idx));
+		sprintf(idx, "%d", i);
+		if (strstr(dtbo_idx, idx)) {
+			printf("Apply dtbo %d\n", i);
+			sprintf(cmd, "adtimg addr 0x%llx;adtimg get dt --index=%d  dtbo_start 0x%llx",
+				dtbo_mem_addr, i, dtbo_mem_addr);
+			run_command(cmd, 0);
+			dtbo_start = simple_strtoul(
+					env_get("dtbo_start"), NULL, 16);
+
+			sprintf(cmd, "fdt apply 0x%llx", dtbo_start);
+			run_command(cmd, 0);
+		}
+	}
+
+	free((void *)dtbo_mem_addr);
+	return 0;
+}
+#endif
+
 /**
  * bootm_find_images - wrapper to find and locate various images
  * @flag: Ignored Argument
@@ -315,6 +461,10 @@
 {
 	int ret;
 
+#if defined(CONFIG_OF_LIBFDT_OVERLAY) && defined(CONFIG_AMLOGIC_MODIFY)
+	u32 fdto_totalsize = 0;
+#endif
+
 	/* find ramdisk */
 	ret = boot_get_ramdisk(argc, argv, &images, IH_INITRD_ARCH,
 			       &images.rd_start, &images.rd_end);
@@ -357,6 +507,14 @@
 
 	if (CONFIG_IS_ENABLED(CMD_FDT))
 		set_working_fdt_addr(map_to_sysmem(images.ft_addr));
+
+#if defined(CONFIG_OF_LIBFDT_OVERLAY) && defined(CONFIG_AMLOGIC_MODIFY)
+	if (get_fdto_totalsize(&fdto_totalsize) == 0)
+		fdt_set_totalsize(images.ft_addr, fdt_get_header(images.ft_addr,
+			totalsize) + fdto_totalsize);
+	images.ft_len = fdt_get_header(images.ft_addr, totalsize);
+	do_fdt_overlay();
+#endif
 #endif
 
 #if CONFIG_IS_ENABLED(FIT)
diff --git a/boot/image-android-dt.c b/boot/image-android-dt.c
index fb01419..1e09796 100644
--- a/boot/image-android-dt.c
+++ b/boot/image-android-dt.c
@@ -28,6 +28,20 @@
 	return magic == DT_TABLE_MAGIC;
 }
 
+#if defined(CONFIG_OF_LIBFDT_OVERLAY) && defined(CONFIG_AMLOGIC_MODIFY)
+u32 android_dt_get_totalsize(ulong hdr_addr)
+{
+	const struct dt_table_header *hdr;
+	u32 totalsize;
+
+	hdr = map_sysmem(hdr_addr, sizeof(*hdr));
+	totalsize = fdt32_to_cpu(hdr->total_size);
+	unmap_sysmem(hdr);
+
+	return totalsize;
+}
+#endif
+
 /**
  * Get the address of FDT (dtb or dtbo) in memory by its index in image.
  *
diff --git a/configs/amlogic/a4_ba400_zircon_defconfig b/configs/amlogic/a4_ba400_zircon_defconfig
index b7e2edb..ca78264 100644
--- a/configs/amlogic/a4_ba400_zircon_defconfig
+++ b/configs/amlogic/a4_ba400_zircon_defconfig
@@ -26,7 +26,6 @@
 CONFIG_SYS_PROMPT="a4_ba400_zircon# "
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_DSPSET is not set
-CONFIG_CMD_DTIMG=y
 # CONFIG_CMD_IMI is not set
 CONFIG_CMD_CLKMSR=y
 CONFIG_CMD_GPIO=y
diff --git a/configs/amlogic/a4_pxp_defconfig b/configs/amlogic/a4_pxp_defconfig
index 9244c90..240a713 100644
--- a/configs/amlogic/a4_pxp_defconfig
+++ b/configs/amlogic/a4_pxp_defconfig
@@ -22,7 +22,6 @@
 CONFIG_SYS_PROMPT="a4_pxp# "
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_DSPSET is not set
-CONFIG_CMD_DTIMG=y
 # CONFIG_CMD_IMI is not set
 CONFIG_CMD_CLKMSR=y
 CONFIG_CMD_GPIO=y
diff --git a/configs/amlogic/s4_ap222_defconfig b/configs/amlogic/s4_ap222_defconfig
index 0304a92..58d442b 100644
--- a/configs/amlogic/s4_ap222_defconfig
+++ b/configs/amlogic/s4_ap222_defconfig
@@ -23,7 +23,6 @@
 CONFIG_SYS_PROMPT="s4_ap222# "
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_DSPSET is not set
-CONFIG_CMD_DTIMG=y
 # CONFIG_CMD_IMI is not set
 CONFIG_CMD_CLK=y
 CONFIG_CMD_CLKMSR=y
@@ -144,4 +143,4 @@
 CONFIG_AES=y
 CONFIG_ARMV8_CRYPTO=y
 CONFIG_BOARD_RNG_SEED=y
-#CONFIG_HW_RNG_OLD=y
\ No newline at end of file
+#CONFIG_HW_RNG_OLD=y
diff --git a/configs/amlogic/s7_bh201_defconfig b/configs/amlogic/s7_bh201_defconfig
index 7068bed..945f5f3 100644
--- a/configs/amlogic/s7_bh201_defconfig
+++ b/configs/amlogic/s7_bh201_defconfig
@@ -13,6 +13,7 @@
 CONFIG_AMLOGIC_ETH=y
 CONFIG_AMLOGIC_EMMC=y
 CONFIG_S7_BH201=y
+CONFIG_CMD_ADTIMG=y
 CONFIG_DTB_BIND_KERNEL=y
 CONFIG_ENABLE_AML_GPIO_UPGRADE=y
 CONFIG_AML_GPIO_UPGRADE_KEY="GPIOD_2"
diff --git a/configs/amlogic/s7_bh202_defconfig b/configs/amlogic/s7_bh202_defconfig
index c420ac7..87eab91 100644
--- a/configs/amlogic/s7_bh202_defconfig
+++ b/configs/amlogic/s7_bh202_defconfig
@@ -13,6 +13,7 @@
 CONFIG_AMLOGIC_ETH=y
 CONFIG_AMLOGIC_EMMC=y
 CONFIG_S7_BH202=y
+CONFIG_CMD_ADTIMG=y
 CONFIG_DEBUG_UART_BASE=0xfe07a000
 CONFIG_DEBUG_UART_CLOCK=24000000
 CONFIG_DEBUG_UART=y
diff --git a/configs/amlogic/s7_bh209_defconfig b/configs/amlogic/s7_bh209_defconfig
index dac9e5e..9afb4b3 100644
--- a/configs/amlogic/s7_bh209_defconfig
+++ b/configs/amlogic/s7_bh209_defconfig
@@ -13,6 +13,7 @@
 CONFIG_AMLOGIC_ETH=y
 CONFIG_AMLOGIC_EMMC=y
 CONFIG_S7_BH209=y
+CONFIG_CMD_ADTIMG=y
 CONFIG_DEBUG_UART_BASE=0xfe07a000
 CONFIG_DEBUG_UART_CLOCK=24000000
 CONFIG_DEBUG_UART=y
diff --git a/include/image-android-dt.h b/include/image-android-dt.h
index 9a3aa8f..d143bf7 100644
--- a/include/image-android-dt.h
+++ b/include/image-android-dt.h
@@ -13,6 +13,10 @@
 bool android_dt_get_fdt_by_index(ulong hdr_addr, u32 index, ulong *addr,
 				 u32 *size);
 
+#if defined(CONFIG_OF_LIBFDT_OVERLAY) && defined(CONFIG_AMLOGIC_MODIFY)
+u32 android_dt_get_totalsize(ulong hdr_addr);
+#endif
+
 #if !defined(CONFIG_SPL_BUILD)
 void android_dt_print_contents(ulong hdr_addr);
 #endif