256 lines
7.2 KiB
Diff
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
|
|
|