rockchip: mkimage: support packing optional second level boot-loader

Support packing optional second level boot-loader:

$ ./tools/mkimage -n rk3399 -T rksd -d \
  rk3399_ddr_800MHz_v1.24.bin:rk3399_miniloader_v1.19.bin out -v
Adding Image rk3399_ddr_800MHz_v1.24.bin
Size 116492(pad to 116736)
Adding Image rk3399_miniloader_v1.19.bin
Size 88060(pad to 88064)
Image Type:   Rockchip RK33 (SD/MMC) boot image
Init Data Size: 116736 bytes
Boot Data Size: 88064 bytes

Mainly parse init file and boot file from datafile option, copy them to
the image, and padding each one to 2KB boundary.

NOTE:
I don't know much about rknand.c, and there's no way to verify it now.
The output image is unchanged though (with a few extra padding).

Haven't got any feedback from upstream yet...But whatever, let's do this!

Change-Id: I0ce98a44634cfcd8acfe9a3e2cfbe3ee0107fba4
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
This commit is contained in:
Jeffy Chen 2019-12-04 14:50:35 +08:00 committed by Kever Yang
parent 96f5441ec8
commit 68c4faa3f8
7 changed files with 277 additions and 203 deletions

View File

@ -233,6 +233,7 @@ time_t imagetool_get_source_date(
void pbl_load_uboot(int fd, struct image_tool_params *mparams);
int rockchip_copy_image(int fd, struct image_tool_params *mparams);
#define ___cat(a, b) a ## b
#define __cat(a, b) ___cat(a, b)

View File

@ -518,6 +518,15 @@ int main(int argc, char **argv)
} else if (params.type == IH_TYPE_PBLIMAGE) {
/* PBL has special Image format, implements its' own */
pbl_load_uboot(ifd, &params);
} else if ((params.type == IH_TYPE_RKSD) ||
(params.type == IH_TYPE_RKSPI) ||
(params.type == IH_TYPE_RKNAND)) {
/* Rockchip has special Image format */
int ret;
ret = rockchip_copy_image(ifd, &params);
if (ret)
return ret;
} else {
copy_file(ifd, params.datafile, pad_len);
}

View File

@ -15,8 +15,6 @@
#include "mkimage.h"
#include "rkcommon.h"
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
enum {
RK_SIGNATURE = 0x0ff0aa55,
};
@ -83,6 +81,24 @@ static struct spl_info spl_infos[] = {
{ "rk1808", "RK18", 0x200000 - 0x2000, false},
};
/**
* struct spl_params - spl params parsed in check_params()
*
* @init_file: Init data file path
* @init_size: Aligned size of init data in bytes
* @boot_file: Boot data file path
* @boot_size: Aligned size of boot data in bytes
*/
struct spl_params {
char *init_file;
uint32_t init_size;
char *boot_file;
uint32_t boot_size;
};
static struct spl_params spl_params = { 0 };
static unsigned char rc4_key[16] = {
124, 78, 3, 4, 85, 5, 9, 7,
45, 44, 123, 56, 23, 13, 23, 17
@ -102,13 +118,26 @@ static struct spl_info *rkcommon_get_spl_info(char *imagename)
return NULL;
}
static int rkcommon_get_aligned_size(struct image_tool_params *params,
const char *fname)
{
int size;
size = imagetool_get_filesize(params, fname);
if (size < 0)
return -1;
/*
* Pad to a 2KB alignment, as required for init/boot size by the ROM
* (see https://lists.denx.de/pipermail/u-boot/2017-May/293268.html)
*/
return ROUND(size, RK_SIZE_ALIGN);
}
int rkcommon_check_params(struct image_tool_params *params)
{
int i;
if (rkcommon_get_spl_info(params->imagename) != NULL)
return EXIT_SUCCESS;
/*
* If this is a operation (list or extract), the don't require
* imagename to be set.
@ -116,6 +145,40 @@ int rkcommon_check_params(struct image_tool_params *params)
if (params->lflag || params->iflag)
return EXIT_SUCCESS;
if (!rkcommon_get_spl_info(params->imagename))
goto err_spl_info;
spl_params.init_file = params->datafile;
spl_params.boot_file = strchr(spl_params.init_file, ':');
if (spl_params.boot_file) {
*spl_params.boot_file = '\0';
spl_params.boot_file += 1;
}
spl_params.init_size =
rkcommon_get_aligned_size(params, spl_params.init_file);
if (spl_params.init_size < 0)
return EXIT_FAILURE;
/* Boot file is optional, and only for back-to-bootrom functionality. */
if (spl_params.boot_file) {
spl_params.boot_size =
rkcommon_get_aligned_size(params, spl_params.boot_file);
if (spl_params.boot_size < 0)
return EXIT_FAILURE;
}
if (spl_params.init_size > rkcommon_get_spl_size(params)) {
fprintf(stderr,
"Error: SPL image is too large (size %#x than %#x)\n",
spl_params.init_size, rkcommon_get_spl_size(params));
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
err_spl_info:
fprintf(stderr, "ERROR: imagename (%s) is not supported!\n",
params->imagename ? params->imagename : "NULL");
@ -158,8 +221,7 @@ bool rkcommon_need_rc4_spl(struct image_tool_params *params)
return info->spl_rc4;
}
static void rkcommon_set_header0(void *buf, uint file_size, uint max_size,
struct image_tool_params *params)
static void rkcommon_set_header0(void *buf, struct image_tool_params *params)
{
struct header0_info *hdr = buf;
@ -167,16 +229,8 @@ static void rkcommon_set_header0(void *buf, uint file_size, uint max_size,
hdr->signature = RK_SIGNATURE;
hdr->disable_rc4 = !rkcommon_need_rc4_spl(params);
hdr->init_offset = RK_INIT_OFFSET;
hdr->init_size = spl_params.init_size / RK_BLK_SIZE;
hdr->init_size = DIV_ROUND_UP(file_size, RK_BLK_SIZE);
/*
* The init_size has to be a multiple of 4 blocks (i.e. of 2K)
* or the BootROM will not boot the image.
*
* Note: To verify that this is not a legacy constraint, we
* rechecked this against the RK3399 BootROM.
*/
hdr->init_size = ROUND(hdr->init_size, 4);
/*
* init_boot_size needs to be set, as it is read by the BootROM
* to determine the size of the next-stage bootloader (e.g. U-Boot
@ -185,21 +239,22 @@ static void rkcommon_set_header0(void *buf, uint file_size, uint max_size,
* see https://lists.denx.de/pipermail/u-boot/2017-May/293267.html
* for a more detailed explanation by Andy Yan
*/
hdr->init_boot_size = hdr->init_size + DIV_ROUND_UP(max_size, RK_BLK_SIZE);
hdr->init_boot_size = ROUND(hdr->init_boot_size, 4);
if (spl_params.boot_file)
hdr->init_boot_size =
hdr->init_size + spl_params.boot_size / RK_BLK_SIZE;
else
hdr->init_boot_size =
hdr->init_size + RK_MAX_BOOT_SIZE / RK_BLK_SIZE;
rc4_encode(buf, RK_BLK_SIZE, rc4_key);
}
int rkcommon_set_header(void *buf, uint file_size, uint max_size,
struct image_tool_params *params)
void rkcommon_set_header(void *buf, struct stat *sbuf, int ifd,
struct image_tool_params *params)
{
struct header1_info *hdr = buf + RK_SPL_HDR_START;
if (file_size > rkcommon_get_spl_size(params))
return -ENOSPC;
rkcommon_set_header0(buf, file_size, max_size, params);
rkcommon_set_header0(buf, params);
/* Set up the SPL name (i.e. copy spl_hdr over) */
if (memcmp(&hdr->magic, "RSAK", 4))
@ -207,9 +262,14 @@ int rkcommon_set_header(void *buf, uint file_size, uint max_size,
if (rkcommon_need_rc4_spl(params))
rkcommon_rc4_encode_spl(buf, RK_SPL_HDR_START,
params->file_size - RK_SPL_HDR_START);
spl_params.init_size);
return 0;
if (spl_params.boot_file) {
if (rkcommon_need_rc4_spl(params))
rkcommon_rc4_encode_spl(buf + RK_SPL_HDR_START,
spl_params.init_size,
spl_params.boot_size);
}
}
static inline unsigned rkcommon_offset_to_spi(unsigned offset)
@ -301,7 +361,7 @@ void rkcommon_print_header(const void *buf)
struct header0_info header0;
struct spl_info *spl_info;
uint8_t image_type;
int ret;
int ret, boot_size;
ret = rkcommon_parse_header(buf, &header0, &spl_info);
@ -319,7 +379,11 @@ void rkcommon_print_header(const void *buf)
printf("Image Type: Rockchip %s (%s) boot image\n",
spl_info->spl_hdr,
(image_type == IH_TYPE_RKSD) ? "SD/MMC" : "SPI");
printf("Data Size: %d bytes\n", header0.init_size * RK_BLK_SIZE);
printf("Init Data Size: %d bytes\n", header0.init_size * RK_BLK_SIZE);
boot_size = (header0.init_boot_size - header0.init_size) * RK_BLK_SIZE;
if (boot_size != RK_MAX_BOOT_SIZE)
printf("Boot Data Size: %d bytes\n", boot_size);
}
void rkcommon_rc4_encode_spl(void *buf, unsigned int offset, unsigned int size)
@ -336,12 +400,8 @@ void rkcommon_rc4_encode_spl(void *buf, unsigned int offset, unsigned int size)
}
int rkcommon_vrec_header(struct image_tool_params *params,
struct image_type_params *tparams,
unsigned int alignment)
struct image_type_params *tparams)
{
unsigned int unpadded_size;
unsigned int padded_size;
/*
* The SPL image looks as follows:
*
@ -367,19 +427,118 @@ int rkcommon_vrec_header(struct image_tool_params *params,
/* Allocate, clear and install the header */
tparams->hdr = malloc(tparams->header_size);
if (!tparams->hdr)
return -ENOMEM;
if (!tparams->hdr) {
fprintf(stderr, "%s: Can't alloc header: %s\n",
params->cmdname, strerror(errno));
exit(EXIT_FAILURE);
}
memset(tparams->hdr, 0, tparams->header_size);
/*
* If someone passed in 0 for the alignment, we'd better handle
* it correctly...
* We need to store the original file-size (i.e. before padding), as
* imagetool does not set this during its adjustment of file_size.
*/
if (!alignment)
alignment = 1;
params->orig_file_size = tparams->header_size +
spl_params.init_size + spl_params.boot_size;
unpadded_size = tparams->header_size + params->file_size;
padded_size = ROUND(unpadded_size, alignment);
params->file_size = ROUND(params->orig_file_size, RK_SIZE_ALIGN);
return padded_size - unpadded_size;
/* Ignoring pad len, since we are using our own copy_image() */
return 0;
}
static int pad_file(struct image_tool_params *params, int ifd, int pad)
{
uint8_t zeros[4096];
memset(zeros, 0, sizeof(zeros));
while (pad > 0) {
int todo = sizeof(zeros);
if (todo > pad)
todo = pad;
if (write(ifd, (char *)&zeros, todo) != todo) {
fprintf(stderr, "%s: Write error on %s: %s\n",
params->cmdname, params->imagefile,
strerror(errno));
return -1;
}
pad -= todo;
}
return 0;
}
static int copy_file(struct image_tool_params *params, int ifd,
const char *file, int padded_size)
{
int dfd;
struct stat sbuf;
unsigned char *ptr;
int size;
if (params->vflag)
fprintf(stderr, "Adding Image %s\n", file);
dfd = open(file, O_RDONLY | O_BINARY);
if (dfd < 0) {
fprintf(stderr, "%s: Can't open %s: %s\n",
params->cmdname, file, strerror(errno));
return -1;
}
if (fstat(dfd, &sbuf) < 0) {
fprintf(stderr, "%s: Can't stat %s: %s\n",
params->cmdname, file, strerror(errno));
goto err_close;
}
if (params->vflag)
fprintf(stderr, "Size %u(pad to %u)\n",
(int)sbuf.st_size, padded_size);
ptr = mmap(0, sbuf.st_size, PROT_READ, MAP_SHARED, dfd, 0);
if (ptr == MAP_FAILED) {
fprintf(stderr, "%s: Can't read %s: %s\n",
params->cmdname, file, strerror(errno));
goto err_munmap;
}
size = sbuf.st_size;
if (write(ifd, ptr, size) != size) {
fprintf(stderr, "%s: Write error on %s: %s\n",
params->cmdname, params->imagefile, strerror(errno));
goto err_munmap;
}
munmap((void *)ptr, sbuf.st_size);
close(dfd);
return pad_file(params, ifd, padded_size - size);
err_munmap:
munmap((void *)ptr, sbuf.st_size);
err_close:
close(dfd);
return -1;
}
int rockchip_copy_image(int ifd, struct image_tool_params *params)
{
int ret;
ret = copy_file(params, ifd, spl_params.init_file,
spl_params.init_size);
if (ret)
return ret;
if (spl_params.boot_file) {
ret = copy_file(params, ifd, spl_params.boot_file,
spl_params.boot_size);
if (ret)
return ret;
}
return pad_file(params, ifd,
params->file_size - params->orig_file_size);
}

