mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	Update uboot for BPI-R2
This commit is contained in:
		
							parent
							
								
									a997f379a0
								
							
						
					
					
						commit
						1385e89bce
					
				
					 29 changed files with 134 additions and 3873 deletions
				
			
		|  | @ -9,11 +9,11 @@ | |||
| include $(TOPDIR)/rules.mk | ||||
| include $(INCLUDE_DIR)/kernel.mk | ||||
| 
 | ||||
| PKG_VERSION:=2019.01 | ||||
| PKG_VERSION:=2020.04-rc5 | ||||
| 
 | ||||
| PKG_HASH:=50bd7e5a466ab828914d080d5f6a432345b500e8fba1ad3b7b61e95e60d51c22 | ||||
| PKG_HASH:=1c967c90d3ab4fcc5817fbca4db8928311a8b3dfa9f827e9c585a590fd94ca7a | ||||
| 
 | ||||
| PKG_MAINTAINER:=Alexey Loukianov <lx2@lexa2.ru> | ||||
| PKG_MAINTAINER:=Cristian Ciobanu <cioby.service@gmail.com> | ||||
| 
 | ||||
| include $(INCLUDE_DIR)/u-boot.mk | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | @ -28,7 +28,7 @@ endef | |||
| define U-Boot/mt7623n_bpir2 | ||||
|   BUILD_SUBTARGET:=mt7623 | ||||
|   NAME:=Bannana PI R2 (mt7623) | ||||
|   BUILD_DEVICES:=7623n-bananapi-bpi-r2 | ||||
|   BUILD_DEVICES:=bpi_bananapi-r2 | ||||
| endef | ||||
| 
 | ||||
| UBOOT_TARGETS := \
 | ||||
|  | @ -43,7 +43,7 @@ UBOOT_MAKE_FLAGS = \ | |||
| 
 | ||||
| define Build/Prepare | ||||
|         $(call Build/Prepare/Default) | ||||
| 	$(CP) uEnv-$(UENV).txt $(PKG_BUILD_DIR)/uEnv.txt | ||||
| 	$(CP) uEnv-$(UENV).txt ${PKG_BUILD_DIR}/uEnv.txt | ||||
| endef | ||||
| 
 | ||||
| define Build/InstallDev | ||||
|  |  | |||
|  | @ -0,0 +1,64 @@ | |||
| From 075db54b57761868cd63434b466fffe7ba7a564f Mon Sep 17 00:00:00 2001 | ||||
| From: Cristian Ciobanu <cioby.service@gmail.com> | ||||
| Date: Thu, 9 Apr 2020 17:59:27 +0300 | ||||
| Subject: [PATCH] defconfig: r2: Add additional U-boot options for mt7623n | ||||
| 
 | ||||
| ---
 | ||||
|  configs/mt7623n_bpir2_defconfig | 30 ++++++++++++++++++++++++++++-- | ||||
|  1 file changed, 28 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/configs/mt7623n_bpir2_defconfig b/configs/mt7623n_bpir2_defconfig
 | ||||
| index 07ddade76a..36a903cbe7 100644
 | ||||
| --- a/configs/mt7623n_bpir2_defconfig
 | ||||
| +++ b/configs/mt7623n_bpir2_defconfig
 | ||||
| @@ -3,7 +3,7 @@ CONFIG_SYS_THUMB_BUILD=y
 | ||||
|  CONFIG_ARCH_MEDIATEK=y | ||||
|  CONFIG_SYS_TEXT_BASE=0x81e00000 | ||||
|  CONFIG_SYS_MALLOC_F_LEN=0x4000 | ||||
| -CONFIG_ENV_SIZE=0x1000
 | ||||
| +CONFIG_ENV_SIZE=0x2000
 | ||||
|  CONFIG_ENV_OFFSET=0x100000 | ||||
|  CONFIG_TARGET_MT7623=y | ||||
|  CONFIG_NR_DRAM_BANKS=1 | ||||
| @@ -14,7 +14,7 @@ CONFIG_SYS_CONSOLE_IS_IN_ENV=y
 | ||||
|  CONFIG_DEFAULT_FDT_FILE="mt7623n-bananapi-bpi-r2" | ||||
|  # CONFIG_DISPLAY_BOARDINFO is not set | ||||
|  CONFIG_HUSH_PARSER=y | ||||
| -CONFIG_SYS_PROMPT="U-Boot> "
 | ||||
| +CONFIG_SYS_PROMPT="BPI-R2> "
 | ||||
|  CONFIG_CMD_BOOTMENU=y | ||||
|  # CONFIG_CMD_ELF is not set | ||||
|  # CONFIG_CMD_XIMG is not set | ||||
| @@ -57,3 +57,29 @@ CONFIG_MTK_TIMER=y
 | ||||
|  CONFIG_WDT_MTK=y | ||||
|  CONFIG_LZMA=y | ||||
|  # CONFIG_EFI_LOADER is not set | ||||
| +
 | ||||
| +CONFIG_LOCALVERSION_AUTO=n
 | ||||
| +CONFIG_USE_DEFAULT_ENV_FILE=y
 | ||||
| +CONFIG_DEFAULT_ENV_FILE="uEnv.txt"
 | ||||
| +CONFIG_CMD_BOOTZ=y
 | ||||
| +CONFIG_OF_LIBFDT_OVERLAY=y
 | ||||
| +
 | ||||
| +#commands used in uenv.txt
 | ||||
| +CONFIG_CMD_ASKENV=y
 | ||||
| +CONFIG_CMD_STRINGS=y
 | ||||
| +CONFIG_CMD_SETEXPR=y
 | ||||
| +CONFIG_CMD_CACHE=y
 | ||||
| +CONFIG_CMD_ERASEENV=y
 | ||||
| +CONFIG_PCI=y
 | ||||
| +CONFIG_DM_PCI=y
 | ||||
| +CONFIG_PCIE_MEDIATEK=y
 | ||||
| +CONFIG_PHY=y
 | ||||
| +CONFIG_PHY_MTK_TPHY=y
 | ||||
| +CONFIG_CMD_PCI=y
 | ||||
| +CONFIG_AHCI=y
 | ||||
| +CONFIG_AHCI_PCI=y
 | ||||
| +CONFIG_SCSI=y
 | ||||
| +CONFIG_DM_SCSI=y
 | ||||
| +CONFIG_SCSI_AHCI=y
 | ||||
| +CONFIG_HAVE_BLOCK_DEVICE=y
 | ||||
| +CONFIG_POWER_MT6323=y
 | ||||
| -- 
 | ||||
| 2.25.1 | ||||
| 
 | ||||
|  | @ -1,39 +0,0 @@ | |||
| diff --git a/configs/mt7623n_bpir2_defconfig b/configs/mt7623n_bpir2_defconfig
 | ||||
| index ae4fb280..74252cd0 100644
 | ||||
| --- a/configs/mt7623n_bpir2_defconfig
 | ||||
| +++ b/configs/mt7623n_bpir2_defconfig
 | ||||
| @@ -3,6 +3,7 @@ CONFIG_SYS_THUMB_BUILD=y
 | ||||
|  CONFIG_ARCH_MEDIATEK=y | ||||
|  CONFIG_SYS_TEXT_BASE=0x81e00000 | ||||
|  CONFIG_SYS_MALLOC_F_LEN=0x4000 | ||||
| +CONFIG_TARGET_MT7623=y
 | ||||
|  CONFIG_NR_DRAM_BANKS=1 | ||||
|  CONFIG_FIT=y | ||||
|  CONFIG_FIT_VERBOSE=y | ||||
| @@ -11,7 +12,7 @@ CONFIG_SYS_CONSOLE_IS_IN_ENV=y
 | ||||
|  CONFIG_DEFAULT_FDT_FILE="mt7623n-bananapi-bpi-r2" | ||||
|  # CONFIG_DISPLAY_BOARDINFO is not set | ||||
|  CONFIG_HUSH_PARSER=y | ||||
| -CONFIG_SYS_PROMPT="U-Boot> "
 | ||||
| +CONFIG_SYS_PROMPT="BPI-R2> "
 | ||||
|  CONFIG_CMD_BOOTMENU=y | ||||
|  # CONFIG_CMD_ELF is not set | ||||
|  # CONFIG_CMD_XIMG is not set | ||||
| @@ -51,3 +52,14 @@ CONFIG_MTK_TIMER=y
 | ||||
|  CONFIG_WDT_MTK=y | ||||
|  CONFIG_LZMA=y | ||||
|  # CONFIG_EFI_LOADER is not set | ||||
| +
 | ||||
| +CONFIG_CMD_BOOTZ=y
 | ||||
| +CONFIG_OF_LIBFDT_OVERLAY=y
 | ||||
| +
 | ||||
| +CONFIG_USE_DEFAULT_ENV_FILE=y
 | ||||
| +CONFIG_DEFAULT_ENV_FILE="uEnv.txt"
 | ||||
| +
 | ||||
| +#enables savenenv-command
 | ||||
| +CONFIG_ENV_IS_IN_MMC=y
 | ||||
| +
 | ||||
| +CONFIG_CMD_ASKENV=y
 | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,61 +0,0 @@ | |||
| From 2a59134ba1d841cf1a7845017656b74b74412aaf Mon Sep 17 00:00:00 2001 | ||||
| From: Frank Wunderlich <frank-w@public-files.de> | ||||
| Date: Mon, 3 Dec 2018 15:32:58 +0100 | ||||
| Subject: adding saveenv-command for bananapi r2 | ||||
| 
 | ||||
| bananapi r2 can be booted from sd-card and emmc | ||||
| saving the environment have to choose the storage | ||||
| from which the device has booted | ||||
| 
 | ||||
| also the offset is set to 1MB-50Kb to make sure env is written | ||||
| to block "user data area" between uboot and first partition | ||||
| 
 | ||||
| https://www.fw-web.de/dokuwiki/lib/exe/fetch.php?cache=&media=bpi-r2:boot-structure.png | ||||
| 
 | ||||
| v3: removed changes in defconfig (users choice) | ||||
| v2: fixed bracket-style in if-else statement | ||||
| 
 | ||||
| Signed-off-by: Frank Wunderlich <frank-w@public-files.de> | ||||
| 
 | ||||
| diff --git a/board/mediatek/mt7623/mt7623_rfb.c b/board/mediatek/mt7623/mt7623_rfb.c
 | ||||
| index 08468b50..4ec27649 100644
 | ||||
| --- a/board/mediatek/mt7623/mt7623_rfb.c
 | ||||
| +++ b/board/mediatek/mt7623/mt7623_rfb.c
 | ||||
| @@ -14,3 +14,22 @@ int board_init(void)
 | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| +
 | ||||
| +int mmc_get_boot_dev(void)
 | ||||
| +{
 | ||||
| +	int g_mmc_devid = -1;
 | ||||
| +	char *uflag = (char *)0x81DFFFF0;
 | ||||
| +	if (strncmp(uflag,"eMMC",4)==0) {
 | ||||
| +		g_mmc_devid = 0;
 | ||||
| +		printf("Boot From Emmc(id:%d)\n\n", g_mmc_devid);
 | ||||
| +	} else {
 | ||||
| +		g_mmc_devid = 1;
 | ||||
| +		printf("Boot From SD(id:%d)\n\n", g_mmc_devid);
 | ||||
| +	}
 | ||||
| +	return g_mmc_devid;
 | ||||
| +}
 | ||||
| +
 | ||||
| +int mmc_get_env_dev(void)
 | ||||
| +{
 | ||||
| +	return mmc_get_boot_dev();
 | ||||
| +}
 | ||||
| diff --git a/include/configs/mt7623.h b/include/configs/mt7623.h
 | ||||
| index ba763501..fb6ac073 100644
 | ||||
| --- a/include/configs/mt7623.h
 | ||||
| +++ b/include/configs/mt7623.h
 | ||||
| @@ -53,4 +53,7 @@
 | ||||
|  #define CONFIG_EXTRA_ENV_SETTINGS	\ | ||||
|  	FDT_HIGH | ||||
|   | ||||
| +#define CONFIG_SYS_MMC_ENV_DEV	0
 | ||||
| +#define CONFIG_ENV_OFFSET	0xF3800
 | ||||
| +
 | ||||
|  #endif | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -0,0 +1,23 @@ | |||
| From 15e032f5b06ba97a7777bc32aef15e10d0086041 Mon Sep 17 00:00:00 2001 | ||||
| From: Cristian Ciobanu <cioby.service@gmail.com> | ||||
| Date: Wed, 8 Apr 2020 22:27:01 +0300 | ||||
| Subject: [PATCH] u-boot: Modify environment offset for mt7623 | ||||
| 
 | ||||
| ---
 | ||||
|  include/configs/mt7623.h | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
| 
 | ||||
| diff --git a/include/configs/mt7623.h b/include/configs/mt7623.h
 | ||||
| index faab0913fc..5d0da71ce9 100644
 | ||||
| --- a/include/configs/mt7623.h
 | ||||
| +++ b/include/configs/mt7623.h
 | ||||
| @@ -56,5 +56,6 @@
 | ||||
|  #define CONFIG_SERVERIP			192.168.1.2 | ||||
|   | ||||
|  #define CONFIG_SYS_MMC_ENV_DEV		0 | ||||
| +#define CONFIG_ENV_OFFSET      0xF3800
 | ||||
|   | ||||
|  #endif | ||||
| -- 
 | ||||
| 2.25.1 | ||||
| 
 | ||||
|  | @ -1,14 +1,17 @@ | |||
| From 17843557032cc342117591939483d238e80bd169 Mon Sep 17 00:00:00 2001 | ||||
| From 798f0fc54926093a074a9cbb011de833a0614c3a Mon Sep 17 00:00:00 2001 | ||||
| From: Frank Wunderlich <frank-w@public-files.de> | ||||
| Date: Fri, 28 Dec 2018 17:56:19 +0100 | ||||
| Subject: [bootmenu] added key-input (1-9,a-f) | ||||
| Subject: [PATCH 1/2] bootmenu: added key-input (1-9,a-f) | ||||
| 
 | ||||
| ---
 | ||||
|  cmd/bootmenu.c | 145 ++++++++++++++++++++++++++++++++----------------- | ||||
|  1 file changed, 94 insertions(+), 51 deletions(-) | ||||
| 
 | ||||
| diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c
 | ||||
| index 7f88c1ed..0935fd40 100644
 | ||||
| index 3dc2c854ac..fd6ba6c8af 100644
 | ||||
| --- a/cmd/bootmenu.c
 | ||||
| +++ b/cmd/bootmenu.c
 | ||||
