Merge branch '2020-08-05-misc-fixes'

- A large number of assorted fixes and minor improvements
This commit is contained in:
Tom Rini 2020-08-05 16:05:33 -04:00
commit 635dfee2cb
44 changed files with 426 additions and 133 deletions

5
README
View file

@ -3444,6 +3444,11 @@ List of environment variables (most likely not complete):
downloads succeed with high packet loss rates, or with
unreliable TFTP servers or client hardware.
tftpwindowsize - if this is set, the value is used for TFTP's
window size as described by RFC 7440.
This means the count of blocks we can receive before
sending ack to server.
vlan - When set to a value < 4095 the traffic over
Ethernet is encapsulated/received over 802.1q
VLAN tagged frames.

View file

@ -139,6 +139,7 @@ config SANDBOX
imply ACPI_PMC
imply ACPI_PMC_SANDBOX
imply CMD_PMC
imply CMD_CLONE
config SH
bool "SuperH architecture"

View file

@ -44,6 +44,7 @@ config ARMV7_PSCI
choice
prompt "Supported PSCI version"
depends on ARMV7_PSCI
default ARMV7_PSCI_0_1 if ARCH_SUNXI
default ARMV7_PSCI_1_0
help
Select the supported PSCI version.
@ -53,6 +54,9 @@ config ARMV7_PSCI_1_0
config ARMV7_PSCI_0_2
bool "PSCI V0.2"
config ARMV7_PSCI_0_1
bool "PSCI V0.1"
endchoice
config ARMV7_PSCI_NR_CPUS

View file

@ -64,7 +64,7 @@
* can afford it due to sufficient memory being available early.
*/
.macro SPL_CLEAR_BSS
.macro CLEAR_BSS
ldr r0, =__bss_start /* this is auto-relocated! */
#ifdef CONFIG_USE_ARCH_MEMSET
@ -109,8 +109,8 @@ ENTRY(_main)
mov r9, r0
bl board_init_f_init_reserve
#if defined(CONFIG_SPL_EARLY_BSS)
SPL_CLEAR_BSS
#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_EARLY_BSS)
CLEAR_BSS
#endif
mov r0, #0
@ -150,8 +150,8 @@ here:
#endif
#if !defined(CONFIG_SPL_BUILD) || CONFIG_IS_ENABLED(FRAMEWORK)
#if !defined(CONFIG_SPL_EARLY_BSS)
SPL_CLEAR_BSS
#if !defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SPL_EARLY_BSS)
CLEAR_BSS
#endif
# ifdef CONFIG_SPL_BUILD

View file

@ -1148,6 +1148,14 @@ config CMD_MMC_SWRITE
endif
config CMD_CLONE
bool "clone"
depends on BLK
help
Enable storage cloning over block devices, useful for
initial flashing by external block device without network
or usb support.
config CMD_MTD
bool "mtd"
depends on MTD

View file

@ -98,6 +98,7 @@ obj-$(CONFIG_CMD_MMC) += mmc.o
obj-$(CONFIG_MP) += mp.o
obj-$(CONFIG_CMD_MTD) += mtd.o
obj-$(CONFIG_CMD_MTDPARTS) += mtdparts.o
obj-$(CONFIG_CMD_CLONE) += clone.o
ifneq ($(CONFIG_CMD_NAND)$(CONFIG_CMD_SF),)
obj-y += legacy-mtd-utils.o
endif

View file

@ -9,6 +9,7 @@
#include <common.h>
#include <command.h>
#include <env.h>
#include <lmb.h>
#include <net.h>
#include <vsprintf.h>
#include <asm/cache.h>
@ -33,9 +34,10 @@ static void print_eth(int idx)
printf("%-12s= %s\n", name, val);
}
static void print_lnum(const char *name, unsigned long long value)
static void print_phys_addr(const char *name, phys_addr_t value)
{
printf("%-12s= 0x%.8llX\n", name, value);
printf("%-12s= 0x%.*llx\n", name, 2 * (int)sizeof(ulong),
(unsigned long long)value);
}
void bdinfo_print_mhz(const char *name, unsigned long hz)
@ -74,7 +76,7 @@ int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
bdinfo_print_num("boot_params", (ulong)bd->bi_boot_params);
print_bi_dram(bd);
bdinfo_print_num("memstart", (ulong)bd->bi_memstart);
print_lnum("memsize", (u64)bd->bi_memsize);
print_phys_addr("memsize", bd->bi_memsize);
bdinfo_print_num("flashstart", (ulong)bd->bi_flashstart);
bdinfo_print_num("flashsize", (ulong)bd->bi_flashsize);
bdinfo_print_num("flashoffset", (ulong)bd->bi_flashoffset);
@ -96,6 +98,12 @@ int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
#if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
bdinfo_print_num("multi_dtb_fit", (ulong)gd->multi_dtb_fit);
#endif
if (gd->fdt_blob) {
struct lmb lmb;
lmb_init_and_reserve(&lmb, gd->bd, (void *)gd->fdt_blob);
lmb_dump_all_force(&lmb);
}
arch_print_bdinfo();

View file

@ -54,7 +54,7 @@ static int bootz_start(struct cmd_tbl *cmdtp, int flag, int argc,
* Handle the BOOTM_STATE_FINDOTHER state ourselves as we do not
* have a header that provide this informaiton.
*/
if (bootm_find_images(flag, argc, argv, zi_start, zi_end - zi_start))
if (bootm_find_images(flag, argc, argv, images->ep, zi_end - zi_start))
return 1;
return 0;

126
cmd/clone.c Normal file
View file

@ -0,0 +1,126 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2020 John Chau <john@harmon.hk>
*
*/
#include <common.h>
#include <command.h>
#include <malloc.h>
#include <part.h>
#include <blk.h>
#include <vsprintf.h>
#define BUFSIZE (1 * 1024 * 1024)
static int do_clone(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[])
{
int srcdev, destdev;
struct blk_desc *srcdesc, *destdesc;
int srcbz, destbz, ret;
char *unit, *buf;
unsigned long wrcnt, rdcnt, requested, srcblk, destblk;
unsigned long timer;
const unsigned long buffersize = 1024 * 1024;
if (argc < 6)
return CMD_RET_USAGE;
srcdev = blk_get_device_by_str(argv[1], argv[2], &srcdesc);
destdev = blk_get_device_by_str(argv[3], argv[4], &destdesc);
if (srcdev < 0) {
printf("Unable to open source device\n");
return 1;
} else if (destdev < 0) {
printf("Unable to open destination device\n");
return 1;
}
requested = simple_strtoul(argv[5], &unit, 10);
srcbz = srcdesc->blksz;
destbz = destdesc->blksz;
if ((srcbz * (buffersize / srcbz) != buffersize) &&
(destbz * (buffersize / destbz) != buffersize)) {
printf("failed: cannot match device block sizes\n");
return 1;
}
if (requested == 0) {
unsigned long a = srcdesc->lba * srcdesc->blksz;
unsigned long b = destdesc->lba * destdesc->blksz;
if (a > b)
requested = a;
else
requested = b;
} else {
switch (unit[0]) {
case 'g':
case 'G':
requested *= 1024;
case 'm':
case 'M':
requested *= 1024;
case 'k':
case 'K':
requested *= 1024;
break;
}
}
printf("Copying %ld bytes from %s:%s to %s:%s\n",
requested, argv[1], argv[2], argv[3], argv[4]);
wrcnt = 0;
rdcnt = 0;
buf = (char *)malloc(BUFSIZE);
srcblk = 0;
destblk = 0;
timer = get_timer(0);
while (wrcnt < requested) {
unsigned long toread = BUFSIZE / srcbz;
unsigned long towrite = BUFSIZE / destbz;
unsigned long offset = 0;
read:
ret = blk_dread(srcdesc, srcblk, toread, buf + offset);
if (ret < 0) {
printf("Src read error @blk %ld\n", srcblk);
goto exit;
}
rdcnt += ret * srcbz;
srcblk += ret;
if (ret < toread) {
toread -= ret;
offset += ret * srcbz;
goto read;
}
offset = 0;
write:
ret = blk_dwrite(destdesc, destblk, towrite, buf + offset);
if (ret < 0) {
printf("Dest write error @blk %ld\n", srcblk);
goto exit;
}
wrcnt += ret * destbz;
destblk += ret;
if (ret < towrite) {
towrite -= ret;
offset += ret * destbz;
goto write;
}
}
exit:
timer = get_timer(timer);
timer = 1000 * timer / CONFIG_SYS_HZ;
printf("%ld read\n", rdcnt);
printf("%ld written\n", wrcnt);
printf("%ldms, %ldkB/s\n", timer, wrcnt / timer);
free(buf);
return 0;
}
U_BOOT_CMD(
clone, 6, 1, do_clone,
"simple storage cloning",
"<src interface> <src dev> <dest interface> <dest dev> <size[K/M/G]>\n"
"clone storage from 'src dev' on 'src interface' to 'dest dev' on 'dest interface' with maximum 'size' bytes (or 0 for clone to end)"
);

View file

@ -403,6 +403,7 @@ config BOOTCOMMAND
config USE_PREBOOT
bool "Enable preboot"
default "usb start" if USB_KEYBOARD
help
When this option is enabled, the existence of the environment
variable "preboot" will be checked immediately before starting the

View file

@ -15,7 +15,6 @@ CONFIG_DEFAULT_DEVICE_TREE="meson-gxl-s805x-libretech-ac"
CONFIG_DEBUG_UART=y
CONFIG_OF_BOARD_SETUP=y
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="usb start"
CONFIG_MISC_INIT_R=y
# CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_DISPLAY_BOARDINFO is not set

View file

@ -15,7 +15,6 @@ CONFIG_DEFAULT_DEVICE_TREE="meson-gxl-s905d-libretech-pc"
CONFIG_DEBUG_UART=y
CONFIG_OF_BOARD_SETUP=y
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="usb start"
CONFIG_MISC_INIT_R=y
# CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_CMD_BDI is not set

View file

@ -14,7 +14,6 @@ CONFIG_DEFAULT_DEVICE_TREE="meson-gxm-s912-libretech-pc"
CONFIG_DEBUG_UART=y
CONFIG_OF_BOARD_SETUP=y
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="usb start"
CONFIG_MISC_INIT_R=y
# CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_CMD_BDI is not set

View file

@ -13,7 +13,6 @@ CONFIG_DEFAULT_DEVICE_TREE="rk3399-pinebook-pro"
CONFIG_DEBUG_UART=y
CONFIG_BOOTDELAY=3
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="usb start"
CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-pinebook-pro.dtb"
CONFIG_MISC_INIT_R=y
CONFIG_DISPLAY_BOARDINFO_LATE=y

View file

@ -13,7 +13,6 @@ CONFIG_SPL_SPI_SUPPORT=y
CONFIG_DEFAULT_DEVICE_TREE="rk3399-rockpro64"
CONFIG_DEBUG_UART=y
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="usb start"
CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-rockpro64.dtb"
CONFIG_MISC_INIT_R=y
CONFIG_DISPLAY_BOARDINFO_LATE=y

View file

@ -9,7 +9,6 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm2835-rpi-zero-w"
CONFIG_DISTRO_DEFAULTS=y
CONFIG_OF_BOARD_SETUP=y
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="usb start"
CONFIG_MISC_INIT_R=y
# CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_DISPLAY_BOARDINFO is not set

View file

@ -9,7 +9,6 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm2836-rpi-2-b"
CONFIG_DISTRO_DEFAULTS=y
CONFIG_OF_BOARD_SETUP=y
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="usb start"
CONFIG_MISC_INIT_R=y
# CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_DISPLAY_BOARDINFO is not set

View file

@ -10,7 +10,6 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm2837-rpi-3-b"
CONFIG_DISTRO_DEFAULTS=y
CONFIG_OF_BOARD_SETUP=y
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="usb start"
CONFIG_MISC_INIT_R=y
# CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_DISPLAY_BOARDINFO is not set

View file

@ -10,7 +10,6 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm2837-rpi-3-b-plus"
CONFIG_DISTRO_DEFAULTS=y
CONFIG_OF_BOARD_SETUP=y
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="usb start"
CONFIG_MISC_INIT_R=y
# CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_DISPLAY_BOARDINFO is not set

View file

@ -10,7 +10,6 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm2837-rpi-3-b"
CONFIG_DISTRO_DEFAULTS=y
CONFIG_OF_BOARD_SETUP=y
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="usb start"
CONFIG_MISC_INIT_R=y
# CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_DISPLAY_BOARDINFO is not set

View file

@ -9,7 +9,6 @@ CONFIG_DEFAULT_DEVICE_TREE="bcm2835-rpi-b"
CONFIG_DISTRO_DEFAULTS=y
CONFIG_OF_BOARD_SETUP=y
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="usb start"
CONFIG_MISC_INIT_R=y
# CONFIG_DISPLAY_CPUINFO is not set
# CONFIG_DISPLAY_BOARDINFO is not set

View file

@ -10,7 +10,6 @@ CONFIG_TARGET_SEABOARD=y
CONFIG_DEFAULT_DEVICE_TREE="tegra20-seaboard"
CONFIG_OF_SYSTEM_SETUP=y
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="usb start"
CONFIG_SYS_PROMPT="Tegra20 (SeaBoard) # "
# CONFIG_CMD_IMI is not set
# CONFIG_CMD_FLASH is not set

View file

@ -10,7 +10,6 @@ CONFIG_TARGET_VENTANA=y
CONFIG_DEFAULT_DEVICE_TREE="tegra20-ventana"
CONFIG_OF_SYSTEM_SETUP=y
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="usb start"
CONFIG_SYS_PROMPT="Tegra20 (Ventana) # "
# CONFIG_CMD_IMI is not set
CONFIG_CMD_GPIO=y

View file

@ -1,55 +0,0 @@
The biggest problem when trying to compile U-Boot with clang is that
almost all archs rely on storing gd in a global register and clang user
manual states: "clang does not support global register variables; this
is unlikely to be implemented soon because it requires additional LLVM
backend support."
Since version 3.4 the ARM backend can be instructed to leave r9 alone.
Global registers themselves are not supported so some inline assembly is
used to get its value. This does lead to larger code then strictly
necessary, but at least works.
NOTE: target compilation only work for _some_ ARM boards at the moment.
Also AArch64 is not supported currently due to a lack of private libgcc
support. Boards which reassign gd in c will also fail to compile, but there is
in no strict reason to do so in the ARM world, since crt0.S takes care of this.
These assignments can be avoided by changing the init calls but this is not in
mainline yet.
Debian (based)
--------------
Binary packages can be installed as usual, e.g.:
sudo apt-get install clang
Note that we still use binutils for some tools so we must continue to set
CROSS_COMPILE. To compile U-Boot with clang on linux without IAS use e.g.:
make HOSTCC=clang rpi_2_defconfig
make HOSTCC=clang CROSS_COMPILE=arm-linux-gnueabi- \
CC="clang -target arm-linux-gnueabi" -j8
It can also be used to compile sandbox:
make HOSTCC=clang sandbox_defconfig
make HOSTCC=clang CC=clang -j8
FreeBSD 11 (Current):
--------------------
Since llvm 3.4 is currently in the base system, the integrated as is
incapable of building U-Boot. Therefore gas from devel/arm-gnueabi-binutils
is used instead. It needs a symlinks to be picked up correctly though:
ln -s /usr/local/bin/arm-gnueabi-freebsd-as /usr/bin/arm-freebsd-eabi-as
# The following commands compile U-Boot using the clang xdev toolchain.
# NOTE: CROSS_COMPILE and target differ on purpose!
export CROSS_COMPILE=arm-gnueabi-freebsd-
gmake rpi_2_defconfig
gmake CC="clang -target arm-freebsd-eabi --sysroot /usr/arm-freebsd" -j8
Given that U-Boot will default to gcc, above commands can be
simplified with a simple wrapper script, listed below.
/usr/local/bin/arm-gnueabi-freebsd-gcc
---
#!/bin/sh
exec clang -target arm-freebsd-eabi --sysroot /usr/arm-freebsd "$@"

76
doc/build/clang.rst vendored Normal file
View file

@ -0,0 +1,76 @@
Building with Clang
===================
The biggest problem when trying to compile U-Boot with Clang is that almost all
archs rely on storing gd in a global register and the Clang 3.5 user manual
states: "Clang does not support global register variables; this is unlikely to
be implemented soon because it requires additional LLVM backend support."
The ARM backend can be instructed not to use the r9 and x18 registers using
-ffixed-r9 or -ffixed-x18 respectively. As global registers themselves are not
supported inline assembly is needed to get and set the r9 or x18 value. This
leads to larger code then strictly necessary, but at least works.
**NOTE:** target compilation only work for _some_ ARM boards at the moment.
Also AArch64 is not supported currently due to a lack of private libgcc
support. Boards which reassign gd in c will also fail to compile, but there is
in no strict reason to do so in the ARM world, since crt0.S takes care of this.
These assignments can be avoided by changing the init calls but this is not in
mainline yet.
Debian based
------------
Required packages can be installed via apt, e.g.
.. code-block:: bash
sudo apt-get install clang
Note that we still use binutils for some tools so we must continue to set
CROSS_COMPILE. To compile U-Boot with Clang on Linux without IAS use e.g.
.. code-block:: bash
make HOSTCC=clang rpi_2_defconfig
make HOSTCC=clang CROSS_COMPILE=arm-linux-gnueabi- \
CC="clang -target arm-linux-gnueabi" -j8
It can also be used to compile sandbox:
.. code-block:: bash
make HOSTCC=clang sandbox_defconfig
make HOSTCC=clang CC=clang -j8
FreeBSD 11
----------
Since llvm 3.4 is currently in the base system, the integrated assembler as
is incapable of building U-Boot. Therefore gas from devel/arm-gnueabi-binutils
is used instead. It needs a symlink to be picked up correctly though:
.. code-block:: bash
ln -s /usr/local/bin/arm-gnueabi-freebsd-as /usr/bin/arm-freebsd-eabi-as
The following commands compile U-Boot using the Clang xdev toolchain.
**NOTE:** CROSS_COMPILE and target differ on purpose!
.. code-block:: bash
export CROSS_COMPILE=arm-gnueabi-freebsd-
gmake rpi_2_defconfig
gmake CC="clang -target arm-freebsd-eabi --sysroot /usr/arm-freebsd" -j8
Given that U-Boot will default to gcc, above commands can be
simplified with a simple wrapper script - saved as
/usr/local/bin/arm-gnueabi-freebsd-gcc - listed below:
.. code-block:: bash
#!/bin/sh
exec clang -target arm-freebsd-eabi --sysroot /usr/arm-freebsd "$@"

1
doc/build/index.rst vendored
View file

@ -6,4 +6,5 @@ Build U-Boot
.. toctree::
:maxdepth: 2
clang
tools

View file

@ -25,7 +25,11 @@
#define PSCI_METHOD_HVC 1
#define PSCI_METHOD_SMC 2
#if CONFIG_IS_ENABLED(EFI_LOADER)
int __efi_runtime_data psci_method;
#else
int psci_method __attribute__ ((section(".data")));
#endif
unsigned long __efi_runtime invoke_psci_fn
(unsigned long function_id, unsigned long arg0,

View file

@ -127,7 +127,7 @@ int nanddev_bbt_set_block_status(struct nand_device *nand, unsigned int entry,
unsigned int rbits = bits_per_block + offs - BITS_PER_LONG;
pos[1] &= ~GENMASK(rbits - 1, 0);
pos[1] |= val >> rbits;
pos[1] |= val >> (bits_per_block - rbits);
}
return 0;

View file

@ -156,9 +156,30 @@ config DWC_ETH_QOS
help
This driver supports the Synopsys Designware Ethernet QOS (Quality
Of Service) IP block. The IP supports many options for bus type,
clocking/reset structure, and feature list. This driver currently
supports the specific configuration used in NVIDIA's Tegra186 chip,
but should be extensible to other combinations quite easily.
clocking/reset structure, and feature list.
config DWC_ETH_QOS_IMX
bool "Synopsys DWC Ethernet QOS device support for IMX"
depends on DWC_ETH_QOS
help
The Synopsys Designware Ethernet QOS IP block with the specific
configuration used in IMX soc.
config DWC_ETH_QOS_STM32
bool "Synopsys DWC Ethernet QOS device support for STM32"
depends on DWC_ETH_QOS
default y if ARCH_STM32MP
help
The Synopsys Designware Ethernet QOS IP block with the specific
configuration used in STM32MP soc.
config DWC_ETH_QOS_TEGRA186
bool "Synopsys DWC Ethernet QOS device support for TEGRA186"
depends on DWC_ETH_QOS
default y if TEGRA186
help
The Synopsys Designware Ethernet QOS IP block with specific
configuration used in NVIDIA's Tegra186 chip.
config E1000
bool "Intel PRO/1000 Gigabit Ethernet support"

View file

@ -2100,7 +2100,7 @@ static struct eqos_ops eqos_tegra186_ops = {
.eqos_get_tick_clk_rate = eqos_get_tick_clk_rate_tegra186
};
static const struct eqos_config eqos_tegra186_config = {
static const struct eqos_config __maybe_unused eqos_tegra186_config = {
.reg_access_always_ok = false,
.mdio_wait = 10,
.swr_wait = 10,
@ -2127,7 +2127,7 @@ static struct eqos_ops eqos_stm32_ops = {
.eqos_get_tick_clk_rate = eqos_get_tick_clk_rate_stm32
};
static const struct eqos_config eqos_stm32_config = {
static const struct eqos_config __maybe_unused eqos_stm32_config = {
.reg_access_always_ok = false,
.mdio_wait = 10000,
.swr_wait = 50,
@ -2154,7 +2154,7 @@ static struct eqos_ops eqos_imx_ops = {
.eqos_get_tick_clk_rate = eqos_get_tick_clk_rate_imx
};
struct eqos_config eqos_imx_config = {
struct eqos_config __maybe_unused eqos_imx_config = {
.reg_access_always_ok = false,
.mdio_wait = 10000,
.swr_wait = 50,
@ -2165,18 +2165,24 @@ struct eqos_config eqos_imx_config = {
};
static const struct udevice_id eqos_ids[] = {
#if IS_ENABLED(CONFIG_DWC_ETH_QOS_TEGRA186)
{
.compatible = "nvidia,tegra186-eqos",
.data = (ulong)&eqos_tegra186_config
},
#endif
#if IS_ENABLED(CONFIG_DWC_ETH_QOS_STM32)
{
.compatible = "st,stm32mp1-dwmac",
.data = (ulong)&eqos_stm32_config
},
#endif
#if IS_ENABLED(CONFIG_DWC_ETH_QOS_IMX)
{
.compatible = "fsl,imx-eqos",
.data = (ulong)&eqos_imx_config
},
#endif
{ }
};

View file

@ -276,13 +276,13 @@ config SPL_PINCTRL_STMFX
See the help of PINCTRL_STMFX for details.
config ASPEED_AST2500_PINCTRL
bool "Aspeed AST2500 pin control driver"
depends on DM && PINCTRL_GENERIC && ASPEED_AST2500
default y
help
Support pin multiplexing control on Aspeed ast2500 SoC. The driver uses
Generic Pinctrl framework and is compatible with the Linux driver,
i.e. it uses the same device tree configuration.
bool "Aspeed AST2500 pin control driver"
depends on DM && PINCTRL_GENERIC && ASPEED_AST2500
default y
help
Support pin multiplexing control on Aspeed ast2500 SoC. The driver
uses Generic Pinctrl framework and is compatible with the Linux
driver, i.e. it uses the same device tree configuration.
endif

View file

@ -278,7 +278,10 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size)
}
} else {
idx = size / mydata->sect_size;
ret = disk_read(startsect, idx, buffer);
if (idx == 0)
ret = 0;
else
ret = disk_read(startsect, idx, buffer);
if (ret != idx) {
debug("Error reading data (got %d)\n", ret);
return -1;

View file

@ -425,7 +425,6 @@ extern int soft_i2c_gpio_scl;
#ifdef CONFIG_USB_KEYBOARD
#define CONSOLE_STDIN_SETTINGS \
"preboot=usb start\0" \
"stdin=serial,usbkbd\0"
#else
#define CONSOLE_STDIN_SETTINGS \

View file

@ -15,5 +15,9 @@
#define PHY_TYPE_PCIE 2
#define PHY_TYPE_USB2 3
#define PHY_TYPE_USB3 4
#define PHY_TYPE_UFS 5
#define PHY_TYPE_DP 6
#define PHY_TYPE_XPCS 7
#define PHY_TYPE_SGMII 8
#endif /* _DT_BINDINGS_PHY */

View file

@ -49,6 +49,7 @@ 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);
extern void lmb_dump_all(struct lmb *lmb);
extern void lmb_dump_all_force(struct lmb *lmb);
static inline phys_size_t
lmb_size_bytes(struct lmb_region *type, unsigned long region_nr)

View file

@ -14,33 +14,37 @@
#define LMB_ALLOC_ANYWHERE 0
void lmb_dump_all_force(struct lmb *lmb)
{
unsigned long i;
printf("lmb_dump_all:\n");
printf(" memory.cnt = 0x%lx\n", lmb->memory.cnt);
printf(" memory.size = 0x%llx\n",
(unsigned long long)lmb->memory.size);
for (i = 0; i < lmb->memory.cnt; i++) {
printf(" memory.reg[0x%lx].base = 0x%llx\n", i,
(unsigned long long)lmb->memory.region[i].base);
printf(" .size = 0x%llx\n",
(unsigned long long)lmb->memory.region[i].size);
}
printf("\n reserved.cnt = 0x%lx\n", lmb->reserved.cnt);
printf(" reserved.size = 0x%llx\n",
(unsigned long long)lmb->reserved.size);
for (i = 0; i < lmb->reserved.cnt; i++) {
printf(" reserved.reg[0x%lx].base = 0x%llx\n", i,
(unsigned long long)lmb->reserved.region[i].base);
printf(" .size = 0x%llx\n",
(unsigned long long)lmb->reserved.region[i].size);
}
}
void lmb_dump_all(struct lmb *lmb)
{
#ifdef DEBUG
unsigned long i;
debug("lmb_dump_all:\n");
debug(" memory.cnt = 0x%lx\n", lmb->memory.cnt);
debug(" memory.size = 0x%llx\n",
(unsigned long long)lmb->memory.size);
for (i = 0; i < lmb->memory.cnt; i++) {
debug(" memory.reg[0x%lx].base = 0x%llx\n", i,
(unsigned long long)lmb->memory.region[i].base);
debug(" .size = 0x%llx\n",
(unsigned long long)lmb->memory.region[i].size);
}
debug("\n reserved.cnt = 0x%lx\n",
lmb->reserved.cnt);
debug(" reserved.size = 0x%llx\n",
(unsigned long long)lmb->reserved.size);
for (i = 0; i < lmb->reserved.cnt; i++) {
debug(" reserved.reg[0x%lx].base = 0x%llx\n", i,
(unsigned long long)lmb->reserved.region[i].base);
debug(" .size = 0x%llx\n",
(unsigned long long)lmb->reserved.region[i].size);
}
#endif /* DEBUG */
lmb_dump_all_force(lmb);
#endif
}
static long lmb_addrs_overlap(phys_addr_t base1, phys_size_t size1,

View file

@ -59,4 +59,13 @@ config TFTP_BLOCKSIZE
almost-MTU block sizes.
You can also activate CONFIG_IP_DEFRAG to set a larger block.
config TFTP_WINDOWSIZE
int "TFTP window size"
default 1
help
Default TFTP window size.
RFC7440 defines an optional window size of transmits,
before an ack response is required.
The default TFTP implementation implies a window size of 1.
endif # if NET

View file

@ -409,6 +409,10 @@ int net_loop(enum proto_t protocol)
int ret = -EINVAL;
enum net_loop_state prev_net_state = net_state;
#if defined(CONFIG_CMD_PING)
if (protocol != PING)
net_ping_ip.s_addr = 0;
#endif
net_restarted = 0;
net_dev_exists = 0;
net_try_count = 1;

View file

@ -5,7 +5,6 @@
* Copyright 2011 Comelit Group SpA,
* Luca Ceresoli <luca.ceresoli@comelit.it>
*/
#include <common.h>
#include <command.h>
#include <efi_loader.h>
@ -98,6 +97,12 @@ static int tftp_tsize;
/* The number of hashes we printed */
static short tftp_tsize_num_hash;
#endif
/* The window size negotiated */
static ushort tftp_windowsize;
/* Next block to send ack to */
static ushort tftp_next_ack;
/* Last nack block we send */
static ushort tftp_last_nack;
#ifdef CONFIG_CMD_TFTPPUT
/* 1 if writing, else 0 */
static int tftp_put_active;
@ -138,8 +143,19 @@ static char tftp_filename[MAX_LEN];
* (but those using CONFIG_IP_DEFRAG may want to set a larger block in cfg file)
*/
/* When windowsize is defined to 1,
* tftp behaves the same way as it was
* never declared
*/
#ifdef CONFIG_TFTP_WINDOWSIZE
#define TFTP_WINDOWSIZE CONFIG_TFTP_WINDOWSIZE
#else
#define TFTP_WINDOWSIZE 1
#endif
static unsigned short tftp_block_size = TFTP_BLOCK_SIZE;
static unsigned short tftp_block_size_option = CONFIG_TFTP_BLOCKSIZE;
static unsigned short tftp_window_size_option = TFTP_WINDOWSIZE;
static inline int store_block(int block, uchar *src, unsigned int len)
{
@ -356,6 +372,14 @@ static void tftp_send(void)
/* try for more effic. blk size */
pkt += sprintf((char *)pkt, "blksize%c%d%c",
0, tftp_block_size_option, 0);
/* try for more effic. window size.
* Implemented only for tftp get.
* Don't bother sending if it's 1
*/
if (tftp_state == STATE_SEND_RRQ && tftp_window_size_option > 1)
pkt += sprintf((char *)pkt, "windowsize%c%d%c",
0, tftp_window_size_option, 0);
len = pkt - xp;
break;
@ -550,7 +574,17 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
(char *)pkt + i + 6, tftp_tsize);
}
#endif
if (strcasecmp((char *)pkt + i, "windowsize") == 0) {
tftp_windowsize =
simple_strtoul((char *)pkt + i + 11,
NULL, 10);
debug("windowsize = %s, %d\n",
(char *)pkt + i + 11, tftp_windowsize);
}
}
tftp_next_ack = tftp_windowsize;
#ifdef CONFIG_CMD_TFTPPUT
if (tftp_put_active && tftp_state == STATE_OACK) {
/* Get ready to send the first block */
@ -564,7 +598,28 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
if (len < 2)
return;
len -= 2;
tftp_cur_block = ntohs(*(__be16 *)pkt);
if (ntohs(*(__be16 *)pkt) != (ushort)(tftp_cur_block + 1)) {
debug("Received unexpected block: %d, expected: %d\n",
ntohs(*(__be16 *)pkt),
(ushort)(tftp_cur_block + 1));
/*
* If one packet is dropped most likely
* all other buffers in the window
* that will arrive will cause a sending NACK.
* This just overwellms the server, let's just send one.
*/
if (tftp_last_nack != tftp_cur_block) {
tftp_send();
tftp_last_nack = tftp_cur_block;
tftp_next_ack = (ushort)(tftp_cur_block +
tftp_windowsize);
}
break;
}
tftp_cur_block++;
tftp_cur_block %= TFTP_SEQUENCE_SIZE;
if (tftp_state == STATE_SEND_RRQ)
debug("Server did not acknowledge any options!\n");
@ -606,10 +661,15 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
* Acknowledge the block just received, which will prompt
* the remote for the next one.
*/
tftp_send();
if (tftp_cur_block == tftp_next_ack) {
tftp_send();
tftp_next_ack += tftp_windowsize;
}
if (len < tftp_block_size)
if (len < tftp_block_size) {
tftp_send();
tftp_complete();
}
break;
case TFTP_ERROR:
@ -683,6 +743,10 @@ void tftp_start(enum proto_t protocol)
if (ep != NULL)
tftp_block_size_option = simple_strtol(ep, NULL, 10);
ep = env_get("tftpwindowsize");
if (ep != NULL)
tftp_window_size_option = simple_strtol(ep, NULL, 10);
ep = env_get("tftptimeout");
if (ep != NULL)
timeout_ms = simple_strtol(ep, NULL, 10);
@ -704,8 +768,8 @@ void tftp_start(enum proto_t protocol)
}
#endif
debug("TFTP blocksize = %i, timeout = %ld ms\n",
tftp_block_size_option, timeout_ms);
debug("TFTP blocksize = %i, TFTP windowsize = %d timeout = %ld ms\n",
tftp_block_size_option, tftp_window_size_option, timeout_ms);
tftp_remote_ip = net_server_ip;
if (!net_parse_bootfile(&tftp_remote_ip, tftp_filename, MAX_LEN)) {
@ -801,7 +865,8 @@ void tftp_start(enum proto_t protocol)
tftp_our_port = simple_strtol(ep, NULL, 10);
#endif
tftp_cur_block = 0;
tftp_windowsize = 1;
tftp_last_nack = 0;
/* zero out server ether in case the server ip has changed */
memset(net_server_ethaddr, 0, 6);
/* Revert tftp_block_size to dflt */

View file

@ -311,7 +311,7 @@ cmd_dt_S_dtb= \
$(obj)/%.dtb.S: $(obj)/%.dtb
$(call cmd,dt_S_dtb)
ifeq ($(CONFIG_SPL_LOAD_FIT_APPLY_OVERLAY),y)
ifeq ($(CONFIG_OF_LIBFDT_OVERLAY),y)
DTC_FLAGS += -@
endif

View file

@ -266,7 +266,7 @@ static void parse_config_file(const char *p)
(q - p == 9 && !memcmp(p, "IS_MODULE(", 10)) ||
(q - p == 3 && !memcmp(p, "VAL(", 4))) {
p = q + 1;
q = p;
q = p;
while (isalnum(*q) || *q == '_')
q++;
r = q;

View file

@ -17,6 +17,7 @@ import u_boot_spawn
# Regexes for text we expect U-Boot to send to the console.
pattern_u_boot_spl_signon = re.compile('(U-Boot SPL \\d{4}\\.\\d{2}[^\r\n]*\\))')
pattern_u_boot_spl2_signon = re.compile('(U-Boot SPL \\d{4}\\.\\d{2}[^\r\n]*\\))')
pattern_u_boot_main_signon = re.compile('(U-Boot \\d{4}\\.\\d{2}[^\r\n]*\\))')
pattern_stop_autoboot_prompt = re.compile('Hit any key to stop autoboot: ')
pattern_unknown_command = re.compile('Unknown command \'.*\' - try \'help\'')
@ -28,6 +29,7 @@ PAT_RE = 1
bad_pattern_defs = (
('spl_signon', pattern_u_boot_spl_signon),
('spl2_signon', pattern_u_boot_spl2_signon),
('main_signon', pattern_u_boot_main_signon),
('stop_autoboot_prompt', pattern_stop_autoboot_prompt),
('unknown_command', pattern_unknown_command),
@ -353,12 +355,20 @@ class ConsoleBase(object):
'n') == 'y'
env_spl_skipped = self.config.env.get('env__spl_skipped',
False)
env_spl2_skipped = self.config.env.get('env__spl2_skipped',
True)
if config_spl and config_spl_serial_support and not env_spl_skipped:
m = self.p.expect([pattern_u_boot_spl_signon] +
self.bad_patterns)
if m != 0:
raise Exception('Bad pattern found on SPL console: ' +
self.bad_pattern_ids[m - 1])
if not env_spl2_skipped:
m = self.p.expect([pattern_u_boot_spl2_signon] +
self.bad_patterns)
if m != 0:
raise Exception('Bad pattern found on SPL2 console: ' +
self.bad_pattern_ids[m - 1])
m = self.p.expect([pattern_u_boot_main_signon] + self.bad_patterns)
if m != 0:
raise Exception('Bad pattern found on console: ' +

6
tools/env/fw_env.c vendored
View file

@ -952,8 +952,8 @@ static int flash_read_buf(int dev, int fd, void *buf, size_t count,
return -1;
}
if (rc != readlen) {
fprintf(stderr, "Read error on %s: "
"Attempted to read %d bytes but got %d\n",
fprintf(stderr,
"Read error on %s: Attempted to read %zd bytes but got %d\n",
DEVNAME(dev), readlen, rc);
return -1;
}
@ -995,7 +995,7 @@ static int flash_write_buf(int dev, int fd, void *buf, size_t count)
of the data */
loff_t blockstart; /* running start of the current block -
MEMGETBADBLOCK needs 64 bits */
int was_locked; /* flash lock flag */
int was_locked = 0; /* flash lock flag */
int rc;
/*

View file

@ -388,7 +388,7 @@ static int fit_build(struct image_tool_params *params, const char *fname)
size = fit_calc_size(params);
if (size < 0)
return -1;
buf = malloc(size);
buf = calloc(1, size);
if (!buf) {
fprintf(stderr, "%s: Out of memory (%d bytes)\n",
params->cmdname, size);
@ -467,7 +467,7 @@ static int fit_extract_data(struct image_tool_params *params, const char *fname)
* Allocate space to hold the image data we will extract,
* extral space allocate for image alignment to prevent overflow.
*/
buf = malloc(fit_size + (align_size * image_number));
buf = calloc(1, fit_size + (align_size * image_number));
if (!buf) {
ret = -ENOMEM;
goto err_munmap;
@ -572,7 +572,7 @@ static int fit_import_data(struct image_tool_params *params, const char *fname)
/* Allocate space to hold the new FIT */
size = sbuf.st_size + 16384;
fdt = malloc(size);
fdt = calloc(1, size);
if (!fdt) {
fprintf(stderr, "%s: Failed to allocate memory (%d bytes)\n",
__func__, size);
@ -673,7 +673,7 @@ static int copyfile(const char *src, const char *dst)
goto out;
}
buf = malloc(512);
buf = calloc(1, 512);
if (!buf) {
printf("Can't allocate buffer to copy file\n");
goto out;