Merge tag 'u-boot-stm32-20211130' of https://source.denx.de/u-boot/custodians/u-boot-stm into next
- add nor1 device support for DFU command - remove CONFIG_STM32_IPCC from stm32mp15 defconfigs - enable simple framebuffer node for splashscreen for stm32mp1 - use lower-case hex for address for stm32 MCU and MPU's device tree - define LOG_CATEGORY for stmfx pinctrl driver - add support for probing bus voltage level translator - add custom PHY reset bindings on AV96 - enable KSZ90x1 PHY driver on DHCOR - stm32mp1 DDR update: - add DDR read data eye training - remove DDR calibration result - remove DDR tuning support - compute DDR size from DDRCTL registers - DHSOM boards: - increase USB power-good delay - add update_sf script to install U-Boot into SF - increase PHY auto-negotiation timeout to 20 seconds - fix SoM and board coding strap GPIO handling - auto-detect uSD level translator
This commit is contained in:
@@ -33,7 +33,7 @@
|
||||
|
||||
fmc: fmc@A0000000 {
|
||||
compatible = "st,stm32-fmc";
|
||||
reg = <0xA0000000 0x1000>;
|
||||
reg = <0xa0000000 0x1000>;
|
||||
clocks = <&rcc 0 STM32F4_AHB3_CLOCK(FMC)>;
|
||||
st,syscfg = <&syscfg>;
|
||||
pinctrl-0 = <&fmc_pins_d32>;
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
};
|
||||
|
||||
&qspi {
|
||||
reg = <0xA0001000 0x1000>, <0x90000000 0x4000000>;
|
||||
reg = <0xa0001000 0x1000>, <0x90000000 0x4000000>;
|
||||
qflash0: n25q512a@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
fmc: fmc@A0000000 {
|
||||
compatible = "st,stm32-fmc";
|
||||
reg = <0xA0000000 0x1000>;
|
||||
reg = <0xa0000000 0x1000>;
|
||||
clocks = <&rcc 0 STM32F4_AHB3_CLOCK(FMC)>;
|
||||
pinctrl-0 = <&fmc_pins>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
fmc: fmc@A0000000 {
|
||||
compatible = "st,stm32-fmc";
|
||||
reg = <0xA0000000 0x1000>;
|
||||
reg = <0xa0000000 0x1000>;
|
||||
clocks = <&rcc 0 STM32F4_AHB3_CLOCK(FMC)>;
|
||||
st,syscfg = <&syscfg>;
|
||||
pinctrl-0 = <&fmc_pins_d32>;
|
||||
@@ -70,7 +70,7 @@
|
||||
compatible = "st,stm32f469-qspi";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0xA0001000 0x1000>, <0x90000000 0x10000000>;
|
||||
reg = <0xa0001000 0x1000>, <0x90000000 0x10000000>;
|
||||
reg-names = "qspi", "qspi_mm";
|
||||
interrupts = <91>;
|
||||
spi-max-frequency = <108000000>;
|
||||
@@ -236,7 +236,7 @@
|
||||
};
|
||||
|
||||
&qspi {
|
||||
reg = <0xA0001000 0x1000>, <0x90000000 0x1000000>;
|
||||
reg = <0xa0001000 0x1000>, <0x90000000 0x1000000>;
|
||||
flash0: n25q128a@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
fmc: fmc@A0000000 {
|
||||
compatible = "st,stm32-fmc";
|
||||
reg = <0xA0000000 0x1000>;
|
||||
reg = <0xa0000000 0x1000>;
|
||||
clocks = <&rcc 0 STM32F7_AHB3_CLOCK(FMC)>;
|
||||
pinctrl-0 = <&fmc_pins>;
|
||||
pinctrl-names = "default";
|
||||
@@ -46,7 +46,7 @@
|
||||
compatible = "st,stm32f469-qspi";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0xA0001000 0x1000>, <0x90000000 0x10000000>;
|
||||
reg = <0xa0001000 0x1000>, <0x90000000 0x10000000>;
|
||||
reg-names = "qspi", "qspi_mm";
|
||||
interrupts = <92>;
|
||||
spi-max-frequency = <108000000>;
|
||||
|
||||
@@ -228,7 +228,7 @@
|
||||
};
|
||||
|
||||
&qspi {
|
||||
reg = <0xA0001000 0x1000>, <0x90000000 0x1000000>;
|
||||
reg = <0xa0001000 0x1000>, <0x90000000 0x1000000>;
|
||||
qflash0: n25q128a@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
@@ -53,9 +53,9 @@
|
||||
soc {
|
||||
dsi: dsi@40016c00 {
|
||||
compatible = "st,stm32-dsi";
|
||||
reg = <0x40016C00 0x800>;
|
||||
reg = <0x40016c00 0x800>;
|
||||
resets = <&rcc STM32F7_APB2_RESET(DSI)>;
|
||||
clocks = <&rcc 0 STM32F7_APB2_CLOCK(DSI)>,
|
||||
clocks = <&rcc 0 STM32F7_APB2_CLOCK(DSI)>,
|
||||
<&rcc 0 STM32F7_APB2_CLOCK(LTDC)>,
|
||||
<&clk_hse>;
|
||||
clock-names = "pclk", "px_clk", "ref";
|
||||
@@ -227,7 +227,7 @@
|
||||
};
|
||||
|
||||
&qspi {
|
||||
reg = <0xA0001000 0x1000>, <0x90000000 0x4000000>;
|
||||
reg = <0xa0001000 0x1000>, <0x90000000 0x4000000>;
|
||||
flash0: mx66l51235l@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
@@ -116,24 +116,6 @@
|
||||
DDR_MR3
|
||||
>;
|
||||
|
||||
#ifdef DDR_PHY_CAL_SKIP
|
||||
st,phy-cal = <
|
||||
DDR_DX0DLLCR
|
||||
DDR_DX0DQTR
|
||||
DDR_DX0DQSTR
|
||||
DDR_DX1DLLCR
|
||||
DDR_DX1DQTR
|
||||
DDR_DX1DQSTR
|
||||
DDR_DX2DLLCR
|
||||
DDR_DX2DQTR
|
||||
DDR_DX2DQSTR
|
||||
DDR_DX3DLLCR
|
||||
DDR_DX3DQTR
|
||||
DDR_DX3DQSTR
|
||||
>;
|
||||
|
||||
#endif
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
@@ -224,18 +206,6 @@
|
||||
#undef DDR_ODTCR
|
||||
#undef DDR_ZQ0CR1
|
||||
#undef DDR_DX0GCR
|
||||
#undef DDR_DX0DLLCR
|
||||
#undef DDR_DX0DQTR
|
||||
#undef DDR_DX0DQSTR
|
||||
#undef DDR_DX1GCR
|
||||
#undef DDR_DX1DLLCR
|
||||
#undef DDR_DX1DQTR
|
||||
#undef DDR_DX1DQSTR
|
||||
#undef DDR_DX2GCR
|
||||
#undef DDR_DX2DLLCR
|
||||
#undef DDR_DX2DQTR
|
||||
#undef DDR_DX2DQSTR
|
||||
#undef DDR_DX3GCR
|
||||
#undef DDR_DX3DLLCR
|
||||
#undef DDR_DX3DQTR
|
||||
#undef DDR_DX3DQSTR
|
||||
|
||||
@@ -100,20 +100,8 @@
|
||||
#define DDR_ODTCR 0x00010000
|
||||
#define DDR_ZQ0CR1 0x00000038
|
||||
#define DDR_DX0GCR 0x0000CE81
|
||||
#define DDR_DX0DLLCR 0x40000000
|
||||
#define DDR_DX0DQTR 0xFFFFFFFF
|
||||
#define DDR_DX0DQSTR 0x3DB02000
|
||||
#define DDR_DX1GCR 0x0000CE81
|
||||
#define DDR_DX1DLLCR 0x40000000
|
||||
#define DDR_DX1DQTR 0xFFFFFFFF
|
||||
#define DDR_DX1DQSTR 0x3DB02000
|
||||
#define DDR_DX2GCR 0x0000CE80
|
||||
#define DDR_DX2DLLCR 0x40000000
|
||||
#define DDR_DX2DQTR 0xFFFFFFFF
|
||||
#define DDR_DX2DQSTR 0x3DB02000
|
||||
#define DDR_DX3GCR 0x0000CE80
|
||||
#define DDR_DX3DLLCR 0x40000000
|
||||
#define DDR_DX3DQTR 0xFFFFFFFF
|
||||
#define DDR_DX3DQSTR 0x3DB02000
|
||||
|
||||
#include "stm32mp15-ddr.dtsi"
|
||||
|
||||
@@ -100,20 +100,8 @@
|
||||
#define DDR_ODTCR 0x00010000
|
||||
#define DDR_ZQ0CR1 0x00000038
|
||||
#define DDR_DX0GCR 0x0000CE81
|
||||
#define DDR_DX0DLLCR 0x40000000
|
||||
#define DDR_DX0DQTR 0xFFFFFFFF
|
||||
#define DDR_DX0DQSTR 0x3DB02000
|
||||
#define DDR_DX1GCR 0x0000CE81
|
||||
#define DDR_DX1DLLCR 0x40000000
|
||||
#define DDR_DX1DQTR 0xFFFFFFFF
|
||||
#define DDR_DX1DQSTR 0x3DB02000
|
||||
#define DDR_DX2GCR 0x0000CE81
|
||||
#define DDR_DX2DLLCR 0x40000000
|
||||
#define DDR_DX2DQTR 0xFFFFFFFF
|
||||
#define DDR_DX2DQSTR 0x3DB02000
|
||||
#define DDR_DX3GCR 0x0000CE81
|
||||
#define DDR_DX3DLLCR 0x40000000
|
||||
#define DDR_DX3DQTR 0xFFFFFFFF
|
||||
#define DDR_DX3DQSTR 0x3DB02000
|
||||
|
||||
#include "stm32mp15-ddr.dtsi"
|
||||
|
||||
@@ -101,20 +101,8 @@
|
||||
#define DDR_ODTCR 0x00010000
|
||||
#define DDR_ZQ0CR1 0x00000038
|
||||
#define DDR_DX0GCR 0x0000CE81
|
||||
#define DDR_DX0DLLCR 0x40000000
|
||||
#define DDR_DX0DQTR 0xFFFFFFFF
|
||||
#define DDR_DX0DQSTR 0x3DB02000
|
||||
#define DDR_DX1GCR 0x0000CE81
|
||||
#define DDR_DX1DLLCR 0x40000000
|
||||
#define DDR_DX1DQTR 0xFFFFFFFF
|
||||
#define DDR_DX1DQSTR 0x3DB02000
|
||||
#define DDR_DX2GCR 0x0000CE81
|
||||
#define DDR_DX2DLLCR 0x40000000
|
||||
#define DDR_DX2DQTR 0xFFFFFFFF
|
||||
#define DDR_DX2DQSTR 0x3DB02000
|
||||
#define DDR_DX3GCR 0x0000CE81
|
||||
#define DDR_DX3DLLCR 0x40000000
|
||||
#define DDR_DX3DQTR 0xFFFFFFFF
|
||||
#define DDR_DX3DQSTR 0x3DB02000
|
||||
|
||||
#include "stm32mp15-ddr.dtsi"
|
||||
|
||||
@@ -101,20 +101,8 @@
|
||||
#define DDR_ODTCR 0x00010000
|
||||
#define DDR_ZQ0CR1 0x00000038
|
||||
#define DDR_DX0GCR 0x0000CE81
|
||||
#define DDR_DX0DLLCR 0x40000000
|
||||
#define DDR_DX0DQTR 0xFFFFFFFF
|
||||
#define DDR_DX0DQSTR 0x3DB02000
|
||||
#define DDR_DX1GCR 0x0000CE81
|
||||
#define DDR_DX1DLLCR 0x40000000
|
||||
#define DDR_DX1DQTR 0xFFFFFFFF
|
||||
#define DDR_DX1DQSTR 0x3DB02000
|
||||
#define DDR_DX2GCR 0x0000CE81
|
||||
#define DDR_DX2DLLCR 0x40000000
|
||||
#define DDR_DX2DQTR 0xFFFFFFFF
|
||||
#define DDR_DX2DQSTR 0x3DB02000
|
||||
#define DDR_DX3GCR 0x0000CE81
|
||||
#define DDR_DX3DLLCR 0x40000000
|
||||
#define DDR_DX3DQTR 0xFFFFFFFF
|
||||
#define DDR_DX3DQSTR 0x3DB02000
|
||||
|
||||
#include "stm32mp15-ddr.dtsi"
|
||||
|
||||
@@ -101,20 +101,8 @@
|
||||
#define DDR_ODTCR 0x00010000
|
||||
#define DDR_ZQ0CR1 0x00000038
|
||||
#define DDR_DX0GCR 0x0000CE81
|
||||
#define DDR_DX0DLLCR 0x40000000
|
||||
#define DDR_DX0DQTR 0xFFFFFFFF
|
||||
#define DDR_DX0DQSTR 0x3DB02000
|
||||
#define DDR_DX1GCR 0x0000CE81
|
||||
#define DDR_DX1DLLCR 0x40000000
|
||||
#define DDR_DX1DQTR 0xFFFFFFFF
|
||||
#define DDR_DX1DQSTR 0x3DB02000
|
||||
#define DDR_DX2GCR 0x0000CE81
|
||||
#define DDR_DX2DLLCR 0x40000000
|
||||
#define DDR_DX2DQTR 0xFFFFFFFF
|
||||
#define DDR_DX2DQSTR 0x3DB02000
|
||||
#define DDR_DX3GCR 0x0000CE81
|
||||
#define DDR_DX3DLLCR 0x40000000
|
||||
#define DDR_DX3DQTR 0xFFFFFFFF
|
||||
#define DDR_DX3DQSTR 0x3DB02000
|
||||
|
||||
#include "stm32mp15-ddr.dtsi"
|
||||
|
||||
@@ -100,20 +100,8 @@
|
||||
#define DDR_ODTCR 0x00010000
|
||||
#define DDR_ZQ0CR1 0x00000038
|
||||
#define DDR_DX0GCR 0x0000CE81
|
||||
#define DDR_DX0DLLCR 0x40000000
|
||||
#define DDR_DX0DQTR 0xFFFFFFFF
|
||||
#define DDR_DX0DQSTR 0x3DB02000
|
||||
#define DDR_DX1GCR 0x0000CE81
|
||||
#define DDR_DX1DLLCR 0x40000000
|
||||
#define DDR_DX1DQTR 0xFFFFFFFF
|
||||
#define DDR_DX1DQSTR 0x3DB02000
|
||||
#define DDR_DX2GCR 0x0000CE81
|
||||
#define DDR_DX2DLLCR 0x40000000
|
||||
#define DDR_DX2DQTR 0xFFFFFFFF
|
||||
#define DDR_DX2DQSTR 0x3DB02000
|
||||
#define DDR_DX3GCR 0x0000CE81
|
||||
#define DDR_DX3DLLCR 0x40000000
|
||||
#define DDR_DX3DQTR 0xFFFFFFFF
|
||||
#define DDR_DX3DQSTR 0x3DB02000
|
||||
|
||||
#include "stm32mp15-ddr.dtsi"
|
||||
|
||||
@@ -50,8 +50,8 @@
|
||||
|
||||
compatible = "st,stm32mp1-ddr";
|
||||
|
||||
reg = <0x5A003000 0x550
|
||||
0x5A004000 0x234>;
|
||||
reg = <0x5a003000 0x550
|
||||
0x5a004000 0x234>;
|
||||
|
||||
clocks = <&rcc AXIDCG>,
|
||||
<&rcc DDRC1>,
|
||||
@@ -237,7 +237,7 @@
|
||||
u-boot-stm32 {
|
||||
filename = "u-boot.stm32";
|
||||
mkimage {
|
||||
args = "-T stm32image -a 0xC0100000 -e 0xC0100000";
|
||||
args = "-T stm32image -a 0xc0100000 -e 0xc0100000";
|
||||
u-boot {
|
||||
};
|
||||
};
|
||||
@@ -250,7 +250,7 @@
|
||||
spl-stm32 {
|
||||
filename = "u-boot-spl.stm32";
|
||||
mkimage {
|
||||
args = "-T stm32image -a 0x2FFC2500 -e 0x2FFC2500";
|
||||
args = "-T stm32image -a 0x2ffc2500 -e 0x2ffc2500";
|
||||
u-boot-spl {
|
||||
};
|
||||
};
|
||||
|
||||
@@ -216,6 +216,10 @@
|
||||
|
||||
&sdmmc1 {
|
||||
u-boot,dm-spl;
|
||||
st,use-ckin;
|
||||
st,cmd-gpios = <&gpiod 2 0>;
|
||||
st,ck-gpios = <&gpioc 12 0>;
|
||||
st,ckin-gpios = <&gpioe 4 0>;
|
||||
};
|
||||
|
||||
&sdmmc1_b4_pins_a {
|
||||
|
||||
@@ -19,8 +19,23 @@
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
ðernet0 {
|
||||
mdio0 {
|
||||
ethernet-phy@7 {
|
||||
reset-gpios = <&gpioz 2 GPIO_ACTIVE_LOW>;
|
||||
reset-assert-us = <11000>;
|
||||
reset-deassert-us = <1000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&sdmmc1 {
|
||||
u-boot,dm-spl;
|
||||
st,use-ckin;
|
||||
st,cmd-gpios = <&gpiod 2 0>;
|
||||
st,ck-gpios = <&gpioc 12 0>;
|
||||
st,ckin-gpios = <&gpioe 4 0>;
|
||||
};
|
||||
|
||||
&sdmmc1_b4_pins_a {
|
||||
|
||||
@@ -212,34 +212,40 @@ static void board_get_coding_straps(void)
|
||||
ofnode node;
|
||||
int i, ret;
|
||||
|
||||
brdcode = 0;
|
||||
ddr3code = 0;
|
||||
somcode = 0;
|
||||
|
||||
node = ofnode_path("/config");
|
||||
if (!ofnode_valid(node)) {
|
||||
printf("%s: no /config node?\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
brdcode = 0;
|
||||
ddr3code = 0;
|
||||
somcode = 0;
|
||||
|
||||
ret = gpio_request_list_by_name_nodev(node, "dh,som-coding-gpios",
|
||||
gpio, ARRAY_SIZE(gpio),
|
||||
GPIOD_IS_IN);
|
||||
for (i = 0; i < ret; i++)
|
||||
somcode |= !!dm_gpio_get_value(&(gpio[i])) << i;
|
||||
|
||||
gpio_free_list_nodev(gpio, ret);
|
||||
|
||||
ret = gpio_request_list_by_name_nodev(node, "dh,ddr3-coding-gpios",
|
||||
gpio, ARRAY_SIZE(gpio),
|
||||
GPIOD_IS_IN);
|
||||
for (i = 0; i < ret; i++)
|
||||
ddr3code |= !!dm_gpio_get_value(&(gpio[i])) << i;
|
||||
|
||||
gpio_free_list_nodev(gpio, ret);
|
||||
|
||||
ret = gpio_request_list_by_name_nodev(node, "dh,board-coding-gpios",
|
||||
gpio, ARRAY_SIZE(gpio),
|
||||
GPIOD_IS_IN);
|
||||
for (i = 0; i < ret; i++)
|
||||
brdcode |= !!dm_gpio_get_value(&(gpio[i])) << i;
|
||||
|
||||
gpio_free_list_nodev(gpio, ret);
|
||||
|
||||
printf("Code: SoM:rev=%d,ddr3=%d Board:rev=%d\n",
|
||||
somcode, ddr3code, brdcode);
|
||||
}
|
||||
|
||||
@@ -505,7 +505,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
|
||||
|
||||
node = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer");
|
||||
if (node < 0)
|
||||
lcd_dt_simplefb_add_node(blob);
|
||||
fdt_simplefb_add_node(blob);
|
||||
|
||||
#ifdef CONFIG_EFI_LOADER
|
||||
/* Reserve the spin table */
|
||||
|
||||
@@ -132,6 +132,10 @@ void set_dfu_alt_info(char *interface, char *devstr)
|
||||
mtd = get_mtd_device_nm("nor0");
|
||||
if (!IS_ERR_OR_NULL(mtd))
|
||||
board_get_alt_info_mtd(mtd, buf);
|
||||
|
||||
mtd = get_mtd_device_nm("nor1");
|
||||
if (!IS_ERR_OR_NULL(mtd))
|
||||
board_get_alt_info_mtd(mtd, buf);
|
||||
}
|
||||
|
||||
mtd = get_mtd_device_nm("nand0");
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <dm.h>
|
||||
#include <env.h>
|
||||
#include <env_internal.h>
|
||||
#include <fdt_simplefb.h>
|
||||
#include <fdt_support.h>
|
||||
#include <g_dnl.h>
|
||||
#include <generic-phy.h>
|
||||
@@ -914,6 +915,9 @@ int ft_board_setup(void *blob, struct bd_info *bd)
|
||||
if (IS_ENABLED(CONFIG_FDT_FIXUP_PARTITIONS))
|
||||
fdt_fixup_mtdparts(blob, nodes, ARRAY_SIZE(nodes));
|
||||
|
||||
if (CONFIG_IS_ENABLED(FDT_SIMPLEFB))
|
||||
fdt_simplefb_enable_and_mem_rsv(blob);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -776,3 +776,12 @@ config SPL_IMAGE_SIGN_INFO
|
||||
Enable image_sign_info helper functions in SPL.
|
||||
|
||||
endif
|
||||
|
||||
config FDT_SIMPLEFB
|
||||
bool "FDT tools for simplefb support"
|
||||
depends on OF_LIBFDT
|
||||
help
|
||||
Enable the fdt tools to manage the simple fb nodes in device tree.
|
||||
These functions can be used by board to indicate to the OS
|
||||
the presence of the simple frame buffer with associated reserved
|
||||
memory
|
||||
|
||||
@@ -18,6 +18,7 @@ obj-$(CONFIG_DISPLAY_BOARDINFO) += board_info.o
|
||||
obj-$(CONFIG_DISPLAY_BOARDINFO_LATE) += board_info.o
|
||||
|
||||
obj-$(CONFIG_CMD_BEDBUG) += bedbug.o
|
||||
obj-$(CONFIG_FDT_SIMPLEFB) += fdt_simplefb.o
|
||||
obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += fdt_support.o
|
||||
obj-$(CONFIG_MII) += miiphyutil.o
|
||||
obj-$(CONFIG_CMD_MII) += miiphyutil.o
|
||||
@@ -40,7 +41,6 @@ ifndef CONFIG_DM_VIDEO
|
||||
obj-$(CONFIG_LCD) += lcd.o lcd_console.o
|
||||
endif
|
||||
obj-$(CONFIG_LCD_ROTATION) += lcd_console_rotation.o
|
||||
obj-$(CONFIG_LCD_DT_SIMPLEFB) += lcd_simplefb.o
|
||||
obj-$(CONFIG_MENU) += menu.o
|
||||
obj-$(CONFIG_UPDATE_COMMON) += update.o
|
||||
obj-$(CONFIG_USB_KEYBOARD) += usb_kbd.o
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
static int lcd_dt_simplefb_configure_node(void *blob, int off)
|
||||
static int fdt_simplefb_configure_node(void *blob, int off)
|
||||
{
|
||||
int xsize, ysize;
|
||||
int bpix; /* log2 of bits per pixel */
|
||||
@@ -58,7 +58,7 @@ static int lcd_dt_simplefb_configure_node(void *blob, int off)
|
||||
xsize * (1 << bpix) / 8, name);
|
||||
}
|
||||
|
||||
int lcd_dt_simplefb_add_node(void *blob)
|
||||
int fdt_simplefb_add_node(void *blob)
|
||||
{
|
||||
static const char compat[] = "simple-framebuffer";
|
||||
static const char disabled[] = "disabled";
|
||||
@@ -76,10 +76,10 @@ int lcd_dt_simplefb_add_node(void *blob)
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
return lcd_dt_simplefb_configure_node(blob, off);
|
||||
return fdt_simplefb_configure_node(blob, off);
|
||||
}
|
||||
|
||||
int lcd_dt_simplefb_enable_existing_node(void *blob)
|
||||
int fdt_simplefb_enable_existing_node(void *blob)
|
||||
{
|
||||
int off;
|
||||
|
||||
@@ -87,5 +87,32 @@ int lcd_dt_simplefb_enable_existing_node(void *blob)
|
||||
if (off < 0)
|
||||
return -1;
|
||||
|
||||
return lcd_dt_simplefb_configure_node(blob, off);
|
||||
return fdt_simplefb_configure_node(blob, off);
|
||||
}
|
||||
|
||||
#if CONFIG_IS_ENABLED(DM_VIDEO)
|
||||
int fdt_simplefb_enable_and_mem_rsv(void *blob)
|
||||
{
|
||||
struct fdt_memory mem;
|
||||
int ret;
|
||||
|
||||
/* nothing to do when video is not active */
|
||||
if (!video_is_active())
|
||||
return 0;
|
||||
|
||||
ret = fdt_simplefb_enable_existing_node(blob);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* nothing to do when the frame buffer is not defined */
|
||||
if (gd->video_bottom == gd->video_top)
|
||||
return 0;
|
||||
|
||||
/* reserved with no-map tag the video buffer */
|
||||
mem.start = gd->video_bottom;
|
||||
mem.end = gd->video_top - 1;
|
||||
|
||||
return fdtdec_add_reserved_memory(blob, "framebuffer", &mem, NULL, 0, NULL,
|
||||
FDTDEC_RESERVED_MEMORY_NO_MAP);
|
||||
}
|
||||
#endif
|
||||
@@ -13,6 +13,7 @@ CONFIG_USE_PREBOOT=y
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
# CONFIG_DISPLAY_BOARDINFO is not set
|
||||
CONFIG_MISC_INIT_R=y
|
||||
CONFIG_FDT_SIMPLEFB=y
|
||||
CONFIG_SYS_PROMPT="U-Boot> "
|
||||
CONFIG_CMD_GPIO=y
|
||||
CONFIG_CMD_MMC=y
|
||||
|
||||
@@ -14,6 +14,7 @@ CONFIG_USE_PREBOOT=y
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
# CONFIG_DISPLAY_BOARDINFO is not set
|
||||
CONFIG_MISC_INIT_R=y
|
||||
CONFIG_FDT_SIMPLEFB=y
|
||||
CONFIG_SYS_PROMPT="U-Boot> "
|
||||
CONFIG_CMD_GPIO=y
|
||||
CONFIG_CMD_MMC=y
|
||||
|
||||
@@ -15,6 +15,7 @@ CONFIG_USE_PREBOOT=y
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
# CONFIG_DISPLAY_BOARDINFO is not set
|
||||
CONFIG_MISC_INIT_R=y
|
||||
CONFIG_FDT_SIMPLEFB=y
|
||||
CONFIG_SYS_PROMPT="U-Boot> "
|
||||
CONFIG_CMD_GPIO=y
|
||||
CONFIG_CMD_MMC=y
|
||||
|
||||
@@ -14,6 +14,7 @@ CONFIG_USE_PREBOOT=y
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
# CONFIG_DISPLAY_BOARDINFO is not set
|
||||
CONFIG_MISC_INIT_R=y
|
||||
CONFIG_FDT_SIMPLEFB=y
|
||||
CONFIG_SYS_PROMPT="U-Boot> "
|
||||
CONFIG_CMD_GPIO=y
|
||||
CONFIG_CMD_MMC=y
|
||||
|
||||
@@ -14,6 +14,7 @@ CONFIG_USE_PREBOOT=y
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
# CONFIG_DISPLAY_BOARDINFO is not set
|
||||
CONFIG_MISC_INIT_R=y
|
||||
CONFIG_FDT_SIMPLEFB=y
|
||||
CONFIG_SYS_PROMPT="U-Boot> "
|
||||
CONFIG_CMD_GPIO=y
|
||||
CONFIG_CMD_MMC=y
|
||||
|
||||
@@ -12,6 +12,7 @@ CONFIG_PREBOOT="pci enum; usb start;"
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
# CONFIG_DISPLAY_BOARDINFO is not set
|
||||
CONFIG_MISC_INIT_R=y
|
||||
CONFIG_FDT_SIMPLEFB=y
|
||||
CONFIG_SYS_PROMPT="U-Boot> "
|
||||
CONFIG_CMD_DFU=y
|
||||
CONFIG_CMD_GPIO=y
|
||||
|
||||
@@ -12,6 +12,7 @@ CONFIG_PREBOOT="pci enum; usb start;"
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
# CONFIG_DISPLAY_BOARDINFO is not set
|
||||
CONFIG_MISC_INIT_R=y
|
||||
CONFIG_FDT_SIMPLEFB=y
|
||||
CONFIG_SYS_PROMPT="U-Boot> "
|
||||
CONFIG_CMD_DFU=y
|
||||
CONFIG_CMD_GPIO=y
|
||||
|
||||
@@ -12,6 +12,7 @@ CONFIG_PREBOOT="pci enum; usb start;"
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
# CONFIG_DISPLAY_BOARDINFO is not set
|
||||
CONFIG_MISC_INIT_R=y
|
||||
CONFIG_FDT_SIMPLEFB=y
|
||||
CONFIG_SYS_PROMPT="U-Boot> "
|
||||
CONFIG_CMD_GPIO=y
|
||||
CONFIG_CMD_MMC=y
|
||||
|
||||
@@ -13,6 +13,7 @@ CONFIG_USE_PREBOOT=y
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
# CONFIG_DISPLAY_BOARDINFO is not set
|
||||
CONFIG_MISC_INIT_R=y
|
||||
CONFIG_FDT_SIMPLEFB=y
|
||||
CONFIG_SYS_PROMPT="U-Boot> "
|
||||
CONFIG_CMD_GPIO=y
|
||||
CONFIG_CMD_MMC=y
|
||||
|
||||
@@ -51,8 +51,6 @@ CONFIG_DM_I2C=y
|
||||
CONFIG_SYS_I2C_STM32F7=y
|
||||
CONFIG_LED=y
|
||||
CONFIG_LED_GPIO=y
|
||||
CONFIG_DM_MAILBOX=y
|
||||
CONFIG_STM32_IPCC=y
|
||||
CONFIG_STM32_FMC2_EBI=y
|
||||
CONFIG_SUPPORT_EMMC_BOOT=y
|
||||
CONFIG_STM32_SDMMC2=y
|
||||
|
||||
@@ -51,8 +51,6 @@ CONFIG_DM_I2C=y
|
||||
CONFIG_SYS_I2C_STM32F7=y
|
||||
CONFIG_LED=y
|
||||
CONFIG_LED_GPIO=y
|
||||
CONFIG_DM_MAILBOX=y
|
||||
CONFIG_STM32_IPCC=y
|
||||
CONFIG_STM32_FMC2_EBI=y
|
||||
CONFIG_SUPPORT_EMMC_BOOT=y
|
||||
CONFIG_STM32_SDMMC2=y
|
||||
|
||||
@@ -51,8 +51,6 @@ CONFIG_DM_I2C=y
|
||||
CONFIG_SYS_I2C_STM32F7=y
|
||||
CONFIG_LED=y
|
||||
CONFIG_LED_GPIO=y
|
||||
CONFIG_DM_MAILBOX=y
|
||||
CONFIG_STM32_IPCC=y
|
||||
CONFIG_STM32_FMC2_EBI=y
|
||||
CONFIG_SUPPORT_EMMC_BOOT=y
|
||||
CONFIG_STM32_SDMMC2=y
|
||||
|
||||
@@ -51,8 +51,6 @@ CONFIG_DM_I2C=y
|
||||
CONFIG_SYS_I2C_STM32F7=y
|
||||
CONFIG_LED=y
|
||||
CONFIG_LED_GPIO=y
|
||||
CONFIG_DM_MAILBOX=y
|
||||
CONFIG_STM32_IPCC=y
|
||||
CONFIG_STM32_FMC2_EBI=y
|
||||
CONFIG_SUPPORT_EMMC_BOOT=y
|
||||
CONFIG_STM32_SDMMC2=y
|
||||
|
||||
@@ -34,6 +34,7 @@ CONFIG_SPL_DM_SPI_FLASH=y
|
||||
CONFIG_SPL_POWER=y
|
||||
CONFIG_SPL_SPI_FLASH_MTD=y
|
||||
CONFIG_SYS_SPI_U_BOOT_OFFS=0x80000
|
||||
CONFIG_FDT_SIMPLEFB=y
|
||||
CONFIG_SYS_PROMPT="STM32MP> "
|
||||
CONFIG_CMD_ADTIMG=y
|
||||
CONFIG_CMD_ERASEENV=y
|
||||
@@ -102,8 +103,6 @@ CONFIG_DM_I2C=y
|
||||
CONFIG_SYS_I2C_STM32F7=y
|
||||
CONFIG_LED=y
|
||||
CONFIG_LED_GPIO=y
|
||||
CONFIG_DM_MAILBOX=y
|
||||
CONFIG_STM32_IPCC=y
|
||||
CONFIG_STM32_FMC2_EBI=y
|
||||
CONFIG_SUPPORT_EMMC_BOOT=y
|
||||
CONFIG_STM32_SDMMC2=y
|
||||
|
||||
@@ -19,6 +19,7 @@ CONFIG_SYS_LOAD_ADDR=0xc2000000
|
||||
CONFIG_FIT=y
|
||||
CONFIG_BOOTDELAY=1
|
||||
CONFIG_BOOTCOMMAND="run bootcmd_stm32mp"
|
||||
CONFIG_FDT_SIMPLEFB=y
|
||||
CONFIG_SYS_PROMPT="STM32MP> "
|
||||
CONFIG_CMD_ADTIMG=y
|
||||
CONFIG_CMD_ERASEENV=y
|
||||
@@ -85,8 +86,6 @@ CONFIG_DM_I2C=y
|
||||
CONFIG_SYS_I2C_STM32F7=y
|
||||
CONFIG_LED=y
|
||||
CONFIG_LED_GPIO=y
|
||||
CONFIG_DM_MAILBOX=y
|
||||
CONFIG_STM32_IPCC=y
|
||||
CONFIG_STM32_FMC2_EBI=y
|
||||
CONFIG_SUPPORT_EMMC_BOOT=y
|
||||
CONFIG_STM32_SDMMC2=y
|
||||
|
||||
@@ -96,8 +96,6 @@ CONFIG_DM_I2C=y
|
||||
CONFIG_SYS_I2C_STM32F7=y
|
||||
CONFIG_LED=y
|
||||
CONFIG_LED_GPIO=y
|
||||
CONFIG_DM_MAILBOX=y
|
||||
CONFIG_STM32_IPCC=y
|
||||
CONFIG_I2C_EEPROM=y
|
||||
CONFIG_SYS_I2C_EEPROM_ADDR=0x50
|
||||
CONFIG_SUPPORT_EMMC_BOOT=y
|
||||
|
||||
@@ -92,8 +92,6 @@ CONFIG_DM_I2C=y
|
||||
CONFIG_SYS_I2C_STM32F7=y
|
||||
CONFIG_LED=y
|
||||
CONFIG_LED_GPIO=y
|
||||
CONFIG_DM_MAILBOX=y
|
||||
CONFIG_STM32_IPCC=y
|
||||
CONFIG_I2C_EEPROM=y
|
||||
CONFIG_SYS_I2C_EEPROM_ADDR=0x53
|
||||
CONFIG_SUPPORT_EMMC_BOOT=y
|
||||
@@ -108,6 +106,8 @@ CONFIG_SPI_FLASH_SPANSION=y
|
||||
CONFIG_SPI_FLASH_STMICRO=y
|
||||
CONFIG_SPI_FLASH_WINBOND=y
|
||||
CONFIG_SPI_FLASH_MTD=y
|
||||
CONFIG_PHY_MICREL=y
|
||||
CONFIG_PHY_MICREL_KSZ90X1=y
|
||||
CONFIG_DM_ETH=y
|
||||
CONFIG_DWC_ETH_QOS=y
|
||||
CONFIG_PHY=y
|
||||
|
||||
@@ -20,6 +20,7 @@ CONFIG_SYS_LOAD_ADDR=0xc2000000
|
||||
CONFIG_FIT=y
|
||||
CONFIG_BOOTDELAY=1
|
||||
CONFIG_BOOTCOMMAND="run bootcmd_stm32mp"
|
||||
CONFIG_FDT_SIMPLEFB=y
|
||||
CONFIG_SYS_PROMPT="STM32MP> "
|
||||
CONFIG_CMD_ADTIMG=y
|
||||
CONFIG_CMD_ERASEENV=y
|
||||
@@ -86,8 +87,6 @@ CONFIG_DM_I2C=y
|
||||
CONFIG_SYS_I2C_STM32F7=y
|
||||
CONFIG_LED=y
|
||||
CONFIG_LED_GPIO=y
|
||||
CONFIG_DM_MAILBOX=y
|
||||
CONFIG_STM32_IPCC=y
|
||||
CONFIG_STM32_FMC2_EBI=y
|
||||
CONFIG_SUPPORT_EMMC_BOOT=y
|
||||
CONFIG_STM32_SDMMC2=y
|
||||
|
||||
@@ -645,16 +645,18 @@ On EV1 board, booting from SD card, without OP-TEE_::
|
||||
dev: eMMC alt: 15 name: mmc1_rootfs layout: RAW_ADDR
|
||||
dev: eMMC alt: 16 name: mmc1_userfs layout: RAW_ADDR
|
||||
dev: MTD alt: 17 name: nor0 layout: RAW_ADDR
|
||||
dev: MTD alt: 18 name: nand0 layout: RAW_ADDR
|
||||
dev: VIRT alt: 19 name: OTP layout: RAW_ADDR
|
||||
dev: VIRT alt: 20 name: PMIC layout: RAW_ADDR
|
||||
dev: MTD alt: 18 name: nor1 layout: RAW_ADDR
|
||||
dev: MTD alt: 19 name: nand0 layout: RAW_ADDR
|
||||
dev: VIRT alt: 20 name: OTP layout: RAW_ADDR
|
||||
dev: VIRT alt: 21 name: PMIC layout: RAW_ADDR
|
||||
|
||||
All the supported device are exported for dfu-util tool::
|
||||
|
||||
$> dfu-util -l
|
||||
Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=20, name="PMIC", serial="002700333338511934383330"
|
||||
Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=19, name="OTP", serial="002700333338511934383330"
|
||||
Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=18, name="nand0", serial="002700333338511934383330"
|
||||
Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=21, name="PMIC", serial="002700333338511934383330"
|
||||
Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=20, name="OTP", serial="002700333338511934383330"
|
||||
Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=19, name="nand0", serial="002700333338511934383330"
|
||||
Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=18, name="nor1", serial="002700333338511934383330"
|
||||
Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=17, name="nor0", serial="002700333338511934383330"
|
||||
Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=16, name="mmc1_userfs", serial="002700333338511934383330"
|
||||
Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=15, name="mmc1_rootfs", serial="002700333338511934383330"
|
||||
@@ -705,12 +707,12 @@ You can update the boot device:
|
||||
When the board is booting for nor0 or nand0,
|
||||
only the MTD partition on the boot devices are available, for example:
|
||||
|
||||
- NOR (nor0 = alt 20) & NAND (nand0 = alt 26) ::
|
||||
- NOR (nor0 = alt 20, nor1 = alt 26) & NAND (nand0 = alt 27) :
|
||||
|
||||
$> dfu-util -d 0483:5720 -a 21 -D tf-a-stm32mp157c-ev1.stm32
|
||||
$> dfu-util -d 0483:5720 -a 22 -D tf-a-stm32mp157c-ev1.stm32
|
||||
$> dfu-util -d 0483:5720 -a 23 -D fip-stm32mp157c-ev1.bin
|
||||
$> dfu-util -d 0483:5720 -a 27 -D st-image-weston-openstlinux-weston-stm32mp1_nand_4_256_multivolume.ubi
|
||||
$> dfu-util -d 0483:5720 -a 28 -D st-image-weston-openstlinux-weston-stm32mp1_nand_4_256_multivolume.ubi
|
||||
|
||||
- NAND (nand0 = alt 21)::
|
||||
|
||||
|
||||
@@ -128,23 +128,6 @@ phyc attributes:
|
||||
MR2
|
||||
MR3
|
||||
|
||||
- st,phy-cal : phy cal depending of calibration or tuning of DDR
|
||||
This parameter is optional; when it is absent the built-in PHY
|
||||
calibration is done.
|
||||
for STM32MP15x: 12 values are requested in this order
|
||||
DX0DLLCR
|
||||
DX0DQTR
|
||||
DX0DQSTR
|
||||
DX1DLLCR
|
||||
DX1DQTR
|
||||
DX1DQSTR
|
||||
DX2DLLCR
|
||||
DX2DQTR
|
||||
DX2DQSTR
|
||||
DX3DLLCR
|
||||
DX3DQTR
|
||||
DX3DQSTR
|
||||
|
||||
Example:
|
||||
|
||||
/ {
|
||||
@@ -280,21 +263,6 @@ Example:
|
||||
0x00000000 /*MR3*/
|
||||
>;
|
||||
|
||||
st,phy-cal = <
|
||||
0x40000000 /*DX0DLLCR*/
|
||||
0xFFFFFFFF /*DX0DQTR*/
|
||||
0x3DB02000 /*DX0DQSTR*/
|
||||
0x40000000 /*DX1DLLCR*/
|
||||
0xFFFFFFFF /*DX1DQTR*/
|
||||
0x3DB02000 /*DX1DQSTR*/
|
||||
0x40000000 /*DX2DLLCR*/
|
||||
0xFFFFFFFF /*DX2DQTR*/
|
||||
0x3DB02000 /*DX2DQSTR*/
|
||||
0x40000000 /*DX3DLLCR*/
|
||||
0xFFFFFFFF /*DX3DQTR*/
|
||||
0x3DB02000 /*DX3DQSTR*/
|
||||
>;
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <asm/bitops.h>
|
||||
#include <asm/cache.h>
|
||||
#include <dm/device_compat.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/libfdt.h>
|
||||
@@ -645,6 +646,66 @@ static const struct dm_mmc_ops stm32_sdmmc2_ops = {
|
||||
.host_power_cycle = stm32_sdmmc2_host_power_cycle,
|
||||
};
|
||||
|
||||
static int stm32_sdmmc2_probe_level_translator(struct udevice *dev)
|
||||
{
|
||||
struct stm32_sdmmc2_priv *priv = dev_get_priv(dev);
|
||||
struct gpio_desc cmd_gpio;
|
||||
struct gpio_desc ck_gpio;
|
||||
struct gpio_desc ckin_gpio;
|
||||
int clk_hi, clk_lo, ret;
|
||||
|
||||
/*
|
||||
* Assume the level translator is present if st,use-ckin is set.
|
||||
* This is to cater for DTs which do not implement this test.
|
||||
*/
|
||||
priv->clk_reg_msk |= SDMMC_CLKCR_SELCLKRX_CKIN;
|
||||
|
||||
ret = gpio_request_by_name(dev, "st,cmd-gpios", 0, &cmd_gpio,
|
||||
GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
|
||||
if (ret)
|
||||
goto exit_cmd;
|
||||
|
||||
ret = gpio_request_by_name(dev, "st,ck-gpios", 0, &ck_gpio,
|
||||
GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
|
||||
if (ret)
|
||||
goto exit_ck;
|
||||
|
||||
ret = gpio_request_by_name(dev, "st,ckin-gpios", 0, &ckin_gpio,
|
||||
GPIOD_IS_IN);
|
||||
if (ret)
|
||||
goto exit_ckin;
|
||||
|
||||
/* All GPIOs are valid, test whether level translator works */
|
||||
|
||||
/* Sample CKIN */
|
||||
clk_hi = !!dm_gpio_get_value(&ckin_gpio);
|
||||
|
||||
/* Set CK low */
|
||||
dm_gpio_set_value(&ck_gpio, 0);
|
||||
|
||||
/* Sample CKIN */
|
||||
clk_lo = !!dm_gpio_get_value(&ckin_gpio);
|
||||
|
||||
/* Tristate all */
|
||||
dm_gpio_set_dir_flags(&cmd_gpio, GPIOD_IS_IN);
|
||||
dm_gpio_set_dir_flags(&ck_gpio, GPIOD_IS_IN);
|
||||
|
||||
/* Level translator is present if CK signal is propagated to CKIN */
|
||||
if (!clk_hi || clk_lo)
|
||||
priv->clk_reg_msk &= ~SDMMC_CLKCR_SELCLKRX_CKIN;
|
||||
|
||||
dm_gpio_free(dev, &ckin_gpio);
|
||||
|
||||
exit_ckin:
|
||||
dm_gpio_free(dev, &ck_gpio);
|
||||
exit_ck:
|
||||
dm_gpio_free(dev, &cmd_gpio);
|
||||
exit_cmd:
|
||||
pinctrl_select_state(dev, "default");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stm32_sdmmc2_probe(struct udevice *dev)
|
||||
{
|
||||
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
|
||||
@@ -662,7 +723,7 @@ static int stm32_sdmmc2_probe(struct udevice *dev)
|
||||
if (dev_read_bool(dev, "st,sig-dir"))
|
||||
priv->pwr_reg_msk |= SDMMC_POWER_DIRPOL;
|
||||
if (dev_read_bool(dev, "st,use-ckin"))
|
||||
priv->clk_reg_msk |= SDMMC_CLKCR_SELCLKRX_CKIN;
|
||||
stm32_sdmmc2_probe_level_translator(dev);
|
||||
|
||||
ret = clk_get_by_index(dev, 0, &priv->clk);
|
||||
if (ret)
|
||||
|
||||
@@ -5,8 +5,12 @@
|
||||
* Driver for STMicroelectronics Multi-Function eXpander (STMFX) GPIO expander
|
||||
* based on Linux driver : pinctrl/pinctrl-stmfx.c
|
||||
*/
|
||||
|
||||
#define LOG_CATEGORY UCLASS_PINCTRL
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <log.h>
|
||||
#include <i2c.h>
|
||||
#include <asm/gpio.h>
|
||||
#include <dm/device.h>
|
||||
|
||||
@@ -8,7 +8,6 @@ obj-y += stm32mp1_ddr.o
|
||||
|
||||
obj-$(CONFIG_STM32MP1_DDR_INTERACTIVE) += stm32mp1_interactive.o
|
||||
obj-$(CONFIG_STM32MP1_DDR_TESTS) += stm32mp1_tests.o
|
||||
obj-$(CONFIG_STM32MP1_DDR_TUNING) += stm32mp1_tuning.o
|
||||
|
||||
ifneq ($(DDR_INTERACTIVE),)
|
||||
CFLAGS_stm32mp1_interactive.o += -DCONFIG_STM32MP1_DDR_INTERACTIVE_FORCE=y
|
||||
|
||||
@@ -68,7 +68,6 @@ struct reg_desc {
|
||||
|
||||
#define DDRPHY_REG_REG_SIZE 11 /* st,phy-reg */
|
||||
#define DDRPHY_REG_TIMING_SIZE 10 /* st,phy-timing */
|
||||
#define DDRPHY_REG_CAL_SIZE 12 /* st,phy-cal */
|
||||
|
||||
#define DDRCTL_REG_REG(x) DDRCTL_REG(x, stm32mp1_ddrctrl_reg)
|
||||
static const struct reg_desc ddr_reg[DDRCTL_REG_REG_SIZE] = {
|
||||
@@ -178,22 +177,6 @@ static const struct reg_desc ddrphy_timing[DDRPHY_REG_TIMING_SIZE] = {
|
||||
DDRPHY_REG_TIMING(mr3),
|
||||
};
|
||||
|
||||
#define DDRPHY_REG_CAL(x) DDRPHY_REG(x, stm32mp1_ddrphy_cal)
|
||||
static const struct reg_desc ddrphy_cal[DDRPHY_REG_CAL_SIZE] = {
|
||||
DDRPHY_REG_CAL(dx0dllcr),
|
||||
DDRPHY_REG_CAL(dx0dqtr),
|
||||
DDRPHY_REG_CAL(dx0dqstr),
|
||||
DDRPHY_REG_CAL(dx1dllcr),
|
||||
DDRPHY_REG_CAL(dx1dqtr),
|
||||
DDRPHY_REG_CAL(dx1dqstr),
|
||||
DDRPHY_REG_CAL(dx2dllcr),
|
||||
DDRPHY_REG_CAL(dx2dqtr),
|
||||
DDRPHY_REG_CAL(dx2dqstr),
|
||||
DDRPHY_REG_CAL(dx3dllcr),
|
||||
DDRPHY_REG_CAL(dx3dqtr),
|
||||
DDRPHY_REG_CAL(dx3dqstr),
|
||||
};
|
||||
|
||||
/**************************************************************
|
||||
* DYNAMIC REGISTERS: only used for debug purpose (read/modify)
|
||||
**************************************************************/
|
||||
@@ -218,12 +201,24 @@ static const struct reg_desc ddrphy_dyn[] = {
|
||||
DDRPHY_REG_DYN(zq0sr1),
|
||||
DDRPHY_REG_DYN(dx0gsr0),
|
||||
DDRPHY_REG_DYN(dx0gsr1),
|
||||
DDRPHY_REG_DYN(dx0dllcr),
|
||||
DDRPHY_REG_DYN(dx0dqtr),
|
||||
DDRPHY_REG_DYN(dx0dqstr),
|
||||
DDRPHY_REG_DYN(dx1gsr0),
|
||||
DDRPHY_REG_DYN(dx1gsr1),
|
||||
DDRPHY_REG_DYN(dx1dllcr),
|
||||
DDRPHY_REG_DYN(dx1dqtr),
|
||||
DDRPHY_REG_DYN(dx1dqstr),
|
||||
DDRPHY_REG_DYN(dx2gsr0),
|
||||
DDRPHY_REG_DYN(dx2gsr1),
|
||||
DDRPHY_REG_DYN(dx2dllcr),
|
||||
DDRPHY_REG_DYN(dx2dqtr),
|
||||
DDRPHY_REG_DYN(dx2dqstr),
|
||||
DDRPHY_REG_DYN(dx3gsr0),
|
||||
DDRPHY_REG_DYN(dx3gsr1),
|
||||
DDRPHY_REG_DYN(dx3dllcr),
|
||||
DDRPHY_REG_DYN(dx3dqtr),
|
||||
DDRPHY_REG_DYN(dx3dqstr),
|
||||
};
|
||||
|
||||
#define DDRPHY_REG_DYN_SIZE ARRAY_SIZE(ddrphy_dyn)
|
||||
@@ -240,7 +235,6 @@ enum reg_type {
|
||||
REG_MAP,
|
||||
REGPHY_REG,
|
||||
REGPHY_TIMING,
|
||||
REGPHY_CAL,
|
||||
#ifdef CONFIG_STM32MP1_DDR_INTERACTIVE
|
||||
/* dynamic registers => managed in driver or not changed,
|
||||
* can be dumped in interactive mode
|
||||
@@ -264,8 +258,6 @@ struct ddr_reg_info {
|
||||
enum base_type base;
|
||||
};
|
||||
|
||||
#define DDRPHY_REG_CAL(x) DDRPHY_REG(x, stm32mp1_ddrphy_cal)
|
||||
|
||||
const struct ddr_reg_info ddr_registers[REG_TYPE_NB] = {
|
||||
[REG_REG] = {
|
||||
"static", ddr_reg, DDRCTL_REG_REG_SIZE, DDR_BASE},
|
||||
@@ -279,8 +271,6 @@ const struct ddr_reg_info ddr_registers[REG_TYPE_NB] = {
|
||||
"static", ddrphy_reg, DDRPHY_REG_REG_SIZE, DDRPHY_BASE},
|
||||
[REGPHY_TIMING] = {
|
||||
"timing", ddrphy_timing, DDRPHY_REG_TIMING_SIZE, DDRPHY_BASE},
|
||||
[REGPHY_CAL] = {
|
||||
"cal", ddrphy_cal, DDRPHY_REG_CAL_SIZE, DDRPHY_BASE},
|
||||
#ifdef CONFIG_STM32MP1_DDR_INTERACTIVE
|
||||
[REG_DYN] = {
|
||||
"dyn", ddr_dyn, DDR_REG_DYN_SIZE, DDR_BASE},
|
||||
@@ -456,9 +446,6 @@ static u32 get_par_addr(const struct stm32mp1_ddr_config *config,
|
||||
case REGPHY_TIMING:
|
||||
par_addr = (u32)&config->p_timing;
|
||||
break;
|
||||
case REGPHY_CAL:
|
||||
par_addr = (u32)&config->p_cal;
|
||||
break;
|
||||
case REG_DYN:
|
||||
case REGPHY_DYN:
|
||||
case REG_TYPE_NB:
|
||||
@@ -570,7 +557,7 @@ static void ddrphy_idone_wait(struct stm32mp1_ddrphy *phy)
|
||||
(u32)&phy->pgsr, pgsr, ret);
|
||||
}
|
||||
|
||||
void stm32mp1_ddrphy_init(struct stm32mp1_ddrphy *phy, u32 pir)
|
||||
static void stm32mp1_ddrphy_init(struct stm32mp1_ddrphy *phy, u32 pir)
|
||||
{
|
||||
pir |= DDRPHYC_PIR_INIT;
|
||||
writel(pir, &phy->pir);
|
||||
@@ -639,7 +626,7 @@ static void wait_operating_mode(struct ddr_info *priv, int mode)
|
||||
log_debug("[0x%08x] stat = 0x%08x\n", (u32)&priv->ctl->stat, stat);
|
||||
}
|
||||
|
||||
void stm32mp1_refresh_disable(struct stm32mp1_ddrctl *ctl)
|
||||
static void stm32mp1_refresh_disable(struct stm32mp1_ddrctl *ctl)
|
||||
{
|
||||
start_sw_done(ctl);
|
||||
/* quasi-dynamic register update*/
|
||||
@@ -650,8 +637,8 @@ void stm32mp1_refresh_disable(struct stm32mp1_ddrctl *ctl)
|
||||
wait_sw_done_ack(ctl);
|
||||
}
|
||||
|
||||
void stm32mp1_refresh_restore(struct stm32mp1_ddrctl *ctl,
|
||||
u32 rfshctl3, u32 pwrctl)
|
||||
static void stm32mp1_refresh_restore(struct stm32mp1_ddrctl *ctl,
|
||||
u32 rfshctl3, u32 pwrctl)
|
||||
{
|
||||
start_sw_done(ctl);
|
||||
if (!(rfshctl3 & DDRCTRL_RFSHCTL3_DIS_AUTO_REFRESH))
|
||||
@@ -774,8 +761,6 @@ start:
|
||||
*/
|
||||
set_reg(priv, REGPHY_REG, &config->p_reg);
|
||||
set_reg(priv, REGPHY_TIMING, &config->p_timing);
|
||||
if (config->p_cal_present)
|
||||
set_reg(priv, REGPHY_CAL, &config->p_cal);
|
||||
|
||||
if (INTERACTIVE(STEP_PHY_INIT))
|
||||
goto start;
|
||||
@@ -810,32 +795,32 @@ start:
|
||||
|
||||
wait_operating_mode(priv, DDRCTRL_STAT_OPERATING_MODE_NORMAL);
|
||||
|
||||
if (config->p_cal_present) {
|
||||
log_debug("DDR DQS training skipped.\n");
|
||||
} else {
|
||||
log_debug("DDR DQS training : ");
|
||||
log_debug("DDR DQS training : ");
|
||||
/* 8. Disable Auto refresh and power down by setting
|
||||
* - RFSHCTL3.dis_au_refresh = 1
|
||||
* - PWRCTL.powerdown_en = 0
|
||||
* - DFIMISC.dfiinit_complete_en = 0
|
||||
*/
|
||||
stm32mp1_refresh_disable(priv->ctl);
|
||||
stm32mp1_refresh_disable(priv->ctl);
|
||||
|
||||
/* 9. Program PUBL PGCR to enable refresh during training and rank to train
|
||||
* not done => keep the programed value in PGCR
|
||||
*/
|
||||
|
||||
/* 10. configure PUBL PIR register to specify which training step to run */
|
||||
/* warning : RVTRN is not supported by this PUBL */
|
||||
stm32mp1_ddrphy_init(priv->phy, DDRPHYC_PIR_QSTRN);
|
||||
/* RVTRN is excuted only on LPDDR2/LPDDR3 */
|
||||
if (config->c_reg.mstr & DDRCTRL_MSTR_DDR3)
|
||||
pir = DDRPHYC_PIR_QSTRN;
|
||||
else
|
||||
pir = DDRPHYC_PIR_QSTRN | DDRPHYC_PIR_RVTRN;
|
||||
stm32mp1_ddrphy_init(priv->phy, pir);
|
||||
|
||||
/* 11. monitor PUB PGSR.IDONE to poll cpmpletion of training sequence */
|
||||
ddrphy_idone_wait(priv->phy);
|
||||
ddrphy_idone_wait(priv->phy);
|
||||
|
||||
/* 12. set back registers in step 8 to the orginal values if desidered */
|
||||
stm32mp1_refresh_restore(priv->ctl, config->c_reg.rfshctl3,
|
||||
config->c_reg.pwrctl);
|
||||
} /* if (config->p_cal_present) */
|
||||
stm32mp1_refresh_restore(priv->ctl, config->c_reg.rfshctl3,
|
||||
config->c_reg.pwrctl);
|
||||
|
||||
/* enable uMCTL2 AXI port 0 and 1 */
|
||||
setbits_le32(&priv->ctl->pctrl_0, DDRCTRL_PCTRL_N_PORT_EN);
|
||||
|
||||
@@ -140,21 +140,6 @@ struct stm32mp1_ddrphy_timing {
|
||||
u32 mr3;
|
||||
};
|
||||
|
||||
struct stm32mp1_ddrphy_cal {
|
||||
u32 dx0dllcr;
|
||||
u32 dx0dqtr;
|
||||
u32 dx0dqstr;
|
||||
u32 dx1dllcr;
|
||||
u32 dx1dqtr;
|
||||
u32 dx1dqstr;
|
||||
u32 dx2dllcr;
|
||||
u32 dx2dqtr;
|
||||
u32 dx2dqstr;
|
||||
u32 dx3dllcr;
|
||||
u32 dx3dqtr;
|
||||
u32 dx3dqstr;
|
||||
};
|
||||
|
||||
struct stm32mp1_ddr_info {
|
||||
const char *name;
|
||||
u32 speed; /* in kHZ */
|
||||
@@ -169,16 +154,9 @@ struct stm32mp1_ddr_config {
|
||||
struct stm32mp1_ddrctrl_perf c_perf;
|
||||
struct stm32mp1_ddrphy_reg p_reg;
|
||||
struct stm32mp1_ddrphy_timing p_timing;
|
||||
struct stm32mp1_ddrphy_cal p_cal;
|
||||
bool p_cal_present;
|
||||
};
|
||||
|
||||
int stm32mp1_ddr_clk_enable(struct ddr_info *priv, u32 mem_speed);
|
||||
void stm32mp1_ddrphy_init(struct stm32mp1_ddrphy *phy, u32 pir);
|
||||
void stm32mp1_refresh_disable(struct stm32mp1_ddrctl *ctl);
|
||||
void stm32mp1_refresh_restore(struct stm32mp1_ddrctl *ctl,
|
||||
u32 rfshctl3,
|
||||
u32 pwrctl);
|
||||
|
||||
void stm32mp1_ddr_init(
|
||||
struct ddr_info *priv,
|
||||
|
||||
@@ -6,8 +6,9 @@
|
||||
#ifndef _RAM_STM32MP1_DDR_REGS_H
|
||||
#define _RAM_STM32MP1_DDR_REGS_H
|
||||
|
||||
/* DDR3/LPDDR2/LPDDR3 Controller (DDRCTRL) registers */
|
||||
#include <linux/bitops.h>
|
||||
|
||||
/* DDR3/LPDDR2/LPDDR3 Controller (DDRCTRL) registers */
|
||||
struct stm32mp1_ddrctl {
|
||||
u32 mstr ; /* 0x0 Master*/
|
||||
u32 stat; /* 0x4 Operating Mode Status*/
|
||||
@@ -238,6 +239,7 @@ struct stm32mp1_ddrphy {
|
||||
#define DDRCTRL_MSTR_LPDDR2 BIT(2)
|
||||
#define DDRCTRL_MSTR_LPDDR3 BIT(3)
|
||||
#define DDRCTRL_MSTR_DATA_BUS_WIDTH_MASK GENMASK(13, 12)
|
||||
#define DDRCTRL_MSTR_DATA_BUS_WIDTH_SHIFT 12
|
||||
#define DDRCTRL_MSTR_DATA_BUS_WIDTH_FULL (0 << 12)
|
||||
#define DDRCTRL_MSTR_DATA_BUS_WIDTH_HALF (1 << 12)
|
||||
#define DDRCTRL_MSTR_DATA_BUS_WIDTH_QUARTER (2 << 12)
|
||||
@@ -275,25 +277,6 @@ struct stm32mp1_ddrphy {
|
||||
|
||||
#define DDRCTRL_DFIMISC_DFI_INIT_COMPLETE_EN BIT(0)
|
||||
|
||||
#define DDRCTRL_DBG1_DIS_HIF BIT(1)
|
||||
|
||||
#define DDRCTRL_DBGCAM_WR_DATA_PIPELINE_EMPTY BIT(29)
|
||||
#define DDRCTRL_DBGCAM_RD_DATA_PIPELINE_EMPTY BIT(28)
|
||||
#define DDRCTRL_DBGCAM_DBG_WR_Q_EMPTY BIT(26)
|
||||
#define DDRCTRL_DBGCAM_DBG_LPR_Q_DEPTH GENMASK(12, 8)
|
||||
#define DDRCTRL_DBGCAM_DBG_HPR_Q_DEPTH GENMASK(4, 0)
|
||||
#define DDRCTRL_DBGCAM_DATA_PIPELINE_EMPTY \
|
||||
(DDRCTRL_DBGCAM_WR_DATA_PIPELINE_EMPTY | \
|
||||
DDRCTRL_DBGCAM_RD_DATA_PIPELINE_EMPTY)
|
||||
#define DDRCTRL_DBGCAM_DBG_Q_DEPTH \
|
||||
(DDRCTRL_DBGCAM_DBG_WR_Q_EMPTY | \
|
||||
DDRCTRL_DBGCAM_DBG_LPR_Q_DEPTH | \
|
||||
DDRCTRL_DBGCAM_DBG_HPR_Q_DEPTH)
|
||||
|
||||
#define DDRCTRL_DBGCMD_RANK0_REFRESH BIT(0)
|
||||
|
||||
#define DDRCTRL_DBGSTAT_RANK0_REFRESH_BUSY BIT(0)
|
||||
|
||||
#define DDRCTRL_SWCTL_SW_DONE BIT(0)
|
||||
|
||||
#define DDRCTRL_SWSTAT_SW_DONE_ACK BIT(0)
|
||||
@@ -309,13 +292,9 @@ struct stm32mp1_ddrphy {
|
||||
#define DDRPHYC_PIR_DRAMRST BIT(5)
|
||||
#define DDRPHYC_PIR_DRAMINIT BIT(6)
|
||||
#define DDRPHYC_PIR_QSTRN BIT(7)
|
||||
#define DDRPHYC_PIR_RVTRN BIT(8)
|
||||
#define DDRPHYC_PIR_ICPC BIT(16)
|
||||
#define DDRPHYC_PIR_ZCALBYP BIT(30)
|
||||
#define DDRPHYC_PIR_INITSTEPS_MASK GENMASK(31, 7)
|
||||
|
||||
#define DDRPHYC_PGCR_DFTCMP BIT(2)
|
||||
#define DDRPHYC_PGCR_PDDISDX BIT(24)
|
||||
#define DDRPHYC_PGCR_RFSHDT_MASK GENMASK(28, 25)
|
||||
|
||||
#define DDRPHYC_PGSR_IDONE BIT(0)
|
||||
#define DDRPHYC_PGSR_DTERR BIT(5)
|
||||
@@ -324,43 +303,6 @@ struct stm32mp1_ddrphy {
|
||||
#define DDRPHYC_PGSR_RVERR BIT(8)
|
||||
#define DDRPHYC_PGSR_RVEIRR BIT(9)
|
||||
|
||||
#define DDRPHYC_DLLGCR_BPS200 BIT(23)
|
||||
|
||||
#define DDRPHYC_ACDLLCR_DLLDIS BIT(31)
|
||||
|
||||
#define DDRPHYC_ZQ0CRN_ZDATA_MASK GENMASK(27, 0)
|
||||
#define DDRPHYC_ZQ0CRN_ZDATA_SHIFT 0
|
||||
#define DDRPHYC_ZQ0CRN_ZDEN BIT(28)
|
||||
|
||||
#define DDRPHYC_DXNGCR_DXEN BIT(0)
|
||||
|
||||
#define DDRPHYC_DXNDLLCR_DLLSRST BIT(30)
|
||||
#define DDRPHYC_DXNDLLCR_DLLDIS BIT(31)
|
||||
#define DDRPHYC_DXNDLLCR_SDPHASE_MASK GENMASK(17, 14)
|
||||
#define DDRPHYC_DXNDLLCR_SDPHASE_SHIFT 14
|
||||
|
||||
#define DDRPHYC_DXNDQTR_DQDLY_SHIFT(bit) (4 * (bit))
|
||||
#define DDRPHYC_DXNDQTR_DQDLY_MASK GENMASK(3, 0)
|
||||
#define DDRPHYC_DXNDQTR_DQDLY_LOW_MASK GENMASK(1, 0)
|
||||
#define DDRPHYC_DXNDQTR_DQDLY_HIGH_MASK GENMASK(3, 2)
|
||||
|
||||
#define DDRPHYC_DXNDQSTR_DQSDLY_MASK GENMASK(22, 20)
|
||||
#define DDRPHYC_DXNDQSTR_DQSDLY_SHIFT 20
|
||||
#define DDRPHYC_DXNDQSTR_DQSNDLY_MASK GENMASK(25, 23)
|
||||
#define DDRPHYC_DXNDQSTR_DQSNDLY_SHIFT 23
|
||||
#define DDRPHYC_DXNDQSTR_R0DGSL_MASK GENMASK(2, 0)
|
||||
#define DDRPHYC_DXNDQSTR_R0DGSL_SHIFT 0
|
||||
#define DDRPHYC_DXNDQSTR_R0DGPS_MASK GENMASK(13, 12)
|
||||
#define DDRPHYC_DXNDQSTR_R0DGPS_SHIFT 12
|
||||
|
||||
#define DDRPHYC_BISTRR_BDXSEL_MASK GENMASK(22, 19)
|
||||
#define DDRPHYC_BISTRR_BDXSEL_SHIFT 19
|
||||
|
||||
#define DDRPHYC_BISTGSR_BDDONE BIT(0)
|
||||
#define DDRPHYC_BISTGSR_BDXERR BIT(2)
|
||||
|
||||
#define DDRPHYC_BISTWCSR_DXWCNT_SHIFT 16
|
||||
|
||||
/* PWR registers */
|
||||
#define PWR_CR3 0x00C
|
||||
#define PWR_CR3_DDRSRDIS BIT(11)
|
||||
|
||||
@@ -32,7 +32,6 @@ enum ddr_command {
|
||||
DDR_CMD_NEXT,
|
||||
DDR_CMD_GO,
|
||||
DDR_CMD_TEST,
|
||||
DDR_CMD_TUNING,
|
||||
DDR_CMD_UNKNOWN,
|
||||
};
|
||||
|
||||
@@ -59,9 +58,6 @@ enum ddr_command stm32mp1_get_command(char *cmd, int argc)
|
||||
[DDR_CMD_GO] = "go",
|
||||
#ifdef CONFIG_STM32MP1_DDR_TESTS
|
||||
[DDR_CMD_TEST] = "test",
|
||||
#endif
|
||||
#ifdef CONFIG_STM32MP1_DDR_TUNING
|
||||
[DDR_CMD_TUNING] = "tuning",
|
||||
#endif
|
||||
};
|
||||
/* min and max number of argument */
|
||||
@@ -78,9 +74,6 @@ enum ddr_command stm32mp1_get_command(char *cmd, int argc)
|
||||
[DDR_CMD_GO] = { 0, 0 },
|
||||
#ifdef CONFIG_STM32MP1_DDR_TESTS
|
||||
[DDR_CMD_TEST] = { 0, 255 },
|
||||
#endif
|
||||
#ifdef CONFIG_STM32MP1_DDR_TUNING
|
||||
[DDR_CMD_TUNING] = { 0, 255 },
|
||||
#endif
|
||||
};
|
||||
int i;
|
||||
@@ -111,7 +104,7 @@ static void stm32mp1_do_usage(void)
|
||||
"help displays help\n"
|
||||
"info displays DDR information\n"
|
||||
"info <param> <val> changes DDR information\n"
|
||||
" with <param> = step, name, size, speed or cal\n"
|
||||
" with <param> = step, name, size or speed\n"
|
||||
"freq displays the DDR PHY frequency in kHz\n"
|
||||
"freq <freq> changes the DDR PHY frequency\n"
|
||||
"param [type|reg] prints input parameters\n"
|
||||
@@ -125,14 +118,11 @@ static void stm32mp1_do_usage(void)
|
||||
"reset reboots machine\n"
|
||||
#ifdef CONFIG_STM32MP1_DDR_TESTS
|
||||
"test [help] | <n> [...] lists (with help) or executes test <n>\n"
|
||||
#endif
|
||||
#ifdef CONFIG_STM32MP1_DDR_TUNING
|
||||
"tuning [help] | <n> [...] lists (with help) or execute tuning <n>\n"
|
||||
#endif
|
||||
"\nwith for [type|reg]:\n"
|
||||
" all registers if absent\n"
|
||||
" <type> = ctl, phy\n"
|
||||
" or one category (static, timing, map, perf, cal, dyn)\n"
|
||||
" or one category (static, timing, map, perf, dyn)\n"
|
||||
" <reg> = name of the register\n"
|
||||
};
|
||||
|
||||
@@ -165,7 +155,6 @@ static void stm32mp1_do_info(struct ddr_info *priv,
|
||||
printf("name = %s\n", config->info.name);
|
||||
printf("size = 0x%x\n", config->info.size);
|
||||
printf("speed = %d kHz\n", config->info.speed);
|
||||
printf("cal = %d\n", config->p_cal_present);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -214,16 +203,6 @@ static void stm32mp1_do_info(struct ddr_info *priv,
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!strcmp(argv[1], "cal")) {
|
||||
if (strict_strtoul(argv[2], 10, &value) < 0 ||
|
||||
(value != 0 && value != 1)) {
|
||||
printf("invalid value %s\n", argv[2]);
|
||||
} else {
|
||||
config->p_cal_present = value;
|
||||
printf("cal = %d\n", config->p_cal_present);
|
||||
}
|
||||
return;
|
||||
}
|
||||
printf("argument %s invalid\n", argv[1]);
|
||||
}
|
||||
|
||||
@@ -322,7 +301,7 @@ end:
|
||||
return step;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_STM32MP1_DDR_TESTS) || defined(CONFIG_STM32MP1_DDR_TUNING)
|
||||
#if defined(CONFIG_STM32MP1_DDR_TESTS)
|
||||
static const char * const s_result[] = {
|
||||
[TEST_PASSED] = "Pass",
|
||||
[TEST_FAILED] = "Failed",
|
||||
@@ -479,16 +458,6 @@ bool stm32mp1_ddr_interactive(void *priv,
|
||||
stm32mp1_ddr_subcmd(priv, argc, argv, test, test_nb);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32MP1_DDR_TUNING
|
||||
case DDR_CMD_TUNING:
|
||||
if (!stm32mp1_check_step(step, STEP_DDR_READY))
|
||||
continue;
|
||||
stm32mp1_ddr_subcmd(priv, argc, argv,
|
||||
tuning, tuning_nb);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -16,6 +16,12 @@
|
||||
#include <asm/io.h>
|
||||
#include <dm/device_compat.h>
|
||||
#include "stm32mp1_ddr.h"
|
||||
#include "stm32mp1_ddr_regs.h"
|
||||
|
||||
/* DDR subsystem configuration */
|
||||
struct stm32mp1_ddr_cfg {
|
||||
u8 nb_bytes; /* MEMC_DRAM_DATA_WIDTH */
|
||||
};
|
||||
|
||||
static const char *const clkname[] = {
|
||||
"ddrc1",
|
||||
@@ -82,7 +88,7 @@ static ofnode stm32mp1_ddr_get_ofnode(struct udevice *dev)
|
||||
return dev_ofnode(dev);
|
||||
}
|
||||
|
||||
static __maybe_unused int stm32mp1_ddr_setup(struct udevice *dev)
|
||||
static int stm32mp1_ddr_setup(struct udevice *dev)
|
||||
{
|
||||
struct ddr_info *priv = dev_get_priv(dev);
|
||||
int ret;
|
||||
@@ -95,26 +101,22 @@ static __maybe_unused int stm32mp1_ddr_setup(struct udevice *dev)
|
||||
{ .name = x, \
|
||||
.offset = offsetof(struct stm32mp1_ddr_config, y), \
|
||||
.size = sizeof(config.y) / sizeof(u32), \
|
||||
.present = z, \
|
||||
}
|
||||
|
||||
#define CTL_PARAM(x) PARAM("st,ctl-"#x, c_##x, NULL)
|
||||
#define PHY_PARAM(x) PARAM("st,phy-"#x, p_##x, NULL)
|
||||
#define PHY_PARAM_OPT(x) PARAM("st,phy-"#x, p_##x, &config.p_##x##_present)
|
||||
|
||||
const struct {
|
||||
const char *name; /* name in DT */
|
||||
const u32 offset; /* offset in config struct */
|
||||
const u32 size; /* size of parameters */
|
||||
bool * const present; /* presence indication for opt */
|
||||
} param[] = {
|
||||
CTL_PARAM(reg),
|
||||
CTL_PARAM(timing),
|
||||
CTL_PARAM(map),
|
||||
CTL_PARAM(perf),
|
||||
PHY_PARAM(reg),
|
||||
PHY_PARAM(timing),
|
||||
PHY_PARAM_OPT(cal)
|
||||
PHY_PARAM(timing)
|
||||
};
|
||||
|
||||
config.info.speed = ofnode_read_u32_default(node, "st,mem-speed", 0);
|
||||
@@ -133,25 +135,11 @@ static __maybe_unused int stm32mp1_ddr_setup(struct udevice *dev)
|
||||
param[idx].size);
|
||||
dev_dbg(dev, "%s: %s[0x%x] = %d\n", __func__,
|
||||
param[idx].name, param[idx].size, ret);
|
||||
if (ret &&
|
||||
(ret != -FDT_ERR_NOTFOUND || !param[idx].present)) {
|
||||
if (ret) {
|
||||
dev_err(dev, "Cannot read %s, error=%d\n",
|
||||
param[idx].name, ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (param[idx].present) {
|
||||
/* save presence of optional parameters */
|
||||
*param[idx].present = true;
|
||||
if (ret == -FDT_ERR_NOTFOUND) {
|
||||
*param[idx].present = false;
|
||||
#ifdef CONFIG_STM32MP1_DDR_INTERACTIVE
|
||||
/* reset values if used later */
|
||||
memset((void *)((u32)&config +
|
||||
param[idx].offset),
|
||||
0, param[idx].size * sizeof(u32));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ret = clk_get_by_name(dev, "axidcg", &axidcg);
|
||||
@@ -183,6 +171,183 @@ static __maybe_unused int stm32mp1_ddr_setup(struct udevice *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u8 get_data_bus_width(struct stm32mp1_ddrctl *ctl)
|
||||
{
|
||||
u32 reg = readl(&ctl->mstr) & DDRCTRL_MSTR_DATA_BUS_WIDTH_MASK;
|
||||
u8 data_bus_width = reg >> DDRCTRL_MSTR_DATA_BUS_WIDTH_SHIFT;
|
||||
|
||||
return data_bus_width;
|
||||
}
|
||||
|
||||
static u8 get_nb_bank(struct stm32mp1_ddrctl *ctl)
|
||||
{
|
||||
/* Count bank address bits */
|
||||
u8 bits = 0;
|
||||
u32 reg, val;
|
||||
|
||||
reg = readl(&ctl->addrmap1);
|
||||
/* addrmap1.addrmap_bank_b1 */
|
||||
val = (reg & GENMASK(5, 0)) >> 0;
|
||||
if (val <= 31)
|
||||
bits++;
|
||||
/* addrmap1.addrmap_bank_b2 */
|
||||
val = (reg & GENMASK(13, 8)) >> 8;
|
||||
if (val <= 31)
|
||||
bits++;
|
||||
/* addrmap1.addrmap_bank_b3 */
|
||||
val = (reg & GENMASK(21, 16)) >> 16;
|
||||
if (val <= 31)
|
||||
bits++;
|
||||
|
||||
return bits;
|
||||
}
|
||||
|
||||
static u8 get_nb_col(struct stm32mp1_ddrctl *ctl, u8 data_bus_width)
|
||||
{
|
||||
u8 bits;
|
||||
u32 reg, val;
|
||||
|
||||
/* Count column address bits, start at 2 for b0 and b1 (fixed) */
|
||||
bits = 2;
|
||||
|
||||
reg = readl(&ctl->addrmap2);
|
||||
/* addrmap2.addrmap_col_b2 */
|
||||
val = (reg & GENMASK(3, 0)) >> 0;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
/* addrmap2.addrmap_col_b3 */
|
||||
val = (reg & GENMASK(11, 8)) >> 8;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
/* addrmap2.addrmap_col_b4 */
|
||||
val = (reg & GENMASK(19, 16)) >> 16;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
/* addrmap2.addrmap_col_b5 */
|
||||
val = (reg & GENMASK(27, 24)) >> 24;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
|
||||
reg = readl(&ctl->addrmap3);
|
||||
/* addrmap3.addrmap_col_b6 */
|
||||
val = (reg & GENMASK(3, 0)) >> 0;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
/* addrmap3.addrmap_col_b7 */
|
||||
val = (reg & GENMASK(11, 8)) >> 8;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
/* addrmap3.addrmap_col_b8 */
|
||||
val = (reg & GENMASK(19, 16)) >> 16;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
/* addrmap3.addrmap_col_b9 */
|
||||
val = (reg & GENMASK(27, 24)) >> 24;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
|
||||
reg = readl(&ctl->addrmap4);
|
||||
/* addrmap4.addrmap_col_b10 */
|
||||
val = (reg & GENMASK(3, 0)) >> 0;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
/* addrmap4.addrmap_col_b11 */
|
||||
val = (reg & GENMASK(11, 8)) >> 8;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
|
||||
/*
|
||||
* column bits shift up:
|
||||
* 1 when half the data bus is used (data_bus_width = 1)
|
||||
* 2 when a quarter the data bus is used (data_bus_width = 2)
|
||||
* nothing to do for full data bus (data_bus_width = 0)
|
||||
*/
|
||||
bits += data_bus_width;
|
||||
|
||||
return bits;
|
||||
}
|
||||
|
||||
static u8 get_nb_row(struct stm32mp1_ddrctl *ctl)
|
||||
{
|
||||
/* Count row address bits */
|
||||
u8 bits = 0;
|
||||
u32 reg, val;
|
||||
|
||||
reg = readl(&ctl->addrmap5);
|
||||
/* addrmap5.addrmap_row_b0 */
|
||||
val = (reg & GENMASK(3, 0)) >> 0;
|
||||
if (val <= 11)
|
||||
bits++;
|
||||
/* addrmap5.addrmap_row_b1 */
|
||||
val = (reg & GENMASK(11, 8)) >> 8;
|
||||
if (val <= 11)
|
||||
bits++;
|
||||
/* addrmap5.addrmap_row_b2_10 */
|
||||
val = (reg & GENMASK(19, 16)) >> 16;
|
||||
if (val <= 11)
|
||||
bits += 9;
|
||||
else
|
||||
printf("warning: addrmap5.addrmap_row_b2_10 not supported\n");
|
||||
/* addrmap5.addrmap_row_b11 */
|
||||
val = (reg & GENMASK(27, 24)) >> 24;
|
||||
if (val <= 11)
|
||||
bits++;
|
||||
|
||||
reg = readl(&ctl->addrmap6);
|
||||
/* addrmap6.addrmap_row_b12 */
|
||||
val = (reg & GENMASK(3, 0)) >> 0;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
/* addrmap6.addrmap_row_b13 */
|
||||
val = (reg & GENMASK(11, 8)) >> 8;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
/* addrmap6.addrmap_row_b14 */
|
||||
val = (reg & GENMASK(19, 16)) >> 16;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
/* addrmap6.addrmap_row_b15 */
|
||||
val = (reg & GENMASK(27, 24)) >> 24;
|
||||
if (val <= 7)
|
||||
bits++;
|
||||
|
||||
return bits;
|
||||
}
|
||||
|
||||
/*
|
||||
* stm32mp1_ddr_size
|
||||
*
|
||||
* Get the current DRAM size from the DDR CTL registers
|
||||
*
|
||||
* @return: DRAM size
|
||||
*/
|
||||
u32 stm32mp1_ddr_size(struct udevice *dev)
|
||||
{
|
||||
u8 nb_bit;
|
||||
u32 ddr_size;
|
||||
u8 data_bus_width;
|
||||
struct ddr_info *priv = dev_get_priv(dev);
|
||||
struct stm32mp1_ddrctl *ctl = priv->ctl;
|
||||
struct stm32mp1_ddr_cfg *cfg = (struct stm32mp1_ddr_cfg *)dev_get_driver_data(dev);
|
||||
const u8 nb_bytes = cfg->nb_bytes;
|
||||
|
||||
data_bus_width = get_data_bus_width(ctl);
|
||||
nb_bit = get_nb_bank(ctl) + get_nb_col(ctl, data_bus_width) +
|
||||
get_nb_row(ctl);
|
||||
if (nb_bit > 32) {
|
||||
nb_bit = 32;
|
||||
debug("invalid DDR configuration: %d bits\n", nb_bit);
|
||||
}
|
||||
|
||||
ddr_size = (nb_bytes >> data_bus_width) << nb_bit;
|
||||
if (ddr_size > STM32_DDR_SIZE) {
|
||||
ddr_size = STM32_DDR_SIZE;
|
||||
debug("invalid DDR configuration: size = %x\n", ddr_size);
|
||||
}
|
||||
|
||||
return ddr_size;
|
||||
}
|
||||
|
||||
static int stm32mp1_ddr_probe(struct udevice *dev)
|
||||
{
|
||||
struct ddr_info *priv = dev_get_priv(dev);
|
||||
@@ -209,8 +374,8 @@ static int stm32mp1_ddr_probe(struct udevice *dev)
|
||||
return log_ret(ret);
|
||||
}
|
||||
|
||||
ofnode node = stm32mp1_ddr_get_ofnode(dev);
|
||||
priv->info.size = ofnode_read_u32_default(node, "st,mem-size", 0);
|
||||
priv->info.size = stm32mp1_ddr_size(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -227,8 +392,12 @@ static struct ram_ops stm32mp1_ddr_ops = {
|
||||
.get_info = stm32mp1_ddr_get_info,
|
||||
};
|
||||
|
||||
static const struct stm32mp1_ddr_cfg stm32mp15x_ddr_cfg = {
|
||||
.nb_bytes = 4,
|
||||
};
|
||||
|
||||
static const struct udevice_id stm32mp1_ddr_ids[] = {
|
||||
{ .compatible = "st,stm32mp1-ddr" },
|
||||
{ .compatible = "st,stm32mp1-ddr", .data = (ulong)&stm32mp15x_ddr_cfg},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
||||
@@ -28,7 +28,4 @@ struct test_desc {
|
||||
extern const struct test_desc test[];
|
||||
extern const int test_nb;
|
||||
|
||||
extern const struct test_desc tuning[];
|
||||
extern const int tuning_nb;
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -459,7 +459,10 @@ static int stm32_ltdc_bind(struct udevice *dev)
|
||||
uc_plat->size = CONFIG_VIDEO_STM32_MAX_XRES *
|
||||
CONFIG_VIDEO_STM32_MAX_YRES *
|
||||
(CONFIG_VIDEO_STM32_MAX_BPP >> 3);
|
||||
dev_dbg(dev, "frame buffer max size %d bytes\n", uc_plat->size);
|
||||
/* align framebuffer on kernel MMU_SECTION_SIZE = max 2MB for LPAE */
|
||||
uc_plat->align = SZ_2M;
|
||||
dev_dbg(dev, "frame buffer max size %d bytes align %x\n",
|
||||
uc_plat->size, uc_plat->align);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -228,6 +228,20 @@ void video_sync_all(void)
|
||||
}
|
||||
}
|
||||
|
||||
bool video_is_active(void)
|
||||
{
|
||||
struct udevice *dev;
|
||||
|
||||
for (uclass_find_first_device(UCLASS_VIDEO, &dev);
|
||||
dev;
|
||||
uclass_find_next_device(&dev)) {
|
||||
if (device_active(dev))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int video_get_xsize(struct udevice *dev)
|
||||
{
|
||||
struct video_priv *priv = dev_get_uclass_priv(dev);
|
||||
|
||||
@@ -44,7 +44,6 @@
|
||||
/* GPIO */
|
||||
#define CONFIG_BCM2835_GPIO
|
||||
/* LCD */
|
||||
#define CONFIG_LCD_DT_SIMPLEFB
|
||||
#define CONFIG_VIDEO_BCM2835
|
||||
|
||||
/* DFU over USB/UDC */
|
||||
|
||||
@@ -142,6 +142,10 @@
|
||||
"env_check=if env info -p -d -q; then env save; fi\0" \
|
||||
"boot_net_usb_start=true\0"
|
||||
|
||||
#ifndef STM32MP_BOARD_EXTRA_ENV
|
||||
#define STM32MP_BOARD_EXTRA_ENV
|
||||
#endif
|
||||
|
||||
#include <config_distro_bootcmd.h>
|
||||
|
||||
/*
|
||||
@@ -169,7 +173,8 @@
|
||||
STM32MP_BOOTCMD \
|
||||
STM32MP_PARTS_DEFAULT \
|
||||
BOOTENV \
|
||||
STM32MP_EXTRA
|
||||
STM32MP_EXTRA \
|
||||
STM32MP_BOARD_EXTRA_ENV
|
||||
|
||||
#endif /* ifndef CONFIG_SPL_BUILD */
|
||||
#endif /* ifdef CONFIG_DISTRO_DEFAULTS*/
|
||||
|
||||
@@ -8,6 +8,22 @@
|
||||
#ifndef __CONFIG_STM32MP15_DH_DHSOM_H__
|
||||
#define __CONFIG_STM32MP15_DH_DHSOM_H__
|
||||
|
||||
/* PHY needs a longer autoneg timeout */
|
||||
#define PHY_ANEG_TIMEOUT 20000
|
||||
|
||||
#define STM32MP_BOARD_EXTRA_ENV \
|
||||
"usb_pgood_delay=1000\0" \
|
||||
"update_sf=" /* Erase SPI NOR and install U-Boot from SD */ \
|
||||
"setexpr loadaddr1 ${loadaddr} + 0x1000000 && " \
|
||||
"load mmc 0:4 ${loadaddr1} /boot/u-boot-spl.stm32 && " \
|
||||
"env set filesize1 ${filesize} && " \
|
||||
"load mmc 0:4 ${loadaddr} /boot/u-boot.itb && " \
|
||||
"sf probe && sf erase 0 0x200000 && " \
|
||||
"sf update ${loadaddr1} 0 ${filesize1} && " \
|
||||
"sf update ${loadaddr1} 0x40000 ${filesize1} && " \
|
||||
"sf update ${loadaddr} 0x80000 ${filesize} && " \
|
||||
"env set filesize1 && env set loadaddr1\0"
|
||||
|
||||
#include <configs/stm32mp15_common.h>
|
||||
|
||||
#define CONFIG_SPL_TARGET "u-boot.itb"
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#ifndef _FDT_SIMPLEFB_H_
|
||||
#define _FDT_SIMPLEFB_H_
|
||||
int lcd_dt_simplefb_add_node(void *blob);
|
||||
int lcd_dt_simplefb_enable_existing_node(void *blob);
|
||||
int fdt_simplefb_add_node(void *blob);
|
||||
int fdt_simplefb_enable_existing_node(void *blob);
|
||||
int fdt_simplefb_enable_and_mem_rsv(void *blob);
|
||||
#endif
|
||||
|
||||
@@ -276,6 +276,13 @@ static inline int video_sync_copy_all(struct udevice *dev)
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* video_is_active() - Test if one video device it active
|
||||
*
|
||||
* @return true if at least one video device is active, else false.
|
||||
*/
|
||||
bool video_is_active(void);
|
||||
|
||||
#ifndef CONFIG_DM_VIDEO
|
||||
|
||||
/* Video functions */
|
||||
|
||||
@@ -699,7 +699,6 @@ CONFIG_LBA48
|
||||
CONFIG_LBDAF
|
||||
CONFIG_LCD_ALIGNMENT
|
||||
CONFIG_LCD_BMP_RLE8
|
||||
CONFIG_LCD_DT_SIMPLEFB
|
||||
CONFIG_LCD_INFO
|
||||
CONFIG_LCD_INFO_BELOW_LOGO
|
||||
CONFIG_LCD_IN_PSRAM
|
||||
|
||||
Reference in New Issue
Block a user