mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-16 09:54:35 +00:00
Merge tag 'u-boot-imx-master-20241105' of https://gitlab.denx.de/u-boot/custodians/u-boot-imx
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:
commit
9c25cd5631
22 changed files with 113 additions and 115 deletions
|
@ -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 \
|
||||
|
|
|
@ -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";
|
||||
};
|
|
@ -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";
|
||||
};
|
|
@ -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";
|
||||
};
|
|
@ -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;
|
||||
};
|
||||
};
|
|
@ -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*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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, ®);
|
||||
ret = fuse_read(sec_config->bank, sec_config->word, ®);
|
||||
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, ®);
|
||||
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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
6
arch/arm/mach-imx/snvs.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Copyright 2018 Linaro
|
||||
*/
|
||||
|
||||
void init_snvs(void);
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
20
dts/upstream/src/arm/nxp/imx/imx6dl-dhcom-pdk2.dts
Normal file
20
dts/upstream/src/arm/nxp/imx/imx6dl-dhcom-pdk2.dts
Normal 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";
|
||||
};
|
|
@ -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" \
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue