From 74c58d9ed7af723b31a4f9d3725afcce9fde1ca4 Mon Sep 17 00:00:00 2001 From: Romuald JEANNE 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