mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
Merge branch '2020-08-05-misc-fixes'
- A large number of assorted fixes and minor improvements
This commit is contained in:
commit
635dfee2cb
44 changed files with 426 additions and 133 deletions
5
README
5
README
|
@ -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.
|
||||
|
|
|
@ -139,6 +139,7 @@ config SANDBOX
|
|||
imply ACPI_PMC
|
||||
imply ACPI_PMC_SANDBOX
|
||||
imply CMD_PMC
|
||||
imply CMD_CLONE
|
||||
|
||||
config SH
|
||||
bool "SuperH architecture"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
14
cmd/bdinfo.c
14
cmd/bdinfo.c
|
@ -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();
|
||||
|
||||
|
|
|
@ -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
126
cmd/clone.c
Normal 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)"
|
||||
);
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
76
doc/build/clang.rst
vendored
Normal 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
1
doc/build/index.rst
vendored
|
@ -6,4 +6,5 @@ Build U-Boot
|
|||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
clang
|
||||
tools
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
||||
{ }
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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)
|
||||
|
|
52
lib/lmb.c
52
lib/lmb.c
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
79
net/tftp.c
79
net/tftp.c
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
6
tools/env/fw_env.c
vendored
|
@ -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;
|
||||
|
||||
/*
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue