aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/cli_readline.c5
-rw-r--r--common/spl/spl.c21
-rw-r--r--common/spl/spl_fit.c8
-rw-r--r--common/xyzModem.c40
4 files changed, 69 insertions, 5 deletions
diff --git a/common/cli_readline.c b/common/cli_readline.c
index e86ee73faf..f883b7ffac 100644
--- a/common/cli_readline.c
+++ b/common/cli_readline.c
@@ -72,8 +72,13 @@ static char *delete_char (char *buffer, char *p, int *colp, int *np, int plen)
#define getcmd_getch() getchar()
#define getcmd_cbeep() getcmd_putch('\a')
+#ifdef CONFIG_SPL_BUILD
+#define HIST_MAX 3
+#define HIST_SIZE 32
+#else
#define HIST_MAX 20
#define HIST_SIZE CONFIG_SYS_CBSIZE
+#endif
static int hist_max;
static int hist_add_idx;
diff --git a/common/spl/spl.c b/common/spl/spl.c
index 29e0898f03..828f72f30b 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -116,6 +116,11 @@ int __weak bootz_setup(ulong image, ulong *start, ulong *end)
{
return 1;
}
+
+int __weak booti_setup(ulong image, ulong *relocated_addr, ulong *size, bool force_reloc)
+{
+ return 1;
+}
#endif
/* Weak default function for arch/board-specific fixups to the spl_image_info */
@@ -391,6 +396,21 @@ int spl_parse_image_header(struct spl_image_info *spl_image,
#endif
#if CONFIG_IS_ENABLED(OS_BOOT)
+#if defined(CMD_BOOTI)
+ ulong start, size;
+
+ if (!booti_setup((ulong)header, &start, &size, 0)) {
+ spl_image->name = "Linux";
+ spl_image->os = IH_OS_LINUX;
+ spl_image->load_addr = start;
+ spl_image->entry_point = start;
+ spl_image->size = size;
+ debug(SPL_TPL_PROMPT
+ "payload Image, load addr: 0x%lx size: %d\n",
+ spl_image->load_addr, spl_image->size);
+ return 0;
+ }
+#elif defined(CMD_BOOTZ)
ulong start, end;
if (!bootz_setup((ulong)header, &start, &end)) {
@@ -405,6 +425,7 @@ int spl_parse_image_header(struct spl_image_info *spl_image,
return 0;
}
#endif
+#endif
if (!spl_parse_board_header(spl_image, bootdev, (const void *)header, sizeof(*header)))
return 0;
diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index a35be52965..c1ed31e367 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -10,7 +10,7 @@
#include <gzip.h>
#include <image.h>
#include <log.h>
-#include <malloc.h>
+#include <memalign.h>
#include <mapmem.h>
#include <spl.h>
#include <sysinfo.h>
@@ -429,7 +429,9 @@ static int spl_fit_append_fdt(struct spl_image_info *spl_image,
* depending on how the overlay is stored, so
* don't fail yet if the allocation failed.
*/
- tmpbuffer = malloc(CONFIG_SPL_LOAD_FIT_APPLY_OVERLAY_BUF_SZ);
+ size_t size = CONFIG_SPL_LOAD_FIT_APPLY_OVERLAY_BUF_SZ;
+
+ tmpbuffer = malloc_cache_aligned(size);
if (!tmpbuffer)
debug("%s: unable to allocate space for overlays\n",
__func__);
@@ -537,7 +539,7 @@ static void *spl_get_fit_load_buffer(size_t size)
{
void *buf;
- buf = malloc(size);
+ buf = malloc_cache_aligned(size);
if (!buf) {
pr_err("Could not get FIT buffer of %lu bytes\n", (ulong)size);
pr_err("\tcheck CONFIG_SYS_SPL_MALLOC_SIZE\n");
diff --git a/common/xyzModem.c b/common/xyzModem.c
index ece25acb18..a68d392902 100644
--- a/common/xyzModem.c
+++ b/common/xyzModem.c
@@ -26,6 +26,7 @@
#include <stdarg.h>
#include <u-boot/crc.h>
#include <watchdog.h>
+#include <env.h>
/* Assumption - run xyzModem protocol over the console port */
@@ -50,6 +51,8 @@ static struct
int len, mode, total_retries;
int total_SOH, total_STX, total_CAN;
bool crc_mode, at_eof, tx_ack;
+ bool first_xmodem_packet;
+ ulong initial_time, timeout;
unsigned long file_length, read_length;
} xyz;
@@ -409,6 +412,19 @@ xyzModem_get_hdr (void)
return 0;
}
+static
+ulong
+xyzModem_get_initial_timeout (void)
+{
+ /* timeout is in seconds, non-positive timeout value is infinity */
+#if CONFIG_IS_ENABLED(ENV_SUPPORT)
+ const char *timeout_str = env_get("loadxy_timeout");
+ if (timeout_str)
+ return 1000 * simple_strtol(timeout_str, NULL, 10);
+#endif
+ return 1000 * CONFIG_CMD_LOADXY_TIMEOUT;
+}
+
int
xyzModem_stream_open (connection_info_t * info, int *err)
{
@@ -439,18 +455,28 @@ xyzModem_stream_open (connection_info_t * info, int *err)
xyz.total_CAN = 0;
xyz.read_length = 0;
xyz.file_length = 0;
+ xyz.first_xmodem_packet = false;
+ xyz.initial_time = get_timer(0);
+ xyz.timeout = xyzModem_get_initial_timeout();
CYGACC_COMM_IF_PUTC (*xyz.__chan, (xyz.crc_mode ? 'C' : NAK));
if (xyz.mode == xyzModem_xmodem)
{
/* X-modem doesn't have an information header - exit here */
+ xyz.first_xmodem_packet = true;
xyz.next_blk = 1;
return 0;
}
- while (retries-- > 0)
+ while (!(xyz.timeout && get_timer(xyz.initial_time) > xyz.timeout))
{
+ if (--retries <= 0)
+ {
+ retries = xyzModem_MAX_RETRIES;
+ crc_retries = xyzModem_MAX_RETRIES_WITH_CRC;
+ xyz.crc_mode = true;
+ }
stat = xyzModem_get_hdr ();
if (stat == 0)
{
@@ -503,9 +529,19 @@ xyzModem_stream_read (char *buf, int size, int *err)
retries = xyzModem_MAX_RETRIES;
while (retries-- > 0)
{
+ if (xyz.first_xmodem_packet && xyz.timeout &&
+ get_timer(xyz.initial_time) > xyz.timeout)
+ {
+ *err = xyzModem_timeout;
+ xyz.len = -1;
+ return total;
+ }
+
stat = xyzModem_get_hdr ();
if (stat == 0)
{
+ if (xyz.mode == xyzModem_xmodem && xyz.first_xmodem_packet)
+ xyz.first_xmodem_packet = false;
if (xyz.blk == xyz.next_blk)
{
xyz.tx_ack = true;
@@ -583,7 +619,7 @@ xyzModem_stream_read (char *buf, int size, int *err)
xyz.total_retries++;
ZM_DEBUG (zm_dprintf ("NAK (%d)\n", __LINE__));
}
- if (stat < 0)
+ if (stat < 0 && (!xyz.first_xmodem_packet || stat != xyzModem_timeout))
{
*err = stat;
xyz.len = -1;