meta-st-stm32mp/recipes-bsp/u-boot/u-boot-stm32mp/0015-ARM-v2018.11-stm32mp-r...

256 lines
7.2 KiB
Diff

From 74c58d9ed7af723b31a4f9d3725afcce9fde1ca4 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com>
Date: Thu, 30 Jan 2020 14:56:24 +0100
Subject: [PATCH 15/17] ARM v2018.11 stm32mp r4 BOARD
---
board/st/stm32mp1/Kconfig | 4 ++++
board/st/stm32mp1/README | 21 ++++++++++++++--
board/st/stm32mp1/board.c | 57 ++++++++++++++++++++++++++++++++++++++++----
board/st/stm32mp1/stm32mp1.c | 36 +++++++++++++---------------
4 files changed, 92 insertions(+), 26 deletions(-)
diff --git a/board/st/stm32mp1/Kconfig b/board/st/stm32mp1/Kconfig
index 92d8f90..6a06e5b 100644
--- a/board/st/stm32mp1/Kconfig
+++ b/board/st/stm32mp1/Kconfig
@@ -16,4 +16,8 @@ config CMD_STBOARD
This compile the stboard command to
read and write the board in the OTP.
+config TARGET_STM32MP157C_DK2
+ bool "support of STMicroelectronics STM32MP157C-DK2 Discovery Board"
+ default y
+
endif
diff --git a/board/st/stm32mp1/README b/board/st/stm32mp1/README
index b710602..782b9d18 100644
--- a/board/st/stm32mp1/README
+++ b/board/st/stm32mp1/README
@@ -305,7 +305,20 @@ Mac id storage and retrieval in stm32mp otp :
To program a MAC address on virgin OTP words above, you can use the fuse command
on bank 0 to access to internal OTP:
- example to set mac address "12:34:56:78:9a:bc"
+ Prerequisite: check if a MAC address isn't yet programmed in OTP
+
+ 1- check OTP: their value must be equal to 0
+
+ STM32MP> fuse sense 0 57 2
+ Sensing bank 0:
+ Word 0x00000039: 00000000 00000000
+
+ 2- check environment variable
+
+ STM32MP> env print ethaddr
+ ## Error: "ethaddr" not defined
+
+ Example to set mac address "12:34:56:78:9a:bc"
1- Write OTP
STM32MP> fuse prog -y 0 57 0x78563412 0x0000bc9a
@@ -319,9 +332,13 @@ on bank 0 to access to internal OTP:
### Setting environment from OTP MAC address = "12:34:56:78:9a:bc"
4 check env update
- STM32MP> print ethaddr
+ STM32MP> env print ethaddr
ethaddr=12:34:56:78:9a:bc
+warning:: This MAC address provisioning can't be executed twice on the same
+ board as the OTP are protected. It is already done for the board
+ provided by STMicroelectronics.
+
10. Coprocessor firmware
========================
diff --git a/board/st/stm32mp1/board.c b/board/st/stm32mp1/board.c
index c3d832f..3e38aef 100644
--- a/board/st/stm32mp1/board.c
+++ b/board/st/stm32mp1/board.c
@@ -38,11 +38,46 @@ void board_debug_uart_init(void)
#endif
#ifdef CONFIG_PMIC_STPMIC1
+u32 opp_voltage_mv;
+
+void board_vddcore_init(u32 voltage_mv)
+{
+ opp_voltage_mv = voltage_mv;
+}
+
+int board_vddcore_set(void)
+{
+ struct udevice *dev;
+ int ret;
+ u32 value;
+
+ if (!opp_voltage_mv)
+ return 0;
+
+ ret = uclass_get_device_by_driver(UCLASS_PMIC,
+ DM_GET_DRIVER(pmic_stpmic1), &dev);
+ if (ret)
+ return ret;
+
+ /* VDDCORE= STMPCI1 BUCK1 ramp=+25mV, 5 => 725mV, 36 => 1500mV */
+ value = ((opp_voltage_mv - 725) / 25) + 5;
+ if (value < 5)
+ value = 5;
+ if (value > 36)
+ value = 36;
+
+ return pmic_clrsetbits(dev,
+ STPMIC1_BUCKX_MAIN_CR(STPMIC1_BUCK1),
+ STPMIC1_BUCK_VOUT_MASK,
+ STPMIC1_BUCK_VOUT(value));
+}
+
int board_ddr_power_init(enum ddr_type ddr_type)
{
struct udevice *dev;
bool buck3_at_1800000v = false;
int ret;
+ u32 buck2;
ret = uclass_get_device_by_driver(UCLASS_PMIC,
DM_GET_DRIVER(pmic_stpmic1), &dev);
@@ -102,8 +137,10 @@ int board_ddr_power_init(enum ddr_type ddr_type)
break;
- case STM32MP_LPDDR2:
- case STM32MP_LPDDR3:
+ case STM32MP_LPDDR2_16:
+ case STM32MP_LPDDR2_32:
+ case STM32MP_LPDDR3_16:
+ case STM32MP_LPDDR3_32:
/*
* configure VDD_DDR1 = LDO3
* Set LDO3 to 1.8V
@@ -133,11 +170,23 @@ int board_ddr_power_init(enum ddr_type ddr_type)
if (ret < 0)
return ret;
- /* VDD_DDR2 : Set BUCK2 to 1.2V */
+ /* VDD_DDR2 : Set BUCK2 to 1.2V (16bits) or 1.25V (32 bits)*/
+ switch (ddr_type) {
+ case STM32MP_LPDDR2_32:
+ case STM32MP_LPDDR3_32:
+ buck2 = STPMIC1_BUCK2_1250000V;
+ break;
+ default:
+ case STM32MP_LPDDR2_16:
+ case STM32MP_LPDDR3_16:
+ buck2 = STPMIC1_BUCK2_1200000V;
+ break;
+ }
+
ret = pmic_clrsetbits(dev,
STPMIC1_BUCKX_MAIN_CR(STPMIC1_BUCK2),
STPMIC1_BUCK_VOUT_MASK,
- STPMIC1_BUCK2_1200000V);
+ buck2);
if (ret < 0)
return ret;
diff --git a/board/st/stm32mp1/stm32mp1.c b/board/st/stm32mp1/stm32mp1.c
index f852b1e..822b6d7 100644
--- a/board/st/stm32mp1/stm32mp1.c
+++ b/board/st/stm32mp1/stm32mp1.c
@@ -388,10 +388,15 @@ int g_dnl_board_usb_cable_connected(void)
}
#define STM32MP1_G_DNL_DFU_PRODUCT_NUM 0xdf11
+#define STM32MP1_G_DNL_FASTBOOT_PRODUCT_NUM 0x0afb
+
int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
{
if (!strcmp(name, "usb_dnl_dfu"))
put_unaligned(STM32MP1_G_DNL_DFU_PRODUCT_NUM, &dev->idProduct);
+ else if (!strcmp(name, "usb_dnl_fastboot"))
+ put_unaligned(STM32MP1_G_DNL_FASTBOOT_PRODUCT_NUM,
+ &dev->idProduct);
else
put_unaligned(CONFIG_USB_GADGET_PRODUCT_NUM, &dev->idProduct);
@@ -517,6 +522,7 @@ static void __maybe_unused led_error_blink(u32 nb_blink)
mdelay(125);
WATCHDOG_RESET();
}
+ led_set_state(led, LEDST_ON);
}
#endif
@@ -876,7 +882,8 @@ const char *env_ext4_get_dev_part(void)
static __maybe_unused bool board_is_dk2(void)
{
- if (of_machine_is_compatible("st,stm32mp157c-dk2"))
+ if (CONFIG_IS_ENABLED(TARGET_STM32MP157C_DK2) &&
+ of_machine_is_compatible("st,stm32mp157c-dk2"))
return true;
return false;
@@ -1079,9 +1086,7 @@ void board_mtdparts_default(const char **mtdids, const char **mtdparts)
#if defined(CONFIG_OF_BOARD_SETUP)
int ft_board_setup(void *blob, bd_t *bd)
{
- ulong copro_rsc_addr, copro_rsc_size;
int off;
- char *s_copro = NULL;
#ifdef CONFIG_FDT_FIXUP_PARTITIONS
struct node_info nodes[] = {
{ "st,stm32f469-qspi", MTD_DEV_TYPE_NOR, },
@@ -1093,20 +1098,11 @@ int ft_board_setup(void *blob, bd_t *bd)
/* Update DT if coprocessor started */
off = fdt_path_offset(blob, "/m4");
if (off > 0) {
- s_copro = env_get("copro_state");
- copro_rsc_addr = env_get_hex("copro_rsc_addr", 0);
- copro_rsc_size = env_get_hex("copro_rsc_size", 0);
-
- if (s_copro) {
+ if (env_get("copro_state")) {
fdt_setprop_empty(blob, off, "early-booted");
- if (copro_rsc_addr)
- fdt_setprop_u32(blob, off, "rsc-address",
- copro_rsc_addr);
- if (copro_rsc_size)
- fdt_setprop_u32(blob, off, "rsc-size",
- copro_rsc_size);
} else {
fdt_delprop(blob, off, "early-booted");
+ writel(0, TAMP_COPRO_RSC_TBL_ADDRESS);
}
}
@@ -1128,18 +1124,18 @@ static void board_stm32copro_image_process(ulong fw_image, size_t fw_size)
}
ret = rproc_load_rsc_table(id, fw_image, fw_size, &rsc_addr, &rsc_size);
- if (!ret) {
- env_set_hex("copro_rsc_addr", rsc_addr);
- env_set_hex("copro_rsc_size", rsc_size);
- }
+ if (ret && ret != -ENODATA)
+ return;
ret = rproc_load(id, fw_image, fw_size);
printf("Load Remote Processor %d with data@addr=0x%08lx %u bytes:%s\n",
id, fw_image, fw_size, ret ? " Failed!" : " Success!");
if (!ret) {
- rproc_start(id);
- env_set("copro_state", "booted");
+ ret = rproc_start(id);
+ printf("Start firmware:%s\n", ret ? " Failed!" : " Success!");
+ if (!ret)
+ env_set("copro_state", "booted");
}
}
--
2.7.4