CI: https://source.denx.de/u-boot/custodians/u-boot-imx/-/pipelines/23262

- Improve imx9 boot medium autodection.
- Add possibility to skip DCD on i.MX8.
- Switch to using upstream DT on DH i.MX6 DHCOM.
- Add support for i.MX6DL DHCOM SoM on PDK2 carrier board.
- Handle FIELD_RETURN on i.MX HAB.
This commit is contained in:
Tom Rini 2024-11-09 11:26:14 -06:00
commit 9c25cd5631
22 changed files with 113 additions and 115 deletions

View file

@ -778,8 +778,6 @@ dtb-y += \
imx6dl-cubox-i.dtb \
imx6dl-cubox-i-emmc-som-v15.dtb \
imx6dl-cubox-i-som-v15.dtb \
imx6dl-dhcom-pdk2.dtb \
imx6dl-dhcom-picoitx.dts \
imx6dl-gw51xx.dtb \
imx6dl-gw52xx.dtb \
imx6dl-gw53xx.dtb \
@ -811,8 +809,7 @@ dtb-y += \
imx6dl-sabreauto.dtb \
imx6dl-sabresd.dtb \
imx6dl-sielaff.dtb \
imx6dl-wandboard-revd1.dtb \
imx6s-dhcom-drc02.dtb
imx6dl-wandboard-revd1.dtb
endif
@ -824,7 +821,6 @@ dtb-y += \
imx6q-cubox-i.dtb \
imx6q-cubox-i-emmc-som-v15.dtb \
imx6q-cubox-i-som-v15.dtb \
imx6q-dhcom-pdk2.dtb \
imx6q-display5.dtb \
imx6q-gw51xx.dtb \
imx6q-gw52xx.dtb \

View file

@ -1,15 +0,0 @@
// SPDX-License-Identifier: (GPL-2.0+)
/*
* Copyright (C) 2019 DH electronics GmbH
*/
/dts-v1/;
#include "imx6dl.dtsi"
#include "imx6qdl-dhcom-som.dtsi"
#include "imx6qdl-dhcom-pdk2.dtsi"
/ {
model = "Freescale i.MX6 Duallite/Solo DHCOM Premium Developer Kit (2)";
compatible = "dh,imx6dl-dhcom-pdk2", "dh,imx6dl-dhcom", "fsl,imx6dl";
};

View file

@ -1,20 +0,0 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2021 DH electronics GmbH
*
* DHCOM iMX6 variant:
* DHCM-iMX6DL-C0800-R102-F0819-E-SD-RTC-T-HS-I-01D2
* DHCOM PCB number: 493-300 or newer
* PicoITX PCB number: 487-600 or newer
*/
/dts-v1/;
#include "imx6dl.dtsi"
#include "imx6qdl-dhcom-som.dtsi"
#include "imx6qdl-dhcom-picoitx.dtsi"
/ {
model = "DH electronics i.MX6DL DHCOM on PicoITX";
compatible = "dh,imx6dl-dhcom-picoitx", "dh,imx6dl-dhcom-som",
"fsl,imx6dl";
};

View file

@ -1,25 +0,0 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2015-2021 DH electronics GmbH
* Copyright (C) 2018 Marek Vasut <marex@denx.de>
*
* DHCOM iMX6 variant:
* DHCM-iMX6Q-C0800-R102-F0819-E-SD-RTC-T-HS-I-01D2
* DHCOM PCB number: 493-300 or newer
* PDK2 PCB number: 516-400 or newer
*/
/dts-v1/;
#include "imx6q.dtsi"
#include "imx6qdl-dhcom-som.dtsi"
#include "imx6qdl-dhcom-pdk2.dtsi"
/ {
model = "DH electronics i.MX6Q DHCOM on Premium Developer Kit (2)";
compatible = "dh,imx6q-dhcom-pdk2", "dh,imx6q-dhcom-som",
"fsl,imx6q";
};
&sata {
status = "okay";
};

View file

@ -1,30 +0,0 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2021 DH electronics GmbH
*
* DHCOM iMX6 variant:
* DHCM-iMX6S-C0800-R102-F0409-E-CAN2-RTC-I-01D2
* DHCOM PCB number: 493-400 or newer
* DRC02 PCB number: 568-100 or newer
*/
/dts-v1/;
/*
* The kernel only distinguishes between i.MX6 Quad and DualLite,
* but the Solo is actually a DualLite with only one CPU. So use
* DualLite for the Solo and disable one CPU node.
*/
#include "imx6dl.dtsi"
#include "imx6qdl-dhcom-som.dtsi"
#include "imx6qdl-dhcom-drc02.dtsi"
/ {
model = "DH electronics i.MX6S DHCOM on DRC02";
compatible = "dh,imx6s-dhcom-drc02", "dh,imx6s-dhcom-som",
"fsl,imx6dl";
cpus {
/delete-node/ cpu@1;
};
};