| @@ -39,7 +39,22 @@ struct bootmenu_data {
 | ||||
| @@ -40,7 +40,22 @@ struct bootmenu_data {
 | ||||
|   | ||||
|  enum bootmenu_key { | ||||
|  	KEY_NONE = 0, | ||||
|  | @ -32,7 +35,7 @@ index 7f88c1ed..0935fd40 100644 | |||
|  	KEY_DOWN, | ||||
|  	KEY_SELECT, | ||||
|  }; | ||||
| @@ -77,6 +92,23 @@ static void bootmenu_print_entry(void *data)
 | ||||
| @@ -78,6 +93,23 @@ static void bootmenu_print_entry(void *data)
 | ||||
|  		puts(ANSI_COLOR_RESET); | ||||
|  } | ||||
|   | ||||
|  | @ -56,7 +59,7 @@ index 7f88c1ed..0935fd40 100644 | |||
|  static void bootmenu_autoboot_loop(struct bootmenu_data *menu, | ||||
|  				enum bootmenu_key *key, int *esc) | ||||
|  { | ||||
| @@ -97,23 +129,23 @@ static void bootmenu_autoboot_loop(struct bootmenu_data *menu,
 | ||||
| @@ -98,23 +130,23 @@ static void bootmenu_autoboot_loop(struct bootmenu_data *menu,
 | ||||
|   | ||||
|  			menu->delay = -1; | ||||
|  			c = getc(); | ||||
|  | @ -94,7 +97,7 @@ index 7f88c1ed..0935fd40 100644 | |||
|  		if (menu->delay < 0) | ||||
|  			break; | ||||
|   | ||||
| @@ -140,47 +172,49 @@ static void bootmenu_loop(struct bootmenu_data *menu,
 | ||||
| @@ -141,47 +173,49 @@ static void bootmenu_loop(struct bootmenu_data *menu,
 | ||||
|   | ||||
|  	c = getc(); | ||||
|   | ||||
|  | @ -179,7 +182,7 @@ index 7f88c1ed..0935fd40 100644 | |||
|  	/* enter key was pressed */ | ||||
|  	if (c == '\r') | ||||
|  		*key = KEY_SELECT; | ||||
| @@ -203,6 +237,14 @@ static char *bootmenu_choice_entry(void *data)
 | ||||
| @@ -204,6 +238,14 @@ static char *bootmenu_choice_entry(void *data)
 | ||||
|  			bootmenu_loop(menu, &key, &esc); | ||||
|  		} | ||||
|   | ||||
|  | @ -194,7 +197,7 @@ index 7f88c1ed..0935fd40 100644 | |||
|  		switch (key) { | ||||
|  		case KEY_UP: | ||||
|  			if (menu->active > 0) | ||||
| @@ -222,6 +264,7 @@ static char *bootmenu_choice_entry(void *data)
 | ||||
| @@ -223,6 +265,7 @@ static char *bootmenu_choice_entry(void *data)
 | ||||
|  		default: | ||||
|  			break; | ||||
|  		} | ||||
|  | @ -202,7 +205,7 @@ index 7f88c1ed..0935fd40 100644 | |||
|  	} | ||||
|   | ||||
|  	/* never happens */ | ||||
| @@ -466,7 +509,7 @@ void menu_display_statusline(struct menu *m)
 | ||||
| @@ -467,7 +510,7 @@ void menu_display_statusline(struct menu *m)
 | ||||
|  	printf(ANSI_CURSOR_POSITION, menu->count + 5, 1); | ||||
|  	puts(ANSI_CLEAR_LINE); | ||||
|  	printf(ANSI_CURSOR_POSITION, menu->count + 6, 1); | ||||
|  | @ -212,5 +215,5 @@ index 7f88c1ed..0935fd40 100644 | |||
|  	printf(ANSI_CURSOR_POSITION, menu->count + 7, 1); | ||||
|  	puts(ANSI_CLEAR_LINE); | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 2.25.1 | ||||
| 
 | ||||
|  | @ -1,189 +0,0 @@ | |||
| From e4033f535d7f6f86f354d36037565a319c02c324 Mon Sep 17 00:00:00 2001 | ||||
| From: Weijie Gao <weijie.gao@mediatek.com> | ||||
| Date: Thu, 20 Dec 2018 16:12:51 +0800 | ||||
| Subject: reset: MedaiTek: add reset controller driver for MediaTek SoCs | ||||
| 
 | ||||
| This patch adds reset controller driver for MediaTek SoCs. | ||||
| 
 | ||||
| Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> | ||||
| Signed-off-by: Weijie Gao <weijie.gao@mediatek.com> | ||||
| 
 | ||||
| diff --git a/arch/arm/include/asm/arch-mediatek/reset.h b/arch/arm/include/asm/arch-mediatek/reset.h
 | ||||
| new file mode 100644 | ||||
| index 00000000..9704666d
 | ||||
| --- /dev/null
 | ||||
| +++ b/arch/arm/include/asm/arch-mediatek/reset.h
 | ||||
| @@ -0,0 +1,13 @@
 | ||||
| +/* SPDX-License-Identifier: GPL-2.0 */
 | ||||
| +/*
 | ||||
| + * Copyright (C) 2018 MediaTek Inc.
 | ||||
| + */
 | ||||
| +
 | ||||
| +#ifndef __MEDIATEK_RESET_H
 | ||||
| +#define __MEDIATEK_RESET_H
 | ||||
| +
 | ||||
| +#include <dm.h>
 | ||||
| +
 | ||||
| +int mediatek_reset_bind(struct udevice *pdev, u32 regofs, u32 num_regs);
 | ||||
| +
 | ||||
| +#endif	/* __MEDIATEK_RESET_H */
 | ||||
| diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
 | ||||
| index 9c5208b7..3a6d61f4 100644
 | ||||
| --- a/drivers/reset/Kconfig
 | ||||
| +++ b/drivers/reset/Kconfig
 | ||||
| @@ -106,4 +106,11 @@ config RESET_SOCFPGA
 | ||||
|  	help | ||||
|  	  Support for reset controller on SoCFPGA platform. | ||||
|   | ||||
| +config RESET_MEDIATEK
 | ||||
| +	bool "Reset controller driver for MediaTek SoCs"
 | ||||
| +	depends on DM_RESET && ARCH_MEDIATEK && CLK
 | ||||
| +	default y
 | ||||
| +	help
 | ||||
| +	  Support for reset controller on MediaTek SoCs.
 | ||||
| +
 | ||||
|  endmenu | ||||
| diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
 | ||||
| index f4520878..8a4dcab8 100644
 | ||||
| --- a/drivers/reset/Makefile
 | ||||
| +++ b/drivers/reset/Makefile
 | ||||
| @@ -17,3 +17,4 @@ obj-$(CONFIG_AST2500_RESET) += ast2500-reset.o
 | ||||
|  obj-$(CONFIG_RESET_ROCKCHIP) += reset-rockchip.o | ||||
|  obj-$(CONFIG_RESET_MESON) += reset-meson.o | ||||
|  obj-$(CONFIG_RESET_SOCFPGA) += reset-socfpga.o | ||||
| +obj-$(CONFIG_RESET_MEDIATEK) += reset-mediatek.o
 | ||||
| diff --git a/drivers/reset/reset-mediatek.c b/drivers/reset/reset-mediatek.c
 | ||||
| new file mode 100644 | ||||
| index 00000000..e3614e6e
 | ||||
| --- /dev/null
 | ||||
| +++ b/drivers/reset/reset-mediatek.c
 | ||||
| @@ -0,0 +1,102 @@
 | ||||
| +// SPDX-License-Identifier: GPL-2.0
 | ||||
| +/*
 | ||||
| + * Copyright (C) 2018 MediaTek Inc.
 | ||||
| + *
 | ||||
| + * Author: Ryder Lee <ryder.lee@mediatek.com>
 | ||||
| + *	   Weijie Gao <weijie.gao@mediatek.com>
 | ||||
| + */
 | ||||
| +
 | ||||
| +#include <common.h>
 | ||||
| +#include <dm.h>
 | ||||
| +#include <dm/lists.h>
 | ||||
| +#include <regmap.h>
 | ||||
| +#include <reset-uclass.h>
 | ||||
| +#include <syscon.h>
 | ||||
| +
 | ||||
| +struct mediatek_reset_priv {
 | ||||
| +	struct regmap *regmap;
 | ||||
| +	u32 regofs;
 | ||||
| +	u32 nr_resets;
 | ||||
| +};
 | ||||
| +
 | ||||
| +static int mediatek_reset_request(struct reset_ctl *reset_ctl)
 | ||||
| +{
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int mediatek_reset_free(struct reset_ctl *reset_ctl)
 | ||||
| +{
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int mediatek_reset_assert(struct reset_ctl *reset_ctl)
 | ||||
| +{
 | ||||
| +	struct mediatek_reset_priv *priv = dev_get_priv(reset_ctl->dev);
 | ||||
| +	int id = reset_ctl->id;
 | ||||
| +
 | ||||
| +	if (id >= priv->nr_resets)
 | ||||
| +		return -EINVAL;
 | ||||
| +
 | ||||
| +	return regmap_update_bits(priv->regmap,
 | ||||
| +		priv->regofs + ((id / 32) << 2), BIT(id % 32), BIT(id % 32));
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int mediatek_reset_deassert(struct reset_ctl *reset_ctl)
 | ||||
| +{
 | ||||
| +	struct mediatek_reset_priv *priv = dev_get_priv(reset_ctl->dev);
 | ||||
| +	int id = reset_ctl->id;
 | ||||
| +
 | ||||
| +	if (id >= priv->nr_resets)
 | ||||
| +		return -EINVAL;
 | ||||
| +
 | ||||
| +	return regmap_update_bits(priv->regmap,
 | ||||
| +		priv->regofs + ((id / 32) << 2), BIT(id % 32), 0);
 | ||||
| +}
 | ||||
| +
 | ||||
| +struct reset_ops mediatek_reset_ops = {
 | ||||
| +	.request = mediatek_reset_request,
 | ||||
| +	.free = mediatek_reset_free,
 | ||||
| +	.rst_assert = mediatek_reset_assert,
 | ||||
| +	.rst_deassert = mediatek_reset_deassert,
 | ||||
| +};
 | ||||
| +
 | ||||
| +static int mediatek_reset_probe(struct udevice *dev)
 | ||||
| +{
 | ||||
| +	struct mediatek_reset_priv *priv = dev_get_priv(dev);
 | ||||
| +
 | ||||
| +	if (!priv->regofs && !priv->nr_resets)
 | ||||
| +		return -EINVAL;
 | ||||
| +
 | ||||
| +	priv->regmap = syscon_node_to_regmap(dev_ofnode(dev));
 | ||||
| +	if (IS_ERR(priv->regmap))
 | ||||
| +		return PTR_ERR(priv->regmap);
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +int mediatek_reset_bind(struct udevice *pdev, u32 regofs, u32 num_regs)
 | ||||
| +{
 | ||||
| +	struct udevice *rst_dev;
 | ||||
| +	struct mediatek_reset_priv *priv;
 | ||||
| +	int ret;
 | ||||
| +
 | ||||
| +	ret = device_bind_driver_to_node(pdev, "mediatek_reset", "reset",
 | ||||
| +					 dev_ofnode(pdev), &rst_dev);
 | ||||
| +	if (ret)
 | ||||
| +		return ret;
 | ||||
| +
 | ||||
| +	priv = malloc(sizeof(struct mediatek_reset_priv));
 | ||||
| +	priv->regofs = regofs;
 | ||||
| +	priv->nr_resets = num_regs * 32;
 | ||||
| +	rst_dev->priv = priv;
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +U_BOOT_DRIVER(mediatek_reset) = {
 | ||||
| +	.name = "mediatek_reset",
 | ||||
| +	.id = UCLASS_RESET,
 | ||||
| +	.probe = mediatek_reset_probe,
 | ||||
| +	.ops = &mediatek_reset_ops,
 | ||||
| +	.priv_auto_alloc_size = sizeof(struct mediatek_reset_priv),
 | ||||
| +};
 | ||||
| diff --git a/include/dt-bindings/reset/mtk-reset.h b/include/dt-bindings/reset/mtk-reset.h
 | ||||
| new file mode 100644 | ||||
| index 00000000..5f0a74f2
 | ||||
| --- /dev/null
 | ||||
| +++ b/include/dt-bindings/reset/mtk-reset.h
 | ||||
| @@ -0,0 +1,18 @@
 | ||||
| +/* SPDX-License-Identifier: GPL-2.0 */
 | ||||
| +/*
 | ||||
| + * Copyright (C) 2018 MediaTek Inc.
 | ||||
| + */
 | ||||
| +
 | ||||
| +#ifndef _DT_BINDINGS_MTK_RESET_H_
 | ||||
| +#define _DT_BINDINGS_MTK_RESET_H_
 | ||||
| +
 | ||||
| +/* ETHSYS */
 | ||||
| +#define ETHSYS_PPE_RST			31
 | ||||
| +#define ETHSYS_EPHY_RST			24
 | ||||
| +#define ETHSYS_GMAC_RST			23
 | ||||
| +#define ETHSYS_ESW_RST			16
 | ||||
| +#define ETHSYS_FE_RST			6
 | ||||
| +#define ETHSYS_MCM_RST			2
 | ||||
| +#define ETHSYS_SYS_RST			0
 | ||||
| +
 | ||||
| +#endif /* _DT_BINDINGS_MTK_RESET_H_ */
 | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -0,0 +1,25 @@ | |||
| From 39b0c824b56be1000844cedb5faba506b6b09b9b Mon Sep 17 00:00:00 2001 | ||||
| From: Cristian Ciobanu <cioby.service@gmail.com> | ||||
| Date: Fri, 10 Apr 2020 00:41:42 +0300 | ||||
| Subject: [PATCH] Add EXT4 support in U-boot | ||||
| 
 | ||||
| ---
 | ||||
|  configs/mt7623n_bpir2_defconfig | 5 +++++ | ||||
|  1 file changed, 5 insertions(+) | ||||
| 
 | ||||
| diff --git a/configs/mt7623n_bpir2_defconfig b/configs/mt7623n_bpir2_defconfig
 | ||||
| index 36a903cbe7..09b9b6f797 100644
 | ||||
| --- a/configs/mt7623n_bpir2_defconfig
 | ||||
| +++ b/configs/mt7623n_bpir2_defconfig
 | ||||
| @@ -83,3 +83,8 @@ CONFIG_DM_SCSI=y
 | ||||
|  CONFIG_SCSI_AHCI=y | ||||
|  CONFIG_HAVE_BLOCK_DEVICE=y | ||||
|  CONFIG_POWER_MT6323=y | ||||
| +
 | ||||
| +CONFIG_CMD_EXT4=y
 | ||||
| +CONFIG_CMD_EXT4_WRITE=y
 | ||||
| +CONFIG_FS_EXT4=y
 | ||||
| +CONFIG_EXT4_WRITE=y
 | ||||
| -- 
 | ||||
| 2.25.1 | ||||
| 
 | ||||
|  | @ -1,109 +0,0 @@ | |||
| From ab7ad2d077ef18d6d853c8838bc116fbbd0ac154 Mon Sep 17 00:00:00 2001 | ||||
| From: Weijie Gao <weijie.gao@mediatek.com> | ||||
| Date: Thu, 20 Dec 2018 16:12:52 +0800 | ||||
| Subject: clk: MediaTek: bind ethsys reset controller | ||||
| 
 | ||||
| The ethsys contains not only the clock gating controller, but also the | ||||
| reset controller for the whole ethernet subsystem and its components. | ||||
| 
 | ||||
| This patch adds binding of the reset controller so that the ethernet node | ||||
| can have references on it. | ||||
| 
 | ||||
| Signed-off-by: Weijie Gao <weijie.gao@mediatek.com> | ||||
| 
 | ||||
| diff --git a/drivers/clk/mediatek/clk-mt7623.c b/drivers/clk/mediatek/clk-mt7623.c
 | ||||
| index c6b09d8e..87ad4f79 100644
 | ||||
| --- a/drivers/clk/mediatek/clk-mt7623.c
 | ||||
| +++ b/drivers/clk/mediatek/clk-mt7623.c
 | ||||
| @@ -8,6 +8,7 @@
 | ||||
|   | ||||
|  #include <common.h> | ||||
|  #include <dm.h> | ||||
| +#include <asm/arch-mediatek/reset.h>
 | ||||
|  #include <asm/io.h> | ||||
|  #include <dt-bindings/clock/mt7623-clk.h> | ||||
|   | ||||
| @@ -782,6 +783,19 @@ static int mt7623_ethsys_probe(struct udevice *dev)
 | ||||
|  	return mtk_common_clk_gate_init(dev, &mt7623_clk_tree, eth_cgs); | ||||
|  } | ||||
|   | ||||
| +static int mt7623_ethsys_bind(struct udevice *dev)
 | ||||
| +{
 | ||||
| +	int ret = 0;
 | ||||
| +
 | ||||
| +#if CONFIG_IS_ENABLED(RESET_MEDIATEK)
 | ||||
| +	ret = mediatek_reset_bind(dev, ETHSYS_RST_CTRL_OFS, 1);
 | ||||
| +	if (ret)
 | ||||
| +		debug("Warning: failed to bind ethsys reset controller\n");
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +	return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static const struct udevice_id mt7623_apmixed_compat[] = { | ||||
|  	{ .compatible = "mediatek,mt7623-apmixedsys" }, | ||||
|  	{ } | ||||
| @@ -865,6 +879,7 @@ U_BOOT_DRIVER(mtk_clk_ethsys) = {
 | ||||
|  	.id = UCLASS_CLK, | ||||
|  	.of_match = mt7623_ethsys_compat, | ||||
|  	.probe = mt7623_ethsys_probe, | ||||
| +	.bind = mt7623_ethsys_bind,
 | ||||
|  	.priv_auto_alloc_size = sizeof(struct mtk_cg_priv), | ||||
|  	.ops = &mtk_clk_gate_ops, | ||||
|  }; | ||||
| diff --git a/drivers/clk/mediatek/clk-mt7629.c b/drivers/clk/mediatek/clk-mt7629.c
 | ||||
| index 2601b6cf..6a9f6013 100644
 | ||||
| --- a/drivers/clk/mediatek/clk-mt7629.c
 | ||||
| +++ b/drivers/clk/mediatek/clk-mt7629.c
 | ||||
| @@ -8,6 +8,7 @@
 | ||||
|   | ||||
|  #include <common.h> | ||||
|  #include <dm.h> | ||||
| +#include <asm/arch-mediatek/reset.h>
 | ||||
|  #include <asm/io.h> | ||||
|  #include <dt-bindings/clock/mt7629-clk.h> | ||||
|   | ||||
| @@ -602,6 +603,19 @@ static int mt7629_ethsys_probe(struct udevice *dev)
 | ||||
|  	return mtk_common_clk_gate_init(dev, &mt7629_clk_tree, eth_cgs); | ||||
|  } | ||||
|   | ||||
| +static int mt7629_ethsys_bind(struct udevice *dev)
 | ||||
| +{
 | ||||
| +	int ret = 0;
 | ||||
| +
 | ||||
| +#if CONFIG_IS_ENABLED(RESET_MEDIATEK)
 | ||||
| +	ret = mediatek_reset_bind(dev, ETHSYS_RST_CTRL_OFS, 1);
 | ||||
| +	if (ret)
 | ||||
| +		debug("Warning: failed to bind ethsys reset controller\n");
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +	return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static int mt7629_sgmiisys_probe(struct udevice *dev) | ||||
|  { | ||||
|  	return mtk_common_clk_gate_init(dev, &mt7629_clk_tree, sgmii_cgs); | ||||
| @@ -695,6 +709,7 @@ U_BOOT_DRIVER(mtk_clk_ethsys) = {
 | ||||
|  	.id = UCLASS_CLK, | ||||
|  	.of_match = mt7629_ethsys_compat, | ||||
|  	.probe = mt7629_ethsys_probe, | ||||
| +	.bind = mt7629_ethsys_bind,
 | ||||
|  	.priv_auto_alloc_size = sizeof(struct mtk_cg_priv), | ||||
|  	.ops = &mtk_clk_gate_ops, | ||||
|  }; | ||||
| diff --git a/drivers/clk/mediatek/clk-mtk.h b/drivers/clk/mediatek/clk-mtk.h
 | ||||
| index 74152ed9..7847388b 100644
 | ||||
| --- a/drivers/clk/mediatek/clk-mtk.h
 | ||||
| +++ b/drivers/clk/mediatek/clk-mtk.h
 | ||||
| @@ -23,6 +23,8 @@
 | ||||
|  #define CLK_PARENT_TOPCKGEN		BIT(5) | ||||
|  #define CLK_PARENT_MASK			GENMASK(5, 4) | ||||
|   | ||||
| +#define ETHSYS_RST_CTRL_OFS		0x34
 | ||||
| +
 | ||||
|  /* struct mtk_pll_data - hardware-specific PLLs data */ | ||||
|  struct mtk_pll_data { | ||||
|  	const int id; | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -1,76 +0,0 @@ | |||
| From fbdf1c37235d4a5a50eaafff41cacff4fd3a6e9f Mon Sep 17 00:00:00 2001 | ||||
| From: Weijie Gao <weijie.gao@mediatek.com> | ||||
| Date: Thu, 20 Dec 2018 16:12:54 +0800 | ||||
| Subject: arm: dts: add ethernet related node for MT7623 SoC | ||||
| 
 | ||||
| This patch adds ethernet gmac node for MT7623 with MT7530 gigabit switch. | ||||
| 
 | ||||
| Signed-off-by: Mark Lee <Mark-MC.Lee@mediatek.com> | ||||
| 
 | ||||
| diff --git a/arch/arm/dts/mt7623.dtsi b/arch/arm/dts/mt7623.dtsi
 | ||||
| index f50f4ef1..448d1d73 100644
 | ||||
| --- a/arch/arm/dts/mt7623.dtsi
 | ||||
| +++ b/arch/arm/dts/mt7623.dtsi
 | ||||
| @@ -10,6 +10,7 @@
 | ||||
|  #include <dt-bindings/interrupt-controller/irq.h> | ||||
|  #include <dt-bindings/interrupt-controller/arm-gic.h> | ||||
|  #include <dt-bindings/power/mt7623-power.h> | ||||
| +#include <dt-bindings/reset/mtk-reset.h>
 | ||||
|  #include "skeleton.dtsi" | ||||
|   | ||||
|  / { | ||||
| @@ -248,8 +249,26 @@
 | ||||
|  	}; | ||||
|   | ||||
|  	ethsys: syscon@1b000000 { | ||||
| -		compatible = "mediatek,mt7623-ethsys";
 | ||||
| +		compatible = "mediatek,mt7623-ethsys", "syscon";
 | ||||
|  		reg = <0x1b000000 0x1000>; | ||||
|  		#clock-cells = <1>; | ||||
| +		#reset-cells = <1>;
 | ||||
| +	};
 | ||||
| +
 | ||||
| +	eth: ethernet@1b100000 {
 | ||||
| +		compatible = "mediatek,mt7623-eth", "syscon";
 | ||||
| +		reg = <0x1b100000 0x20000>;
 | ||||
| +		clocks = <&topckgen CLK_TOP_ETHIF_SEL>,
 | ||||
| +			 <ðsys CLK_ETHSYS_ESW>,
 | ||||
| +			 <ðsys CLK_ETHSYS_GP1>,
 | ||||
| +			 <ðsys CLK_ETHSYS_GP2>,
 | ||||
| +			 <&apmixedsys CLK_APMIXED_TRGPLL>;
 | ||||
| +		clock-names = "ethif", "esw", "gp1", "gp2", "trgpll";
 | ||||
| +		power-domains = <&scpsys MT7623_POWER_DOMAIN_ETH>;
 | ||||
| +		resets = <ðsys ETHSYS_FE_RST>,
 | ||||
| +			 <ðsys ETHSYS_MCM_RST>;
 | ||||
| +		reset-names = "fe", "mcm";
 | ||||
| +		mediatek,ethsys = <ðsys>;
 | ||||
| +		status = "disabled";
 | ||||
|  	}; | ||||
|  }; | ||||
| diff --git a/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts b/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts
 | ||||
| index 84a77fde..51628bb6 100644
 | ||||
| --- a/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts
 | ||||
| +++ b/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts
 | ||||
| @@ -67,6 +67,19 @@
 | ||||
|  	}; | ||||
|  }; | ||||
|   | ||||
| +ð {
 | ||||
| +	status = "okay";
 | ||||
| +	mediatek,gmac-id = <0>;
 | ||||
| +	phy-mode = "rgmii";
 | ||||
| +	mediatek,switch = "mt7530";
 | ||||
| +	reset-gpios = <&gpio 33 GPIO_ACTIVE_HIGH>;
 | ||||
| +
 | ||||
| +	fixed-link {
 | ||||
| +		speed = <1000>;
 | ||||
| +		full-duplex;
 | ||||
| +	};
 | ||||
| +};
 | ||||
| +
 | ||||
|  &mmc0 { | ||||
|  	pinctrl-names = "default"; | ||||
|  	pinctrl-0 = <&mmc0_pins_default>; | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,95 +0,0 @@ | |||
| From 038e3dc3801007f5025a2e57bb4b715c48b9590d Mon Sep 17 00:00:00 2001 | ||||
| From: Weijie Gao <weijie.gao@mediatek.com> | ||||
| Date: Thu, 20 Dec 2018 16:12:55 +0800 | ||||
| Subject: arm: dts: add ethernet related node for MT7629 SoC | ||||
| 
 | ||||
| This patch adds ethernet gmac node for MT7629 with internal gigabit phy. | ||||
| 
 | ||||
| Signed-off-by: Mark Lee <Mark-MC.Lee@mediatek.com> | ||||
| 
 | ||||
| diff --git a/arch/arm/dts/mt7629-rfb.dts b/arch/arm/dts/mt7629-rfb.dts
 | ||||
| index a6d28a06..95d10aa6 100644
 | ||||
| --- a/arch/arm/dts/mt7629-rfb.dts
 | ||||
| +++ b/arch/arm/dts/mt7629-rfb.dts
 | ||||
| @@ -22,6 +22,17 @@
 | ||||
|  	}; | ||||
|  }; | ||||
|   | ||||
| +ð {
 | ||||
| +	status = "okay";
 | ||||
| +	mediatek,gmac-id = <1>;
 | ||||
| +	phy-mode = "gmii";
 | ||||
| +	phy-handle = <&phy0>;
 | ||||
| +
 | ||||
| +	phy0: ethernet-phy@0 {
 | ||||
| +		reg = <0>;
 | ||||
| +	};
 | ||||
| +};
 | ||||
| +
 | ||||
|  &pinctrl { | ||||
|  	qspi_pins: qspi-pins { | ||||
|  		mux { | ||||
| diff --git a/arch/arm/dts/mt7629.dtsi b/arch/arm/dts/mt7629.dtsi
 | ||||
| index e6052bbd..c87115e0 100644
 | ||||
| --- a/arch/arm/dts/mt7629.dtsi
 | ||||
| +++ b/arch/arm/dts/mt7629.dtsi
 | ||||
| @@ -10,6 +10,7 @@
 | ||||
|  #include <dt-bindings/interrupt-controller/irq.h> | ||||
|  #include <dt-bindings/interrupt-controller/arm-gic.h> | ||||
|  #include <dt-bindings/power/mt7629-power.h> | ||||
| +#include <dt-bindings/reset/mtk-reset.h>
 | ||||
|  #include "skeleton.dtsi" | ||||
|   | ||||
|  / { | ||||
| @@ -228,6 +229,48 @@
 | ||||
|  		compatible = "mediatek,mt7629-ethsys", "syscon"; | ||||
|  		reg = <0x1b000000 0x1000>; | ||||
|  		#clock-cells = <1>; | ||||
| +		#reset-cells = <1>;
 | ||||
| +	};
 | ||||
| +
 | ||||
| +	eth: ethernet@1b100000 {
 | ||||
| +		compatible = "mediatek,mt7629-eth", "syscon";
 | ||||
| +		reg = <0x1b100000 0x20000>;
 | ||||
| +		clocks = <&topckgen CLK_TOP_ETH_SEL>,
 | ||||
| +			<&topckgen CLK_TOP_F10M_REF_SEL>,
 | ||||
| +			<ðsys CLK_ETH_ESW_EN>,
 | ||||
| +			<ðsys CLK_ETH_GP0_EN>,
 | ||||
| +			<ðsys CLK_ETH_GP1_EN>,
 | ||||
| +			<ðsys CLK_ETH_GP2_EN>,
 | ||||
| +			<ðsys CLK_ETH_FE_EN>,
 | ||||
| +			<&sgmiisys0 CLK_SGMII_TX_EN>,
 | ||||
| +			<&sgmiisys0 CLK_SGMII_RX_EN>,
 | ||||
| +			<&sgmiisys0 CLK_SGMII_CDR_REF>,
 | ||||
| +			<&sgmiisys0 CLK_SGMII_CDR_FB>,
 | ||||
| +			<&sgmiisys1 CLK_SGMII_TX_EN>,
 | ||||
| +			<&sgmiisys1 CLK_SGMII_RX_EN>,
 | ||||
| +			<&sgmiisys1 CLK_SGMII_CDR_REF>,
 | ||||
| +			<&sgmiisys1 CLK_SGMII_CDR_FB>,
 | ||||
| +			<&apmixedsys CLK_APMIXED_SGMIPLL>,
 | ||||
| +			<&apmixedsys CLK_APMIXED_ETH2PLL>;
 | ||||
| +		clock-names = "ethif", "sgmiitop", "esw", "gp0", "gp1", "gp2",
 | ||||
| +				"fe", "sgmii_tx250m", "sgmii_rx250m",
 | ||||
| +				"sgmii_cdr_ref", "sgmii_cdr_fb",
 | ||||
| +				"sgmii2_tx250m", "sgmii2_rx250m",
 | ||||
| +				"sgmii2_cdr_ref", "sgmii2_cdr_fb",
 | ||||
| +				"sgmii_ck", "eth2pll";
 | ||||
| +		assigned-clocks = <&topckgen CLK_TOP_ETH_SEL>,
 | ||||
| +				  <&topckgen CLK_TOP_F10M_REF_SEL>;
 | ||||
| +		assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL1_D2>,
 | ||||
| +					 <&topckgen CLK_TOP_SGMIIPLL_D2>;
 | ||||
| +		power-domains = <&scpsys MT7629_POWER_DOMAIN_ETHSYS>;
 | ||||
| +		resets = <ðsys ETHSYS_FE_RST>;
 | ||||
| +		reset-names = "fe";
 | ||||
| +		mediatek,ethsys = <ðsys>;
 | ||||
| +		mediatek,sgmiisys = <&sgmiisys0>;
 | ||||
| +		mediatek,infracfg = <&infracfg>;
 | ||||
| +		#address-cells = <1>;
 | ||||
| +		#size-cells = <0>;
 | ||||
| +		status = "disabled";
 | ||||
|  	}; | ||||
|   | ||||
|  	sgmiisys0: syscon@1b128000 { | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,59 +0,0 @@ | |||
| From 8da1e0fd083f4c6a71f6735c06698e71250bcc07 Mon Sep 17 00:00:00 2001 | ||||
| From: Weijie Gao <weijie.gao@mediatek.com> | ||||
| Date: Thu, 20 Dec 2018 16:12:56 +0800 | ||||
| Subject: arm: MediaTek: add ethernet support for MT7623 boards | ||||
| 
 | ||||
| Enable ethernet related configs to mt7623n_bpir2_defconfig. | ||||
| Add default IP addresses. | ||||
| Enable noncached memory region required by ethernet driver. | ||||
| 
 | ||||
| Signed-off-by: Mark Lee <Mark-MC.Lee@mediatek.com> | ||||
| 
 | ||||
| diff --git a/configs/mt7623n_bpir2_defconfig b/configs/mt7623n_bpir2_defconfig
 | ||||
| index 74252cd0..bb67f328 100644
 | ||||
| --- a/configs/mt7623n_bpir2_defconfig
 | ||||
| +++ b/configs/mt7623n_bpir2_defconfig
 | ||||
| @@ -29,6 +29,7 @@ CONFIG_CMD_FAT=y
 | ||||
|  CONFIG_CMD_FS_GENERIC=y | ||||
|  CONFIG_OF_EMBED=y | ||||
|  CONFIG_DEFAULT_DEVICE_TREE="mt7623n-bananapi-bpi-r2" | ||||
| +CONFIG_NET_RANDOM_ETHADDR=y
 | ||||
|  CONFIG_REGMAP=y | ||||
|  CONFIG_SYSCON=y | ||||
|  # CONFIG_BLOCK_CACHE is not set | ||||
| @@ -38,6 +39,11 @@ CONFIG_DM_MMC=y
 | ||||
|  # CONFIG_MMC_QUIRKS is not set | ||||
|  CONFIG_MMC_HS400_SUPPORT=y | ||||
|  CONFIG_MMC_MTK=y | ||||
| +CONFIG_DM_RESET=y
 | ||||
| +CONFIG_RESET_MEDIATEK=y
 | ||||
| +CONFIG_PHY_FIXED=y
 | ||||
| +CONFIG_DM_ETH=y
 | ||||
| +CONFIG_MEDIATEK_ETH=y
 | ||||
|  CONFIG_PINCTRL=y | ||||
|  CONFIG_PINCONF=y | ||||
|  CONFIG_PINCTRL_MT7623=y | ||||
| diff --git a/include/configs/mt7623.h b/include/configs/mt7623.h
 | ||||
| index fb6ac073..7d26debb 100644
 | ||||
| --- a/include/configs/mt7623.h
 | ||||
| +++ b/include/configs/mt7623.h
 | ||||
| @@ -24,6 +24,7 @@
 | ||||
|   | ||||
|  /* Size of malloc() pool */ | ||||
|  #define CONFIG_SYS_MALLOC_LEN		SZ_4M | ||||
| +#define CONFIG_SYS_NONCACHED_MEMORY	SZ_1M
 | ||||
|   | ||||
|  /* Environment */ | ||||
|  #define CONFIG_ENV_SIZE			SZ_4K | ||||
| @@ -56,4 +57,8 @@
 | ||||
|  #define CONFIG_SYS_MMC_ENV_DEV	0 | ||||
|  #define CONFIG_ENV_OFFSET	0x100000 | ||||
|   | ||||
| +/* Ethernet */
 | ||||
| +#define CONFIG_IPADDR		192.168.1.1
 | ||||
| +#define CONFIG_SERVERIP		192.168.1.2
 | ||||
| +
 | ||||
|  #endif | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,58 +0,0 @@ | |||
| From 0fcb7ab842170e1ea7e9bf4d309af584b1e54388 Mon Sep 17 00:00:00 2001 | ||||
| From: Weijie Gao <weijie.gao@mediatek.com> | ||||
| Date: Thu, 20 Dec 2018 16:12:57 +0800 | ||||
| Subject: arm: MediaTek: add ethernet support for MT7629 boards | ||||
| 
 | ||||
| Enable ethernet related configs to mt7629_rfb_defconfig. | ||||
| Add default IP addresses. | ||||
| Enable noncached memory region required by ethernet driver. | ||||
| 
 | ||||
| Signed-off-by: Mark Lee <Mark-MC.Lee@mediatek.com> | ||||
| 
 | ||||
| diff --git a/configs/mt7629_rfb_defconfig b/configs/mt7629_rfb_defconfig
 | ||||
| index 1729d13c..fdd5f575 100644
 | ||||
| --- a/configs/mt7629_rfb_defconfig
 | ||||
| +++ b/configs/mt7629_rfb_defconfig
 | ||||
| @@ -32,6 +32,7 @@ CONFIG_CMD_PING=y
 | ||||
|  CONFIG_OF_EMBED=y | ||||
|  CONFIG_DEFAULT_DEVICE_TREE="mt7629-rfb" | ||||
|  CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-parents" | ||||
| +CONFIG_NET_RANDOM_ETHADDR=y
 | ||||
|  CONFIG_SPL_DM_SEQ_ALIAS=y | ||||
|  CONFIG_REGMAP=y | ||||
|  CONFIG_SPL_REGMAP=y | ||||
| @@ -51,6 +52,10 @@ CONFIG_SPI_FLASH_MACRONIX=y
 | ||||
|  CONFIG_SPI_FLASH_SPANSION=y | ||||
|  CONFIG_SPI_FLASH_STMICRO=y | ||||
|  CONFIG_SPI_FLASH_WINBOND=y | ||||
| +CONFIG_DM_RESET=y
 | ||||
| +CONFIG_RESET_MEDIATEK=y
 | ||||
| +CONFIG_DM_ETH=y
 | ||||
| +CONFIG_MEDIATEK_ETH=y
 | ||||
|  CONFIG_PINCTRL=y | ||||
|  CONFIG_PINCONF=y | ||||
|  CONFIG_PINCTRL_MT7629=y | ||||
| diff --git a/include/configs/mt7629.h b/include/configs/mt7629.h
 | ||||
| index a665a5eb..9910d8c8 100644
 | ||||
| --- a/include/configs/mt7629.h
 | ||||
| +++ b/include/configs/mt7629.h
 | ||||
| @@ -24,6 +24,7 @@
 | ||||
|   | ||||
|  /* Size of malloc() pool */ | ||||
|  #define CONFIG_SYS_MALLOC_LEN		SZ_4M | ||||
| +#define CONFIG_SYS_NONCACHED_MEMORY	SZ_1M
 | ||||
|   | ||||
|  /* Environment */ | ||||
|  #define CONFIG_ENV_SIZE			SZ_4K | ||||
| @@ -54,4 +55,8 @@
 | ||||
|  /* DRAM */ | ||||
|  #define CONFIG_SYS_SDRAM_BASE		0x40000000 | ||||
|   | ||||
| +/* Ethernet */
 | ||||
| +#define CONFIG_IPADDR			192.168.1.1
 | ||||
| +#define CONFIG_SERVERIP			192.168.1.2
 | ||||
| +
 | ||||
|  #endif | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,25 +0,0 @@ | |||
| From 31ca82655b5f623303e45508a820205b071df258 Mon Sep 17 00:00:00 2001 | ||||
| From: Weijie Gao <weijie.gao@mediatek.com> | ||||
| Date: Thu, 20 Dec 2018 16:12:58 +0800 | ||||
| Subject: MAINTAINERS: ARM MEDIATEK: update file entries | ||||
| 
 | ||||
| This patch adds new file entries for MediaTek SoCs | ||||
| 
 | ||||
| Signed-off-by: Weijie Gao <weijie.gao@mediatek.com> | ||||
| 
 | ||||
| diff --git a/MAINTAINERS b/MAINTAINERS
 | ||||
| index f86fdf9c..e192db07 100644
 | ||||
| --- a/MAINTAINERS
 | ||||
| +++ b/MAINTAINERS
 | ||||
| @@ -176,6 +176,8 @@ F:	drivers/ram/mediatek/
 | ||||
|  F:	drivers/spi/mtk_qspi.c | ||||
|  F:	drivers/timer/mtk_timer.c | ||||
|  F:	drivers/watchdog/mtk_wdt.c | ||||
| +F:	drivers/net/mtk_eth.c
 | ||||
| +F:	drivers/reset/reset-mediatek.c
 | ||||
|  F:	tools/mtk_image.c | ||||
|  F:	tools/mtk_image.h | ||||
|  N:	mediatek | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,40 +0,0 @@ | |||
| From d4b93c443372d651bd6f8b78070c54338ee35b91 Mon Sep 17 00:00:00 2001 | ||||
| From: Weijie Gao <weijie.gao@mediatek.com> | ||||
| Date: Thu, 20 Dec 2018 16:12:59 +0800 | ||||
| Subject: configs: MediaTek: use OF_SEPARATE instead of OF_EMBED | ||||
| 
 | ||||
| This patch replace OF_EMBED with OF_SEPARATE of defconfig files of | ||||
| MediaTek boards because now OF_EMBED is only used for debugging purpose. | ||||
| 
 | ||||
| Signed-off-by: Weijie Gao <weijie.gao@mediatek.com> | ||||
| Reviewed-by: Simon Glass <sjg@chromium.org> | ||||
| 
 | ||||
| diff --git a/configs/mt7623n_bpir2_defconfig b/configs/mt7623n_bpir2_defconfig
 | ||||
| index bb67f328..a9f4506e 100644
 | ||||
| --- a/configs/mt7623n_bpir2_defconfig
 | ||||
| +++ b/configs/mt7623n_bpir2_defconfig
 | ||||
| @@ -27,7 +27,7 @@ CONFIG_CMD_READ=y
 | ||||
|  CONFIG_CMD_PING=y | ||||
|  CONFIG_CMD_FAT=y | ||||
|  CONFIG_CMD_FS_GENERIC=y | ||||
| -CONFIG_OF_EMBED=y
 | ||||
| +CONFIG_OF_SEPARATE=y
 | ||||
|  CONFIG_DEFAULT_DEVICE_TREE="mt7623n-bananapi-bpi-r2" | ||||
|  CONFIG_NET_RANDOM_ETHADDR=y | ||||
|  CONFIG_REGMAP=y | ||||
| diff --git a/configs/mt7629_rfb_defconfig b/configs/mt7629_rfb_defconfig
 | ||||
| index fdd5f575..1da9932d 100644
 | ||||
| --- a/configs/mt7629_rfb_defconfig
 | ||||
| +++ b/configs/mt7629_rfb_defconfig
 | ||||
| @@ -29,7 +29,7 @@ CONFIG_CMD_SF_TEST=y
 | ||||
|  # CONFIG_CMD_NFS is not set | ||||
|  CONFIG_CMD_PING=y | ||||
|  # CONFIG_PARTITIONS is not set | ||||
| -CONFIG_OF_EMBED=y
 | ||||
| +CONFIG_OF_SEPARATE=y
 | ||||
|  CONFIG_DEFAULT_DEVICE_TREE="mt7629-rfb" | ||||
|  CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-parents" | ||||
|  CONFIG_NET_RANDOM_ETHADDR=y | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,326 +0,0 @@ | |||
| From d6755b9b0e59ea0193914e169f74df51d556fbb7 Mon Sep 17 00:00:00 2001 | ||||
| From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Date: Mon, 14 Jan 2019 22:38:14 +0100 | ||||
| Subject: test: add test for lib/lmb.c | ||||
| 
 | ||||
| Add basic tests for the lmb memory allocation code used to reserve and | ||||
| allocate memory during boot. | ||||
| 
 | ||||
| Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Reviewed-by: Simon Glass <sjg@chromium.org> | ||||
| 
 | ||||
| diff --git a/test/lib/Makefile b/test/lib/Makefile
 | ||||
| index ea68fae5..5a636aac 100644
 | ||||
| --- a/test/lib/Makefile
 | ||||
| +++ b/test/lib/Makefile
 | ||||
| @@ -3,3 +3,4 @@
 | ||||
|  # (C) Copyright 2018 | ||||
|  # Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc | ||||
|  obj-y += hexdump.o | ||||
| +obj-y += lmb.o
 | ||||
| diff --git a/test/lib/lmb.c b/test/lib/lmb.c
 | ||||
| new file mode 100644 | ||||
| index 00000000..dd7ba14b
 | ||||
| --- /dev/null
 | ||||
| +++ b/test/lib/lmb.c
 | ||||
| @@ -0,0 +1,297 @@
 | ||||
| +// SPDX-License-Identifier: GPL-2.0+
 | ||||
| +/*
 | ||||
| + * (C) Copyright 2018 Simon Goldschmidt
 | ||||
| + */
 | ||||
| +
 | ||||
| +#include <common.h>
 | ||||
| +#include <lmb.h>
 | ||||
| +#include <dm/test.h>
 | ||||
| +#include <test/ut.h>
 | ||||
| +
 | ||||
| +static int check_lmb(struct unit_test_state *uts, struct lmb *lmb,
 | ||||
| +		     phys_addr_t ram_base, phys_size_t ram_size,
 | ||||
| +		     unsigned long num_reserved,
 | ||||
| +		     phys_addr_t base1, phys_size_t size1,
 | ||||
| +		     phys_addr_t base2, phys_size_t size2,
 | ||||
| +		     phys_addr_t base3, phys_size_t size3)
 | ||||
| +{
 | ||||
| +	ut_asserteq(lmb->memory.cnt, 1);
 | ||||
| +	ut_asserteq(lmb->memory.region[0].base, ram_base);
 | ||||
| +	ut_asserteq(lmb->memory.region[0].size, ram_size);
 | ||||
| +
 | ||||
| +	ut_asserteq(lmb->reserved.cnt, num_reserved);
 | ||||
| +	if (num_reserved > 0) {
 | ||||
| +		ut_asserteq(lmb->reserved.region[0].base, base1);
 | ||||
| +		ut_asserteq(lmb->reserved.region[0].size, size1);
 | ||||
| +	}
 | ||||
| +	if (num_reserved > 1) {
 | ||||
| +		ut_asserteq(lmb->reserved.region[1].base, base2);
 | ||||
| +		ut_asserteq(lmb->reserved.region[1].size, size2);
 | ||||
| +	}
 | ||||
| +	if (num_reserved > 2) {
 | ||||
| +		ut_asserteq(lmb->reserved.region[2].base, base3);
 | ||||
| +		ut_asserteq(lmb->reserved.region[2].size, size3);
 | ||||
| +	}
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +#define ASSERT_LMB(lmb, ram_base, ram_size, num_reserved, base1, size1, \
 | ||||
| +		   base2, size2, base3, size3) \
 | ||||
| +		   ut_assert(!check_lmb(uts, lmb, ram_base, ram_size, \
 | ||||
| +			     num_reserved, base1, size1, base2, size2, base3, \
 | ||||
| +			     size3))
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * Test helper function that reserves 64 KiB somewhere in the simulated RAM and
 | ||||
| + * then does some alloc + free tests.
 | ||||
| + */
 | ||||
| +static int test_multi_alloc(struct unit_test_state *uts,
 | ||||
| +			    const phys_addr_t ram, const phys_size_t ram_size,
 | ||||
| +			    const phys_addr_t alloc_64k_addr)
 | ||||
| +{
 | ||||
| +	const phys_addr_t ram_end = ram + ram_size;
 | ||||
| +	const phys_addr_t alloc_64k_end = alloc_64k_addr + 0x10000;
 | ||||
| +
 | ||||
| +	struct lmb lmb;
 | ||||
| +	long ret;
 | ||||
| +	phys_addr_t a, a2, b, b2, c, d;
 | ||||
| +
 | ||||
| +	/* check for overflow */
 | ||||
| +	ut_assert(ram_end == 0 || ram_end > ram);
 | ||||
| +	ut_assert(alloc_64k_end > alloc_64k_addr);
 | ||||
| +	/* check input addresses + size */
 | ||||
| +	ut_assert(alloc_64k_addr >= ram + 8);
 | ||||
| +	ut_assert(alloc_64k_end <= ram_end - 8);
 | ||||
| +
 | ||||
| +	lmb_init(&lmb);
 | ||||
| +
 | ||||
| +	ret = lmb_add(&lmb, ram, ram_size);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +
 | ||||
| +	/* reserve 64KiB somewhere */
 | ||||
| +	ret = lmb_reserve(&lmb, alloc_64k_addr, 0x10000);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, alloc_64k_addr, 0x10000,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	/* allocate somewhere, should be at the end of RAM */
 | ||||
| +	a = lmb_alloc(&lmb, 4, 1);
 | ||||
| +	ut_asserteq(a, ram_end - 4);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2, alloc_64k_addr, 0x10000,
 | ||||
| +		   ram_end - 4, 4, 0, 0);
 | ||||
| +	/* alloc below end of reserved region -> below reserved region */
 | ||||
| +	b = lmb_alloc_base(&lmb, 4, 1, alloc_64k_end);
 | ||||
| +	ut_asserteq(b, alloc_64k_addr - 4);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2,
 | ||||
| +		   alloc_64k_addr - 4, 0x10000 + 4, ram_end - 4, 4, 0, 0);
 | ||||
| +
 | ||||
| +	/* 2nd time */
 | ||||
| +	c = lmb_alloc(&lmb, 4, 1);
 | ||||
| +	ut_asserteq(c, ram_end - 8);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2,
 | ||||
| +		   alloc_64k_addr - 4, 0x10000 + 4, ram_end - 8, 8, 0, 0);
 | ||||
| +	d = lmb_alloc_base(&lmb, 4, 1, alloc_64k_end);
 | ||||
| +	ut_asserteq(d, alloc_64k_addr - 8);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2,
 | ||||
| +		   alloc_64k_addr - 8, 0x10000 + 8, ram_end - 8, 8, 0, 0);
 | ||||
| +
 | ||||
| +	ret = lmb_free(&lmb, a, 4);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2,
 | ||||
| +		   alloc_64k_addr - 8, 0x10000 + 8, ram_end - 8, 4, 0, 0);
 | ||||
| +	/* allocate again to ensure we get the same address */
 | ||||
| +	a2 = lmb_alloc(&lmb, 4, 1);
 | ||||
| +	ut_asserteq(a, a2);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2,
 | ||||
| +		   alloc_64k_addr - 8, 0x10000 + 8, ram_end - 8, 8, 0, 0);
 | ||||
| +	ret = lmb_free(&lmb, a2, 4);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2,
 | ||||
| +		   alloc_64k_addr - 8, 0x10000 + 8, ram_end - 8, 4, 0, 0);
 | ||||
| +
 | ||||
| +	ret = lmb_free(&lmb, b, 4);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 3,
 | ||||
| +		   alloc_64k_addr - 8, 4, alloc_64k_addr, 0x10000,
 | ||||
| +		   ram_end - 8, 4);
 | ||||
| +	/* allocate again to ensure we get the same address */
 | ||||
| +	b2 = lmb_alloc_base(&lmb, 4, 1, alloc_64k_end);
 | ||||
| +	ut_asserteq(b, b2);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2,
 | ||||
| +		   alloc_64k_addr - 8, 0x10000 + 8, ram_end - 8, 4, 0, 0);
 | ||||
| +	ret = lmb_free(&lmb, b2, 4);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 3,
 | ||||
| +		   alloc_64k_addr - 8, 4, alloc_64k_addr, 0x10000,
 | ||||
| +		   ram_end - 8, 4);
 | ||||
| +
 | ||||
| +	ret = lmb_free(&lmb, c, 4);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2,
 | ||||
| +		   alloc_64k_addr - 8, 4, alloc_64k_addr, 0x10000, 0, 0);
 | ||||
| +	ret = lmb_free(&lmb, d, 4);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, alloc_64k_addr, 0x10000,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int test_multi_alloc_512mb(struct unit_test_state *uts,
 | ||||
| +				  const phys_addr_t ram)
 | ||||
| +{
 | ||||
| +	return test_multi_alloc(uts, ram, 0x20000000, ram + 0x10000000);
 | ||||
| +}
 | ||||
| +
 | ||||
| +/* Create a memory region with one reserved region and allocate */
 | ||||
| +static int lib_test_lmb_simple(struct unit_test_state *uts)
 | ||||
| +{
 | ||||
| +	/* simulate 512 MiB RAM beginning at 1GiB */
 | ||||
| +	return test_multi_alloc_512mb(uts, 0x40000000);
 | ||||
| +}
 | ||||
| +
 | ||||
| +DM_TEST(lib_test_lmb_simple, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 | ||||
| +
 | ||||
| +/* Simulate 512 MiB RAM, allocate some blocks that fit/don't fit */
 | ||||
| +static int test_bigblock(struct unit_test_state *uts, const phys_addr_t ram)
 | ||||
| +{
 | ||||
| +	const phys_size_t ram_size = 0x20000000;
 | ||||
| +	const phys_size_t big_block_size = 0x10000000;
 | ||||
| +	const phys_addr_t ram_end = ram + ram_size;
 | ||||
| +	const phys_addr_t alloc_64k_addr = ram + 0x10000000;
 | ||||
| +	struct lmb lmb;
 | ||||
| +	long ret;
 | ||||
| +	phys_addr_t a, b;
 | ||||
| +
 | ||||
| +	/* check for overflow */
 | ||||
| +	ut_assert(ram_end == 0 || ram_end > ram);
 | ||||
| +
 | ||||
| +	lmb_init(&lmb);
 | ||||
| +
 | ||||
| +	ret = lmb_add(&lmb, ram, ram_size);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +
 | ||||
| +	/* reserve 64KiB in the middle of RAM */
 | ||||
| +	ret = lmb_reserve(&lmb, alloc_64k_addr, 0x10000);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, alloc_64k_addr, 0x10000,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	/* allocate a big block, should be below reserved */
 | ||||
| +	a = lmb_alloc(&lmb, big_block_size, 1);
 | ||||
| +	ut_asserteq(a, ram);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, a,
 | ||||
| +		   big_block_size + 0x10000, 0, 0, 0, 0);
 | ||||
| +	/* allocate 2nd big block */
 | ||||
| +	/* This should fail, printing an error */
 | ||||
| +	b = lmb_alloc(&lmb, big_block_size, 1);
 | ||||
| +	ut_asserteq(b, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, a,
 | ||||
| +		   big_block_size + 0x10000, 0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	ret = lmb_free(&lmb, a, big_block_size);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, alloc_64k_addr, 0x10000,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	/* allocate too big block */
 | ||||
| +	/* This should fail, printing an error */
 | ||||
| +	a = lmb_alloc(&lmb, ram_size, 1);
 | ||||
| +	ut_asserteq(a, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, alloc_64k_addr, 0x10000,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int lib_test_lmb_big(struct unit_test_state *uts)
 | ||||
| +{
 | ||||
| +	return test_bigblock(uts, 0x40000000);
 | ||||
| +}
 | ||||
| +
 | ||||
| +DM_TEST(lib_test_lmb_big, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 | ||||
| +
 | ||||
| +/* Simulate 512 MiB RAM, allocate a block without previous reservation */
 | ||||
| +static int test_noreserved(struct unit_test_state *uts, const phys_addr_t ram)
 | ||||
| +{
 | ||||
| +	const phys_size_t ram_size = 0x20000000;
 | ||||
| +	const phys_addr_t ram_end = ram + ram_size;
 | ||||
| +	struct lmb lmb;
 | ||||
| +	long ret;
 | ||||
| +	phys_addr_t a, b;
 | ||||
| +
 | ||||
| +	/* check for overflow */
 | ||||
| +	ut_assert(ram_end == 0 || ram_end > ram);
 | ||||
| +
 | ||||
| +	lmb_init(&lmb);
 | ||||
| +
 | ||||
| +	ret = lmb_add(&lmb, ram, ram_size);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +
 | ||||
| +	/* allocate a block */
 | ||||
| +	a = lmb_alloc(&lmb, 4, 1);
 | ||||
| +	ut_assert(a != 0);
 | ||||
| +	/* and free it */
 | ||||
| +	ret = lmb_free(&lmb, a, 4);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +
 | ||||
| +	/* allocate a block with base*/
 | ||||
| +	b = lmb_alloc_base(&lmb, 4, 1, ram_end);
 | ||||
| +	ut_assert(a == b);
 | ||||
| +	/* and free it */
 | ||||
| +	ret = lmb_free(&lmb, b, 4);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int lib_test_lmb_noreserved(struct unit_test_state *uts)
 | ||||
| +{
 | ||||
| +	return test_noreserved(uts, 0x40000000);
 | ||||
| +}
 | ||||
| +
 | ||||
| +DM_TEST(lib_test_lmb_noreserved, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * Simulate a RAM that starts at 0 and allocate down to address 0, which must
 | ||||
| + * fail as '0' means failure for the lmb_alloc functions.
 | ||||
| + */
 | ||||
| +static int lib_test_lmb_at_0(struct unit_test_state *uts)
 | ||||
| +{
 | ||||
| +	const phys_addr_t ram = 0;
 | ||||
| +	const phys_size_t ram_size = 0x20000000;
 | ||||
| +	struct lmb lmb;
 | ||||
| +	long ret;
 | ||||
| +	phys_addr_t a, b;
 | ||||
| +
 | ||||
| +	lmb_init(&lmb);
 | ||||
| +
 | ||||
| +	ret = lmb_add(&lmb, ram, ram_size);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +
 | ||||
| +	/* allocate nearly everything */
 | ||||
| +	a = lmb_alloc(&lmb, ram_size - 4, 1);
 | ||||
| +	ut_asserteq(a, ram + 4);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, a, ram_size - 4,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +	/* allocate the rest */
 | ||||
| +	/* This should fail as the allocated address would be 0 */
 | ||||
| +	b = lmb_alloc(&lmb, 4, 1);
 | ||||
| +	ut_asserteq(b, 0);
 | ||||
| +	/* check that this was an error by checking lmb */
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, a, ram_size - 4,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +	/* check that this was an error by freeing b */
 | ||||
| +	ret = lmb_free(&lmb, b, 4);
 | ||||
| +	ut_asserteq(ret, -1);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, a, ram_size - 4,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	ret = lmb_free(&lmb, a, ram_size - 4);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 0, 0, 0, 0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +DM_TEST(lib_test_lmb_at_0, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,157 +0,0 @@ | |||
| From 8d8854693b9a288c6dbcf5382e74e6ce05839b33 Mon Sep 17 00:00:00 2001 | ||||
| From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Date: Mon, 14 Jan 2019 22:38:15 +0100 | ||||
| Subject: lmb: fix allocation at end of address range | ||||
| 
 | ||||
| The lmb code fails if base + size of RAM overflows to zero. | ||||
| 
 | ||||
| Fix this by calculating end as 'base + size - 1' instead of 'base + size' | ||||
| where appropriate. | ||||
| 
 | ||||
| Added tests to assert this is fixed. | ||||
| 
 | ||||
| Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| 
 | ||||
| diff --git a/lib/lmb.c b/lib/lmb.c
 | ||||
| index 17054173..6d3dcf4e 100644
 | ||||
| --- a/lib/lmb.c
 | ||||
| +++ b/lib/lmb.c
 | ||||
| @@ -43,7 +43,10 @@ void lmb_dump_all(struct lmb *lmb)
 | ||||
|  static long lmb_addrs_overlap(phys_addr_t base1, | ||||
|  		phys_size_t size1, phys_addr_t base2, phys_size_t size2) | ||||
|  { | ||||
| -	return ((base1 < (base2+size2)) && (base2 < (base1+size1)));
 | ||||
| +	const phys_addr_t base1_end = base1 + size1 - 1;
 | ||||
| +	const phys_addr_t base2_end = base2 + size2 - 1;
 | ||||
| +
 | ||||
| +	return ((base1 <= base2_end) && (base2 <= base1_end));
 | ||||
|  } | ||||
|   | ||||
|  static long lmb_addrs_adjacent(phys_addr_t base1, phys_size_t size1, | ||||
| @@ -89,18 +92,9 @@ static void lmb_coalesce_regions(struct lmb_region *rgn,
 | ||||
|   | ||||
|  void lmb_init(struct lmb *lmb) | ||||
|  { | ||||
| -	/* Create a dummy zero size LMB which will get coalesced away later.
 | ||||
| -	 * This simplifies the lmb_add() code below...
 | ||||
| -	 */
 | ||||
| -	lmb->memory.region[0].base = 0;
 | ||||
| -	lmb->memory.region[0].size = 0;
 | ||||
| -	lmb->memory.cnt = 1;
 | ||||
| +	lmb->memory.cnt = 0;
 | ||||
|  	lmb->memory.size = 0; | ||||
| -
 | ||||
| -	/* Ditto. */
 | ||||
| -	lmb->reserved.region[0].base = 0;
 | ||||
| -	lmb->reserved.region[0].size = 0;
 | ||||
| -	lmb->reserved.cnt = 1;
 | ||||
| +	lmb->reserved.cnt = 0;
 | ||||
|  	lmb->reserved.size = 0; | ||||
|  } | ||||
|   | ||||
| @@ -110,9 +104,10 @@ static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t
 | ||||
|  	unsigned long coalesced = 0; | ||||
|  	long adjacent, i; | ||||
|   | ||||
| -	if ((rgn->cnt == 1) && (rgn->region[0].size == 0)) {
 | ||||
| +	if (rgn->cnt == 0) {
 | ||||
|  		rgn->region[0].base = base; | ||||
|  		rgn->region[0].size = size; | ||||
| +		rgn->cnt = 1;
 | ||||
|  		return 0; | ||||
|  	} | ||||
|   | ||||
| @@ -183,7 +178,7 @@ long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size)
 | ||||
|  { | ||||
|  	struct lmb_region *rgn = &(lmb->reserved); | ||||
|  	phys_addr_t rgnbegin, rgnend; | ||||
| -	phys_addr_t end = base + size;
 | ||||
| +	phys_addr_t end = base + size - 1;
 | ||||
|  	int i; | ||||
|   | ||||
|  	rgnbegin = rgnend = 0; /* supress gcc warnings */ | ||||
| @@ -191,7 +186,7 @@ long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size)
 | ||||
|  	/* Find the region where (base, size) belongs to */ | ||||
|  	for (i=0; i < rgn->cnt; i++) { | ||||
|  		rgnbegin = rgn->region[i].base; | ||||
| -		rgnend = rgnbegin + rgn->region[i].size;
 | ||||
| +		rgnend = rgnbegin + rgn->region[i].size - 1;
 | ||||
|   | ||||
|  		if ((rgnbegin <= base) && (end <= rgnend)) | ||||
|  			break; | ||||
| @@ -209,7 +204,7 @@ long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size)
 | ||||
|   | ||||
|  	/* Check to see if region is matching at the front */ | ||||
|  	if (rgnbegin == base) { | ||||
| -		rgn->region[i].base = end;
 | ||||
| +		rgn->region[i].base = end + 1;
 | ||||
|  		rgn->region[i].size -= size; | ||||
|  		return 0; | ||||
|  	} | ||||
| @@ -225,7 +220,7 @@ long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size)
 | ||||
|  	 * beginging of the hole and add the region after hole. | ||||
|  	 */ | ||||
|  	rgn->region[i].size = base - rgn->region[i].base; | ||||
| -	return lmb_add_region(rgn, end, rgnend - end);
 | ||||
| +	return lmb_add_region(rgn, end + 1, rgnend - end);
 | ||||
|  } | ||||
|   | ||||
|  long lmb_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size) | ||||
| diff --git a/test/lib/lmb.c b/test/lib/lmb.c
 | ||||
| index dd7ba14b..fb7ca45e 100644
 | ||||
| --- a/test/lib/lmb.c
 | ||||
| +++ b/test/lib/lmb.c
 | ||||
| @@ -146,8 +146,15 @@ static int test_multi_alloc_512mb(struct unit_test_state *uts,
 | ||||
|  /* Create a memory region with one reserved region and allocate */ | ||||
|  static int lib_test_lmb_simple(struct unit_test_state *uts) | ||||
|  { | ||||
| +	int ret;
 | ||||
| +
 | ||||
|  	/* simulate 512 MiB RAM beginning at 1GiB */ | ||||
| -	return test_multi_alloc_512mb(uts, 0x40000000);
 | ||||
| +	ret = test_multi_alloc_512mb(uts, 0x40000000);
 | ||||
| +	if (ret)
 | ||||
| +		return ret;
 | ||||
| +
 | ||||
| +	/* simulate 512 MiB RAM beginning at 1.5GiB */
 | ||||
| +	return test_multi_alloc_512mb(uts, 0xE0000000);
 | ||||
|  } | ||||
|   | ||||
|  DM_TEST(lib_test_lmb_simple, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); | ||||
| @@ -206,7 +213,15 @@ static int test_bigblock(struct unit_test_state *uts, const phys_addr_t ram)
 | ||||
|   | ||||
|  static int lib_test_lmb_big(struct unit_test_state *uts) | ||||
|  { | ||||
| -	return test_bigblock(uts, 0x40000000);
 | ||||
| +	int ret;
 | ||||
| +
 | ||||
| +	/* simulate 512 MiB RAM beginning at 1GiB */
 | ||||
| +	ret = test_bigblock(uts, 0x40000000);
 | ||||
| +	if (ret)
 | ||||
| +		return ret;
 | ||||
| +
 | ||||
| +	/* simulate 512 MiB RAM beginning at 1.5GiB */
 | ||||
| +	return test_bigblock(uts, 0xE0000000);
 | ||||
|  } | ||||
|   | ||||
|  DM_TEST(lib_test_lmb_big, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); | ||||
| @@ -247,7 +262,15 @@ static int test_noreserved(struct unit_test_state *uts, const phys_addr_t ram)
 | ||||
|   | ||||
|  static int lib_test_lmb_noreserved(struct unit_test_state *uts) | ||||
|  { | ||||
| -	return test_noreserved(uts, 0x40000000);
 | ||||
| +	int ret;
 | ||||
| +
 | ||||
| +	/* simulate 512 MiB RAM beginning at 1GiB */
 | ||||
| +	ret = test_noreserved(uts, 0x40000000);
 | ||||
| +	if (ret)
 | ||||
| +		return ret;
 | ||||
| +
 | ||||
| +	/* simulate 512 MiB RAM beginning at 1.5GiB */
 | ||||
| +	return test_noreserved(uts, 0xE0000000);
 | ||||
|  } | ||||
|   | ||||
|  DM_TEST(lib_test_lmb_noreserved, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,208 +0,0 @@ | |||
| From 0b66765ffcdc995177753b7e6607be477593041e Mon Sep 17 00:00:00 2001 | ||||
| From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Date: Mon, 14 Jan 2019 22:38:16 +0100 | ||||
| Subject: lib: lmb: reserving overlapping regions should fail | ||||
| 
 | ||||
| lmb_add_region handles overlapping regions wrong: instead of merging | ||||
| or rejecting to add a new reserved region that overlaps an existing | ||||
| one, it just adds the new region. | ||||
| 
 | ||||
| Since internally the same function is used for lmb_alloc, change | ||||
| lmb_add_region to reject overlapping regions. | ||||
| 
 | ||||
| Also, to keep reserved memory correct after 'free', reserved entries | ||||
| created by allocating memory must not set their size to a multiple | ||||
| of alignment but to the original size. This ensures the reserved | ||||
| region is completely removed when the caller calls 'lmb_free', as | ||||
| this one takes the same size as passed to 'lmb_alloc' etc. | ||||
| 
 | ||||
| Add test to assert this. | ||||
| 
 | ||||
| Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| 
 | ||||
| diff --git a/lib/lmb.c b/lib/lmb.c
 | ||||
| index 6d3dcf4e..cd297f82 100644
 | ||||
| --- a/lib/lmb.c
 | ||||
| +++ b/lib/lmb.c
 | ||||
| @@ -131,6 +131,9 @@ static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t
 | ||||
|  			rgn->region[i].size += size; | ||||
|  			coalesced++; | ||||
|  			break; | ||||
| +		} else if (lmb_addrs_overlap(base, size, rgnbase, rgnsize)) {
 | ||||
| +			/* regions overlap */
 | ||||
| +			return -1;
 | ||||
|  		} | ||||
|  	} | ||||
|   | ||||
| @@ -269,11 +272,6 @@ static phys_addr_t lmb_align_down(phys_addr_t addr, phys_size_t size)
 | ||||
|  	return addr & ~(size - 1); | ||||
|  } | ||||
|   | ||||
| -static phys_addr_t lmb_align_up(phys_addr_t addr, ulong size)
 | ||||
| -{
 | ||||
| -	return (addr + (size - 1)) & ~(size - 1);
 | ||||
| -}
 | ||||
| -
 | ||||
|  phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phys_addr_t max_addr) | ||||
|  { | ||||
|  	long i, j; | ||||
| @@ -302,8 +300,7 @@ phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phy
 | ||||
|  			if (j < 0) { | ||||
|  				/* This area isn't reserved, take it */ | ||||
|  				if (lmb_add_region(&lmb->reserved, base, | ||||
| -							lmb_align_up(size,
 | ||||
| -								align)) < 0)
 | ||||
| +						   size) < 0)
 | ||||
|  					return 0; | ||||
|  				return base; | ||||
|  			} | ||||
| diff --git a/test/lib/lmb.c b/test/lib/lmb.c
 | ||||
| index fb7ca45e..e6acb70e 100644
 | ||||
| --- a/test/lib/lmb.c
 | ||||
| +++ b/test/lib/lmb.c
 | ||||
| @@ -227,13 +227,16 @@ static int lib_test_lmb_big(struct unit_test_state *uts)
 | ||||
|  DM_TEST(lib_test_lmb_big, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); | ||||
|   | ||||
|  /* Simulate 512 MiB RAM, allocate a block without previous reservation */ | ||||
| -static int test_noreserved(struct unit_test_state *uts, const phys_addr_t ram)
 | ||||
| +static int test_noreserved(struct unit_test_state *uts, const phys_addr_t ram,
 | ||||
| +			   const phys_addr_t alloc_size, const ulong align)
 | ||||
|  { | ||||
|  	const phys_size_t ram_size = 0x20000000; | ||||
|  	const phys_addr_t ram_end = ram + ram_size; | ||||
|  	struct lmb lmb; | ||||
|  	long ret; | ||||
|  	phys_addr_t a, b; | ||||
| +	const phys_addr_t alloc_size_aligned = (alloc_size + align - 1) &
 | ||||
| +		~(align - 1);
 | ||||
|   | ||||
|  	/* check for overflow */ | ||||
|  	ut_assert(ram_end == 0 || ram_end > ram); | ||||
| @@ -242,20 +245,43 @@ static int test_noreserved(struct unit_test_state *uts, const phys_addr_t ram)
 | ||||
|   | ||||
|  	ret = lmb_add(&lmb, ram, ram_size); | ||||
|  	ut_asserteq(ret, 0); | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 0, 0, 0, 0, 0, 0, 0);
 | ||||
|   | ||||
|  	/* allocate a block */ | ||||
| -	a = lmb_alloc(&lmb, 4, 1);
 | ||||
| +	a = lmb_alloc(&lmb, alloc_size, align);
 | ||||
|  	ut_assert(a != 0); | ||||
| -	/* and free it */
 | ||||
| -	ret = lmb_free(&lmb, a, 4);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, ram + ram_size - alloc_size_aligned,
 | ||||
| +		   alloc_size, 0, 0, 0, 0);
 | ||||
| +	/* allocate another block */
 | ||||
| +	b = lmb_alloc(&lmb, alloc_size, align);
 | ||||
| +	ut_assert(b != 0);
 | ||||
| +	if (alloc_size == alloc_size_aligned) {
 | ||||
| +		ASSERT_LMB(&lmb, ram, ram_size, 1, ram + ram_size -
 | ||||
| +			   (alloc_size_aligned * 2), alloc_size * 2, 0, 0, 0,
 | ||||
| +			   0);
 | ||||
| +	} else {
 | ||||
| +		ASSERT_LMB(&lmb, ram, ram_size, 2, ram + ram_size -
 | ||||
| +			   (alloc_size_aligned * 2), alloc_size, ram + ram_size
 | ||||
| +			   - alloc_size_aligned, alloc_size, 0, 0);
 | ||||
| +	}
 | ||||
| +	/* and free them */
 | ||||
| +	ret = lmb_free(&lmb, b, alloc_size);
 | ||||
|  	ut_asserteq(ret, 0); | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, ram + ram_size - alloc_size_aligned,
 | ||||
| +		   alloc_size, 0, 0, 0, 0);
 | ||||
| +	ret = lmb_free(&lmb, a, alloc_size);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 0, 0, 0, 0, 0, 0, 0);
 | ||||
|   | ||||
|  	/* allocate a block with base*/ | ||||
| -	b = lmb_alloc_base(&lmb, 4, 1, ram_end);
 | ||||
| +	b = lmb_alloc_base(&lmb, alloc_size, align, ram_end);
 | ||||
|  	ut_assert(a == b); | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, ram + ram_size - alloc_size_aligned,
 | ||||
| +		   alloc_size, 0, 0, 0, 0);
 | ||||
|  	/* and free it */ | ||||
| -	ret = lmb_free(&lmb, b, 4);
 | ||||
| +	ret = lmb_free(&lmb, b, alloc_size);
 | ||||
|  	ut_asserteq(ret, 0); | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 0, 0, 0, 0, 0, 0, 0);
 | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| @@ -265,16 +291,30 @@ static int lib_test_lmb_noreserved(struct unit_test_state *uts)
 | ||||
|  	int ret; | ||||
|   | ||||
|  	/* simulate 512 MiB RAM beginning at 1GiB */ | ||||
| -	ret = test_noreserved(uts, 0x40000000);
 | ||||
| +	ret = test_noreserved(uts, 0x40000000, 4, 1);
 | ||||
|  	if (ret) | ||||
|  		return ret; | ||||
|   | ||||
|  	/* simulate 512 MiB RAM beginning at 1.5GiB */ | ||||
| -	return test_noreserved(uts, 0xE0000000);
 | ||||
| +	return test_noreserved(uts, 0xE0000000, 4, 1);
 | ||||
|  } | ||||
|   | ||||
|  DM_TEST(lib_test_lmb_noreserved, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); | ||||
|   | ||||
| +static int lib_test_lmb_unaligned_size(struct unit_test_state *uts)
 | ||||
| +{
 | ||||
| +	int ret;
 | ||||
| +
 | ||||
| +	/* simulate 512 MiB RAM beginning at 1GiB */
 | ||||
| +	ret = test_noreserved(uts, 0x40000000, 5, 8);
 | ||||
| +	if (ret)
 | ||||
| +		return ret;
 | ||||
| +
 | ||||
| +	/* simulate 512 MiB RAM beginning at 1.5GiB */
 | ||||
| +	return test_noreserved(uts, 0xE0000000, 5, 8);
 | ||||
| +}
 | ||||
| +
 | ||||
| +DM_TEST(lib_test_lmb_unaligned_size, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 | ||||
|  /* | ||||
|   * Simulate a RAM that starts at 0 and allocate down to address 0, which must | ||||
|   * fail as '0' means failure for the lmb_alloc functions. | ||||
| @@ -318,3 +358,42 @@ static int lib_test_lmb_at_0(struct unit_test_state *uts)
 | ||||
|  } | ||||
|   | ||||
|  DM_TEST(lib_test_lmb_at_0, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); | ||||
| +
 | ||||
| +/* Check that calling lmb_reserve with overlapping regions fails. */
 | ||||
| +static int lib_test_lmb_overlapping_reserve(struct unit_test_state *uts)
 | ||||
| +{
 | ||||
| +	const phys_addr_t ram = 0x40000000;
 | ||||
| +	const phys_size_t ram_size = 0x20000000;
 | ||||
| +	struct lmb lmb;
 | ||||
| +	long ret;
 | ||||
| +
 | ||||
| +	lmb_init(&lmb);
 | ||||
| +
 | ||||
| +	ret = lmb_add(&lmb, ram, ram_size);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +
 | ||||
| +	ret = lmb_reserve(&lmb, 0x40010000, 0x10000);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, 0x40010000, 0x10000,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +	/* allocate overlapping region should fail */
 | ||||
| +	ret = lmb_reserve(&lmb, 0x40011000, 0x10000);
 | ||||
| +	ut_asserteq(ret, -1);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, 0x40010000, 0x10000,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +	/* allocate 3nd region */
 | ||||
| +	ret = lmb_reserve(&lmb, 0x40030000, 0x10000);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2, 0x40010000, 0x10000,
 | ||||
| +		   0x40030000, 0x10000, 0, 0);
 | ||||
| +	/* allocate 2nd region */
 | ||||
| +	ret = lmb_reserve(&lmb, 0x40020000, 0x10000);
 | ||||
| +	ut_assert(ret >= 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, 0x40010000, 0x30000,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +DM_TEST(lib_test_lmb_overlapping_reserve,
 | ||||
| +	DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,117 +0,0 @@ | |||
| From 83dc6df2cff9e91e77890107c74d4858182e4b61 Mon Sep 17 00:00:00 2001 | ||||
| From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Date: Mon, 14 Jan 2019 22:38:17 +0100 | ||||
| Subject: fdt: parse "reserved-memory" for memory reservation | ||||
| 
 | ||||
| boot_fdt_add_mem_rsv_regions() adds reserved memory sections to an lmb | ||||
| struct. Currently, it only parses regions described by /memreserve/ | ||||
| entries. | ||||
| 
 | ||||
| Extend this to the more commonly used scheme of the "reserved-memory" | ||||
| node. | ||||
| 
 | ||||
| Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Reviewed-by: Simon Glass <sjg@chromium.org> | ||||
| 
 | ||||
| diff --git a/common/image-fdt.c b/common/image-fdt.c
 | ||||
| index 95748f0a..5c0d6db3 100644
 | ||||
| --- a/common/image-fdt.c
 | ||||
| +++ b/common/image-fdt.c
 | ||||
| @@ -10,6 +10,7 @@
 | ||||
|   | ||||
|  #include <common.h> | ||||
|  #include <fdt_support.h> | ||||
| +#include <fdtdec.h>
 | ||||
|  #include <errno.h> | ||||
|  #include <image.h> | ||||
|  #include <linux/libfdt.h> | ||||
| @@ -67,30 +68,66 @@ static const image_header_t *image_get_fdt(ulong fdt_addr)
 | ||||
|  } | ||||
|  #endif | ||||
|   | ||||
| +static void boot_fdt_reserve_region(struct lmb *lmb, uint64_t addr,
 | ||||
| +				    uint64_t size)
 | ||||
| +{
 | ||||
| +	int ret;
 | ||||
| +
 | ||||
| +	ret = lmb_reserve(lmb, addr, size);
 | ||||
| +	if (!ret) {
 | ||||
| +		debug("   reserving fdt memory region: addr=%llx size=%llx\n",
 | ||||
| +		      (unsigned long long)addr, (unsigned long long)size);
 | ||||
| +	} else {
 | ||||
| +		puts("ERROR: reserving fdt memory region failed ");
 | ||||
| +		printf("(addr=%llx size=%llx)\n",
 | ||||
| +		       (unsigned long long)addr, (unsigned long long)size);
 | ||||
| +	}
 | ||||
| +}
 | ||||
| +
 | ||||
|  /** | ||||
| - * boot_fdt_add_mem_rsv_regions - Mark the memreserve sections as unusable
 | ||||
| + * boot_fdt_add_mem_rsv_regions - Mark the memreserve and reserved-memory
 | ||||
| + * sections as unusable
 | ||||
|   * @lmb: pointer to lmb handle, will be used for memory mgmt | ||||
|   * @fdt_blob: pointer to fdt blob base address | ||||
|   * | ||||
| - * Adds the memreserve regions in the dtb to the lmb block.  Adding the
 | ||||
| - * memreserve regions prevents u-boot from using them to store the initrd
 | ||||
| - * or the fdt blob.
 | ||||
| + * Adds the and reserved-memorymemreserve regions in the dtb to the lmb block.
 | ||||
| + * Adding the memreserve regions prevents u-boot from using them to store the
 | ||||
| + * initrd or the fdt blob.
 | ||||
|   */ | ||||
|  void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob) | ||||
|  { | ||||
|  	uint64_t addr, size; | ||||
| -	int i, total;
 | ||||
| +	int i, total, ret;
 | ||||
| +	int nodeoffset, subnode;
 | ||||
| +	struct fdt_resource res;
 | ||||
|   | ||||
|  	if (fdt_check_header(fdt_blob) != 0) | ||||
|  		return; | ||||
|   | ||||
| +	/* process memreserve sections */
 | ||||
|  	total = fdt_num_mem_rsv(fdt_blob); | ||||
|  	for (i = 0; i < total; i++) { | ||||
|  		if (fdt_get_mem_rsv(fdt_blob, i, &addr, &size) != 0) | ||||
|  			continue; | ||||
| -		printf("   reserving fdt memory region: addr=%llx size=%llx\n",
 | ||||
| -		       (unsigned long long)addr, (unsigned long long)size);
 | ||||
| -		lmb_reserve(lmb, addr, size);
 | ||||
| +		boot_fdt_reserve_region(lmb, addr, size);
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	/* process reserved-memory */
 | ||||
| +	nodeoffset = fdt_subnode_offset(fdt_blob, 0, "reserved-memory");
 | ||||
| +	if (nodeoffset >= 0) {
 | ||||
| +		subnode = fdt_first_subnode(fdt_blob, nodeoffset);
 | ||||
| +		while (subnode >= 0) {
 | ||||
| +			/* check if this subnode has a reg property */
 | ||||
| +			ret = fdt_get_resource(fdt_blob, subnode, "reg", 0,
 | ||||
| +					       &res);
 | ||||
| +			if (!ret) {
 | ||||
| +				addr = res.start;
 | ||||
| +				size = res.end - res.start + 1;
 | ||||
| +				boot_fdt_reserve_region(lmb, addr, size);
 | ||||
| +			}
 | ||||
| +
 | ||||
| +			subnode = fdt_next_subnode(fdt_blob, subnode);
 | ||||
| +		}
 | ||||
|  	} | ||||
|  } | ||||
|   | ||||
| diff --git a/lib/Makefile b/lib/Makefile
 | ||||
| index a6dd928a..358789ff 100644
 | ||||
| --- a/lib/Makefile
 | ||||
| +++ b/lib/Makefile
 | ||||
| @@ -30,6 +30,7 @@ obj-y += crc7.o
 | ||||
|  obj-y += crc8.o | ||||
|  obj-y += crc16.o | ||||
|  obj-$(CONFIG_ERRNO_STR) += errno_str.o | ||||
| +obj-$(CONFIG_OF_LIBFDT) += fdtdec.o
 | ||||
|  obj-$(CONFIG_FIT) += fdtdec_common.o | ||||
|  obj-$(CONFIG_TEST_FDTDEC) += fdtdec_test.o | ||||
|  obj-$(CONFIG_GZIP_COMPRESSED) += gzip.o | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,312 +0,0 @@ | |||
| From 16448a9becefd10a64601a08bbcacea38075db70 Mon Sep 17 00:00:00 2001 | ||||
| From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Date: Mon, 14 Jan 2019 22:38:18 +0100 | ||||
| Subject: lib: lmb: extend lmb for checks at load time | ||||
| 
 | ||||
| This adds two new functions, lmb_alloc_addr and | ||||
| lmb_get_unreserved_size. | ||||
| 
 | ||||
| lmb_alloc_addr behaves like lmb_alloc, but it tries to allocate a | ||||
| pre-specified address range. Unlike lmb_reserve, this address range | ||||
| must be inside one of the memory ranges that has been set up with | ||||
| lmb_add. | ||||
| 
 | ||||
| lmb_get_unreserved_size returns the number of bytes that can be | ||||
| used up to the next reserved region or the end of valid ram. This | ||||
| can be 0 if the address passed is reserved. | ||||
| 
 | ||||
| Added test for these new functions. | ||||
| 
 | ||||
| Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| 
 | ||||
| diff --git a/include/lmb.h b/include/lmb.h
 | ||||
| index f04d0580..7d7e2a78 100644
 | ||||
| --- a/include/lmb.h
 | ||||
| +++ b/include/lmb.h
 | ||||
| @@ -38,6 +38,9 @@ extern phys_addr_t lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align
 | ||||
|  			    phys_addr_t max_addr); | ||||
|  extern phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, | ||||
|  			      phys_addr_t max_addr); | ||||
| +extern phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base,
 | ||||
| +				  phys_size_t size);
 | ||||
| +extern phys_size_t lmb_get_unreserved_size(struct lmb *lmb, phys_addr_t addr);
 | ||||
|  extern int lmb_is_reserved(struct lmb *lmb, phys_addr_t addr); | ||||
|  extern long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size); | ||||
|   | ||||
| diff --git a/lib/lmb.c b/lib/lmb.c
 | ||||
| index cd297f82..e380a0a7 100644
 | ||||
| --- a/lib/lmb.c
 | ||||
| +++ b/lib/lmb.c
 | ||||
| @@ -313,6 +313,59 @@ phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phy
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| +/*
 | ||||
| + * Try to allocate a specific address range: must be in defined memory but not
 | ||||
| + * reserved
 | ||||
| + */
 | ||||
| +phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base, phys_size_t size)
 | ||||
| +{
 | ||||
| +	long j;
 | ||||
| +
 | ||||
| +	/* Check if the requested address is in one of the memory regions */
 | ||||
| +	j = lmb_overlaps_region(&lmb->memory, base, size);
 | ||||
| +	if (j >= 0) {
 | ||||
| +		/*
 | ||||
| +		 * Check if the requested end address is in the same memory
 | ||||
| +		 * region we found.
 | ||||
| +		 */
 | ||||
| +		if (lmb_addrs_overlap(lmb->memory.region[j].base,
 | ||||
| +				      lmb->memory.region[j].size, base + size -
 | ||||
| +				      1, 1)) {
 | ||||
| +			/* ok, reserve the memory */
 | ||||
| +			if (lmb_reserve(lmb, base, size) >= 0)
 | ||||
| +				return base;
 | ||||
| +		}
 | ||||
| +	}
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +/* Return number of bytes from a given address that are free */
 | ||||
| +phys_size_t lmb_get_unreserved_size(struct lmb *lmb, phys_addr_t addr)
 | ||||
| +{
 | ||||
| +	int i;
 | ||||
| +	long j;
 | ||||
| +
 | ||||
| +	/* check if the requested address is in the memory regions */
 | ||||
| +	j = lmb_overlaps_region(&lmb->memory, addr, 1);
 | ||||
| +	if (j >= 0) {
 | ||||
| +		for (i = 0; i < lmb->reserved.cnt; i++) {
 | ||||
| +			if (addr < lmb->reserved.region[i].base) {
 | ||||
| +				/* first reserved range > requested address */
 | ||||
| +				return lmb->reserved.region[i].base - addr;
 | ||||
| +			}
 | ||||
| +			if (lmb->reserved.region[i].base +
 | ||||
| +			    lmb->reserved.region[i].size > addr) {
 | ||||
| +				/* requested addr is in this reserved range */
 | ||||
| +				return 0;
 | ||||
| +			}
 | ||||
| +		}
 | ||||
| +		/* if we come here: no reserved ranges above requested addr */
 | ||||
| +		return lmb->memory.region[lmb->memory.cnt - 1].base +
 | ||||
| +		       lmb->memory.region[lmb->memory.cnt - 1].size - addr;
 | ||||
| +	}
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
|  int lmb_is_reserved(struct lmb *lmb, phys_addr_t addr) | ||||
|  { | ||||
|  	int i; | ||||
| diff --git a/test/lib/lmb.c b/test/lib/lmb.c
 | ||||
| index e6acb70e..058d3c33 100644
 | ||||
| --- a/test/lib/lmb.c
 | ||||
| +++ b/test/lib/lmb.c
 | ||||
| @@ -397,3 +397,205 @@ static int lib_test_lmb_overlapping_reserve(struct unit_test_state *uts)
 | ||||
|   | ||||
|  DM_TEST(lib_test_lmb_overlapping_reserve, | ||||
|  	DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); | ||||
| +
 | ||||
| +/*
 | ||||
| + * Simulate 512 MiB RAM, reserve 3 blocks, allocate addresses in between.
 | ||||
| + * Expect addresses outside the memory range to fail.
 | ||||
| + */
 | ||||
| +static int test_alloc_addr(struct unit_test_state *uts, const phys_addr_t ram)
 | ||||
| +{
 | ||||
| +	const phys_size_t ram_size = 0x20000000;
 | ||||
| +	const phys_addr_t ram_end = ram + ram_size;
 | ||||
| +	const phys_size_t alloc_addr_a = ram + 0x8000000;
 | ||||
| +	const phys_size_t alloc_addr_b = ram + 0x8000000 * 2;
 | ||||
| +	const phys_size_t alloc_addr_c = ram + 0x8000000 * 3;
 | ||||
| +	struct lmb lmb;
 | ||||
| +	long ret;
 | ||||
| +	phys_addr_t a, b, c, d, e;
 | ||||
| +
 | ||||
| +	/* check for overflow */
 | ||||
| +	ut_assert(ram_end == 0 || ram_end > ram);
 | ||||
| +
 | ||||
| +	lmb_init(&lmb);
 | ||||
| +
 | ||||
| +	ret = lmb_add(&lmb, ram, ram_size);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +
 | ||||
| +	/*  reserve 3 blocks */
 | ||||
| +	ret = lmb_reserve(&lmb, alloc_addr_a, 0x10000);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ret = lmb_reserve(&lmb, alloc_addr_b, 0x10000);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ret = lmb_reserve(&lmb, alloc_addr_c, 0x10000);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 3, alloc_addr_a, 0x10000,
 | ||||
| +		   alloc_addr_b, 0x10000, alloc_addr_c, 0x10000);
 | ||||
| +
 | ||||
| +	/* allocate blocks */
 | ||||
| +	a = lmb_alloc_addr(&lmb, ram, alloc_addr_a - ram);
 | ||||
| +	ut_asserteq(a, ram);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 3, ram, 0x8010000,
 | ||||
| +		   alloc_addr_b, 0x10000, alloc_addr_c, 0x10000);
 | ||||
| +	b = lmb_alloc_addr(&lmb, alloc_addr_a + 0x10000,
 | ||||
| +			   alloc_addr_b - alloc_addr_a - 0x10000);
 | ||||
| +	ut_asserteq(b, alloc_addr_a + 0x10000);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2, ram, 0x10010000,
 | ||||
| +		   alloc_addr_c, 0x10000, 0, 0);
 | ||||
| +	c = lmb_alloc_addr(&lmb, alloc_addr_b + 0x10000,
 | ||||
| +			   alloc_addr_c - alloc_addr_b - 0x10000);
 | ||||
| +	ut_asserteq(c, alloc_addr_b + 0x10000);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, ram, 0x18010000,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +	d = lmb_alloc_addr(&lmb, alloc_addr_c + 0x10000,
 | ||||
| +			   ram_end - alloc_addr_c - 0x10000);
 | ||||
| +	ut_asserteq(d, alloc_addr_c + 0x10000);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, ram, ram_size,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	/* allocating anything else should fail */
 | ||||
| +	e = lmb_alloc(&lmb, 1, 1);
 | ||||
| +	ut_asserteq(e, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, ram, ram_size,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	ret = lmb_free(&lmb, d, ram_end - alloc_addr_c - 0x10000);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +
 | ||||
| +	/* allocate at 3 points in free range */
 | ||||
| +
 | ||||
| +	d = lmb_alloc_addr(&lmb, ram_end - 4, 4);
 | ||||
| +	ut_asserteq(d, ram_end - 4);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2, ram, 0x18010000,
 | ||||
| +		   d, 4, 0, 0);
 | ||||
| +	ret = lmb_free(&lmb, d, 4);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, ram, 0x18010000,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	d = lmb_alloc_addr(&lmb, ram_end - 128, 4);
 | ||||
| +	ut_asserteq(d, ram_end - 128);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2, ram, 0x18010000,
 | ||||
| +		   d, 4, 0, 0);
 | ||||
| +	ret = lmb_free(&lmb, d, 4);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, ram, 0x18010000,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	d = lmb_alloc_addr(&lmb, alloc_addr_c + 0x10000, 4);
 | ||||
| +	ut_asserteq(d, alloc_addr_c + 0x10000);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, ram, 0x18010004,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +	ret = lmb_free(&lmb, d, 4);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, ram, 0x18010000,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +
 | ||||
| +	/* allocate at the bottom */
 | ||||
| +	ret = lmb_free(&lmb, a, alloc_addr_a - ram);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 1, ram + 0x8000000, 0x10010000,
 | ||||
| +		   0, 0, 0, 0);
 | ||||
| +	d = lmb_alloc_addr(&lmb, ram, 4);
 | ||||
| +	ut_asserteq(d, ram);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 2, d, 4,
 | ||||
| +		   ram + 0x8000000, 0x10010000, 0, 0);
 | ||||
| +
 | ||||
| +	/* check that allocating outside memory fails */
 | ||||
| +	if (ram_end != 0) {
 | ||||
| +		ret = lmb_alloc_addr(&lmb, ram_end, 1);
 | ||||
| +		ut_asserteq(ret, 0);
 | ||||
| +	}
 | ||||
| +	if (ram != 0) {
 | ||||
| +		ret = lmb_alloc_addr(&lmb, ram - 1, 1);
 | ||||
| +		ut_asserteq(ret, 0);
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int lib_test_lmb_alloc_addr(struct unit_test_state *uts)
 | ||||
| +{
 | ||||
| +	int ret;
 | ||||
| +
 | ||||
| +	/* simulate 512 MiB RAM beginning at 1GiB */
 | ||||
| +	ret = test_alloc_addr(uts, 0x40000000);
 | ||||
| +	if (ret)
 | ||||
| +		return ret;
 | ||||
| +
 | ||||
| +	/* simulate 512 MiB RAM beginning at 1.5GiB */
 | ||||
| +	return test_alloc_addr(uts, 0xE0000000);
 | ||||
| +}
 | ||||
| +
 | ||||
| +DM_TEST(lib_test_lmb_alloc_addr, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 | ||||
| +
 | ||||
| +/* Simulate 512 MiB RAM, reserve 3 blocks, check addresses in between */
 | ||||
| +static int test_get_unreserved_size(struct unit_test_state *uts,
 | ||||
| +				    const phys_addr_t ram)
 | ||||
| +{
 | ||||
| +	const phys_size_t ram_size = 0x20000000;
 | ||||
| +	const phys_addr_t ram_end = ram + ram_size;
 | ||||
| +	const phys_size_t alloc_addr_a = ram + 0x8000000;
 | ||||
| +	const phys_size_t alloc_addr_b = ram + 0x8000000 * 2;
 | ||||
| +	const phys_size_t alloc_addr_c = ram + 0x8000000 * 3;
 | ||||
| +	struct lmb lmb;
 | ||||
| +	long ret;
 | ||||
| +	phys_size_t s;
 | ||||
| +
 | ||||
| +	/* check for overflow */
 | ||||
| +	ut_assert(ram_end == 0 || ram_end > ram);
 | ||||
| +
 | ||||
| +	lmb_init(&lmb);
 | ||||
| +
 | ||||
| +	ret = lmb_add(&lmb, ram, ram_size);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +
 | ||||
| +	/*  reserve 3 blocks */
 | ||||
| +	ret = lmb_reserve(&lmb, alloc_addr_a, 0x10000);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ret = lmb_reserve(&lmb, alloc_addr_b, 0x10000);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ret = lmb_reserve(&lmb, alloc_addr_c, 0x10000);
 | ||||
| +	ut_asserteq(ret, 0);
 | ||||
| +	ASSERT_LMB(&lmb, ram, ram_size, 3, alloc_addr_a, 0x10000,
 | ||||
| +		   alloc_addr_b, 0x10000, alloc_addr_c, 0x10000);
 | ||||
| +
 | ||||
| +	/* check addresses in between blocks */
 | ||||
| +	s = lmb_get_unreserved_size(&lmb, ram);
 | ||||
| +	ut_asserteq(s, alloc_addr_a - ram);
 | ||||
| +	s = lmb_get_unreserved_size(&lmb, ram + 0x10000);
 | ||||
| +	ut_asserteq(s, alloc_addr_a - ram - 0x10000);
 | ||||
| +	s = lmb_get_unreserved_size(&lmb, alloc_addr_a - 4);
 | ||||
| +	ut_asserteq(s, 4);
 | ||||
| +
 | ||||
| +	s = lmb_get_unreserved_size(&lmb, alloc_addr_a + 0x10000);
 | ||||
| +	ut_asserteq(s, alloc_addr_b - alloc_addr_a - 0x10000);
 | ||||
| +	s = lmb_get_unreserved_size(&lmb, alloc_addr_a + 0x20000);
 | ||||
| +	ut_asserteq(s, alloc_addr_b - alloc_addr_a - 0x20000);
 | ||||
| +	s = lmb_get_unreserved_size(&lmb, alloc_addr_b - 4);
 | ||||
| +	ut_asserteq(s, 4);
 | ||||
| +
 | ||||
| +	s = lmb_get_unreserved_size(&lmb, alloc_addr_c + 0x10000);
 | ||||
| +	ut_asserteq(s, ram_end - alloc_addr_c - 0x10000);
 | ||||
| +	s = lmb_get_unreserved_size(&lmb, alloc_addr_c + 0x20000);
 | ||||
| +	ut_asserteq(s, ram_end - alloc_addr_c - 0x20000);
 | ||||
| +	s = lmb_get_unreserved_size(&lmb, ram_end - 4);
 | ||||
| +	ut_asserteq(s, 4);
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int lib_test_lmb_get_unreserved_size(struct unit_test_state *uts)
 | ||||
| +{
 | ||||
| +	int ret;
 | ||||
| +
 | ||||
| +	/* simulate 512 MiB RAM beginning at 1GiB */
 | ||||
| +	ret = test_get_unreserved_size(uts, 0x40000000);
 | ||||
| +	if (ret)
 | ||||
| +		return ret;
 | ||||
| +
 | ||||
| +	/* simulate 512 MiB RAM beginning at 1.5GiB */
 | ||||
| +	return test_get_unreserved_size(uts, 0xE0000000);
 | ||||
| +}
 | ||||
| +
 | ||||
| +DM_TEST(lib_test_lmb_get_unreserved_size,
 | ||||
| +	DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,138 +0,0 @@ | |||
| From 94e5a755db2a72b8bdaceb634b732ed59816b5ac Mon Sep 17 00:00:00 2001 | ||||
| From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Date: Mon, 14 Jan 2019 22:38:19 +0100 | ||||
| Subject: fs: prevent overwriting reserved memory | ||||
| 
 | ||||
| This fixes CVE-2018-18440 ("insufficient boundary checks in filesystem | ||||
| image load") by using lmb to check the load size of a file against | ||||
| reserved memory addresses. | ||||
| 
 | ||||
| Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Reviewed-by: Simon Glass <sjg@chromium.org> | ||||
| 
 | ||||
| diff --git a/fs/fs.c b/fs/fs.c
 | ||||
| index cb265174..7fd22101 100644
 | ||||
| --- a/fs/fs.c
 | ||||
| +++ b/fs/fs.c
 | ||||
| @@ -429,13 +429,57 @@ int fs_size(const char *filename, loff_t *size)
 | ||||
|  	return ret; | ||||
|  } | ||||
|   | ||||
| -int fs_read(const char *filename, ulong addr, loff_t offset, loff_t len,
 | ||||
| -	    loff_t *actread)
 | ||||
| +#ifdef CONFIG_LMB
 | ||||
| +/* Check if a file may be read to the given address */
 | ||||
| +static int fs_read_lmb_check(const char *filename, ulong addr, loff_t offset,
 | ||||
| +			     loff_t len, struct fstype_info *info)
 | ||||
| +{
 | ||||
| +	struct lmb lmb;
 | ||||
| +	int ret;
 | ||||
| +	loff_t size;
 | ||||
| +	loff_t read_len;
 | ||||
| +
 | ||||
| +	/* get the actual size of the file */
 | ||||
| +	ret = info->size(filename, &size);
 | ||||
| +	if (ret)
 | ||||
| +		return ret;
 | ||||
| +	if (offset >= size) {
 | ||||
| +		/* offset >= EOF, no bytes will be written */
 | ||||
| +		return 0;
 | ||||
| +	}
 | ||||
| +	read_len = size - offset;
 | ||||
| +
 | ||||
| +	/* limit to 'len' if it is smaller */
 | ||||
| +	if (len && len < read_len)
 | ||||
| +		read_len = len;
 | ||||
| +
 | ||||
| +	lmb_init_and_reserve(&lmb, gd->bd->bi_dram[0].start,
 | ||||
| +			     gd->bd->bi_dram[0].size, (void *)gd->fdt_blob);
 | ||||
| +	lmb_dump_all(&lmb);
 | ||||
| +
 | ||||
| +	if (lmb_alloc_addr(&lmb, addr, read_len) == addr)
 | ||||
| +		return 0;
 | ||||
| +
 | ||||
| +	printf("** Reading file would overwrite reserved memory **\n");
 | ||||
| +	return -ENOSPC;
 | ||||
| +}
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +static int _fs_read(const char *filename, ulong addr, loff_t offset, loff_t len,
 | ||||
| +		    int do_lmb_check, loff_t *actread)
 | ||||
|  { | ||||
|  	struct fstype_info *info = fs_get_info(fs_type); | ||||
|  	void *buf; | ||||
|  	int ret; | ||||
|   | ||||
| +#ifdef CONFIG_LMB
 | ||||
| +	if (do_lmb_check) {
 | ||||
| +		ret = fs_read_lmb_check(filename, addr, offset, len, info);
 | ||||
| +		if (ret)
 | ||||
| +			return ret;
 | ||||
| +	}
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  	/* | ||||
|  	 * We don't actually know how many bytes are being read, since len==0 | ||||
|  	 * means read the whole file. | ||||
| @@ -452,6 +496,12 @@ int fs_read(const char *filename, ulong addr, loff_t offset, loff_t len,
 | ||||
|  	return ret; | ||||
|  } | ||||
|   | ||||
| +int fs_read(const char *filename, ulong addr, loff_t offset, loff_t len,
 | ||||
| +	    loff_t *actread)
 | ||||
| +{
 | ||||
| +	return _fs_read(filename, addr, offset, len, 0, actread);
 | ||||
| +}
 | ||||
| +
 | ||||
|  int fs_write(const char *filename, ulong addr, loff_t offset, loff_t len, | ||||
|  	     loff_t *actwrite) | ||||
|  { | ||||
| @@ -622,7 +672,7 @@ int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
 | ||||
|  		pos = 0; | ||||
|   | ||||
|  	time = get_timer(0); | ||||
| -	ret = fs_read(filename, addr, pos, bytes, &len_read);
 | ||||
| +	ret = _fs_read(filename, addr, pos, bytes, 1, &len_read);
 | ||||
|  	time = get_timer(time); | ||||
|  	if (ret < 0) | ||||
|  		return 1; | ||||
| diff --git a/include/lmb.h b/include/lmb.h
 | ||||
| index 7d7e2a78..62da85e7 100644
 | ||||
| --- a/include/lmb.h
 | ||||
| +++ b/include/lmb.h
 | ||||
| @@ -31,6 +31,8 @@ struct lmb {
 | ||||
|  extern struct lmb lmb; | ||||
|   | ||||
|  extern void lmb_init(struct lmb *lmb); | ||||
| +extern void lmb_init_and_reserve(struct lmb *lmb, phys_addr_t base,
 | ||||
| +				 phys_size_t size, void *fdt_blob);
 | ||||
|  extern long lmb_add(struct lmb *lmb, phys_addr_t base, phys_size_t size); | ||||
|  extern long lmb_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size); | ||||
|  extern phys_addr_t lmb_alloc(struct lmb *lmb, phys_size_t size, ulong align); | ||||
| diff --git a/lib/lmb.c b/lib/lmb.c
 | ||||
| index e380a0a7..3407705f 100644
 | ||||
| --- a/lib/lmb.c
 | ||||
| +++ b/lib/lmb.c
 | ||||
| @@ -98,6 +98,19 @@ void lmb_init(struct lmb *lmb)
 | ||||
|  	lmb->reserved.size = 0; | ||||
|  } | ||||
|   | ||||
| +/* Initialize the struct, add memory and call arch/board reserve functions */
 | ||||
| +void lmb_init_and_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size,
 | ||||
| +			  void *fdt_blob)
 | ||||
| +{
 | ||||
| +	lmb_init(lmb);
 | ||||
| +	lmb_add(lmb, base, size);
 | ||||
| +	arch_lmb_reserve(lmb);
 | ||||
| +	board_lmb_reserve(lmb);
 | ||||
| +
 | ||||
| +	if (IMAGE_ENABLE_OF_LIBFDT && fdt_blob)
 | ||||
| +		boot_fdt_add_mem_rsv_regions(lmb, fdt_blob);
 | ||||
| +}
 | ||||
| +
 | ||||
|  /* This routine called with relocation disabled. */ | ||||
|  static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t size) | ||||
|  { | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,35 +0,0 @@ | |||
| From 2e3bdfbc449a5558ebbb55e36feee31f69fe32f7 Mon Sep 17 00:00:00 2001 | ||||
| From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Date: Mon, 14 Jan 2019 22:38:20 +0100 | ||||
| Subject: bootm: use new common function lmb_init_and_reserve | ||||
| 
 | ||||
| This reduces duplicate code only. | ||||
| 
 | ||||
| Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Reviewed-by: Simon Glass <sjg@chromium.org> | ||||
| 
 | ||||
| diff --git a/common/bootm.c b/common/bootm.c
 | ||||
| index 8bf84ebc..31e4f0f7 100644
 | ||||
| --- a/common/bootm.c
 | ||||
| +++ b/common/bootm.c
 | ||||
| @@ -56,15 +56,11 @@ static void boot_start_lmb(bootm_headers_t *images)
 | ||||
|  	ulong		mem_start; | ||||
|  	phys_size_t	mem_size; | ||||
|   | ||||
| -	lmb_init(&images->lmb);
 | ||||
| -
 | ||||
|  	mem_start = env_get_bootm_low(); | ||||
|  	mem_size = env_get_bootm_size(); | ||||
|   | ||||
| -	lmb_add(&images->lmb, (phys_addr_t)mem_start, mem_size);
 | ||||
| -
 | ||||
| -	arch_lmb_reserve(&images->lmb);
 | ||||
| -	board_lmb_reserve(&images->lmb);
 | ||||
| +	lmb_init_and_reserve(&images->lmb, (phys_addr_t)mem_start, mem_size,
 | ||||
| +			     NULL);
 | ||||
|  } | ||||
|  #else | ||||
|  #define lmb_reserve(lmb, base, size) | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,26 +0,0 @@ | |||
| From 8b554b62dcab25c0072c5b6880d0fcf079cc9d87 Mon Sep 17 00:00:00 2001 | ||||
| From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Date: Mon, 14 Jan 2019 22:38:21 +0100 | ||||
| Subject: lmb: remove unused extern declaration | ||||
| 
 | ||||
| lmb.h includes an extern declaration of "struct lmb lmb;" which | ||||
| is not used anywhere, so remove it. | ||||
| 
 | ||||
| Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| 
 | ||||
| diff --git a/include/lmb.h b/include/lmb.h
 | ||||
| index 62da85e7..1bb003e3 100644
 | ||||
| --- a/include/lmb.h
 | ||||
| +++ b/include/lmb.h
 | ||||
| @@ -28,8 +28,6 @@ struct lmb {
 | ||||
|  	struct lmb_region reserved; | ||||
|  }; | ||||
|   | ||||
| -extern struct lmb lmb;
 | ||||
| -
 | ||||
|  extern void lmb_init(struct lmb *lmb); | ||||
|  extern void lmb_init_and_reserve(struct lmb *lmb, phys_addr_t base, | ||||
|  				 phys_size_t size, void *fdt_blob); | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,172 +0,0 @@ | |||
| From 2e972e30c0b07736fedcc4fad53cfe49249495a5 Mon Sep 17 00:00:00 2001 | ||||
| From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Date: Mon, 14 Jan 2019 22:38:22 +0100 | ||||
| Subject: tftp: prevent overwriting reserved memory | ||||
| 
 | ||||
| This fixes CVE-2018-18439 ("insufficient boundary checks in network | ||||
| image boot") by using lmb to check for a valid range to store | ||||
| received blocks. | ||||
| 
 | ||||
| Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Acked-by: Joe Hershberger <joe.hershberger@ni.com> | ||||
| 
 | ||||
| diff --git a/net/tftp.c b/net/tftp.c
 | ||||
| index 68ffd814..a9335b1b 100644
 | ||||
| --- a/net/tftp.c
 | ||||
| +++ b/net/tftp.c
 | ||||
| @@ -17,6 +17,8 @@
 | ||||
|  #include <flash.h> | ||||
|  #endif | ||||
|   | ||||
| +DECLARE_GLOBAL_DATA_PTR;
 | ||||
| +
 | ||||
|  /* Well known TFTP port # */ | ||||
|  #define WELL_KNOWN_PORT	69 | ||||
|  /* Millisecs to timeout for lost pkt */ | ||||
| @@ -81,6 +83,10 @@ static ulong	tftp_block_wrap;
 | ||||
|  /* memory offset due to wrapping */ | ||||
|  static ulong	tftp_block_wrap_offset; | ||||
|  static int	tftp_state; | ||||
| +static ulong	tftp_load_addr;
 | ||||
| +#ifdef CONFIG_LMB
 | ||||
| +static ulong	tftp_load_size;
 | ||||
| +#endif
 | ||||
|  #ifdef CONFIG_TFTP_TSIZE | ||||
|  /* The file size reported by the server */ | ||||
|  static int	tftp_tsize; | ||||
| @@ -164,10 +170,11 @@ static void mcast_cleanup(void)
 | ||||
|   | ||||
|  #endif	/* CONFIG_MCAST_TFTP */ | ||||
|   | ||||
| -static inline void store_block(int block, uchar *src, unsigned len)
 | ||||
| +static inline int store_block(int block, uchar *src, unsigned int len)
 | ||||
|  { | ||||
|  	ulong offset = block * tftp_block_size + tftp_block_wrap_offset; | ||||
|  	ulong newsize = offset + len; | ||||
| +	ulong store_addr = tftp_load_addr + offset;
 | ||||
|  #ifdef CONFIG_SYS_DIRECT_FLASH_TFTP | ||||
|  	int i, rc = 0; | ||||
|   | ||||
| @@ -175,24 +182,32 @@ static inline void store_block(int block, uchar *src, unsigned len)
 | ||||
|  		/* start address in flash? */ | ||||
|  		if (flash_info[i].flash_id == FLASH_UNKNOWN) | ||||
|  			continue; | ||||
| -		if (load_addr + offset >= flash_info[i].start[0]) {
 | ||||
| +		if (store_addr >= flash_info[i].start[0]) {
 | ||||
|  			rc = 1; | ||||
|  			break; | ||||
|  		} | ||||
|  	} | ||||
|   | ||||
|  	if (rc) { /* Flash is destination for this packet */ | ||||
| -		rc = flash_write((char *)src, (ulong)(load_addr+offset), len);
 | ||||
| +		rc = flash_write((char *)src, store_addr, len);
 | ||||
|  		if (rc) { | ||||
|  			flash_perror(rc); | ||||
| -			net_set_state(NETLOOP_FAIL);
 | ||||
| -			return;
 | ||||
| +			return rc;
 | ||||
|  		} | ||||
|  	} else | ||||
|  #endif /* CONFIG_SYS_DIRECT_FLASH_TFTP */ | ||||
|  	{ | ||||
| -		void *ptr = map_sysmem(load_addr + offset, len);
 | ||||
| -
 | ||||
| +		void *ptr;
 | ||||
| +
 | ||||
| +#ifdef CONFIG_LMB
 | ||||
| +		if (store_addr < tftp_load_addr ||
 | ||||
| +		    store_addr + len > tftp_load_addr + tftp_load_size) {
 | ||||
| +			puts("\nTFTP error: ");
 | ||||
| +			puts("trying to overwrite reserved memory...\n");
 | ||||
| +			return -1;
 | ||||
| +		}
 | ||||
| +#endif
 | ||||
| +		ptr = map_sysmem(store_addr, len);
 | ||||
|  		memcpy(ptr, src, len); | ||||
|  		unmap_sysmem(ptr); | ||||
|  	} | ||||
| @@ -203,6 +218,8 @@ static inline void store_block(int block, uchar *src, unsigned len)
 | ||||
|   | ||||
|  	if (net_boot_file_size < newsize) | ||||
|  		net_boot_file_size = newsize; | ||||
| +
 | ||||
| +	return 0;
 | ||||
|  } | ||||
|   | ||||
|  /* Clear our state ready for a new transfer */ | ||||
| @@ -606,7 +623,11 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
 | ||||
|  		timeout_count_max = tftp_timeout_count_max; | ||||
|  		net_set_timeout_handler(timeout_ms, tftp_timeout_handler); | ||||
|   | ||||
| -		store_block(tftp_cur_block - 1, pkt + 2, len);
 | ||||
| +		if (store_block(tftp_cur_block - 1, pkt + 2, len)) {
 | ||||
| +			eth_halt();
 | ||||
| +			net_set_state(NETLOOP_FAIL);
 | ||||
| +			break;
 | ||||
| +		}
 | ||||
|   | ||||
|  		/* | ||||
|  		 *	Acknowledge the block just received, which will prompt | ||||
| @@ -695,6 +716,25 @@ static void tftp_timeout_handler(void)
 | ||||
|  	} | ||||
|  } | ||||
|   | ||||
| +/* Initialize tftp_load_addr and tftp_load_size from load_addr and lmb */
 | ||||
| +static int tftp_init_load_addr(void)
 | ||||
| +{
 | ||||
| +#ifdef CONFIG_LMB
 | ||||
| +	struct lmb lmb;
 | ||||
| +	phys_size_t max_size;
 | ||||
| +
 | ||||
| +	lmb_init_and_reserve(&lmb, gd->bd->bi_dram[0].start,
 | ||||
| +			     gd->bd->bi_dram[0].size, (void *)gd->fdt_blob);
 | ||||
| +
 | ||||
| +	max_size = lmb_get_unreserved_size(&lmb, load_addr);
 | ||||
| +	if (!max_size)
 | ||||
| +		return -1;
 | ||||
| +
 | ||||
| +	tftp_load_size = max_size;
 | ||||
| +#endif
 | ||||
| +	tftp_load_addr = load_addr;
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
|   | ||||
|  void tftp_start(enum proto_t protocol) | ||||
|  { | ||||
| @@ -791,7 +831,14 @@ void tftp_start(enum proto_t protocol)
 | ||||
|  	} else | ||||
|  #endif | ||||
|  	{ | ||||
| -		printf("Load address: 0x%lx\n", load_addr);
 | ||||
| +		if (tftp_init_load_addr()) {
 | ||||
| +			eth_halt();
 | ||||
| +			net_set_state(NETLOOP_FAIL);
 | ||||
| +			puts("\nTFTP error: ");
 | ||||
| +			puts("trying to overwrite reserved memory...\n");
 | ||||
| +			return;
 | ||||
| +		}
 | ||||
| +		printf("Load address: 0x%lx\n", tftp_load_addr);
 | ||||
|  		puts("Loading: *\b"); | ||||
|  		tftp_state = STATE_SEND_RRQ; | ||||
|  #ifdef CONFIG_CMD_BOOTEFI | ||||
| @@ -842,9 +889,15 @@ void tftp_start_server(void)
 | ||||
|  { | ||||
|  	tftp_filename[0] = 0; | ||||
|   | ||||
| +	if (tftp_init_load_addr()) {
 | ||||
| +		eth_halt();
 | ||||
| +		net_set_state(NETLOOP_FAIL);
 | ||||
| +		puts("\nTFTP error: trying to overwrite reserved memory...\n");
 | ||||
| +		return;
 | ||||
| +	}
 | ||||
|  	printf("Using %s device\n", eth_get_name()); | ||||
|  	printf("Listening for TFTP transfer on %pI4\n", &net_ip); | ||||
| -	printf("Load address: 0x%lx\n", load_addr);
 | ||||
| +	printf("Load address: 0x%lx\n", tftp_load_addr);
 | ||||
|   | ||||
|  	puts("Loading: *\b"); | ||||
|   | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,46 +0,0 @@ | |||
| From 72bc6aa0bc7f034bd6966c872819f19af69f2b64 Mon Sep 17 00:00:00 2001 | ||||
| From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Date: Mon, 14 Jan 2019 22:38:23 +0100 | ||||
| Subject: arm: bootm: fix sp detection at end of address range | ||||
| 
 | ||||
| This fixes  'arch_lmb_reserve()' for ARM that tries to detect in which | ||||
| DRAM bank 'sp' is in. | ||||
| 
 | ||||
| This code failed if a bank was at the end of physical address range | ||||
| (i.e. size + length overflowed to 0). | ||||
| 
 | ||||
| To fix this, calculate 'bank_end' as 'size + length - 1' so that such | ||||
| banks end at 0xffffffff, not 0. | ||||
| 
 | ||||
| Fixes: 15751403b6 ("ARM: bootm: don't assume sp is in DRAM bank 0") | ||||
| Reported-by: Frank Wunderlich <frank-w@public-files.de> | ||||
| Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> | ||||
| Reviewed-by: Stephen Warren <swarren@nvidia.com> | ||||
| 
 | ||||
| diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
 | ||||
| index c3c1d2fd..329f20c2 100644
 | ||||
| --- a/arch/arm/lib/bootm.c
 | ||||
| +++ b/arch/arm/lib/bootm.c
 | ||||
| @@ -64,13 +64,15 @@ void arch_lmb_reserve(struct lmb *lmb)
 | ||||
|  	/* adjust sp by 4K to be safe */ | ||||
|  	sp -= 4096; | ||||
|  	for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) { | ||||
| -		if (sp < gd->bd->bi_dram[bank].start)
 | ||||
| +		if (!gd->bd->bi_dram[bank].size ||
 | ||||
| +		    sp < gd->bd->bi_dram[bank].start)
 | ||||
|  			continue; | ||||
| +		/* Watch out for RAM at end of address space! */
 | ||||
|  		bank_end = gd->bd->bi_dram[bank].start + | ||||
| -			gd->bd->bi_dram[bank].size;
 | ||||
| -		if (sp >= bank_end)
 | ||||
| +			gd->bd->bi_dram[bank].size - 1;
 | ||||
| +		if (sp > bank_end)
 | ||||
|  			continue; | ||||
| -		lmb_reserve(lmb, sp, bank_end - sp);
 | ||||
| +		lmb_reserve(lmb, sp, bank_end - sp + 1);
 | ||||
|  		break; | ||||
|  	} | ||||
|  } | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,27 +0,0 @@ | |||
| From 7b492a978a09fbc95340dbcdc1e14d604ac6ae76 Mon Sep 17 00:00:00 2001 | ||||
| From: Frank Wunderlich <frank-w@public-files.de> | ||||
| Date: Wed, 23 Jan 2019 16:16:45 +0100 | ||||
| Subject: [defconfig] added strings and setenv used for lstftp | ||||
| 
 | ||||
| 
 | ||||
| diff --git a/configs/mt7623n_bpir2_defconfig b/configs/mt7623n_bpir2_defconfig
 | ||||
| index a9f4506e..bac45d11 100644
 | ||||
| --- a/configs/mt7623n_bpir2_defconfig
 | ||||
| +++ b/configs/mt7623n_bpir2_defconfig
 | ||||
| @@ -22,7 +22,6 @@ CONFIG_CMD_GPT=y
 | ||||
|  CONFIG_CMD_MMC=y | ||||
|  CONFIG_CMD_PART=y | ||||
|  CONFIG_CMD_READ=y | ||||
| -# CONFIG_CMD_SETEXPR is not set
 | ||||
|  # CONFIG_CMD_NFS is not set | ||||
|  CONFIG_CMD_PING=y | ||||
|  CONFIG_CMD_FAT=y | ||||
| @@ -69,3 +68,5 @@ CONFIG_DEFAULT_ENV_FILE="uEnv.txt"
 | ||||
|  CONFIG_ENV_IS_IN_MMC=y | ||||
|   | ||||
|  CONFIG_CMD_ASKENV=y | ||||
| +CONFIG_CMD_STRINGS=y
 | ||||
| +CONFIG_CMD_SETEXPR=y
 | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -1,22 +0,0 @@ | |||
| From 0164e641d4a64dcff5d5394b168d612b174d83bd Mon Sep 17 00:00:00 2001 | ||||
| From: Frank Wunderlich <frank-w@public-files.de> | ||||
| Date: Wed, 23 Jan 2019 16:30:39 +0100 | ||||
| Subject: increase size for environment 4k => 8k | ||||
| 
 | ||||
| 
 | ||||
| diff --git a/include/configs/mt7623.h b/include/configs/mt7623.h
 | ||||
| index 7d26debb..aa0314db 100644
 | ||||
| --- a/include/configs/mt7623.h
 | ||||
| +++ b/include/configs/mt7623.h
 | ||||
| @@ -27,7 +27,7 @@
 | ||||
|  #define CONFIG_SYS_NONCACHED_MEMORY	SZ_1M | ||||
|   | ||||
|  /* Environment */ | ||||
| -#define CONFIG_ENV_SIZE			SZ_4K
 | ||||
| +#define CONFIG_ENV_SIZE			SZ_8K
 | ||||
|  /* Allow to overwrite serial and ethaddr */ | ||||
|  #define CONFIG_ENV_OVERWRITE | ||||
|   | ||||
| -- 
 | ||||
| 1.8.3.1 | ||||
| 
 | ||||
|  | @ -4,9 +4,9 @@ bootenv=uEnv.txt | |||
| kernel=uImage | ||||
| loadaddr=0x80200000 | ||||
| #default bootargs will be overidden by buildargs | ||||
| bootargs=console=ttyS0,115200 root=/dev/mmcblk1p2 rw rootwait ip=dhcp | ||||
| bootargs=console=ttyS2,115200 root=/dev/mmcblk1p2 rw rootwait ip=dhcp | ||||
| 
 | ||||
| console=earlyprintk console=ttyS0,115200 console=tty1 fbcon=map:0 | ||||
| console=earlyprintk console=ttyS2,115200 console=tty1 fbcon=map:0 | ||||
| roottmpl=${rootdev} rootfstype=ext4 rootwait | ||||
| prepsetroot=setenv setroot setenv root ${roottmpl} | ||||
| bootopts=vmalloc=496M debug=7 initcall_debug=0 | ||||
|  | @ -65,7 +65,7 @@ netmask=255.255.255.0 | |||
| serverip=192.168.0.10 | ||||
| 
 | ||||
| bootfile=uImage | ||||
| netbootargs=console=ttyS0,115200 root=/dev/mmcblk1p2 rw rootwait | ||||
| netbootargs=console=ttyS2,115200 root=/dev/mmcblk1p2 rw rootwait | ||||
| #ip=dhcp sets ip on eth0 instead of wan | ||||
| 
 | ||||
| lstftp=tftp ${loadaddr} ${serverip}:files.lst;setexpr listend ${loadaddr} + ${filesize};mw.b ${listend} 00 2;strings ${loadaddr}; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue