summaryrefslogtreecommitdiff
path: root/tools/pblimage.c
diff options
context:
space:
mode:
authorChris Packham <chris.packham@alliedtelesis.co.nz>2013-05-27 10:51:46 +1200
committerAndy Fleming <afleming@freescale.com>2013-06-20 17:08:52 -0500
commit0d3efd805618068f33ec8dd3610b1cd740afb5cd (patch)
treebfb140d13d12f93340c26f6c007f3a5849ffa26f /tools/pblimage.c
parente51e47d38ef2f15a2d81d48621121e0a30aad316 (diff)
downloadu-boot-imx-0d3efd805618068f33ec8dd3610b1cd740afb5cd.zip
u-boot-imx-0d3efd805618068f33ec8dd3610b1cd740afb5cd.tar.gz
u-boot-imx-0d3efd805618068f33ec8dd3610b1cd740afb5cd.tar.bz2
powerpc/CoreNet: Allow pbl images to take u-boot images != 512K
Instead of assuming that SYS_TEXT_BASE is 0xFFF80000 calculate the initial pbl command offset by subtracting the image size from the top of the 24-bit address range. Also increase the size of the memory buffer to accommodate a larger output image. Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> Signed-off-by: Andy Fleming <afleming@freescale.com>
Diffstat (limited to 'tools/pblimage.c')
-rw-r--r--tools/pblimage.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/tools/pblimage.c b/tools/pblimage.c
index 508a747..5f39dc5 100644
--- a/tools/pblimage.c
+++ b/tools/pblimage.c
@@ -26,18 +26,14 @@
#include "pblimage.h"
/*
- * The PBL can load up to 64 bytes at a time, so we split the U-Boot
- * image into 64 byte chunks. PBL needs a command for each piece, of
- * the form "81xxxxxx", where "xxxxxx" is the offset. SYS_TEXT_BASE
- * is 0xFFF80000 for PBL boot, and PBL only cares about low 24-bit,
- * so it starts from 0x81F80000.
+ * Initialize to an invalid value.
*/
-static uint32_t next_pbl_cmd = 0x81F80000;
+static uint32_t next_pbl_cmd = 0x82000000;
/*
* need to store all bytes in memory for calculating crc32, then write the
* bytes to image file for PBL boot.
*/
-static unsigned char mem_buf[600000];
+static unsigned char mem_buf[1000000];
static unsigned char *pmem_buf = mem_buf;
static int pbl_size;
static char *fname = "Unknown";
@@ -52,6 +48,27 @@ static union
#define ENDIANNESS ((char)endian_test.l)
+/*
+ * The PBL can load up to 64 bytes at a time, so we split the U-Boot
+ * image into 64 byte chunks. PBL needs a command for each piece, of
+ * the form "81xxxxxx", where "xxxxxx" is the offset. Calculate the
+ * start offset by subtracting the size of the u-boot image from the
+ * top of the allowable 24-bit range.
+ */
+static void init_next_pbl_cmd(FILE *fp_uboot)
+{
+ struct stat st;
+ int fd = fileno(fp_uboot);
+
+ if (fstat(fd, &st) == -1) {
+ printf("Error: Could not determine u-boot image size. %s\n",
+ strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
+ next_pbl_cmd = 0x82000000 - st.st_size;
+}
+
static void generate_pbl_cmd(void)
{
uint32_t val = next_pbl_cmd;
@@ -80,6 +97,7 @@ static void pbl_fget(size_t size, FILE *stream)
/* load split u-boot with PBI command 81xxxxxx. */
static void load_uboot(FILE *fp_uboot)
{
+ init_next_pbl_cmd(fp_uboot);
while (next_pbl_cmd < 0x82000000) {
generate_pbl_cmd();
pbl_fget(64, fp_uboot);