summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-mvebu/Kconfig10
-rw-r--r--arch/arm/mach-mvebu/Makefile5
-rw-r--r--arch/arm/mach-mvebu/kwbimage.cfg.in3
-rw-r--r--arch/arm/mach-mvebu/spl.c11
-rw-r--r--cmd/mvebu/bubt.c7
-rw-r--r--drivers/ddr/marvell/a38x/mv_ddr_plat.c7
-rw-r--r--tools/aisimage.c2
-rw-r--r--tools/atmelimage.c2
-rw-r--r--tools/default_image.c7
-rw-r--r--tools/fit_common.c5
-rw-r--r--tools/fit_common.h2
-rw-r--r--tools/fit_image.c2
-rw-r--r--tools/gpimage.c2
-rw-r--r--tools/imagetool.c4
-rw-r--r--tools/imagetool.h2
-rw-r--r--tools/imx8image.c2
-rw-r--r--tools/imx8mimage.c2
-rw-r--r--tools/imximage.c2
-rw-r--r--tools/kwbimage.c144
-rw-r--r--tools/kwboot.c35
-rw-r--r--tools/lpc32xximage.c2
-rw-r--r--tools/mkimage.c2
-rw-r--r--tools/mtk_image.c2
-rw-r--r--tools/mxsimage.c2
-rw-r--r--tools/omapimage.c2
-rw-r--r--tools/pblimage.c2
-rw-r--r--tools/rkcommon.c2
-rw-r--r--tools/rkcommon.h2
-rw-r--r--tools/socfpgaimage.c2
-rw-r--r--tools/stm32image.c2
-rw-r--r--tools/sunxi_egon.c2
-rw-r--r--tools/sunxi_toc0.c2
-rw-r--r--tools/ublimage.c2
-rw-r--r--tools/vybridimage.c2
-rw-r--r--tools/zynqimage.c2
-rw-r--r--tools/zynqmpimage.c2
-rw-r--r--tools/zynqmpimage.h2
37 files changed, 199 insertions, 91 deletions
diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig
index b1f2e97ae7..ac484c73f6 100644
--- a/arch/arm/mach-mvebu/Kconfig
+++ b/arch/arm/mach-mvebu/Kconfig
@@ -381,6 +381,16 @@ config MVEBU_SPL_NAND_BADBLK_LOCATION
Value 0x0 = SLC flash = BBI at page 0 or page 1
Value 0x1 = MLC flash = BBI at last page in the block
+config MVEBU_SPL_SATA_BLKSZ
+ int "SATA block size"
+ depends on MVEBU_SPL_BOOT_DEVICE_SATA
+ range 512 32768
+ default 512
+ help
+ Block size of the SATA disk in bytes.
+ Typically 512 bytes for majority of disks
+ and 4096 bytes for 4K Native disks.
+
config MVEBU_EFUSE
bool "Enable eFuse support"
depends on HAVE_MVEBU_EFUSE
diff --git a/arch/arm/mach-mvebu/Makefile b/arch/arm/mach-mvebu/Makefile
index 90f88337bc..0584ed2be5 100644
--- a/arch/arm/mach-mvebu/Makefile
+++ b/arch/arm/mach-mvebu/Makefile
@@ -73,6 +73,11 @@ KWB_CFG_NAND_BLKSZ = $(CONFIG_SYS_NAND_BLOCK_SIZE)
KWB_CFG_NAND_BADBLK_LOCATION = $(CONFIG_MVEBU_SPL_NAND_BADBLK_LOCATION)
endif
+ifneq ($(CONFIG_MVEBU_SPL_BOOT_DEVICE_SATA),)
+KWB_REPLACE += SATA_BLKSZ
+KWB_CFG_SATA_BLKSZ = $(CONFIG_MVEBU_SPL_SATA_BLKSZ)
+endif
+
ifneq ($(CONFIG_SECURED_MODE_IMAGE),)
KWB_REPLACE += CSK_INDEX
KWB_CFG_CSK_INDEX = $(CONFIG_SECURED_MODE_CSK_INDEX)
diff --git a/arch/arm/mach-mvebu/kwbimage.cfg.in b/arch/arm/mach-mvebu/kwbimage.cfg.in
index 90cf00c5b9..588c259202 100644
--- a/arch/arm/mach-mvebu/kwbimage.cfg.in
+++ b/arch/arm/mach-mvebu/kwbimage.cfg.in
@@ -16,6 +16,9 @@ VERSION 1
#@NAND_BLKSZ
#@NAND_BADBLK_LOCATION
+# SATA configuration
+#@SATA_BLKSZ
+
# Enable BootROM output via DEBUG flag on SoCs which require it
#@DEBUG
diff --git a/arch/arm/mach-mvebu/spl.c b/arch/arm/mach-mvebu/spl.c
index 6b8c72a71d..379daa88a4 100644
--- a/arch/arm/mach-mvebu/spl.c
+++ b/arch/arm/mach-mvebu/spl.c
@@ -208,10 +208,15 @@ int spl_parse_board_header(struct spl_image_info *spl_image,
/*
* For SATA srcaddr is specified in number of sectors.
- * This expects that sector size is 512 bytes.
+ * Retrieve block size of the first SCSI device (same
+ * code used by the spl_sata_load_image_raw() function)
+ * or fallback to default sector size of 512 bytes.
*/
- if (IS_ENABLED(CONFIG_SPL_SATA) && mhdr->blockid == IBR_HDR_SATA_ID)
- spl_image->offset *= 512;
+ if (IS_ENABLED(CONFIG_SPL_SATA) && mhdr->blockid == IBR_HDR_SATA_ID) {
+ struct blk_desc *blk_dev = blk_get_devnum_by_uclass_id(UCLASS_SCSI, 0);
+ unsigned long blksz = blk_dev ? blk_dev->blksz : 512;
+ spl_image->offset *= blksz;
+ }
if (spl_image->offset % 4 != 0) {
printf("ERROR: Wrong srcaddr (0x%08x) in kwbimage\n",
diff --git a/cmd/mvebu/bubt.c b/cmd/mvebu/bubt.c
index 37ff9c4552..ca24a5c1c4 100644
--- a/cmd/mvebu/bubt.c
+++ b/cmd/mvebu/bubt.c
@@ -924,8 +924,11 @@ static int check_image_header(void)
offset = le32_to_cpu(hdr->srcaddr);
size = le32_to_cpu(hdr->blocksize);
- if (hdr->blockid == 0x78) /* SATA id */
- offset *= 512;
+ if (hdr->blockid == 0x78) { /* SATA id */
+ struct blk_desc *blk_dev = IS_ENABLED(BLK) ? blk_get_devnum_by_uclass_id(UCLASS_SCSI, 0) : NULL;
+ unsigned long blksz = blk_dev ? blk_dev->blksz : 512;
+ offset *= blksz;
+ }
if (offset % 4 != 0 || size < 4 || size % 4 != 0) {
printf("Error: Bad A38x image blocksize.\n");
diff --git a/drivers/ddr/marvell/a38x/mv_ddr_plat.c b/drivers/ddr/marvell/a38x/mv_ddr_plat.c
index 6e7949ac72..8ec9fb0874 100644
--- a/drivers/ddr/marvell/a38x/mv_ddr_plat.c
+++ b/drivers/ddr/marvell/a38x/mv_ddr_plat.c
@@ -1363,13 +1363,6 @@ int mv_ddr_pre_training_soc_config(const char *ddr_type)
DRAM_RESET_MASK_MASKED << DRAM_RESET_MASK_OFFS);
}
- /* Check if DRAM is already initialized */
- if (reg_read(REG_BOOTROM_ROUTINE_ADDR) &
- (1 << REG_BOOTROM_ROUTINE_DRAM_INIT_OFFS)) {
- printf("%s Training Sequence - 2nd boot - Skip\n", ddr_type);
- return MV_OK;
- }
-
/* Fix read ready phases for all SOC in reg 0x15c8 */
reg_val = reg_read(TRAINING_DBG_3_REG);
diff --git a/tools/aisimage.c b/tools/aisimage.c
index b8b3ee3207..c5b33b559b 100644
--- a/tools/aisimage.c
+++ b/tools/aisimage.c
@@ -113,7 +113,7 @@ static int get_ais_table_id(uint32_t *ptr)
return -1;
}
-static void aisimage_print_header(const void *hdr)
+static void aisimage_print_header(const void *hdr, struct image_tool_params *params)
{
struct ais_header *ais_hdr = (struct ais_header *)hdr;
uint32_t *ptr;
diff --git a/tools/atmelimage.c b/tools/atmelimage.c
index 7b3b243d58..6a2d9d8fea 100644
--- a/tools/atmelimage.c
+++ b/tools/atmelimage.c
@@ -182,7 +182,7 @@ static void atmel_print_pmecc_header(const uint32_t word)
printf("\t\t====================\n");
}
-static void atmel_print_header(const void *ptr)
+static void atmel_print_header(const void *ptr, struct image_tool_params *params)
{
uint32_t *ints = (uint32_t *)ptr;
size_t pos;
diff --git a/tools/default_image.c b/tools/default_image.c
index dc429ce9e4..0e49ab3301 100644
--- a/tools/default_image.c
+++ b/tools/default_image.c
@@ -41,6 +41,11 @@ static int image_check_params(struct image_tool_params *params)
(params->lflag && (params->dflag || params->fflag)));
}
+static void image_print_header(const void *ptr, struct image_tool_params *params)
+{
+ image_print_contents(ptr);
+}
+
static int image_verify_header(unsigned char *ptr, int image_size,
struct image_tool_params *params)
{
@@ -201,7 +206,7 @@ U_BOOT_IMAGE_TYPE(
(void *)&header,
image_check_params,
image_verify_header,
- image_print_contents,
+ image_print_header,
image_set_header,
image_extract_subimage,
image_check_image_types,
diff --git a/tools/fit_common.c b/tools/fit_common.c
index 01649760ac..2d417d4719 100644
--- a/tools/fit_common.c
+++ b/tools/fit_common.c
@@ -23,6 +23,11 @@
#include <image.h>
#include <u-boot/crc.h>
+void fit_print_header(const void *fit, struct image_tool_params *params)
+{
+ fit_print_contents(fit);
+}
+
int fit_verify_header(unsigned char *ptr, int image_size,
struct image_tool_params *params)
{
diff --git a/tools/fit_common.h b/tools/fit_common.h
index 920a16acfd..2da4b9422d 100644
--- a/tools/fit_common.h
+++ b/tools/fit_common.h
@@ -10,6 +10,8 @@
#include "mkimage.h"
#include <image.h>
+void fit_print_header(const void *fit, struct image_tool_params *params);
+
/**
* Verify the format of FIT header pointed to by ptr
*
diff --git a/tools/fit_image.c b/tools/fit_image.c
index 8763a36d01..9fe69ea0d9 100644
--- a/tools/fit_image.c
+++ b/tools/fit_image.c
@@ -944,7 +944,7 @@ U_BOOT_IMAGE_TYPE(
(void *)&header,
fit_check_params,
fit_verify_header,
- fit_print_contents,
+ fit_print_header,
NULL,
fit_extract_contents,
fit_check_image_types,
diff --git a/tools/gpimage.c b/tools/gpimage.c
index 27de4cfaed..d2bc79d46b 100644
--- a/tools/gpimage.c
+++ b/tools/gpimage.c
@@ -41,7 +41,7 @@ static int gpimage_verify_header(unsigned char *ptr, int image_size,
return gph_verify_header(gph, 1);
}
-static void gpimage_print_header(const void *ptr)
+static void gpimage_print_header(const void *ptr, struct image_tool_params *params)
{
const struct gp_header *gph = (struct gp_header *)ptr;
diff --git a/tools/imagetool.c b/tools/imagetool.c
index 87eee4ad04..b293211cf8 100644
--- a/tools/imagetool.c
+++ b/tools/imagetool.c
@@ -66,7 +66,7 @@ int imagetool_verify_print_header(
*/
if ((*curr)->print_header) {
if (!params->quiet)
- (*curr)->print_header(ptr);
+ (*curr)->print_header(ptr, params);
} else {
fprintf(stderr,
"%s: print_header undefined for %s\n",
@@ -103,7 +103,7 @@ static int imagetool_verify_print_header_by_type(
*/
if (tparams->print_header) {
if (!params->quiet)
- tparams->print_header(ptr);
+ tparams->print_header(ptr, params);
} else {
fprintf(stderr,
"%s: print_header undefined for %s\n",
diff --git a/tools/imagetool.h b/tools/imagetool.h
index fdceea46c0..a766aa2ae9 100644
--- a/tools/imagetool.h
+++ b/tools/imagetool.h
@@ -132,7 +132,7 @@ struct image_type_params {
*/
int (*verify_header) (unsigned char *, int, struct image_tool_params *);
/* Prints image information abstracting from image header */
- void (*print_header) (const void *);
+ void (*print_header) (const void *, struct image_tool_params *);
/*
* The header or image contents need to be set as per image type to
* be generated using this callback function.
diff --git a/tools/imx8image.c b/tools/imx8image.c
index c25ea84e25..76d0cd62dc 100644
--- a/tools/imx8image.c
+++ b/tools/imx8image.c
@@ -30,7 +30,7 @@ static void imx8image_set_header(void *ptr, struct stat *sbuf, int ifd,
{
}
-static void imx8image_print_header(const void *ptr)
+static void imx8image_print_header(const void *ptr, struct image_tool_params *params)
{
}
diff --git a/tools/imx8mimage.c b/tools/imx8mimage.c
index 3ca79d865a..21075c2379 100644
--- a/tools/imx8mimage.c
+++ b/tools/imx8mimage.c
@@ -60,7 +60,7 @@ static void imx8mimage_set_header(void *ptr, struct stat *sbuf, int ifd,
{
}
-static void imx8mimage_print_header(const void *ptr)
+static void imx8mimage_print_header(const void *ptr, struct image_tool_params *params)
{
}
diff --git a/tools/imximage.c b/tools/imximage.c
index 354ee34c14..b3da1f244c 100644
--- a/tools/imximage.c
+++ b/tools/imximage.c
@@ -813,7 +813,7 @@ static int imximage_verify_header(unsigned char *ptr, int image_size,
return 0;
}
-static void imximage_print_header(const void *ptr)
+static void imximage_print_header(const void *ptr, struct image_tool_params *params)
{
struct imx_header *imx_hdr = (struct imx_header *) ptr;
uint32_t version = detect_imximage_version(imx_hdr);
diff --git a/tools/kwbimage.c b/tools/kwbimage.c
index 177084adf8..4dce495ff0 100644
--- a/tools/kwbimage.c
+++ b/tools/kwbimage.c
@@ -116,6 +116,7 @@ enum image_cfg_type {
IMAGE_CFG_NAND_BADBLK_LOCATION,
IMAGE_CFG_NAND_ECC_MODE,
IMAGE_CFG_NAND_PAGESZ,
+ IMAGE_CFG_SATA_BLKSZ,
IMAGE_CFG_CPU,
IMAGE_CFG_BINARY,
IMAGE_CFG_DATA,
@@ -147,6 +148,7 @@ static const char * const id_strs[] = {
[IMAGE_CFG_NAND_BADBLK_LOCATION] = "NAND_BADBLK_LOCATION",
[IMAGE_CFG_NAND_ECC_MODE] = "NAND_ECC_MODE",
[IMAGE_CFG_NAND_PAGESZ] = "NAND_PAGE_SIZE",
+ [IMAGE_CFG_SATA_BLKSZ] = "SATA_BLKSZ",
[IMAGE_CFG_CPU] = "CPU",
[IMAGE_CFG_BINARY] = "BINARY",
[IMAGE_CFG_DATA] = "DATA",
@@ -185,6 +187,7 @@ struct image_cfg_element {
unsigned int nandbadblklocation;
unsigned int nandeccmode;
unsigned int nandpagesz;
+ unsigned int satablksz;
struct ext_hdr_v0_reg regdata;
unsigned int regdata_delay;
unsigned int baudrate;
@@ -992,13 +995,21 @@ static int image_fill_xip_header(void *image, struct image_tool_params *params)
return 1;
}
+static unsigned int image_get_satablksz(void)
+{
+ struct image_cfg_element *e;
+ e = image_find_option(IMAGE_CFG_SATA_BLKSZ);
+ return e ? e->satablksz : 512;
+}
+
static size_t image_headersz_align(size_t headersz, uint8_t blockid)
{
/*
* Header needs to be 4-byte aligned, which is already ensured by code
* above. Moreover UART images must have header aligned to 128 bytes
* (xmodem block size), NAND images to 256 bytes (ECC calculation),
- * and SATA and SDIO images to 512 bytes (storage block size).
+ * SDIO images to 512 bytes (SDHC/SDXC fixed block size) and SATA
+ * images to specified storage block size (default 512 bytes).
* Note that SPI images do not have to have header size aligned
* to 256 bytes because it is possible to read from SPI storage from
* any offset (read offset does not have to be aligned to block size).
@@ -1007,8 +1018,10 @@ static size_t image_headersz_align(size_t headersz, uint8_t blockid)
return ALIGN(headersz, 128);
else if (blockid == IBR_HDR_NAND_ID)
return ALIGN(headersz, 256);
- else if (blockid == IBR_HDR_SATA_ID || blockid == IBR_HDR_SDIO_ID)
+ else if (blockid == IBR_HDR_SDIO_ID)
return ALIGN(headersz, 512);
+ else if (blockid == IBR_HDR_SATA_ID)
+ return ALIGN(headersz, image_get_satablksz());
else
return headersz;
}
@@ -1076,12 +1089,11 @@ static void *image_create_v0(size_t *dataoff, struct image_tool_params *params,
if (e)
main_hdr->nandbadblklocation = e->nandbadblklocation;
- /*
- * For SATA srcaddr is specified in number of sectors.
- * This expects the sector size to be 512 bytes.
- */
- if (main_hdr->blockid == IBR_HDR_SATA_ID)
- main_hdr->srcaddr = cpu_to_le32(le32_to_cpu(main_hdr->srcaddr) / 512);
+ /* For SATA srcaddr is specified in number of sectors. */
+ if (main_hdr->blockid == IBR_HDR_SATA_ID) {
+ params->bl_len = image_get_satablksz();
+ main_hdr->srcaddr = cpu_to_le32(le32_to_cpu(main_hdr->srcaddr) / params->bl_len);
+ }
/* For PCIe srcaddr is not used and must be set to 0xFFFFFFFF. */
if (main_hdr->blockid == IBR_HDR_PEX_ID)
@@ -1533,12 +1545,11 @@ static void *image_create_v1(size_t *dataoff, struct image_tool_params *params,
if (e)
main_hdr->flags = e->debug ? 0x1 : 0;
- /*
- * For SATA srcaddr is specified in number of sectors.
- * This expects the sector size to be 512 bytes.
- */
- if (main_hdr->blockid == IBR_HDR_SATA_ID)
- main_hdr->srcaddr = cpu_to_le32(le32_to_cpu(main_hdr->srcaddr) / 512);
+ /* For SATA srcaddr is specified in number of sectors. */
+ if (main_hdr->blockid == IBR_HDR_SATA_ID) {
+ params->bl_len = image_get_satablksz();
+ main_hdr->srcaddr = cpu_to_le32(le32_to_cpu(main_hdr->srcaddr) / params->bl_len);
+ }
/* For PCIe srcaddr is not used and must be set to 0xFFFFFFFF. */
if (main_hdr->blockid == IBR_HDR_PEX_ID)
@@ -1702,6 +1713,13 @@ static int image_create_config_parse_oneline(char *line,
case IMAGE_CFG_NAND_PAGESZ:
el->nandpagesz = strtoul(value1, NULL, 16);
break;
+ case IMAGE_CFG_SATA_BLKSZ:
+ el->satablksz = strtoul(value1, NULL, 0);
+ if (el->satablksz & (el->satablksz-1)) {
+ fprintf(stderr, "Invalid SATA block size '%s'\n", value1);
+ return -1;
+ }
+ break;
case IMAGE_CFG_BINARY:
argi = 0;
@@ -1893,6 +1911,8 @@ static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,
struct stat s;
int ret;
+ params->bl_len = 1;
+
/*
* Do not use sbuf->st_size as it contains size with padding.
* We need original image data size, so stat original file.
@@ -1972,7 +1992,7 @@ static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,
free(image);
}
-static void kwbimage_print_header(const void *ptr)
+static void kwbimage_print_header(const void *ptr, struct image_tool_params *params)
{
struct main_hdr_v0 *mhdr = (struct main_hdr_v0 *)ptr;
struct bin_hdr_v0 *bhdr;
@@ -2004,10 +2024,11 @@ static void kwbimage_print_header(const void *ptr)
genimg_print_size(le32_to_cpu(mhdr->blocksize) - sizeof(uint32_t));
printf("Data Offset: ");
if (mhdr->blockid == IBR_HDR_SATA_ID)
- printf("%u Sector%s (LBA)\n", le32_to_cpu(mhdr->srcaddr),
+ printf("%u Sector%s (LBA) = ", le32_to_cpu(mhdr->srcaddr),
le32_to_cpu(mhdr->srcaddr) != 1 ? "s" : "");
- else
- genimg_print_size(le32_to_cpu(mhdr->srcaddr));
+ genimg_print_size(le32_to_cpu(mhdr->srcaddr) * params->bl_len);
+ if (mhdr->blockid == IBR_HDR_SATA_ID)
+ printf("Sector Size: %u Bytes\n", params->bl_len);
if (mhdr->blockid == IBR_HDR_SPI_ID && le32_to_cpu(mhdr->destaddr) == 0xFFFFFFFF) {
printf("Load Address: XIP\n");
printf("Execute Offs: %08x\n", le32_to_cpu(mhdr->execaddr));
@@ -2033,6 +2054,7 @@ static int kwbimage_verify_header(unsigned char *ptr, int image_size,
uint32_t offset;
uint32_t size;
uint8_t csum;
+ int blksz;
if (header_size > 192*1024)
return -FDT_ERR_BADSTRUCTURE;
@@ -2091,12 +2113,28 @@ static int kwbimage_verify_header(unsigned char *ptr, int image_size,
return -FDT_ERR_BADSTRUCTURE;
}
+ if (size < 4 || size % 4 != 0)
+ return -FDT_ERR_BADSTRUCTURE;
+
/*
* For SATA srcaddr is specified in number of sectors.
- * This expects that sector size is 512 bytes.
+ * Try all possible sector sizes which are power of two,
+ * at least 512 bytes and up to the 32 kB.
*/
- if (blockid == IBR_HDR_SATA_ID)
- offset *= 512;
+ if (blockid == IBR_HDR_SATA_ID) {
+ for (blksz = 512; blksz < 0x10000; blksz *= 2) {
+ if (offset * blksz > image_size || offset * blksz + size > image_size)
+ break;
+
+ if (image_checksum32(ptr + offset * blksz, size - 4) ==
+ *(uint32_t *)(ptr + offset * blksz + size - 4)) {
+ params->bl_len = blksz;
+ return 0;
+ }
+ }
+
+ return -FDT_ERR_BADSTRUCTURE;
+ }
/*
* For PCIe srcaddr is always set to 0xFFFFFFFF.
@@ -2105,21 +2143,17 @@ static int kwbimage_verify_header(unsigned char *ptr, int image_size,
if (blockid == IBR_HDR_PEX_ID && offset == 0xFFFFFFFF)
offset = header_size;
- if (offset > image_size || offset % 4 != 0)
- return -FDT_ERR_BADSTRUCTURE;
-
- if (size < 4 || offset + size > image_size || size % 4 != 0)
+ if (offset % 4 != 0 || offset > image_size || offset + size > image_size)
return -FDT_ERR_BADSTRUCTURE;
if (image_checksum32(ptr + offset, size - 4) !=
*(uint32_t *)(ptr + offset + size - 4))
return -FDT_ERR_BADSTRUCTURE;
+ params->bl_len = 1;
return 0;
}
-static int kwbimage_align_size(int bootfrom, int alloc_len, struct stat s);
-
static int kwbimage_generate(struct image_tool_params *params,
struct image_type_params *tparams)
{
@@ -2130,6 +2164,8 @@ static int kwbimage_generate(struct image_tool_params *params,
int version;
void *hdr;
int ret;
+ int align, size;
+ unsigned int satablksz;
fcfg = fopen(params->imagename, "r");
if (!fcfg) {
@@ -2167,6 +2203,7 @@ static int kwbimage_generate(struct image_tool_params *params,
bootfrom = image_get_bootfrom();
version = image_get_version();
+ satablksz = image_get_satablksz();
switch (version) {
/*
* Fallback to version 0 if no version is provided in the
@@ -2212,39 +2249,43 @@ static int kwbimage_generate(struct image_tool_params *params,
tparams->hdr = hdr;
/*
+ * Final SATA images must be aligned to disk block size.
+ * Final SDIO images must be aligned to 512 bytes.
+ * Final SPI and NAND images must be aligned to 256 bytes.
+ * Final UART image must be aligned to 128 bytes.
+ */
+ if (bootfrom == IBR_HDR_SATA_ID)
+ align = satablksz;
+ else if (bootfrom == IBR_HDR_SDIO_ID)
+ align = 512;
+ else if (bootfrom == IBR_HDR_SPI_ID || bootfrom == IBR_HDR_NAND_ID)
+ align = 256;
+ else if (bootfrom == IBR_HDR_UART_ID)
+ align = 128;
+ else
+ align = 4;
+
+ /*
+ * The resulting image needs to be 4-byte aligned. At least
+ * the Marvell hdrparser tool complains if its unaligned.
+ * After the image data is stored 4-byte checksum.
+ */
+ size = 4 + (align - (alloc_len + s.st_size + 4) % align) % align;
+
+ /*
* This function should return aligned size of the datafile.
* When skipcpy is set (datafile is skipped) then return value of this
* function is ignored, so we have to put required kwbimage aligning
* into the preallocated header size.
*/
if (params->skipcpy) {
- tparams->header_size += kwbimage_align_size(bootfrom, alloc_len, s);
+ tparams->header_size += size;
return 0;
} else {
- return kwbimage_align_size(bootfrom, alloc_len, s);
+ return size;
}
}
-static int kwbimage_align_size(int bootfrom, int alloc_len, struct stat s)
-{
- /*
- * The resulting image needs to be 4-byte aligned. At least
- * the Marvell hdrparser tool complains if its unaligned.
- * After the image data is stored 4-byte checksum.
- * Final UART image must be aligned to 128 bytes.
- * Final SPI and NAND images must be aligned to 256 bytes.
- * Final SATA and SDIO images must be aligned to 512 bytes.
- */
- if (bootfrom == IBR_HDR_SPI_ID || bootfrom == IBR_HDR_NAND_ID)
- return 4 + (256 - (alloc_len + s.st_size + 4) % 256) % 256;
- else if (bootfrom == IBR_HDR_SATA_ID || bootfrom == IBR_HDR_SDIO_ID)
- return 4 + (512 - (alloc_len + s.st_size + 4) % 512) % 512;
- else if (bootfrom == IBR_HDR_UART_ID)
- return 4 + (128 - (alloc_len + s.st_size + 4) % 128) % 128;
- else
- return 4 + (4 - s.st_size % 4) % 4;
-}
-
static int kwbimage_generate_config(void *ptr, struct image_tool_params *params)
{
struct main_hdr_v0 *mhdr0 = (struct main_hdr_v0 *)ptr;
@@ -2306,6 +2347,9 @@ static int kwbimage_generate_config(void *ptr, struct image_tool_params *params)
if (version == 0 && mhdr->blockid == IBR_HDR_SATA_ID)
fprintf(f, "SATA_PIO_MODE %u\n", (unsigned)mhdr0->satapiomode);
+ if (mhdr->blockid == IBR_HDR_SATA_ID)
+ fprintf(f, "SATA_BLKSZ %u\n", params->bl_len);
+
/*
* Addresses and sizes which are specified by mkimage command line
* arguments and not in kwbimage config file
@@ -2486,7 +2530,7 @@ static int kwbimage_extract_subimage(void *ptr, struct image_tool_params *params
offset = le32_to_cpu(mhdr->srcaddr);
if (mhdr->blockid == IBR_HDR_SATA_ID)
- offset *= 512;
+ offset *= params->bl_len;
if (mhdr->blockid == IBR_HDR_PEX_ID && offset == 0xFFFFFFFF)
offset = header_size;
diff --git a/tools/kwboot.c b/tools/kwboot.c
index 348a3203d6..6bef4610ff 100644
--- a/tools/kwboot.c
+++ b/tools/kwboot.c
@@ -1991,6 +1991,39 @@ _inject_baudrate_change_code(void *img, size_t *size, int for_data,
}
}
+static int
+kwboot_img_guess_sata_blksz(void *img, uint32_t blkoff, uint32_t data_size, size_t total_size)
+{
+ uint32_t sum, *ptr, *end;
+ int blksz;
+
+ /*
+ * Try all possible sector sizes which are power of two,
+ * at least 512 bytes and up to the 32 kB.
+ */
+ for (blksz = 512; blksz < 0x10000; blksz *= 2) {
+ if (blkoff * blksz > total_size ||
+ blkoff * blksz + data_size > total_size ||
+ data_size % 4)
+ break;
+
+ /*
+ * Calculate data checksum and if it matches
+ * then tried blksz should be correct.
+ */
+ ptr = img + blkoff * blksz;
+ end = (void *)ptr + data_size - 4;
+ for (sum = 0; ptr < end; ptr++)
+ sum += *ptr;
+
+ if (sum == *end)
+ return blksz;
+ }
+
+ /* Fallback to 512 bytes */
+ return 512;
+}
+
static const char *
kwboot_img_type(uint8_t blockid)
{
@@ -2049,7 +2082,7 @@ kwboot_img_patch(void *img, size_t *size, int baudrate)
switch (hdr->blockid) {
case IBR_HDR_SATA_ID:
- hdr->srcaddr = cpu_to_le32(srcaddr * 512);
+ hdr->srcaddr = cpu_to_le32(srcaddr * kwboot_img_guess_sata_blksz(img, srcaddr, le32_to_cpu(hdr->blocksize), *size));
break;
case IBR_HDR_PEX_ID:
diff --git a/tools/lpc32xximage.c b/tools/lpc32xximage.c
index 37931f9184..715a55a5b5 100644
--- a/tools/lpc32xximage.c
+++ b/tools/lpc32xximage.c
@@ -125,7 +125,7 @@ static void print_hdr_byte(struct nand_page_0_boot_header *hdr, int ofs)
printf("header[%d] = %02x\n", ofs, hdr->data[ofs]);
}
-static void lpc32xximage_print_header(const void *ptr)
+static void lpc32xximage_print_header(const void *ptr, struct image_tool_params *params)
{
struct nand_page_0_boot_header *hdr =
(struct nand_page_0_boot_header *)ptr;
diff --git a/tools/mkimage.c b/tools/mkimage.c
index a92d9d5ca5..6dfe3e1d42 100644
--- a/tools/mkimage.c
+++ b/tools/mkimage.c
@@ -790,7 +790,7 @@ int main(int argc, char **argv)
/* Print the image information by processing image header */
if (tparams->print_header)
- tparams->print_header (ptr);
+ tparams->print_header (ptr, &params);
else {
fprintf (stderr, "%s: Can't print header for %s\n",
params.cmdname, tparams->name);
diff --git a/tools/mtk_image.c b/tools/mtk_image.c
index 5ef9334163..30f54c8e8d 100644
--- a/tools/mtk_image.c
+++ b/tools/mtk_image.c
@@ -510,7 +510,7 @@ static int mtk_image_verify_header(unsigned char *ptr, int image_size,
return -1;
}
-static void mtk_image_print_header(const void *ptr)
+static void mtk_image_print_header(const void *ptr, struct image_tool_params *params)
{
struct legacy_img_hdr *hdr = (struct legacy_img_hdr *)ptr;
union lk_hdr *lk = (union lk_hdr *)ptr;
diff --git a/tools/mxsimage.c b/tools/mxsimage.c
index fbe46c47fa..ead61d0cd6 100644
--- a/tools/mxsimage.c
+++ b/tools/mxsimage.c
@@ -2239,7 +2239,7 @@ static int mxsimage_verify_header(unsigned char *ptr, int image_size,
return mxsimage_verify_print_header(params->imagefile, 1);
}
-static void mxsimage_print_header(const void *hdr)
+static void mxsimage_print_header(const void *hdr, struct image_tool_params *params)
{
if (imagefile)
mxsimage_verify_print_header(imagefile, 0);
diff --git a/tools/omapimage.c b/tools/omapimage.c
index c59cdcc79b..b79c1c3b64 100644
--- a/tools/omapimage.c
+++ b/tools/omapimage.c
@@ -85,7 +85,7 @@ static void omapimage_print_section(struct ch_settings *chs)
chs->flags);
}
-static void omapimage_print_header(const void *ptr)
+static void omapimage_print_header(const void *ptr, struct image_tool_params *params)
{
const struct ch_toc *toc = (struct ch_toc *)ptr;
const struct gp_header *gph =
diff --git a/tools/pblimage.c b/tools/pblimage.c
index bd639c276f..6c4d360e46 100644
--- a/tools/pblimage.c
+++ b/tools/pblimage.c
@@ -254,7 +254,7 @@ static int pblimage_verify_header(unsigned char *ptr, int image_size,
return 0;
}
-static void pblimage_print_header(const void *ptr)
+static void pblimage_print_header(const void *ptr, struct image_tool_params *params)
{
printf("Image Type: Freescale PBL Boot Image\n");
}
diff --git a/tools/rkcommon.c b/tools/rkcommon.c
index 96efc1192c..12c27b34ea 100644
--- a/tools/rkcommon.c
+++ b/tools/rkcommon.c
@@ -481,7 +481,7 @@ int rkcommon_verify_header(unsigned char *buf, int size,
return -ENOENT;
}
-void rkcommon_print_header(const void *buf)
+void rkcommon_print_header(const void *buf, struct image_tool_params *params)
{
struct header0_info header0;
struct header0_info_v2 header0_v2;
diff --git a/tools/rkcommon.h b/tools/rkcommon.h
index 49b6df3185..5d2770a80f 100644
--- a/tools/rkcommon.h
+++ b/tools/rkcommon.h
@@ -68,7 +68,7 @@ int rkcommon_verify_header(unsigned char *buf, int size,
*
* @buf: Pointer to the image (can be a read-only file-mapping)
*/
-void rkcommon_print_header(const void *buf);
+void rkcommon_print_header(const void *buf, struct image_tool_params *params);
/**
* rkcommon_need_rc4_spl() - check if rc4 encoded spl is required
diff --git a/tools/socfpgaimage.c b/tools/socfpgaimage.c
index eba812fec9..953dfeed4d 100644
--- a/tools/socfpgaimage.c
+++ b/tools/socfpgaimage.c
@@ -313,7 +313,7 @@ static void socfpgaimage_print_header_v1(struct socfpga_header_v1 *header)
le16_to_cpu(header->checksum));
}
-static void socfpgaimage_print_header(const void *ptr)
+static void socfpgaimage_print_header(const void *ptr, struct image_tool_params *params)
{
const void *header = ptr + HEADER_OFFSET;
struct socfpga_header_v0 *header_v0;
diff --git a/tools/stm32image.c b/tools/stm32image.c
index 18357c0518..5c6991f35d 100644
--- a/tools/stm32image.c
+++ b/tools/stm32image.c
@@ -99,7 +99,7 @@ static int stm32image_verify_header(unsigned char *ptr, int image_size,
return 0;
}
-static void stm32image_print_header(const void *ptr)
+static void stm32image_print_header(const void *ptr, struct image_tool_params *params)
{
struct stm32_header *stm32hdr = (struct stm32_header *)ptr;
diff --git a/tools/sunxi_egon.c b/tools/sunxi_egon.c
index d45b6f5e43..a514427809 100644
--- a/tools/sunxi_egon.c
+++ b/tools/sunxi_egon.c
@@ -82,7 +82,7 @@ static int egon_verify_header(unsigned char *ptr, int image_size,
return EXIT_SUCCESS;
}
-static void egon_print_header(const void *buf)
+static void egon_print_header(const void *buf, struct image_tool_params *params)
{
const struct boot_file_head *header = buf;
diff --git a/tools/sunxi_toc0.c b/tools/sunxi_toc0.c
index 7a8d74bb8e..292649fe90 100644
--- a/tools/sunxi_toc0.c
+++ b/tools/sunxi_toc0.c
@@ -757,7 +757,7 @@ static const char *toc0_item_name(uint32_t name)
return "(unknown)";
}
-static void toc0_print_header(const void *buf)
+static void toc0_print_header(const void *buf, struct image_tool_params *params)
{
const struct toc0_main_info *main_info = buf;
const struct toc0_item_info *item_info = (void *)(main_info + 1);
diff --git a/tools/ublimage.c b/tools/ublimage.c
index 1d2e897f6b..8f9b58c798 100644
--- a/tools/ublimage.c
+++ b/tools/ublimage.c
@@ -202,7 +202,7 @@ static int ublimage_verify_header(unsigned char *ptr, int image_size,
return 0;
}
-static void ublimage_print_header(const void *ptr)
+static void ublimage_print_header(const void *ptr, struct image_tool_params *params)
{
struct ubl_header *ubl_hdr = (struct ubl_header *) ptr;
diff --git a/tools/vybridimage.c b/tools/vybridimage.c
index 94a6684c19..c38886fa90 100644
--- a/tools/vybridimage.c
+++ b/tools/vybridimage.c
@@ -134,7 +134,7 @@ static void vybridimage_print_hdr_field(struct nand_page_0_boot_header *hdr,
printf("header.fcb[%d] = %08x\n", idx, hdr->fcb[idx]);
}
-static void vybridimage_print_header(const void *ptr)
+static void vybridimage_print_header(const void *ptr, struct image_tool_params *params)
{
struct nand_page_0_boot_header *hdr =
(struct nand_page_0_boot_header *)ptr;
diff --git a/tools/zynqimage.c b/tools/zynqimage.c
index d3f418b061..359c93d1ac 100644
--- a/tools/zynqimage.c
+++ b/tools/zynqimage.c
@@ -163,7 +163,7 @@ static int zynqimage_verify_header(unsigned char *ptr, int image_size,
return 0;
}
-static void zynqimage_print_header(const void *ptr)
+static void zynqimage_print_header(const void *ptr, struct image_tool_params *params)
{
struct zynq_header *zynqhdr = (struct zynq_header *)ptr;
int i;
diff --git a/tools/zynqmpimage.c b/tools/zynqmpimage.c
index 19b2f02ff1..5113ba895f 100644
--- a/tools/zynqmpimage.c
+++ b/tools/zynqmpimage.c
@@ -209,7 +209,7 @@ static void print_partition(const void *ptr, const struct partition_header *ph)
printf(" Checksum : 0x%08x\n", le32_to_cpu(ph->checksum));
}
-void zynqmpimage_print_header(const void *ptr)
+void zynqmpimage_print_header(const void *ptr, struct image_tool_params *params)
{
struct zynqmp_header *zynqhdr = (struct zynqmp_header *)ptr;
int i;
diff --git a/tools/zynqmpimage.h b/tools/zynqmpimage.h
index a1db819aa3..9d526a17cd 100644
--- a/tools/zynqmpimage.h
+++ b/tools/zynqmpimage.h
@@ -133,6 +133,6 @@ struct zynqmp_header {
};
void zynqmpimage_default_header(struct zynqmp_header *ptr);
-void zynqmpimage_print_header(const void *ptr);
+void zynqmpimage_print_header(const void *ptr, struct image_tool_params *params);
#endif /* _ZYNQMPIMAGE_H_ */