View File

@ -10,13 +10,11 @@
enum {
RK_BLK_SIZE = 512,
RK_INIT_SIZE_ALIGN = 2048,
RK_SIZE_ALIGN = 2048,
RK_INIT_OFFSET = 4,
RK_MAX_BOOT_SIZE = 512 << 10,
RK_SPL_HDR_START = RK_INIT_OFFSET * RK_BLK_SIZE,
RK_SPL_HDR_SIZE = 4,
RK_SPL_START = RK_SPL_HDR_START + RK_SPL_HDR_SIZE,
RK_IMAGE_HEADER_LEN = RK_SPL_START,
};
/**
@ -50,11 +48,9 @@ int rkcommon_get_spl_size(struct image_tool_params *params);
* This sets up a 2KB header which can be interpreted by the Rockchip boot ROM.
*
* @buf: Pointer to header place (must be at least 2KB in size)
* @file_size: Size of the file we want the boot ROM to load, in bytes
* @return 0 if OK, -ENOSPC if too large
*/
int rkcommon_set_header(void *buf, uint file_size, uint max_size,
struct image_tool_params *params);
void rkcommon_set_header(void *buf, struct stat *sbuf, int ifd,
struct image_tool_params *params);
/**
* rkcommon_verify_header() - verify the header for a Rockchip boot image
@ -103,14 +99,10 @@ void rkcommon_rc4_encode_spl(void *buf, unsigned int offset, unsigned int size);
* @params: Pointer to the tool params structure
* @tparams: Pointer tot the image type structure (for setting
* the header and header_size)
* @alignment: Alignment (a power of two) that the image should be
* padded to (e.g. 512 if we want to align with SD/MMC
* blocksizes or 2048 for the SPI format)
*
* @return bytes of padding required/added (does not include the header_size)
* @return 0 (always)
*/
int rkcommon_vrec_header(struct image_tool_params *params,
struct image_type_params *tparams,
unsigned int alignment);
struct image_type_params *tparams);
#endif

