From 6bf8976410982236d28cabb68b382f5e640fd79a Mon Sep 17 00:00:00 2001 From: Ye Li Date: Mon, 25 Feb 2019 01:18:56 -0800 Subject: [PATCH] MLK-20980 imx8qm/qxp_mek: Set kernel fdt according to M4 boot When M4 is booted by ROM, we have to enable RPMSG in kernel, so need to select the -rpmsg.dtb. If M4 is not enabled, use default kernel dtb. Signed-off-by: Ye Li Reviewed-by: Peng Fan (cherry picked from commit 8a57be45e18295ce1b19799723775cf5b205281d) --- arch/arm/include/asm/arch-imx8/sys_proto.h | 1 + arch/arm/mach-imx/imx8/cpu.c | 28 ++++++++++++++++++++++ board/freescale/imx8qm_mek/imx8qm_mek.c | 13 ++++++++++ board/freescale/imx8qxp_mek/imx8qxp_mek.c | 13 ++++++++++ include/configs/imx8qm_mek.h | 2 +- include/configs/imx8qxp_mek.h | 2 +- 6 files changed, 57 insertions(+), 2 deletions(-) diff --git a/arch/arm/include/asm/arch-imx8/sys_proto.h b/arch/arm/include/asm/arch-imx8/sys_proto.h index bddd477dfb..b432d4bb41 100644 --- a/arch/arm/include/asm/arch-imx8/sys_proto.h +++ b/arch/arm/include/asm/arch-imx8/sys_proto.h @@ -19,3 +19,4 @@ enum boot_device get_boot_device(void); int print_bootinfo(void); void power_off_pd_devices(const char* permanent_on_devices[], int size); extern unsigned long rom_pointer[]; +bool check_m4_parts_boot(void); diff --git a/arch/arm/mach-imx/imx8/cpu.c b/arch/arm/mach-imx/imx8/cpu.c index b0260c522f..cbf3e78ed4 100644 --- a/arch/arm/mach-imx/imx8/cpu.c +++ b/arch/arm/mach-imx/imx8/cpu.c @@ -1753,6 +1753,34 @@ bool check_owned_udevice(struct udevice *dev) return check_owned_resource(resource_id); } +bool check_m4_parts_boot(void) +{ + sc_rm_pt_t m4_parts[2]; + int err; + + err = sc_rm_get_resource_owner(-1, SC_R_M4_0_PID0, &m4_parts[0]); + if (err != SC_ERR_NONE) { + printf("%s get resource [%d] owner error: %d\n", __func__, SC_R_M4_0_PID0, err); + return false; + } + + if (sc_pm_is_partition_started(-1, m4_parts[0])) + return true; + + if (is_imx8qm()) { + err = sc_rm_get_resource_owner(-1, SC_R_M4_1_PID0, &m4_parts[1]); + if (err != SC_ERR_NONE) { + printf("%s get resource [%d] owner error: %d\n", __func__, SC_R_M4_1_PID0, err); + return false; + } + + if (sc_pm_is_partition_started(-1, m4_parts[1])) + return true; + } + + return false; +} + #ifdef CONFIG_IMX_VSERVICE struct udevice * board_imx_vservice_find_mu(struct udevice *dev) { diff --git a/board/freescale/imx8qm_mek/imx8qm_mek.c b/board/freescale/imx8qm_mek/imx8qm_mek.c index fbf1402162..4846510cf1 100644 --- a/board/freescale/imx8qm_mek/imx8qm_mek.c +++ b/board/freescale/imx8qm_mek/imx8qm_mek.c @@ -481,6 +481,9 @@ int board_mmc_get_env_dev(int devno) int board_late_init(void) { + char *fdt_file; + bool m4_boot; + #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG env_set("board_name", "MEK"); env_set("board_rev", "iMX8QM"); @@ -491,6 +494,16 @@ int board_late_init(void) env_set("sec_boot", "yes"); #endif + fdt_file = env_get("fdt_file"); + m4_boot = check_m4_parts_boot(); + + if (fdt_file && !strcmp(fdt_file, "undefined")) { + if (m4_boot) + env_set("fdt_file", "fsl-imx8qm-mek-rpmsg.dtb"); + else + env_set("fdt_file", "fsl-imx8qm-mek.dtb"); + } + return 0; } diff --git a/board/freescale/imx8qxp_mek/imx8qxp_mek.c b/board/freescale/imx8qxp_mek/imx8qxp_mek.c index a4b7da7f67..2678278506 100644 --- a/board/freescale/imx8qxp_mek/imx8qxp_mek.c +++ b/board/freescale/imx8qxp_mek/imx8qxp_mek.c @@ -496,6 +496,9 @@ int board_mmc_get_env_dev(int devno) int board_late_init(void) { + char *fdt_file; + bool m4_boot; + #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG env_set("board_name", "MEK"); env_set("board_rev", "iMX8QXP"); @@ -506,6 +509,16 @@ int board_late_init(void) env_set("sec_boot", "yes"); #endif + fdt_file = env_get("fdt_file"); + m4_boot = check_m4_parts_boot(); + + if (fdt_file && !strcmp(fdt_file, "undefined")) { + if (m4_boot) + env_set("fdt_file", "fsl-imx8qxp-mek-rpmsg.dtb"); + else + env_set("fdt_file", "fsl-imx8qxp-mek.dtb"); + } + return 0; } diff --git a/include/configs/imx8qm_mek.h b/include/configs/imx8qm_mek.h index 254ca1674f..bfa1e02cc4 100644 --- a/include/configs/imx8qm_mek.h +++ b/include/configs/imx8qm_mek.h @@ -193,7 +193,7 @@ "cntr_addr=0x98000000\0" \ "cntr_file=os_cntr_signed.bin\0" \ "boot_fdt=try\0" \ - "fdt_file=fsl-imx8qm-mek.dtb\0" \ + "fdt_file=undefined\0" \ "initrd_addr=0x83100000\0" \ "initrd_high=0xffffffffffffffff\0" \ "mmcdev="__stringify(CONFIG_SYS_MMC_ENV_DEV)"\0" \ diff --git a/include/configs/imx8qxp_mek.h b/include/configs/imx8qxp_mek.h index 3ab24d03bb..2520c4ac2a 100644 --- a/include/configs/imx8qxp_mek.h +++ b/include/configs/imx8qxp_mek.h @@ -154,7 +154,7 @@ "cntr_addr=0x98000000\0" \ "cntr_file=os_cntr_signed.bin\0" \ "boot_fdt=try\0" \ - "fdt_file=fsl-imx8qxp-mek.dtb\0" \ + "fdt_file=undefined\0" \ "initrd_addr=0x83100000\0" \ "initrd_high=0xffffffffffffffff\0" \ "mmcdev="__stringify(CONFIG_SYS_MMC_ENV_DEV)"\0" \ -- 2.17.1