View file

@ -132,13 +132,14 @@ enum hab_target {
HAB_TGT_ANY = 0x55,
};
struct imx_sec_config_fuse_t {
struct imx_fuse {
int bank;
int word;
};
#if defined(CONFIG_IMX_HAB)
extern struct imx_sec_config_fuse_t const imx_sec_config_fuse;
extern struct imx_fuse const imx_sec_config_fuse;
extern struct imx_fuse const imx_field_return_fuse;
#endif
/*Function prototype description*/

View file

@ -293,3 +293,5 @@ obj-$(CONFIG_ARCH_IMXRT) += imxrt/
obj-$(CONFIG_SPL_BOOTROM_SUPPORT) += spl_imx_romapi.o
obj-$(CONFIG_IMX8_ROMAPI) += romapi.o
obj-$(CONFIG_MX7)$(CONFIG_IMX8M) += snvs.o

View file

@ -26,6 +26,14 @@ DECLARE_GLOBAL_DATA_PTR;
#define IS_HAB_ENABLED_BIT \
(is_soc_type(MXC_SOC_MX7ULP) ? 0x80000000 : \
((is_soc_type(MXC_SOC_MX7) || is_soc_type(MXC_SOC_IMX8M)) ? 0x2000000 : 0x2))
#define FIELD_RETURN_FUSE_MASK \
(is_imx8mp() ? 0xFFFFFFFF : 0x00000001)
/*
* The fuse pattern for i.MX8M Plus is 0x28001401, but bit 2 is already set from factory.
* This means when field return is set, the fuse word value reads 0x28001405
*/
#define FIELD_RETURN_PATTERN \
(is_imx8mp() ? 0x28001405 : 0x00000001)
#ifdef CONFIG_MX7ULP
#define HAB_M4_PERSISTENT_START ((soc_rev() >= CHIP_REV_2_0) ? 0x20008040 : \
@ -870,18 +878,30 @@ static int validate_ivt(struct ivt *ivt_initial)
bool imx_hab_is_enabled(void)
{
struct imx_sec_config_fuse_t *fuse =
(struct imx_sec_config_fuse_t *)&imx_sec_config_fuse;
struct imx_fuse *sec_config =
(struct imx_fuse *)&imx_sec_config_fuse;
struct imx_fuse *field_return =
(struct imx_fuse *)&imx_field_return_fuse;
uint32_t reg;
bool is_enabled;
int ret;
ret = fuse_read(fuse->bank, fuse->word, &reg);
ret = fuse_read(sec_config->bank, sec_config->word, &reg);
if (ret) {
puts("\nSecure boot fuse read error\n");
puts("Secure boot fuse read error\n");
return ret;
}
is_enabled = reg & IS_HAB_ENABLED_BIT;
if (is_enabled) {
ret = fuse_read(field_return->bank, field_return->word, &reg);
if (ret) {
puts("Field return fuse read error\n");
return ret;
}
is_enabled = (reg & FIELD_RETURN_FUSE_MASK) != FIELD_RETURN_PATTERN;
}
return (reg & IS_HAB_ENABLED_BIT) == IS_HAB_ENABLED_BIT;
return is_enabled;
}
int imx_hab_authenticate_image(uint32_t ddr_start, uint32_t image_size,

View file

@ -34,13 +34,20 @@
#include <linux/bitfield.h>
#include <linux/sizes.h>
#include "../snvs.h"
DECLARE_GLOBAL_DATA_PTR;
#if defined(CONFIG_IMX_HAB)
struct imx_sec_config_fuse_t const imx_sec_config_fuse = {
struct imx_fuse const imx_sec_config_fuse = {
.bank = 1,
.word = 3,
};
struct imx_fuse const imx_field_return_fuse = {
.bank = 8,
.word = 3,
};
#endif
int timer_init(void)
@ -571,6 +578,8 @@ static void imx8m_setup_snvs(void)
writel(SNVS_LPPGDR_INIT, SNVS_BASE_ADDR + SNVS_LPLVDR);
/* Clear interrupt status */
writel(0xffffffff, SNVS_BASE_ADDR + SNVS_LPSR);
init_snvs();
}
static void imx8m_setup_csu_tzasc(void)

View file

@ -42,12 +42,18 @@ DECLARE_GLOBAL_DATA_PTR;
struct rom_api *g_rom_api = (struct rom_api *)0x1980;
#ifdef CONFIG_ENV_IS_IN_MMC
#if CONFIG_IS_ENABLED(ENV_IS_IN_MMC) || CONFIG_IS_ENABLED(ENV_IS_NOWHERE)
__weak int board_mmc_get_env_dev(int devno)
{
return devno;
}
#ifdef CONFIG_SYS_MMC_ENV_DEV
#define IMX9_MMC_ENV_DEV CONFIG_SYS_MMC_ENV_DEV
#else
#define IMX9_MMC_ENV_DEV 0
#endif
int mmc_get_env_dev(void)
{
int ret;
@ -59,7 +65,7 @@ int mmc_get_env_dev(void)
if (ret != ROM_API_OKAY) {
puts("ROMAPI: failure at query_boot_info\n");
return CONFIG_SYS_MMC_ENV_DEV;
return IMX9_MMC_ENV_DEV;
}
boot_type = boot >> 16;
@ -69,7 +75,7 @@ int mmc_get_env_dev(void)
/* If not boot from sd/mmc, use default value */
if (boot_type != BOOT_TYPE_SD && boot_type != BOOT_TYPE_MMC)
return env_get_ulong("mmcdev", 10, CONFIG_SYS_MMC_ENV_DEV);
return env_get_ulong("mmcdev", 10, IMX9_MMC_ENV_DEV);
return board_mmc_get_env_dev(boot_instance);
}

View file

@ -51,10 +51,15 @@ U_BOOT_DRVINFO(imx6_thermal) = {
#endif
#if defined(CONFIG_IMX_HAB)
struct imx_sec_config_fuse_t const imx_sec_config_fuse = {
struct imx_fuse const imx_sec_config_fuse = {
.bank = 0,
.word = 6,
};
struct imx_fuse const imx_field_return_fuse = {
.bank = 5,
.word = 6,
};
#endif
u32 get_nr_cpus(void)

View file

@ -3,5 +3,5 @@
# (C) Copyright 2015 Freescale Semiconductor, Inc.
#
obj-y := soc.o clock.o clock_slice.o ddr.o snvs.o
obj-y := soc.o clock.o clock_slice.o ddr.o
obj-$(CONFIG_ARMV7_PSCI) += psci-mx7.o psci-suspend.o

View file

@ -127,10 +127,15 @@ static void isolate_resource(void)
#endif
#if defined(CONFIG_IMX_HAB)
struct imx_sec_config_fuse_t const imx_sec_config_fuse = {
struct imx_fuse const imx_sec_config_fuse = {
.bank = 1,
.word = 3,
};
struct imx_fuse const imx_field_return_fuse = {
.bank = 8,
.word = 3,
};
#endif
static bool is_mx7d(void)

View file

@ -38,10 +38,15 @@
static char *get_reset_cause(char *);
#if defined(CONFIG_IMX_HAB)
struct imx_sec_config_fuse_t const imx_sec_config_fuse = {
struct imx_fuse const imx_sec_config_fuse = {
.bank = 29,
.word = 6,
};
struct imx_fuse const imx_field_return_fuse = {
.bank = 9,
.word = 6,
};
#endif
#define ROM_VERSION_ADDR 0x80

6
arch/arm/mach-imx/snvs.h Normal file
View file

@ -0,0 +1,6 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright 2018 Linaro
*/
void init_snvs(void);

View file

@ -58,7 +58,7 @@ int board_init(void)
int board_late_init(void)
{
#ifdef CONFIG_ENV_IS_IN_MMC
#if CONFIG_IS_ENABLED(ENV_IS_IN_MMC) || CONFIG_IS_ENABLED(ENV_IS_NOWHERE)
board_late_mmc_env_init();
#endif

View file

@ -5,11 +5,12 @@ CONFIG_ARCH_MX6=y
CONFIG_MX6QDL=y
CONFIG_TARGET_DHCOMIMX6=y
CONFIG_SPL_SYS_L2_PL310=y
CONFIG_DEFAULT_DEVICE_TREE="imx6q-dhcom-pdk2"
CONFIG_DEFAULT_DEVICE_TREE="nxp/imx/imx6q-dhcom-pdk2"
CONFIG_MX6_DDRCAL=y
CONFIG_NR_DRAM_BANKS=1
CONFIG_OF_LIBFDT_OVERLAY=y
CONFIG_OF_LIST="imx6q-dhcom-pdk2 imx6dl-dhcom-pdk2 imx6s-dhcom-drc02 imx6dl-dhcom-picoitx"
CONFIG_OF_LIST="nxp/imx/imx6q-dhcom-pdk2 nxp/imx/imx6dl-dhcom-pdk2 nxp/imx/imx6s-dhcom-drc02 nxp/imx/imx6dl-dhcom-picoitx"
CONFIG_OF_UPSTREAM=y
CONFIG_FIT_VERBOSE=y
CONFIG_MULTI_DTB_FIT=y
CONFIG_LTO=y

View file

@ -0,0 +1,20 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2024 Marek Vasut <marex@denx.de>
*
* DHCOM iMX6 variant:
* DHCM-iMX6DL-C080-R102-F0819-E-SD-RTC-T-HS-I-01D2
* DHCOM PCB number: 493-400 or newer
* PDK2 PCB number: 516-400 or newer
*/
/dts-v1/;
#include "imx6dl.dtsi"
#include "imx6qdl-dhcom-som.dtsi"
#include "imx6qdl-dhcom-pdk2.dtsi"
/ {
model = "DH electronics i.MX6DL DHCOM on Premium Developer Kit (2)";
compatible = "dh,imx6dl-dhcom-pdk2", "dh,imx6dl-dhcom-som",
"fsl,imx6dl";
};

View file

@ -27,6 +27,12 @@
#define BOOTENV
#endif
#ifdef CONFIG_SYS_MMC_ENV_DEV
#define IMX93_EVK_MMC_ENV_DEV CONFIG_SYS_MMC_ENV_DEV
#else
#define IMX93_EVK_MMC_ENV_DEV 0
#endif
/* Initial environment variables */
#define CFG_EXTRA_ENV_SETTINGS \
BOOTENV \
@ -42,7 +48,7 @@
"boot_fit=no\0" \
"fdtfile=" CONFIG_DEFAULT_FDT_FILE "\0" \
"bootm_size=0x10000000\0" \
"mmcdev=" __stringify(CONFIG_SYS_MMC_ENV_DEV)"\0" \
"mmcdev=" __stringify(IMX93_EVK_MMC_ENV_DEV)"\0" \
"mmcpart=1\0" \
"mmcroot=/dev/mmcblk1p2 rootwait rw\0" \
"mmcautodetect=yes\0" \

View file

@ -146,6 +146,7 @@ struct image_array {
enum imx8image_cmd {
CMD_INVALID,
CMD_BOOT_FROM,
CMD_DCD_SKIP,
CMD_FUSE_VERSION,
CMD_SW_VERSION,
CMD_MSG_BLOCK,

View file

@ -14,6 +14,7 @@ static soc_type_t soc;
static int container = -1;
static int32_t core_type = CFG_CORE_INVALID;
static bool emmc_fastboot;
static bool dcd_skip;
static image_t param_stack[IMG_STACK_SIZE];
static uint8_t fuse_version;
static uint16_t sw_version;
@ -41,6 +42,7 @@ static int imx8image_check_image_types(uint8_t type)
static table_entry_t imx8image_cmds[] = {
{CMD_BOOT_FROM, "BOOT_FROM", "boot command", },
{CMD_DCD_SKIP, "DCD_SKIP", "skip DCD init", },
{CMD_FUSE_VERSION, "FUSE_VERSION", "fuse version", },
{CMD_SW_VERSION, "SW_VERSION", "sw version", },
{CMD_MSG_BLOCK, "MSG_BLOCK", "msg block", },
@ -88,6 +90,9 @@ static void parse_cfg_cmd(image_t *param_stack, int32_t cmd, char *token,
if (!strncmp("emmc_fastboot", token, 13))
emmc_fastboot = true;
break;
case CMD_DCD_SKIP:
if (!strncmp("true", token, 4))
dcd_skip = true;
case CMD_FUSE_VERSION:
fuse_version = (uint8_t)(strtoll(token, NULL, 0) & 0xFF);
break;
@ -1024,7 +1029,7 @@ int imx8image_copy_image(int outfd, struct image_tool_params *mparams)
fprintf(stdout, "CONTAINER SW VERSION:\t0x%04x\n", sw_version);
build_container(soc, sector_size, emmc_fastboot,
img_sp, false, fuse_version, sw_version, outfd);
img_sp, dcd_skip, fuse_version, sw_version, outfd);
return 0;
}