View File

@ -10,113 +10,52 @@
#include "mkimage.h"
#include "rkcommon.h"
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
enum {
RKNAND_SECT_LEN = RK_BLK_SIZE * 4,
};
struct rknand_info {
uint32_t pagesize;
uint32_t skippages;
uint32_t tplsize;
uint32_t splsize;
uint32_t tplpaddedsize;
uint32_t splpaddedsize;
uint32_t itersize;
uint32_t tplsplsize;
char *tplfile;
char *splfile;
};
struct rknand_info ninfo;
static uint32_t rknand_get_file_size(char *filename)
{
int dfd;
struct stat sbuf;
dfd = open(filename, O_RDONLY | O_BINARY);
if (dfd < 0) {
fprintf(stderr, "Can't open %s: %s\n", filename, strerror(errno));
exit(EXIT_FAILURE);
}
if (fstat(dfd, &sbuf) < 0) {
fprintf(stderr, "Can't stat %s: %s\n", filename, strerror(errno));
exit(EXIT_FAILURE);
}
close(dfd);
return sbuf.st_size;
}
static void rknand_fill_ninfo(struct image_tool_params *params)
{
sscanf(params->extraparams, "%u,%u", &ninfo.pagesize, &ninfo.skippages);
ninfo.tplfile = params->datafile;
if ((ninfo.splfile = strchr(params->datafile, ':')) != NULL) {
*ninfo.splfile = '\0';
ninfo.splfile += 1;
}
ninfo.tplsize = rknand_get_file_size(ninfo.tplfile);
ninfo.splsize = rknand_get_file_size(ninfo.splfile);
ninfo.tplpaddedsize = ROUND(ninfo.tplsize, RKNAND_SECT_LEN);
ninfo.splpaddedsize = ROUND(ninfo.splsize, RKNAND_SECT_LEN);
ninfo.itersize = ninfo.pagesize * (ninfo.skippages + 1);
ninfo.tplsplsize = ((ninfo.tplpaddedsize + ninfo.splpaddedsize) /
RKNAND_SECT_LEN) * ninfo.itersize;
}
static void rknand_set_header(void *buf, struct stat *sbuf, int ifd,
struct image_tool_params *params)
{
int sector, sploffset, splfd, ret;
int sector;
unsigned int size;
ret = rkcommon_set_header(buf, ninfo.tplsize, ninfo.splsize, params);
if (ret) {
printf("Warning: TPL image is too large (size %#x) and will "
"not boot\n", ninfo.tplsize);
}
size = params->orig_file_size;
if ((splfd = open(ninfo.splfile, O_RDONLY | O_BINARY)) < 0) {
fprintf (stderr, "%s: Can't open %s: %s\n",
params->cmdname, ninfo.splfile, strerror(errno));
exit (EXIT_FAILURE);
}
sploffset = RKNAND_SECT_LEN + ninfo.tplpaddedsize;
if (read(splfd, buf + sploffset, ninfo.splsize) != ninfo.splsize) {
fprintf (stderr, "%s: Read error on %s: %s\n",
params->cmdname, ninfo.splfile, strerror(errno));
exit (EXIT_FAILURE);
}
close(splfd);
if (rkcommon_need_rc4_spl(params))
rkcommon_rc4_encode_spl(buf, sploffset, ninfo.splpaddedsize);
rkcommon_set_header(buf, sbuf, ifd, params);
/*
* Spread the image out so we only use the first 2KB of each pagesize
* region. This is a feature of the NAND format required by the Rockchip
* boot ROM.
*/
for (sector = ninfo.tplsplsize / ninfo.itersize - 1; sector >= 0; sector--) {
memmove(buf + sector * ninfo.itersize + ninfo.pagesize,
buf + (sector + 1) * RKNAND_SECT_LEN, RKNAND_SECT_LEN);
if (params->vflag)
fprintf(stderr, "Spreading nand image from %u to %u\n",
size, params->file_size);
if (sector < (ninfo.tplsplsize / ninfo.itersize - 1))
memset(buf + sector * ninfo.itersize + ninfo.pagesize +
RKNAND_SECT_LEN, 0xFF, ninfo.itersize -
RKNAND_SECT_LEN);
for (sector = ninfo.tplsplsize / ninfo.itersize - 1; sector >= 0;
sector--) {
memmove(buf + ninfo.pagesize + sector * ninfo.itersize,
buf + RK_SPL_HDR_START + sector * RKNAND_SECT_LEN,
RKNAND_SECT_LEN);
memset(buf + ninfo.pagesize + sector * ninfo.itersize +
RKNAND_SECT_LEN, 0xFF,
ninfo.itersize - RKNAND_SECT_LEN);
}
memset(buf + RKNAND_SECT_LEN, 0xFF, ninfo.pagesize - RKNAND_SECT_LEN);
memset(buf + ninfo.tplsplsize - ninfo.pagesize + RKNAND_SECT_LEN, 0xFF,
ninfo.pagesize - RKNAND_SECT_LEN);
/* Fill up padded area of the header. */
memset(buf + RK_SPL_HDR_START, 0xFF, ninfo.pagesize - RK_SPL_HDR_START);
}
static int rknand_check_image_type(uint8_t type)
@ -130,10 +69,28 @@ static int rknand_check_image_type(uint8_t type)
static int rknand_vrec_header(struct image_tool_params *params,
struct image_type_params *tparams)
{
rknand_fill_ninfo(params);
rkcommon_vrec_header(params, tparams, RKNAND_SECT_LEN);
int tplsplsize;
uint32_t skippages;
int ret;
return ninfo.tplsplsize - tparams->header_size - ninfo.tplsize;
rkcommon_vrec_header(params, tparams);
ret = sscanf(params->extraparams, "%u,%u", &ninfo.pagesize, &skippages);
if (ret != 2 || (ninfo.pagesize % RKNAND_SECT_LEN)) {
fprintf(stderr, "%s: Wrong nand params\n", params->cmdname);
exit(EXIT_FAILURE);
}
ninfo.itersize = ninfo.pagesize * (skippages + 1);
tplsplsize = params->file_size - RK_SPL_HDR_START;
ninfo.tplsplsize =
DIV_ROUND_UP(tplsplsize, RKNAND_SECT_LEN) * ninfo.itersize;
/* Padded file size = padded header + padded tpl & spl. */
params->file_size = ninfo.pagesize + ninfo.tplsplsize;
return 0;
}
/*
@ -145,8 +102,9 @@ U_BOOT_IMAGE_TYPE(
0,
NULL,
rkcommon_check_params,
rkcommon_verify_header,
rkcommon_print_header,
/* TODO: Support rknand in there helpers */
NULL, //rkcommon_verify_header,
NULL, //rkcommon_print_header,
rknand_set_header,
NULL,
rknand_check_image_type,

View File

@ -13,27 +13,6 @@
#include "mkimage.h"
#include "rkcommon.h"
static void rksd_set_header(void *buf, struct stat *sbuf, int ifd,
struct image_tool_params *params)
{
unsigned int size;
int ret;
/*
* We need to calculate this using 'RK_SPL_HDR_START' and not using
* 'tparams->header_size', as the additional byte inserted when
* 'is_boot0' is true counts towards the payload (and not towards the
* header).
*/
size = params->file_size - RK_SPL_HDR_START;
ret = rkcommon_set_header(buf, size, RK_MAX_BOOT_SIZE, params);
if (ret) {
/* TODO(sjg@chromium.org): This method should return an error */
printf("Warning: SPL image is too large (size %#x) and will "
"not boot\n", size);
}
}
static int rksd_check_image_type(uint8_t type)
{
if (type == IH_TYPE_RKSD)
@ -42,16 +21,6 @@ static int rksd_check_image_type(uint8_t type)
return EXIT_FAILURE;
}
static int rksd_vrec_header(struct image_tool_params *params,
struct image_type_params *tparams)
{
/*
* Pad to a 2KB alignment, as required for init_size by the ROM
* (see https://lists.denx.de/pipermail/u-boot/2017-May/293268.html)
*/
return rkcommon_vrec_header(params, tparams, RK_INIT_SIZE_ALIGN);
}
/*
* rk_sd parameters
*/
@ -63,9 +32,9 @@ U_BOOT_IMAGE_TYPE(
rkcommon_check_params,
rkcommon_verify_header,
rkcommon_print_header,
rksd_set_header,
rkcommon_set_header,
NULL,
rksd_check_image_type,
NULL,
rksd_vrec_header
rkcommon_vrec_header
);

View File

@ -22,22 +22,20 @@ static void rkspi_set_header(void *buf, struct stat *sbuf, int ifd,
{
int sector;
unsigned int size;
int ret;
size = params->orig_file_size;
ret = rkcommon_set_header(buf, size, RK_MAX_BOOT_SIZE, params);
debug("size %x\n", size);
if (ret) {
/* TODO(sjg@chromium.org): This method should return an error */
printf("Warning: SPL image is too large (size %#x) and will "
"not boot\n", size);
}
rkcommon_set_header(buf, sbuf, ifd, params);
/*
* Spread the image out so we only use the first 2KB of each 4KB
* region. This is a feature of the SPI format required by the Rockchip
* boot ROM. Its rationale is unknown.
*/
if (params->vflag)
fprintf(stderr, "Spreading spi image from %u to %u\n",
size, params->file_size);
for (sector = size / RKSPI_SECT_LEN - 1; sector >= 0; sector--) {
debug("sector %u\n", sector);
memmove(buf + sector * RKSPI_SECT_LEN * 2,
@ -57,35 +55,23 @@ static int rkspi_check_image_type(uint8_t type)
}
/*
* The SPI payload needs to be padded out to make space for odd half-sector
* layout used in flash (i.e. only the first 2K of each 4K sector is used).
* The SPI payload needs to make space for odd half-sector layout used in flash
* (i.e. only the first 2K of each 4K sector is used).
*/
static int rkspi_vrec_header(struct image_tool_params *params,
struct image_type_params *tparams)
{
int padding = rkcommon_vrec_header(params, tparams, RK_INIT_SIZE_ALIGN);
/*
* The file size has not been adjusted at this point (our caller will
* eventually add the header/padding to the file_size), so we need to
* add up the header_size, file_size and padding ourselves.
*/
int padded_size = tparams->header_size + params->file_size + padding;
/*
* We need to store the original file-size (i.e. before padding), as
* imagetool does not set this during its adjustment of file_size.
*/
params->orig_file_size = padded_size;
rkcommon_vrec_header(params, tparams);
/*
* Converting to the SPI format (i.e. splitting each 4K page into two
* 2K subpages and then padding these 2K pages up to take a complete
* 4K sector again) will will double the image size.
*
* Thus we return the padded_size as an additional padding requirement
* (be sure to add this to the padding returned from the common code).
* 4K sector again) which will double the image size.
*/
return padded_size + padding;
params->file_size = ROUND(params->file_size, RKSPI_SECT_LEN) << 1;
/* Ignoring pad len, since we are using our own copy_image() */
return 0;
}
/*