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