From 09800a15fd8573ace396346f0f615300785b686e Mon Sep 17 00:00:00 2001 From: Teo Hall Date: Thu, 6 Feb 2020 10:56:25 -0600 Subject: [PATCH] MLK-23279-3 imx: Add support for i.MX8DXL SoC Add soc id in cpu codes and conditionals. Also add support for v2x container on 8DXL. Signed-off-by: Ye Li Signed-off-by: Teo Hall (cherry picked from commit 35691a6b85c3240b0e3b9f9a8da9fc6328bf92d8) (cherry picked from commit f1f546d03dec535774f0583ae95b02875dfcf72c) --- arch/arm/include/asm/arch-imx/cpu.h | 2 + arch/arm/include/asm/mach-imx/sys_proto.h | 2 + arch/arm/mach-imx/imx8/Kconfig | 6 +++ arch/arm/mach-imx/imx8/cpu.c | 8 +-- arch/arm/mach-imx/imx8/image.c | 56 ++++++++++++++------- drivers/cpu/imx8_cpu.c | 2 + drivers/fastboot/fb_fsl/fb_fsl_partitions.c | 6 +-- drivers/misc/imx8/fuse.c | 4 +- include/imx8image.h | 5 +- 9 files changed, 62 insertions(+), 29 deletions(-) diff --git a/arch/arm/include/asm/arch-imx/cpu.h b/arch/arm/include/asm/arch-imx/cpu.h index 0abf191928..4e67fad823 100644 --- a/arch/arm/include/asm/arch-imx/cpu.h +++ b/arch/arm/include/asm/arch-imx/cpu.h @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0+ */ /* * (C) Copyright 2014 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP */ #define MXC_CPU_MX23 0x23 @@ -47,6 +48,7 @@ #define MXC_CPU_IMX8QXP_A0 0x90 /* dummy ID */ #define MXC_CPU_IMX8QM 0x91 /* dummy ID */ #define MXC_CPU_IMX8QXP 0x92 /* dummy ID */ +#define MXC_CPU_IMX8DXL 0x9E /* dummy ID */ #define MXC_CPU_MX7ULP 0xE1 /* Temporally hard code */ #define MXC_CPU_VF610 0xF6 /* dummy ID */ diff --git a/arch/arm/include/asm/mach-imx/sys_proto.h b/arch/arm/include/asm/mach-imx/sys_proto.h index 07a8f3887c..1aef8abf88 100644 --- a/arch/arm/include/asm/mach-imx/sys_proto.h +++ b/arch/arm/include/asm/mach-imx/sys_proto.h @@ -2,6 +2,7 @@ /* * (C) Copyright 2009 * Stefano Babic, DENX Software Engineering, sbabic@denx.de. + * Copyright 2018-2020 NXP */ #ifndef _SYS_PROTO_H_ @@ -73,6 +74,7 @@ struct bd_info; #define is_imx8mp6() (is_cpu_type(MXC_CPU_IMX8MP6)) #define is_imx8qxp() (is_cpu_type(MXC_CPU_IMX8QXP)) +#define is_imx8dxl() (is_cpu_type(MXC_CPU_IMX8DXL)) /* gd->flags reserves high 16 bits for arch-specific flags */ #define GD_FLG_ARCH_IMX_USB_BOOT 0x80000000 /* Only used for MX6/7, If set, the u-boot is booting from USB serial download */ diff --git a/arch/arm/mach-imx/imx8/Kconfig b/arch/arm/mach-imx/imx8/Kconfig index 77ced382b6..f918537274 100644 --- a/arch/arm/mach-imx/imx8/Kconfig +++ b/arch/arm/mach-imx/imx8/Kconfig @@ -28,6 +28,12 @@ config IMX8QXP select SPL_RECOVER_DATA_SECTION bool +config IMX8DXL + select IMX8 + select SUPPORT_SPL + select RECOVER_SPL_DATA_SECTION + bool + config SYS_SOC default "imx8" diff --git a/arch/arm/mach-imx/imx8/cpu.c b/arch/arm/mach-imx/imx8/cpu.c index e314abe141..b09cbf1237 100644 --- a/arch/arm/mach-imx/imx8/cpu.c +++ b/arch/arm/mach-imx/imx8/cpu.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0+ /* - * Copyright 2017-2019 NXP + * Copyright 2017-2020 NXP */ #include @@ -71,7 +71,7 @@ int arch_cpu_init_dm(void) struct pass_over_info_t *pass_over; - if (is_soc_rev(CHIP_REV_A)) { + if ((is_imx8qm() || is_imx8qxp()) && is_soc_rev(CHIP_REV_A)) { pass_over = get_pass_over_info(); if (pass_over && pass_over->g_ap_mu == 0) { /* @@ -149,7 +149,7 @@ int arch_auxiliary_core_up(u32 core_id, ulong boot_private_data) } #endif -#ifdef CONFIG_IMX8QXP +#if defined(CONFIG_IMX8QXP) || defined(CONFIG_IMX8DXL) int arch_auxiliary_core_up(u32 core_id, ulong boot_private_data) { sc_rsrc_t core_rsrc, mu_rsrc = SC_R_NONE; @@ -775,7 +775,7 @@ u64 get_page_table_size(void) #define FUSE_MAC0_WORD1 453 #define FUSE_MAC1_WORD0 454 #define FUSE_MAC1_WORD1 455 -#elif defined(CONFIG_IMX8QXP) +#elif defined(CONFIG_IMX8QXP) || defined (CONFIG_IMX8DXL) #define FUSE_MAC0_WORD0 708 #define FUSE_MAC0_WORD1 709 #define FUSE_MAC1_WORD0 710 diff --git a/arch/arm/mach-imx/imx8/image.c b/arch/arm/mach-imx/imx8/image.c index 5abc0d3a39..b5772e0504 100644 --- a/arch/arm/mach-imx/imx8/image.c +++ b/arch/arm/mach-imx/imx8/image.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0+ /* - * Copyright 2019 NXP + * Copyright 2018-2020 NXP */ #include @@ -20,7 +20,7 @@ #define NAND_DEV 2 #define QSPI_NOR_DEV 3 -static int __get_container_size(ulong addr) +static int __get_container_size(ulong addr, u16 *header_length) { struct container_hdr *phdr; struct boot_img_t *img_entry; @@ -34,7 +34,9 @@ static int __get_container_size(ulong addr) return -EFAULT; } - max_offset = sizeof(struct container_hdr); + max_offset = phdr->length_lsb + (phdr->length_msb << 8); + if (header_length) + *header_length = max_offset; img_entry = (struct boot_img_t *)(addr + sizeof(struct container_hdr)); for (i = 0; i < phdr->num_images; i++) { @@ -60,7 +62,7 @@ static int __get_container_size(ulong addr) return max_offset; } -static int get_container_size(void *dev, int dev_type, unsigned long offset) +static int get_container_size(void *dev, int dev_type, unsigned long offset, u16 *header_length) { u8 *buf = malloc(CONTAINER_HDR_ALIGNMENT); int ret = 0; @@ -115,7 +117,7 @@ static int get_container_size(void *dev, int dev_type, unsigned long offset) memcpy(buf, (const void *)offset, CONTAINER_HDR_ALIGNMENT); #endif - ret = __get_container_size((ulong)buf); + ret = __get_container_size((ulong)buf, header_length); free(buf); @@ -156,13 +158,13 @@ static unsigned long get_boot_device_offset(void *dev, int dev_type) static int get_imageset_end(void *dev, int dev_type) { - unsigned long offset1 = 0, offset2 = 0; - int value_container[2]; + unsigned long offset[3] = {}; + int value_container[3] = {}; + u16 hdr_length; - offset1 = get_boot_device_offset(dev, dev_type); - offset2 = CONTAINER_HDR_ALIGNMENT + offset1; + offset[0] = get_boot_device_offset(dev, dev_type); - value_container[0] = get_container_size(dev, dev_type, offset1); + value_container[0] = get_container_size(dev, dev_type, offset[0], &hdr_length); if (value_container[0] < 0) { printf("Parse seco container failed %d\n", value_container[0]); return value_container[0]; @@ -170,17 +172,35 @@ static int get_imageset_end(void *dev, int dev_type) debug("seco container size 0x%x\n", value_container[0]); - value_container[1] = get_container_size(dev, dev_type, offset2); - if (value_container[1] < 0) { - debug("Parse scu container failed %d, only seco container\n", - value_container[1]); - /* return seco container total size */ - return value_container[0] + offset1; + if (is_imx8dxl()) { + offset[1] = ALIGN(hdr_length, CONTAINER_HDR_ALIGNMENT) + offset[0]; + + value_container[1] = get_container_size(dev, dev_type, offset[1], &hdr_length); + if (value_container[1] < 0) { + printf("Parse v2x container failed %d\n", value_container[1]); + return value_container[0] + offset[0]; /* return seco container total size */ + } + + debug("v2x container size 0x%x\n", value_container[1]); + + offset[2] = ALIGN(hdr_length, CONTAINER_HDR_ALIGNMENT) + offset[1]; + } else { + /* Skip offset[1] */ + offset[2] = ALIGN(hdr_length, CONTAINER_HDR_ALIGNMENT) + offset[0]; + } + + value_container[2] = get_container_size(dev, dev_type, offset[2], &hdr_length); + if (value_container[2] < 0) { + debug("Parse scu container image failed %d, only seco container\n", value_container[2]); + if (is_imx8dxl()) + return value_container[1] + offset[1]; /* return seco + v2x container total size */ + else + return value_container[0] + offset[0]; /* return seco container total size */ } - debug("scu container size 0x%x\n", value_container[1]); + debug("scu container size 0x%x\n", value_container[2]); - return value_container[1] + offset2; + return value_container[2] + offset[2]; } #ifdef CONFIG_SPL_SPI_LOAD diff --git a/drivers/cpu/imx8_cpu.c b/drivers/cpu/imx8_cpu.c index abddbef57b..c111cb0822 100644 --- a/drivers/cpu/imx8_cpu.c +++ b/drivers/cpu/imx8_cpu.c @@ -35,6 +35,8 @@ const char *get_imx8_type(u32 imxtype) return "QXP"; case MXC_CPU_IMX8QM: return "QM"; + case MXC_CPU_IMX8DXL: + return "DXL"; default: return "??"; } diff --git a/drivers/fastboot/fb_fsl/fb_fsl_partitions.c b/drivers/fastboot/fb_fsl/fb_fsl_partitions.c index 625eb0c53e..6dbbfe72ae 100644 --- a/drivers/fastboot/fb_fsl/fb_fsl_partitions.c +++ b/drivers/fastboot/fb_fsl/fb_fsl_partitions.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0+ /* - * Copyright 2019 NXP + * Copyright 2019-2020 NXP */ #include @@ -53,7 +53,7 @@ unsigned int g_pcount; static ulong bootloader_mmc_offset(void) { - if (is_imx8mq() || is_imx8mm() || (is_imx8() && is_soc_rev(CHIP_REV_A))) + if (is_imx8mq() || is_imx8mm() || ((is_imx8qm() || is_imx8qxp()) && is_soc_rev(CHIP_REV_A))) return 0x8400; else if (is_imx8qm() || (is_imx8qxp() && !is_soc_rev(CHIP_REV_B))) { if (MEK_8QM_EMMC == fastboot_devinfo.dev_id) @@ -62,7 +62,7 @@ static ulong bootloader_mmc_offset(void) else /* target device is SD card, bootloader offset is 0x8000 */ return 0x8000; - } else if (is_imx8mn() || is_imx8mp()) { + } else if (is_imx8mn() || is_imx8mp() || is_imx8dxl()) { /* target device is eMMC boot0 partition, bootloader offset is 0x0 */ if (env_get_ulong("emmc_dev", 10, 2) == fastboot_devinfo.dev_id) return 0; diff --git a/drivers/misc/imx8/fuse.c b/drivers/misc/imx8/fuse.c index 38111c5254..887df0ae71 100644 --- a/drivers/misc/imx8/fuse.c +++ b/drivers/misc/imx8/fuse.c @@ -20,7 +20,7 @@ DECLARE_GLOBAL_DATA_PTR; #ifdef CONFIG_IMX8QM #define FSL_ECC_WORD_START_2 0x1A0 #define FSL_ECC_WORD_END_2 0x1FF -#elif defined(CONFIG_IMX8QXP) +#elif defined(CONFIG_IMX8QXP) || defined(CONFIG_IMX8DXL) #define FSL_ECC_WORD_START_2 0x220 #define FSL_ECC_WORD_END_2 0x31F #endif @@ -61,7 +61,7 @@ int fuse_prog(u32 bank, u32 word, u32 val) return -EINVAL; } - if (IS_ENABLED(CONFIG_IMX8QXP)) { + if (IS_ENABLED(CONFIG_IMX8QXP) || IS_ENABLED(CONFIG_IMX8DXL)) { if (word >= FSL_QXP_FUSE_GAP_START && word <= FSL_QXP_FUSE_GAP_END) { printf("Invalid word argument for this SoC\n"); diff --git a/include/imx8image.h b/include/imx8image.h index 00c614ab6c..3705460512 100644 --- a/include/imx8image.h +++ b/include/imx8image.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0+ */ /* - * Copyright 2018 NXP + * Copyright 2018-2020 NXP * * Peng Fan */ @@ -180,7 +180,8 @@ enum imx8image_fld_types { typedef enum SOC_TYPE { NONE = 0, QX, - QM + QM, + DXL } soc_type_t; typedef enum option_type { -- 2.17.1