1 // SPDX-License-Identifier: GPL-2.0+
3 * Image manipulator for Marvell SoCs
4 * supports Kirkwood, Dove, Armada 370, Armada XP, Armada 375, Armada 38x and
7 * (C) Copyright 2013 Thomas Petazzoni
8 * <thomas.petazzoni@free-electrons.com>
10 * (C) Copyright 2022 Pali Rohár <pali@kernel.org>
13 #define OPENSSL_API_COMPAT 0x10101000L
15 #include "imagetool.h"
22 #include <openssl/bn.h>
23 #include <openssl/rsa.h>
24 #include <openssl/pem.h>
25 #include <openssl/err.h>
26 #include <openssl/evp.h>
28 #if OPENSSL_VERSION_NUMBER < 0x10100000L || \
29 (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL)
30 static void RSA_get0_key(const RSA
*r
,
31 const BIGNUM
**n
, const BIGNUM
**e
, const BIGNUM
**d
)
41 #elif !defined(LIBRESSL_VERSION_NUMBER)
42 void EVP_MD_CTX_cleanup(EVP_MD_CTX
*ctx
)
44 EVP_MD_CTX_reset(ctx
);
48 /* fls - find last (most-significant) bit set in 4-bit integer */
49 static inline int fls4(int num
)
63 static struct image_cfg_element
*image_cfg
;
65 static int verbose_mode
;
79 struct boot_mode boot_modes
[] = {
80 { IBR_HDR_I2C_ID
, "i2c" },
81 { IBR_HDR_SPI_ID
, "spi" },
82 { IBR_HDR_NAND_ID
, "nand" },
83 { IBR_HDR_SATA_ID
, "sata" },
84 { IBR_HDR_PEX_ID
, "pex" },
85 { IBR_HDR_UART_ID
, "uart" },
86 { IBR_HDR_SDIO_ID
, "sdio" },
90 struct nand_ecc_mode
{
95 struct nand_ecc_mode nand_ecc_modes
[] = {
96 { IBR_HDR_ECC_DEFAULT
, "default" },
97 { IBR_HDR_ECC_FORCED_HAMMING
, "hamming" },
98 { IBR_HDR_ECC_FORCED_RS
, "rs" },
99 { IBR_HDR_ECC_DISABLED
, "disabled" },
103 /* Used to identify an undefined execution or destination address */
104 #define ADDR_INVALID ((uint32_t)-1)
106 #define BINARY_MAX_ARGS 255
108 /* In-memory representation of a line of the configuration file */
110 enum image_cfg_type
{
111 IMAGE_CFG_VERSION
= 0x1,
115 IMAGE_CFG_NAND_BLKSZ
,
116 IMAGE_CFG_NAND_BADBLK_LOCATION
,
117 IMAGE_CFG_NAND_ECC_MODE
,
118 IMAGE_CFG_NAND_PAGESZ
,
119 IMAGE_CFG_SATA_BLKSZ
,
123 IMAGE_CFG_DATA_DELAY
,
131 IMAGE_CFG_JTAG_DELAY
,
134 IMAGE_CFG_SEC_COMMON_IMG
,
135 IMAGE_CFG_SEC_SPECIALIZED_IMG
,
136 IMAGE_CFG_SEC_BOOT_DEV
,
137 IMAGE_CFG_SEC_FUSE_DUMP
,
142 static const char * const id_strs
[] = {
143 [IMAGE_CFG_VERSION
] = "VERSION",
144 [IMAGE_CFG_BOOT_FROM
] = "BOOT_FROM",
145 [IMAGE_CFG_DEST_ADDR
] = "DEST_ADDR",
146 [IMAGE_CFG_EXEC_ADDR
] = "EXEC_ADDR",
147 [IMAGE_CFG_NAND_BLKSZ
] = "NAND_BLKSZ",
148 [IMAGE_CFG_NAND_BADBLK_LOCATION
] = "NAND_BADBLK_LOCATION",
149 [IMAGE_CFG_NAND_ECC_MODE
] = "NAND_ECC_MODE",
150 [IMAGE_CFG_NAND_PAGESZ
] = "NAND_PAGE_SIZE",
151 [IMAGE_CFG_SATA_BLKSZ
] = "SATA_BLKSZ",
152 [IMAGE_CFG_CPU
] = "CPU",
153 [IMAGE_CFG_BINARY
] = "BINARY",
154 [IMAGE_CFG_DATA
] = "DATA",
155 [IMAGE_CFG_DATA_DELAY
] = "DATA_DELAY",
156 [IMAGE_CFG_BAUDRATE
] = "BAUDRATE",
157 [IMAGE_CFG_UART_PORT
] = "UART_PORT",
158 [IMAGE_CFG_UART_MPP
] = "UART_MPP",
159 [IMAGE_CFG_DEBUG
] = "DEBUG",
160 [IMAGE_CFG_KAK
] = "KAK",
161 [IMAGE_CFG_CSK
] = "CSK",
162 [IMAGE_CFG_CSK_INDEX
] = "CSK_INDEX",
163 [IMAGE_CFG_JTAG_DELAY
] = "JTAG_DELAY",
164 [IMAGE_CFG_BOX_ID
] = "BOX_ID",
165 [IMAGE_CFG_FLASH_ID
] = "FLASH_ID",
166 [IMAGE_CFG_SEC_COMMON_IMG
] = "SEC_COMMON_IMG",
167 [IMAGE_CFG_SEC_SPECIALIZED_IMG
] = "SEC_SPECIALIZED_IMG",
168 [IMAGE_CFG_SEC_BOOT_DEV
] = "SEC_BOOT_DEV",
169 [IMAGE_CFG_SEC_FUSE_DUMP
] = "SEC_FUSE_DUMP"
172 struct image_cfg_element
{
173 enum image_cfg_type type
;
175 unsigned int version
;
176 unsigned int cpu_sheeva
;
177 unsigned int bootfrom
;
180 unsigned int loadaddr
;
181 unsigned int args
[BINARY_MAX_ARGS
];
184 unsigned int dstaddr
;
185 unsigned int execaddr
;
186 unsigned int nandblksz
;
187 unsigned int nandbadblklocation
;
188 unsigned int nandeccmode
;
189 unsigned int nandpagesz
;
190 unsigned int satablksz
;
191 struct ext_hdr_v0_reg regdata
;
192 unsigned int regdata_delay
;
193 unsigned int baudrate
;
194 unsigned int uart_port
;
195 unsigned int uart_mpp
;
197 const char *key_name
;
202 bool sec_specialized_img
;
203 unsigned int sec_boot_dev
;
208 #define IMAGE_CFG_ELEMENT_MAX 256
211 * Utility functions to manipulate boot mode and ecc modes (convert
212 * them back and forth between description strings and the
213 * corresponding numerical identifiers).
216 static const char *image_boot_mode_name(unsigned int id
)
220 for (i
= 0; boot_modes
[i
].name
; i
++)
221 if (boot_modes
[i
].id
== id
)
222 return boot_modes
[i
].name
;
226 static int image_boot_mode_id(const char *boot_mode_name
)
230 for (i
= 0; boot_modes
[i
].name
; i
++)
231 if (!strcmp(boot_modes
[i
].name
, boot_mode_name
))
232 return boot_modes
[i
].id
;
237 static const char *image_nand_ecc_mode_name(unsigned int id
)
241 for (i
= 0; nand_ecc_modes
[i
].name
; i
++)
242 if (nand_ecc_modes
[i
].id
== id
)
243 return nand_ecc_modes
[i
].name
;
248 static int image_nand_ecc_mode_id(const char *nand_ecc_mode_name
)
252 for (i
= 0; nand_ecc_modes
[i
].name
; i
++)
253 if (!strcmp(nand_ecc_modes
[i
].name
, nand_ecc_mode_name
))
254 return nand_ecc_modes
[i
].id
;
258 static struct image_cfg_element
*
259 image_find_option(unsigned int optiontype
)
263 for (i
= 0; i
< cfgn
; i
++) {
264 if (image_cfg
[i
].type
== optiontype
)
265 return &image_cfg
[i
];
272 image_count_options(unsigned int optiontype
)
275 unsigned int count
= 0;
277 for (i
= 0; i
< cfgn
; i
++)
278 if (image_cfg
[i
].type
== optiontype
)
284 static int image_get_csk_index(void)
286 struct image_cfg_element
*e
;
288 e
= image_find_option(IMAGE_CFG_CSK_INDEX
);
295 static bool image_get_spezialized_img(void)
297 struct image_cfg_element
*e
;
299 e
= image_find_option(IMAGE_CFG_SEC_SPECIALIZED_IMG
);
303 return e
->sec_specialized_img
;
306 static int image_get_bootfrom(void)
308 struct image_cfg_element
*e
;
310 e
= image_find_option(IMAGE_CFG_BOOT_FROM
);
312 /* fallback to SPI if no BOOT_FROM is not provided */
313 return IBR_HDR_SPI_ID
;
318 static int image_is_cpu_sheeva(void)
320 struct image_cfg_element
*e
;
322 e
= image_find_option(IMAGE_CFG_CPU
);
326 return e
->cpu_sheeva
;
330 * Compute a 8-bit checksum of a memory area. This algorithm follows
331 * the requirements of the Marvell SoC BootROM specifications.
333 static uint8_t image_checksum8(void *start
, uint32_t len
)
338 /* check len and return zero checksum if invalid */
351 * Verify checksum over a complete header that includes the checksum field.
352 * Return 1 when OK, otherwise 0.
354 static int main_hdr_checksum_ok(void *hdr
)
356 /* Offsets of checksum in v0 and v1 headers are the same */
357 struct main_hdr_v0
*main_hdr
= (struct main_hdr_v0
*)hdr
;
360 checksum
= image_checksum8(hdr
, kwbheader_size_for_csum(hdr
));
361 /* Calculated checksum includes the header checksum field. Compensate
364 checksum
-= main_hdr
->checksum
;
366 return checksum
== main_hdr
->checksum
;
369 static uint32_t image_checksum32(void *start
, uint32_t len
)
374 /* check len and return zero checksum if invalid */
378 if (len
% sizeof(uint32_t)) {
379 fprintf(stderr
, "Length %d is not in multiple of %zu\n",
380 len
, sizeof(uint32_t));
387 len
-= sizeof(uint32_t);
393 static unsigned int options_to_baudrate(uint8_t options
)
395 switch (options
& 0x7) {
396 case MAIN_HDR_V1_OPT_BAUD_2400
:
398 case MAIN_HDR_V1_OPT_BAUD_4800
:
400 case MAIN_HDR_V1_OPT_BAUD_9600
:
402 case MAIN_HDR_V1_OPT_BAUD_19200
:
404 case MAIN_HDR_V1_OPT_BAUD_38400
:
406 case MAIN_HDR_V1_OPT_BAUD_57600
:
408 case MAIN_HDR_V1_OPT_BAUD_115200
:
410 case MAIN_HDR_V1_OPT_BAUD_DEFAULT
:
416 static uint8_t baudrate_to_option(unsigned int baudrate
)
420 return MAIN_HDR_V1_OPT_BAUD_2400
;
422 return MAIN_HDR_V1_OPT_BAUD_4800
;
424 return MAIN_HDR_V1_OPT_BAUD_9600
;
426 return MAIN_HDR_V1_OPT_BAUD_19200
;
428 return MAIN_HDR_V1_OPT_BAUD_38400
;
430 return MAIN_HDR_V1_OPT_BAUD_57600
;
432 return MAIN_HDR_V1_OPT_BAUD_115200
;
434 return MAIN_HDR_V1_OPT_BAUD_DEFAULT
;
438 static void kwb_msg(const char *fmt
, ...)
444 vfprintf(stdout
, fmt
, ap
);
449 static int openssl_err(const char *msg
)
451 unsigned long ssl_err
= ERR_get_error();
453 fprintf(stderr
, "%s", msg
);
454 fprintf(stderr
, ": %s\n",
455 ERR_error_string(ssl_err
, 0));
460 static int kwb_load_rsa_key(const char *keydir
, const char *name
, RSA
**p_rsa
)
469 snprintf(path
, sizeof(path
), "%s/%s.key", keydir
, name
);
470 f
= fopen(path
, "r");
472 fprintf(stderr
, "Couldn't open RSA private key: '%s': %s\n",
473 path
, strerror(errno
));
477 rsa
= PEM_read_RSAPrivateKey(f
, 0, NULL
, "");
479 openssl_err("Failure reading private key");
489 static int kwb_load_cfg_key(struct image_tool_params
*params
,
490 unsigned int cfg_option
, const char *key_name
,
493 struct image_cfg_element
*e_key
;
499 e_key
= image_find_option(cfg_option
);
501 fprintf(stderr
, "%s not configured\n", key_name
);
505 res
= kwb_load_rsa_key(params
->keydir
, e_key
->key_name
, &key
);
507 fprintf(stderr
, "Failed to load %s\n", key_name
);
516 static int kwb_load_kak(struct image_tool_params
*params
, RSA
**p_kak
)
518 return kwb_load_cfg_key(params
, IMAGE_CFG_KAK
, "KAK", p_kak
);
521 static int kwb_load_csk(struct image_tool_params
*params
, RSA
**p_csk
)
523 return kwb_load_cfg_key(params
, IMAGE_CFG_CSK
, "CSK", p_csk
);
526 static int kwb_compute_pubkey_hash(struct pubkey_der_v1
*pk
,
527 struct hash_v1
*hash
)
530 unsigned int key_size
;
531 unsigned int hash_size
;
534 if (!pk
|| !hash
|| pk
->key
[0] != 0x30 || pk
->key
[1] != 0x82)
537 key_size
= (pk
->key
[2] << 8) + pk
->key
[3] + 4;
539 ctx
= EVP_MD_CTX_create();
541 return openssl_err("EVP context creation failed");
543 EVP_MD_CTX_init(ctx
);
544 if (!EVP_DigestInit(ctx
, EVP_sha256())) {
545 ret
= openssl_err("Digest setup failed");
549 if (!EVP_DigestUpdate(ctx
, pk
->key
, key_size
)) {
550 ret
= openssl_err("Hashing data failed");
554 if (!EVP_DigestFinal(ctx
, hash
->hash
, &hash_size
)) {
555 ret
= openssl_err("Could not obtain hash");
559 EVP_MD_CTX_cleanup(ctx
);
562 EVP_MD_CTX_destroy(ctx
);
566 static int kwb_import_pubkey(RSA
**key
, struct pubkey_der_v1
*src
, char *keyname
)
569 const unsigned char *ptr
;
575 rsa
= d2i_RSAPublicKey(key
, &ptr
, sizeof(src
->key
));
577 openssl_err("error decoding public key");
583 fprintf(stderr
, "Failed to decode %s pubkey\n", keyname
);
587 static int kwb_export_pubkey(RSA
*key
, struct pubkey_der_v1
*dst
, FILE *hashf
,
590 int size_exp
, size_mod
, size_seq
;
591 const BIGNUM
*key_e
, *key_n
;
593 char *errmsg
= "Failed to encode %s\n";
595 RSA_get0_key(key
, NULL
, &key_e
, NULL
);
596 RSA_get0_key(key
, &key_n
, NULL
, NULL
);
598 if (!key
|| !key_e
|| !key_n
|| !dst
) {
599 fprintf(stderr
, "export pk failed: (%p, %p, %p, %p)",
600 key
, key_e
, key_n
, dst
);
601 fprintf(stderr
, errmsg
, keyname
);
606 * According to the specs, the key should be PKCS#1 DER encoded.
607 * But unfortunately the really required encoding seems to be different;
608 * it violates DER...! (But it still conformes to BER.)
609 * (Length always in long form w/ 2 byte length code; no leading zero
610 * when MSB of first byte is set...)
611 * So we cannot use the encoding func provided by OpenSSL and have to
612 * do the encoding manually.
615 size_exp
= BN_num_bytes(key_e
);
616 size_mod
= BN_num_bytes(key_n
);
617 size_seq
= 4 + size_mod
+ 4 + size_exp
;
619 if (size_mod
> 256) {
620 fprintf(stderr
, "export pk failed: wrong mod size: %d\n",
622 fprintf(stderr
, errmsg
, keyname
);
626 if (4 + size_seq
> sizeof(dst
->key
)) {
627 fprintf(stderr
, "export pk failed: seq too large (%d, %zu)\n",
628 4 + size_seq
, sizeof(dst
->key
));
629 fprintf(stderr
, errmsg
, keyname
);
635 /* PKCS#1 (RFC3447) RSAPublicKey structure */
636 *cur
++ = 0x30; /* SEQUENCE */
638 *cur
++ = (size_seq
>> 8) & 0xFF;
639 *cur
++ = size_seq
& 0xFF;
641 *cur
++ = 0x02; /* INTEGER */
643 *cur
++ = (size_mod
>> 8) & 0xFF;
644 *cur
++ = size_mod
& 0xFF;
645 BN_bn2bin(key_n
, cur
);
648 *cur
++ = 0x02; /* INTEGER */
650 *cur
++ = (size_exp
>> 8) & 0xFF;
651 *cur
++ = size_exp
& 0xFF;
652 BN_bn2bin(key_e
, cur
);
655 struct hash_v1 pk_hash
;
659 ret
= kwb_compute_pubkey_hash(dst
, &pk_hash
);
661 fprintf(stderr
, errmsg
, keyname
);
665 fprintf(hashf
, "SHA256 = ");
666 for (i
= 0 ; i
< sizeof(pk_hash
.hash
); ++i
)
667 fprintf(hashf
, "%02X", pk_hash
.hash
[i
]);
668 fprintf(hashf
, "\n");
674 static int kwb_sign(RSA
*key
, void *data
, int datasz
, struct sig_v1
*sig
,
679 unsigned int sig_size
;
683 evp_key
= EVP_PKEY_new();
685 return openssl_err("EVP_PKEY object creation failed");
687 if (!EVP_PKEY_set1_RSA(evp_key
, key
)) {
688 ret
= openssl_err("EVP key setup failed");
692 size
= EVP_PKEY_size(evp_key
);
693 if (size
> sizeof(sig
->sig
)) {
694 fprintf(stderr
, "Buffer to small for signature (%d bytes)\n",
700 ctx
= EVP_MD_CTX_create();
702 ret
= openssl_err("EVP context creation failed");
705 EVP_MD_CTX_init(ctx
);
706 if (!EVP_SignInit(ctx
, EVP_sha256())) {
707 ret
= openssl_err("Signer setup failed");
711 if (!EVP_SignUpdate(ctx
, data
, datasz
)) {
712 ret
= openssl_err("Signing data failed");
716 if (!EVP_SignFinal(ctx
, sig
->sig
, &sig_size
, evp_key
)) {
717 ret
= openssl_err("Could not obtain signature");
721 EVP_MD_CTX_cleanup(ctx
);
722 EVP_MD_CTX_destroy(ctx
);
723 EVP_PKEY_free(evp_key
);
728 EVP_MD_CTX_destroy(ctx
);
730 EVP_PKEY_free(evp_key
);
731 fprintf(stderr
, "Failed to create %s signature\n", signame
);
735 static int kwb_verify(RSA
*key
, void *data
, int datasz
, struct sig_v1
*sig
,
743 evp_key
= EVP_PKEY_new();
745 return openssl_err("EVP_PKEY object creation failed");
747 if (!EVP_PKEY_set1_RSA(evp_key
, key
)) {
748 ret
= openssl_err("EVP key setup failed");
752 size
= EVP_PKEY_size(evp_key
);
753 if (size
> sizeof(sig
->sig
)) {
754 fprintf(stderr
, "Invalid signature size (%d bytes)\n",
760 ctx
= EVP_MD_CTX_create();
762 ret
= openssl_err("EVP context creation failed");
765 EVP_MD_CTX_init(ctx
);
766 if (!EVP_VerifyInit(ctx
, EVP_sha256())) {
767 ret
= openssl_err("Verifier setup failed");
771 if (!EVP_VerifyUpdate(ctx
, data
, datasz
)) {
772 ret
= openssl_err("Hashing data failed");
776 if (EVP_VerifyFinal(ctx
, sig
->sig
, sizeof(sig
->sig
), evp_key
) != 1) {
777 ret
= openssl_err("Could not verify signature");
781 EVP_MD_CTX_cleanup(ctx
);
782 EVP_MD_CTX_destroy(ctx
);
783 EVP_PKEY_free(evp_key
);
788 EVP_MD_CTX_destroy(ctx
);
790 EVP_PKEY_free(evp_key
);
791 fprintf(stderr
, "Failed to verify %s signature\n", signame
);
795 static int kwb_sign_and_verify(RSA
*key
, void *data
, int datasz
,
796 struct sig_v1
*sig
, char *signame
)
798 if (kwb_sign(key
, data
, datasz
, sig
, signame
) < 0)
801 if (kwb_verify(key
, data
, datasz
, sig
, signame
) < 0)
808 static int kwb_dump_fuse_cmds_38x(FILE *out
, struct secure_hdr_v1
*sec_hdr
)
810 struct hash_v1 kak_pub_hash
;
811 struct image_cfg_element
*e
;
812 unsigned int fuse_line
;
818 if (!out
|| !sec_hdr
)
821 ret
= kwb_compute_pubkey_hash(&sec_hdr
->kak
, &kak_pub_hash
);
825 fprintf(out
, "# burn KAK pub key hash\n");
826 ptr
= kak_pub_hash
.hash
;
827 for (fuse_line
= 26; fuse_line
<= 30; ++fuse_line
) {
828 fprintf(out
, "fuse prog -y %u 0 ", fuse_line
);
830 for (i
= 4; i
-- > 0;)
831 fprintf(out
, "%02hx", (ushort
)ptr
[i
]);
835 if (fuse_line
< 30) {
836 for (i
= 3; i
-- > 0;)
837 fprintf(out
, "%02hx", (ushort
)ptr
[i
]);
840 fprintf(out
, "000000");
843 fprintf(out
, " 1\n");
846 fprintf(out
, "# burn CSK selection\n");
848 idx
= image_get_csk_index();
849 if (idx
< 0 || idx
> 15) {
854 for (fuse_line
= 31; fuse_line
< 31 + idx
; ++fuse_line
)
855 fprintf(out
, "fuse prog -y %u 0 00000001 00000000 1\n",
858 fprintf(out
, "# CSK index is 0; no mods needed\n");
861 e
= image_find_option(IMAGE_CFG_BOX_ID
);
863 fprintf(out
, "# set box ID\n");
864 fprintf(out
, "fuse prog -y 48 0 %08x 00000000 1\n", e
->boxid
);
867 e
= image_find_option(IMAGE_CFG_FLASH_ID
);
869 fprintf(out
, "# set flash ID\n");
870 fprintf(out
, "fuse prog -y 47 0 %08x 00000000 1\n", e
->flashid
);
873 fprintf(out
, "# enable secure mode ");
874 fprintf(out
, "(must be the last fuse line written)\n");
877 e
= image_find_option(IMAGE_CFG_SEC_BOOT_DEV
);
879 fprintf(stderr
, "ERROR: secured mode boot device not given\n");
884 if (e
->sec_boot_dev
> 0xff) {
885 fprintf(stderr
, "ERROR: secured mode boot device invalid\n");
890 val
|= (e
->sec_boot_dev
<< 8);
892 fprintf(out
, "fuse prog -y 24 0 %08x 0103e0a9 1\n", val
);
894 fprintf(out
, "# lock (unused) fuse lines (0-23)s\n");
895 for (fuse_line
= 0; fuse_line
< 24; ++fuse_line
)
896 fprintf(out
, "fuse prog -y %u 2 1\n", fuse_line
);
898 fprintf(out
, "# OK, that's all :-)\n");
904 static int kwb_dump_fuse_cmds(struct secure_hdr_v1
*sec_hdr
)
907 struct image_cfg_element
*e
;
909 e
= image_find_option(IMAGE_CFG_SEC_FUSE_DUMP
);
913 if (!strcmp(e
->name
, "a38x")) {
914 FILE *out
= fopen("kwb_fuses_a38x.txt", "w+");
917 fprintf(stderr
, "Couldn't open eFuse settings: '%s': %s\n",
918 "kwb_fuses_a38x.txt", strerror(errno
));
922 kwb_dump_fuse_cmds_38x(out
, sec_hdr
);
933 static int image_fill_xip_header(void *image
, struct image_tool_params
*params
)
935 struct main_hdr_v1
*main_hdr
= image
; /* kwbimage v0 and v1 have same XIP members */
936 int version
= kwbimage_version(image
);
937 uint32_t srcaddr
= le32_to_cpu(main_hdr
->srcaddr
);
938 uint32_t startaddr
= 0;
940 if (main_hdr
->blockid
!= IBR_HDR_SPI_ID
) {
941 fprintf(stderr
, "XIP is supported only for SPI images\n");
946 params
->addr
>= 0xE8000000 && params
->addr
< 0xEFFFFFFF &&
947 params
->ep
>= 0xE8000000 && params
->ep
< 0xEFFFFFFF) {
948 /* Load and Execute address is in SPI address space (kwbimage v0) */
949 startaddr
= 0xE8000000;
950 } else if (version
!= 0 &&
951 params
->addr
>= 0xD4000000 && params
->addr
< 0xD7FFFFFF &&
952 params
->ep
>= 0xD4000000 && params
->ep
< 0xD7FFFFFF) {
953 /* Load and Execute address is in SPI address space (kwbimage v1) */
954 startaddr
= 0xD4000000;
955 } else if (version
!= 0 &&
956 params
->addr
>= 0xD8000000 && params
->addr
< 0xDFFFFFFF &&
957 params
->ep
>= 0xD8000000 && params
->ep
< 0xDFFFFFFF) {
958 /* Load and Execute address is in Device bus space (kwbimage v1) */
959 startaddr
= 0xD8000000;
960 } else if (params
->addr
!= 0x0) {
961 /* Load address is non-zero */
963 fprintf(stderr
, "XIP Load Address or XIP Entry Point is not in SPI address space\n");
965 fprintf(stderr
, "XIP Load Address or XIP Entry Point is not in SPI nor in Device bus address space\n");
970 * For XIP destaddr must be set to 0xFFFFFFFF and
971 * execaddr relative to the start of XIP memory address space.
973 main_hdr
->destaddr
= cpu_to_le32(0xFFFFFFFF);
975 if (startaddr
== 0) {
977 * mkimage's --load-address 0x0 means that binary is Position
978 * Independent and in this case mkimage's --entry-point address
979 * is relative offset from beginning of the data part of image.
981 main_hdr
->execaddr
= cpu_to_le32(srcaddr
+ params
->ep
);
983 /* The lowest possible load address is after the header at srcaddr. */
984 if (params
->addr
- startaddr
< srcaddr
) {
986 "Invalid XIP Load Address 0x%08x.\n"
987 "The lowest address for this configuration is 0x%08x.\n",
988 params
->addr
, (unsigned)(startaddr
+ srcaddr
));
991 main_hdr
->srcaddr
= cpu_to_le32(params
->addr
- startaddr
);
992 main_hdr
->execaddr
= cpu_to_le32(params
->ep
- startaddr
);
998 static unsigned int image_get_satablksz(void)
1000 struct image_cfg_element
*e
;
1001 e
= image_find_option(IMAGE_CFG_SATA_BLKSZ
);
1002 return e
? e
->satablksz
: 512;
1005 static size_t image_headersz_align(size_t headersz
, uint8_t blockid
)
1008 * Header needs to be 4-byte aligned, which is already ensured by code
1009 * above. Moreover UART images must have header aligned to 128 bytes
1010 * (xmodem block size), NAND images to 256 bytes (ECC calculation),
1011 * SDIO images to 512 bytes (SDHC/SDXC fixed block size) and SATA
1012 * images to specified storage block size (default 512 bytes).
1013 * Note that SPI images do not have to have header size aligned
1014 * to 256 bytes because it is possible to read from SPI storage from
1015 * any offset (read offset does not have to be aligned to block size).
1017 if (blockid
== IBR_HDR_UART_ID
)
1018 return ALIGN(headersz
, 128);
1019 else if (blockid
== IBR_HDR_NAND_ID
)
1020 return ALIGN(headersz
, 256);
1021 else if (blockid
== IBR_HDR_SDIO_ID
)
1022 return ALIGN(headersz
, 512);
1023 else if (blockid
== IBR_HDR_SATA_ID
)
1024 return ALIGN(headersz
, image_get_satablksz());
1029 static size_t image_headersz_v0(int *hasext
)
1033 headersz
= sizeof(struct main_hdr_v0
);
1034 if (image_count_options(IMAGE_CFG_DATA
) > 0) {
1035 headersz
+= sizeof(struct ext_hdr_v0
);
1043 static void *image_create_v0(size_t *dataoff
, struct image_tool_params
*params
,
1046 struct image_cfg_element
*e
;
1048 struct main_hdr_v0
*main_hdr
;
1053 * Calculate the size of the header and the offset of the
1056 headersz
= image_headersz_v0(&has_ext
);
1057 *dataoff
= image_headersz_align(headersz
, image_get_bootfrom());
1059 image
= malloc(headersz
);
1061 fprintf(stderr
, "Cannot allocate memory for image\n");
1065 memset(image
, 0, headersz
);
1067 main_hdr
= (struct main_hdr_v0
*)image
;
1069 /* Fill in the main header */
1070 main_hdr
->blocksize
=
1071 cpu_to_le32(payloadsz
);
1072 main_hdr
->srcaddr
= cpu_to_le32(*dataoff
);
1073 main_hdr
->ext
= has_ext
;
1074 main_hdr
->version
= 0;
1075 main_hdr
->destaddr
= cpu_to_le32(params
->addr
);
1076 main_hdr
->execaddr
= cpu_to_le32(params
->ep
);
1077 main_hdr
->blockid
= image_get_bootfrom();
1079 e
= image_find_option(IMAGE_CFG_NAND_ECC_MODE
);
1081 main_hdr
->nandeccmode
= e
->nandeccmode
;
1082 e
= image_find_option(IMAGE_CFG_NAND_BLKSZ
);
1084 main_hdr
->nandblocksize
= e
->nandblksz
/ (64 * 1024);
1085 e
= image_find_option(IMAGE_CFG_NAND_PAGESZ
);
1087 main_hdr
->nandpagesize
= cpu_to_le16(e
->nandpagesz
);
1088 e
= image_find_option(IMAGE_CFG_NAND_BADBLK_LOCATION
);
1090 main_hdr
->nandbadblklocation
= e
->nandbadblklocation
;
1092 /* For SATA srcaddr is specified in number of sectors. */
1093 if (main_hdr
->blockid
== IBR_HDR_SATA_ID
) {
1094 params
->bl_len
= image_get_satablksz();
1095 main_hdr
->srcaddr
= cpu_to_le32(le32_to_cpu(main_hdr
->srcaddr
) / params
->bl_len
);
1098 /* For PCIe srcaddr is not used and must be set to 0xFFFFFFFF. */
1099 if (main_hdr
->blockid
== IBR_HDR_PEX_ID
)
1100 main_hdr
->srcaddr
= cpu_to_le32(0xFFFFFFFF);
1102 if (params
->xflag
) {
1103 if (!image_fill_xip_header(main_hdr
, params
)) {
1107 *dataoff
= le32_to_cpu(main_hdr
->srcaddr
);
1110 /* Generate the ext header */
1112 struct ext_hdr_v0
*ext_hdr
;
1115 ext_hdr
= (struct ext_hdr_v0
*)
1116 (image
+ sizeof(struct main_hdr_v0
));
1117 ext_hdr
->offset
= cpu_to_le32(0x40);
1119 for (cfgi
= 0, datai
= 0; cfgi
< cfgn
; cfgi
++) {
1120 e
= &image_cfg
[cfgi
];
1121 if (e
->type
!= IMAGE_CFG_DATA
)
1124 ext_hdr
->rcfg
[datai
].raddr
=
1125 cpu_to_le32(e
->regdata
.raddr
);
1126 ext_hdr
->rcfg
[datai
].rdata
=
1127 cpu_to_le32(e
->regdata
.rdata
);
1131 ext_hdr
->checksum
= image_checksum8(ext_hdr
,
1132 sizeof(struct ext_hdr_v0
));
1135 main_hdr
->checksum
= image_checksum8(image
,
1136 sizeof(struct main_hdr_v0
));
1141 static size_t image_headersz_v1(int *hasext
)
1143 struct image_cfg_element
*e
;
1151 headersz
= sizeof(struct main_hdr_v1
);
1153 if (image_get_csk_index() >= 0) {
1154 headersz
+= sizeof(struct secure_hdr_v1
);
1159 cpu_sheeva
= image_is_cpu_sheeva();
1162 for (cfgi
= 0; cfgi
< cfgn
; cfgi
++) {
1163 e
= &image_cfg
[cfgi
];
1165 if (e
->type
== IMAGE_CFG_DATA
)
1168 if (e
->type
== IMAGE_CFG_DATA_DELAY
||
1169 (e
->type
== IMAGE_CFG_BINARY
&& count
> 0)) {
1170 headersz
+= sizeof(struct register_set_hdr_v1
) + 8 * count
+ 4;
1174 if (e
->type
!= IMAGE_CFG_BINARY
)
1177 ret
= stat(e
->binary
.file
, &s
);
1182 memset(cwd
, 0, sizeof(cwd
));
1183 if (!getcwd(cwd
, sizeof(cwd
))) {
1184 dir
= "current working directory";
1185 perror("getcwd() failed");
1189 "Didn't find the file '%s' in '%s' which is mandatory to generate the image\n"
1190 "This file generally contains the DDR3 training code, and should be extracted from an existing bootable\n"
1191 "image for your board. Use 'dumpimage -T kwbimage -p 1' to extract it from an existing image.\n",
1192 e
->binary
.file
, dir
);
1196 headersz
+= sizeof(struct opt_hdr_v1
) + sizeof(uint32_t) +
1197 (e
->binary
.nargs
) * sizeof(uint32_t);
1199 if (e
->binary
.loadaddr
) {
1201 * BootROM loads kwbimage header (in which the
1202 * executable code is also stored) to address
1203 * 0x40004000 or 0x40000000. Thus there is
1204 * restriction for the load address of the N-th
1207 unsigned int base_addr
, low_addr
, high_addr
;
1209 base_addr
= cpu_sheeva
? 0x40004000 : 0x40000000;
1210 low_addr
= base_addr
+ headersz
;
1211 high_addr
= low_addr
+
1212 (BINARY_MAX_ARGS
- e
->binary
.nargs
) * sizeof(uint32_t);
1214 if (cpu_sheeva
&& e
->binary
.loadaddr
% 16) {
1216 "Invalid LOAD_ADDRESS 0x%08x for BINARY %s with %d args.\n"
1217 "Address for CPU SHEEVA must be 16-byte aligned.\n",
1218 e
->binary
.loadaddr
, e
->binary
.file
, e
->binary
.nargs
);
1222 if (e
->binary
.loadaddr
% 4 || e
->binary
.loadaddr
< low_addr
||
1223 e
->binary
.loadaddr
> high_addr
) {
1225 "Invalid LOAD_ADDRESS 0x%08x for BINARY %s with %d args.\n"
1226 "Address must be 4-byte aligned and in range 0x%08x-0x%08x.\n",
1227 e
->binary
.loadaddr
, e
->binary
.file
,
1228 e
->binary
.nargs
, low_addr
, high_addr
);
1231 headersz
= e
->binary
.loadaddr
- base_addr
;
1232 } else if (cpu_sheeva
) {
1233 headersz
= ALIGN(headersz
, 16);
1235 headersz
= ALIGN(headersz
, 4);
1238 headersz
+= ALIGN(s
.st_size
, 4) + sizeof(uint32_t);
1244 headersz
+= sizeof(struct register_set_hdr_v1
) + 8 * count
+ 4;
1247 * For all images except UART, headersz stored in header itself should
1248 * contains header size without padding. For UART image BootROM rounds
1249 * down headersz to multiply of 128 bytes. Therefore align UART headersz
1250 * to multiply of 128 bytes to ensure that remaining UART header bytes
1251 * are not ignored by BootROM.
1253 if (image_get_bootfrom() == IBR_HDR_UART_ID
)
1254 headersz
= ALIGN(headersz
, 128);
1259 static int add_binary_header_v1(uint8_t **cur
, uint8_t **next_ext
,
1260 struct image_cfg_element
*binarye
,
1261 struct main_hdr_v1
*main_hdr
)
1263 struct opt_hdr_v1
*hdr
= (struct opt_hdr_v1
*)*cur
;
1275 hdr
->headertype
= OPT_HDR_V1_BINARY_TYPE
;
1277 bin
= fopen(binarye
->binary
.file
, "r");
1279 fprintf(stderr
, "Cannot open binary file %s\n",
1280 binarye
->binary
.file
);
1284 if (fstat(fileno(bin
), &s
)) {
1285 fprintf(stderr
, "Cannot stat binary file %s\n",
1286 binarye
->binary
.file
);
1290 *cur
+= sizeof(struct opt_hdr_v1
);
1292 args
= (uint32_t *)*cur
;
1293 *args
= cpu_to_le32(binarye
->binary
.nargs
);
1295 for (argi
= 0; argi
< binarye
->binary
.nargs
; argi
++)
1296 args
[argi
] = cpu_to_le32(binarye
->binary
.args
[argi
]);
1298 *cur
+= (binarye
->binary
.nargs
+ 1) * sizeof(uint32_t);
1301 * ARM executable code inside the BIN header on platforms with Sheeva
1302 * CPU (A370 and AXP) must always be aligned with the 128-bit boundary.
1303 * In the case when this code is not position independent (e.g. ARM
1304 * SPL), it must be placed at fixed load and execute address.
1305 * This requirement can be met by inserting dummy arguments into
1306 * BIN header, if needed.
1308 cpu_sheeva
= image_is_cpu_sheeva();
1309 base_addr
= cpu_sheeva
? 0x40004000 : 0x40000000;
1310 offset
= *cur
- (uint8_t *)main_hdr
;
1311 if (binarye
->binary
.loadaddr
)
1312 add_args
= (binarye
->binary
.loadaddr
- base_addr
- offset
) / sizeof(uint32_t);
1313 else if (cpu_sheeva
)
1314 add_args
= ((16 - offset
% 16) % 16) / sizeof(uint32_t);
1318 *(args
- 1) = cpu_to_le32(binarye
->binary
.nargs
+ add_args
);
1319 *cur
+= add_args
* sizeof(uint32_t);
1322 ret
= fread(*cur
, s
.st_size
, 1, bin
);
1325 "Could not read binary image %s\n",
1326 binarye
->binary
.file
);
1332 *cur
+= ALIGN(s
.st_size
, 4);
1334 *((uint32_t *)*cur
) = 0x00000000;
1338 *cur
+= sizeof(uint32_t);
1340 binhdrsz
= sizeof(struct opt_hdr_v1
) +
1341 (binarye
->binary
.nargs
+ add_args
+ 2) * sizeof(uint32_t) +
1342 ALIGN(s
.st_size
, 4);
1343 hdr
->headersz_lsb
= cpu_to_le16(binhdrsz
& 0xFFFF);
1344 hdr
->headersz_msb
= (binhdrsz
& 0xFFFF0000) >> 16;
1354 static int export_pub_kak_hash(RSA
*kak
, struct secure_hdr_v1
*secure_hdr
)
1359 hashf
= fopen("pub_kak_hash.txt", "w");
1361 fprintf(stderr
, "Couldn't open hash file: '%s': %s\n",
1362 "pub_kak_hash.txt", strerror(errno
));
1366 res
= kwb_export_pubkey(kak
, &secure_hdr
->kak
, hashf
, "KAK");
1370 return res
< 0 ? 1 : 0;
1373 static int kwb_sign_csk_with_kak(struct image_tool_params
*params
,
1374 struct secure_hdr_v1
*secure_hdr
, RSA
*csk
)
1377 RSA
*kak_pub
= NULL
;
1378 int csk_idx
= image_get_csk_index();
1379 struct sig_v1 tmp_sig
;
1381 if (csk_idx
< 0 || csk_idx
> 15) {
1382 fprintf(stderr
, "Invalid CSK index %d\n", csk_idx
);
1386 if (kwb_load_kak(params
, &kak
) < 0)
1389 if (export_pub_kak_hash(kak
, secure_hdr
))
1392 if (kwb_import_pubkey(&kak_pub
, &secure_hdr
->kak
, "KAK") < 0)
1395 if (kwb_export_pubkey(csk
, &secure_hdr
->csk
[csk_idx
], NULL
, "CSK") < 0)
1398 if (kwb_sign_and_verify(kak
, &secure_hdr
->csk
,
1399 sizeof(secure_hdr
->csk
) +
1400 sizeof(secure_hdr
->csksig
),
1401 &tmp_sig
, "CSK") < 0)
1404 if (kwb_verify(kak_pub
, &secure_hdr
->csk
,
1405 sizeof(secure_hdr
->csk
) +
1406 sizeof(secure_hdr
->csksig
),
1407 &tmp_sig
, "CSK (2)") < 0)
1410 secure_hdr
->csksig
= tmp_sig
;
1415 static int add_secure_header_v1(struct image_tool_params
*params
, uint8_t *image_ptr
,
1416 size_t image_size
, uint8_t *header_ptr
, size_t headersz
,
1417 struct secure_hdr_v1
*secure_hdr
)
1419 struct image_cfg_element
*e_jtagdelay
;
1420 struct image_cfg_element
*e_boxid
;
1421 struct image_cfg_element
*e_flashid
;
1423 struct sig_v1 tmp_sig
;
1424 bool specialized_img
= image_get_spezialized_img();
1426 kwb_msg("Create secure header content\n");
1428 e_jtagdelay
= image_find_option(IMAGE_CFG_JTAG_DELAY
);
1429 e_boxid
= image_find_option(IMAGE_CFG_BOX_ID
);
1430 e_flashid
= image_find_option(IMAGE_CFG_FLASH_ID
);
1432 if (kwb_load_csk(params
, &csk
) < 0)
1435 secure_hdr
->headertype
= OPT_HDR_V1_SECURE_TYPE
;
1436 secure_hdr
->headersz_msb
= 0;
1437 secure_hdr
->headersz_lsb
= cpu_to_le16(sizeof(struct secure_hdr_v1
));
1439 secure_hdr
->jtag_delay
= e_jtagdelay
->jtag_delay
;
1440 if (e_boxid
&& specialized_img
)
1441 secure_hdr
->boxid
= cpu_to_le32(e_boxid
->boxid
);
1442 if (e_flashid
&& specialized_img
)
1443 secure_hdr
->flashid
= cpu_to_le32(e_flashid
->flashid
);
1445 if (kwb_sign_csk_with_kak(params
, secure_hdr
, csk
))
1448 if (kwb_sign_and_verify(csk
, image_ptr
, image_size
- 4,
1449 &secure_hdr
->imgsig
, "image") < 0)
1452 if (kwb_sign_and_verify(csk
, header_ptr
, headersz
, &tmp_sig
, "header") < 0)
1455 secure_hdr
->hdrsig
= tmp_sig
;
1457 kwb_dump_fuse_cmds(secure_hdr
);
1462 static void finish_register_set_header_v1(uint8_t **cur
, uint8_t **next_ext
,
1463 struct register_set_hdr_v1
*register_set_hdr
,
1464 int *datai
, uint8_t delay
)
1466 int size
= sizeof(struct register_set_hdr_v1
) + 8 * (*datai
) + 4;
1468 register_set_hdr
->headertype
= OPT_HDR_V1_REGISTER_TYPE
;
1469 register_set_hdr
->headersz_lsb
= cpu_to_le16(size
& 0xFFFF);
1470 register_set_hdr
->headersz_msb
= size
>> 16;
1471 register_set_hdr
->data
[*datai
].last_entry
.delay
= delay
;
1474 *next_ext
= ®ister_set_hdr
->data
[*datai
].last_entry
.next
;
1478 static void *image_create_v1(size_t *dataoff
, struct image_tool_params
*params
,
1479 uint8_t *ptr
, int payloadsz
)
1481 struct image_cfg_element
*e
;
1482 struct main_hdr_v1
*main_hdr
;
1483 struct register_set_hdr_v1
*register_set_hdr
;
1484 struct secure_hdr_v1
*secure_hdr
= NULL
;
1486 uint8_t *image
, *cur
;
1488 uint8_t *next_ext
= NULL
;
1493 * Calculate the size of the header and the offset of the
1496 headersz
= image_headersz_v1(&hasext
);
1499 *dataoff
= image_headersz_align(headersz
, image_get_bootfrom());
1501 image
= malloc(headersz
);
1503 fprintf(stderr
, "Cannot allocate memory for image\n");
1507 memset(image
, 0, headersz
);
1509 main_hdr
= (struct main_hdr_v1
*)image
;
1511 cur
+= sizeof(struct main_hdr_v1
);
1512 next_ext
= &main_hdr
->ext
;
1514 /* Fill the main header */
1515 main_hdr
->blocksize
=
1516 cpu_to_le32(payloadsz
);
1517 main_hdr
->headersz_lsb
= cpu_to_le16(headersz
& 0xFFFF);
1518 main_hdr
->headersz_msb
= (headersz
& 0xFFFF0000) >> 16;
1519 main_hdr
->destaddr
= cpu_to_le32(params
->addr
);
1520 main_hdr
->execaddr
= cpu_to_le32(params
->ep
);
1521 main_hdr
->srcaddr
= cpu_to_le32(*dataoff
);
1522 main_hdr
->ext
= hasext
;
1523 main_hdr
->version
= 1;
1524 main_hdr
->blockid
= image_get_bootfrom();
1526 e
= image_find_option(IMAGE_CFG_NAND_BLKSZ
);
1528 main_hdr
->nandblocksize
= e
->nandblksz
/ (64 * 1024);
1529 e
= image_find_option(IMAGE_CFG_NAND_PAGESZ
);
1531 main_hdr
->nandpagesize
= cpu_to_le16(e
->nandpagesz
);
1532 e
= image_find_option(IMAGE_CFG_NAND_BADBLK_LOCATION
);
1534 main_hdr
->nandbadblklocation
= e
->nandbadblklocation
;
1535 e
= image_find_option(IMAGE_CFG_BAUDRATE
);
1537 main_hdr
->options
|= baudrate_to_option(e
->baudrate
);
1538 e
= image_find_option(IMAGE_CFG_UART_PORT
);
1540 main_hdr
->options
|= (e
->uart_port
& 3) << 3;
1541 e
= image_find_option(IMAGE_CFG_UART_MPP
);
1543 main_hdr
->options
|= (e
->uart_mpp
& 7) << 5;
1544 e
= image_find_option(IMAGE_CFG_DEBUG
);
1546 main_hdr
->flags
= e
->debug
? 0x1 : 0;
1548 /* For SATA srcaddr is specified in number of sectors. */
1549 if (main_hdr
->blockid
== IBR_HDR_SATA_ID
) {
1550 params
->bl_len
= image_get_satablksz();
1551 main_hdr
->srcaddr
= cpu_to_le32(le32_to_cpu(main_hdr
->srcaddr
) / params
->bl_len
);
1554 /* For PCIe srcaddr is not used and must be set to 0xFFFFFFFF. */
1555 if (main_hdr
->blockid
== IBR_HDR_PEX_ID
)
1556 main_hdr
->srcaddr
= cpu_to_le32(0xFFFFFFFF);
1558 if (params
->xflag
) {
1559 if (!image_fill_xip_header(main_hdr
, params
)) {
1563 *dataoff
= le32_to_cpu(main_hdr
->srcaddr
);
1566 if (image_get_csk_index() >= 0) {
1568 * only reserve the space here; we fill the header later since
1569 * we need the header to be complete to compute the signatures
1571 secure_hdr
= (struct secure_hdr_v1
*)cur
;
1572 cur
+= sizeof(struct secure_hdr_v1
);
1574 next_ext
= &secure_hdr
->next
;
1578 for (cfgi
= 0; cfgi
< cfgn
; cfgi
++) {
1579 e
= &image_cfg
[cfgi
];
1580 if (e
->type
!= IMAGE_CFG_DATA
&&
1581 e
->type
!= IMAGE_CFG_DATA_DELAY
&&
1582 e
->type
!= IMAGE_CFG_BINARY
)
1586 register_set_hdr
= (struct register_set_hdr_v1
*)cur
;
1588 /* If delay is not specified, use the smallest possible value. */
1589 if (e
->type
== IMAGE_CFG_DATA_DELAY
)
1590 delay
= e
->regdata_delay
;
1592 delay
= REGISTER_SET_HDR_OPT_DELAY_MS(0);
1595 * DATA_DELAY command is the last entry in the register set
1596 * header and BINARY command inserts new binary header.
1597 * Therefore BINARY command requires to finish register set
1598 * header if some DATA command was specified. And DATA_DELAY
1599 * command automatically finish register set header even when
1600 * there was no DATA command.
1602 if (e
->type
== IMAGE_CFG_DATA_DELAY
||
1603 (e
->type
== IMAGE_CFG_BINARY
&& datai
!= 0))
1604 finish_register_set_header_v1(&cur
, &next_ext
, register_set_hdr
,
1607 if (e
->type
== IMAGE_CFG_DATA
) {
1608 register_set_hdr
->data
[datai
].entry
.address
=
1609 cpu_to_le32(e
->regdata
.raddr
);
1610 register_set_hdr
->data
[datai
].entry
.value
=
1611 cpu_to_le32(e
->regdata
.rdata
);
1615 if (e
->type
== IMAGE_CFG_BINARY
) {
1616 if (add_binary_header_v1(&cur
, &next_ext
, e
, main_hdr
))
1621 /* Set delay to the smallest possible value. */
1622 delay
= REGISTER_SET_HDR_OPT_DELAY_MS(0);
1623 finish_register_set_header_v1(&cur
, &next_ext
, register_set_hdr
,
1627 if (secure_hdr
&& add_secure_header_v1(params
, ptr
+ *dataoff
, payloadsz
,
1628 image
, headersz
, secure_hdr
))
1631 /* Calculate and set the header checksum */
1632 main_hdr
->checksum
= image_checksum8(main_hdr
, headersz
);
1637 static int recognize_keyword(char *keyword
)
1641 for (kw_id
= 1; kw_id
< IMAGE_CFG_COUNT
; ++kw_id
)
1642 if (!strcmp(keyword
, id_strs
[kw_id
]))
1648 static int image_create_config_parse_oneline(char *line
,
1649 struct image_cfg_element
*el
)
1651 char *keyword
, *saveptr
, *value1
, *value2
;
1652 char delimiters
[] = " \t";
1653 int keyword_id
, ret
, argi
;
1654 char *unknown_msg
= "Ignoring unknown line '%s'\n";
1656 keyword
= strtok_r(line
, delimiters
, &saveptr
);
1657 keyword_id
= recognize_keyword(keyword
);
1660 fprintf(stderr
, unknown_msg
, line
);
1664 el
->type
= keyword_id
;
1666 value1
= strtok_r(NULL
, delimiters
, &saveptr
);
1669 fprintf(stderr
, "Parameter missing in line '%s'\n", line
);
1673 switch (keyword_id
) {
1674 case IMAGE_CFG_VERSION
:
1675 el
->version
= atoi(value1
);
1678 if (strcmp(value1
, "FEROCEON") == 0)
1680 else if (strcmp(value1
, "SHEEVA") == 0)
1682 else if (strcmp(value1
, "A9") == 0)
1685 fprintf(stderr
, "Invalid CPU %s\n", value1
);
1689 case IMAGE_CFG_BOOT_FROM
:
1690 ret
= image_boot_mode_id(value1
);
1693 fprintf(stderr
, "Invalid boot media '%s'\n", value1
);
1698 case IMAGE_CFG_NAND_BLKSZ
:
1699 el
->nandblksz
= strtoul(value1
, NULL
, 16);
1701 case IMAGE_CFG_NAND_BADBLK_LOCATION
:
1702 el
->nandbadblklocation
= strtoul(value1
, NULL
, 16);
1704 case IMAGE_CFG_NAND_ECC_MODE
:
1705 ret
= image_nand_ecc_mode_id(value1
);
1708 fprintf(stderr
, "Invalid NAND ECC mode '%s'\n", value1
);
1711 el
->nandeccmode
= ret
;
1713 case IMAGE_CFG_NAND_PAGESZ
:
1714 el
->nandpagesz
= strtoul(value1
, NULL
, 16);
1716 case IMAGE_CFG_SATA_BLKSZ
:
1717 el
->satablksz
= strtoul(value1
, NULL
, 0);
1718 if (el
->satablksz
& (el
->satablksz
-1)) {
1719 fprintf(stderr
, "Invalid SATA block size '%s'\n", value1
);
1723 case IMAGE_CFG_BINARY
:
1726 el
->binary
.file
= strdup(value1
);
1728 char *value
= strtok_r(NULL
, delimiters
, &saveptr
);
1734 if (!strcmp(value
, "LOAD_ADDRESS")) {
1735 value
= strtok_r(NULL
, delimiters
, &saveptr
);
1738 "Missing address argument for BINARY LOAD_ADDRESS\n");
1741 el
->binary
.loadaddr
= strtoul(value
, &endptr
, 16);
1744 "Invalid argument '%s' for BINARY LOAD_ADDRESS\n",
1748 value
= strtok_r(NULL
, delimiters
, &saveptr
);
1751 "Unexpected argument '%s' after BINARY LOAD_ADDRESS\n",
1758 el
->binary
.args
[argi
] = strtoul(value
, &endptr
, 16);
1760 fprintf(stderr
, "Invalid argument '%s' for BINARY\n", value
);
1764 if (argi
>= BINARY_MAX_ARGS
) {
1766 "Too many arguments for BINARY\n");
1770 el
->binary
.nargs
= argi
;
1772 case IMAGE_CFG_DATA
:
1773 value2
= strtok_r(NULL
, delimiters
, &saveptr
);
1775 if (!value1
|| !value2
) {
1777 "Invalid number of arguments for DATA\n");
1781 el
->regdata
.raddr
= strtoul(value1
, NULL
, 16);
1782 el
->regdata
.rdata
= strtoul(value2
, NULL
, 16);
1784 case IMAGE_CFG_DATA_DELAY
:
1785 if (!strcmp(value1
, "SDRAM_SETUP"))
1786 el
->regdata_delay
= REGISTER_SET_HDR_OPT_DELAY_SDRAM_SETUP
;
1788 el
->regdata_delay
= REGISTER_SET_HDR_OPT_DELAY_MS(strtoul(value1
, NULL
, 10));
1789 if (el
->regdata_delay
> 255) {
1790 fprintf(stderr
, "Maximal DATA_DELAY is 255\n");
1794 case IMAGE_CFG_BAUDRATE
:
1795 el
->baudrate
= strtoul(value1
, NULL
, 10);
1797 case IMAGE_CFG_UART_PORT
:
1798 el
->uart_port
= strtoul(value1
, NULL
, 16);
1800 case IMAGE_CFG_UART_MPP
:
1801 el
->uart_mpp
= strtoul(value1
, NULL
, 16);
1803 case IMAGE_CFG_DEBUG
:
1804 el
->debug
= strtoul(value1
, NULL
, 10);
1807 el
->key_name
= strdup(value1
);
1810 el
->key_name
= strdup(value1
);
1812 case IMAGE_CFG_CSK_INDEX
:
1813 el
->csk_idx
= strtol(value1
, NULL
, 0);
1815 case IMAGE_CFG_JTAG_DELAY
:
1816 el
->jtag_delay
= strtoul(value1
, NULL
, 0);
1818 case IMAGE_CFG_BOX_ID
:
1819 el
->boxid
= strtoul(value1
, NULL
, 0);
1821 case IMAGE_CFG_FLASH_ID
:
1822 el
->flashid
= strtoul(value1
, NULL
, 0);
1824 case IMAGE_CFG_SEC_SPECIALIZED_IMG
:
1825 el
->sec_specialized_img
= true;
1827 case IMAGE_CFG_SEC_COMMON_IMG
:
1828 el
->sec_specialized_img
= false;
1830 case IMAGE_CFG_SEC_BOOT_DEV
:
1831 el
->sec_boot_dev
= strtoul(value1
, NULL
, 0);
1833 case IMAGE_CFG_SEC_FUSE_DUMP
:
1834 el
->name
= strdup(value1
);
1837 fprintf(stderr
, unknown_msg
, line
);
1844 * Parse the configuration file 'fcfg' into the array of configuration
1845 * elements 'image_cfg', and return the number of configuration
1846 * elements in 'cfgn'.
1848 static int image_create_config_parse(FILE *fcfg
)
1853 /* Parse the configuration file */
1854 while (!feof(fcfg
)) {
1858 /* Read the current line */
1859 memset(buf
, 0, sizeof(buf
));
1860 line
= fgets(buf
, sizeof(buf
), fcfg
);
1864 /* Ignore useless lines */
1865 if (line
[0] == '\n' || line
[0] == '#')
1868 /* Strip final newline */
1869 if (line
[strlen(line
) - 1] == '\n')
1870 line
[strlen(line
) - 1] = 0;
1872 /* Parse the current line */
1873 ret
= image_create_config_parse_oneline(line
,
1880 if (cfgi
>= IMAGE_CFG_ELEMENT_MAX
) {
1882 "Too many configuration elements in .cfg file\n");
1891 static int image_get_version(void)
1893 struct image_cfg_element
*e
;
1895 e
= image_find_option(IMAGE_CFG_VERSION
);
1902 static void kwbimage_set_header(void *ptr
, struct stat
*sbuf
, int ifd
,
1903 struct image_tool_params
*params
)
1917 * Do not use sbuf->st_size as it contains size with padding.
1918 * We need original image data size, so stat original file.
1920 if (params
->skipcpy
) {
1922 } else if (stat(params
->datafile
, &s
)) {
1923 fprintf(stderr
, "Could not stat data file %s: %s\n",
1924 params
->datafile
, strerror(errno
));
1927 datasz
= ALIGN(s
.st_size
, 4);
1929 fcfg
= fopen(params
->imagename
, "r");
1931 fprintf(stderr
, "Could not open input file %s\n",
1936 image_cfg
= malloc(IMAGE_CFG_ELEMENT_MAX
*
1937 sizeof(struct image_cfg_element
));
1939 fprintf(stderr
, "Cannot allocate memory\n");
1944 memset(image_cfg
, 0,
1945 IMAGE_CFG_ELEMENT_MAX
* sizeof(struct image_cfg_element
));
1948 ret
= image_create_config_parse(fcfg
);
1955 version
= image_get_version();
1958 * Fallback to version 0 if no version is provided in the
1963 image
= image_create_v0(&dataoff
, params
, datasz
+ 4);
1967 image
= image_create_v1(&dataoff
, params
, ptr
, datasz
+ 4);
1971 fprintf(stderr
, "Unsupported version %d\n", version
);
1977 fprintf(stderr
, "Could not create image\n");
1984 /* Build and add image data checksum */
1985 checksum
= cpu_to_le32(image_checksum32((uint8_t *)ptr
+ dataoff
,
1987 memcpy((uint8_t *)ptr
+ dataoff
+ datasz
, &checksum
, sizeof(uint32_t));
1989 /* Finally copy the header into the image area */
1990 memcpy(ptr
, image
, kwbheader_size(image
));
1995 static void kwbimage_print_header(const void *ptr
, struct image_tool_params
*params
)
1997 struct main_hdr_v0
*mhdr
= (struct main_hdr_v0
*)ptr
;
1998 struct bin_hdr_v0
*bhdr
;
1999 struct opt_hdr_v1
*ohdr
;
2001 printf("Image Type: MVEBU Boot from %s Image\n",
2002 image_boot_mode_name(mhdr
->blockid
));
2003 printf("Image version:%d\n", kwbimage_version(ptr
));
2005 for_each_opt_hdr_v1 (ohdr
, mhdr
) {
2006 if (ohdr
->headertype
== OPT_HDR_V1_BINARY_TYPE
) {
2007 printf("BIN Img Size: ");
2008 genimg_print_size(opt_hdr_v1_size(ohdr
) - 12 -
2010 printf("BIN Img Offs: ");
2011 genimg_print_size(((uint8_t *)ohdr
- (uint8_t *)mhdr
) +
2012 8 + 4 * ohdr
->data
[0]);
2016 for_each_bin_hdr_v0(bhdr
, mhdr
) {
2017 printf("BIN Img Size: ");
2018 genimg_print_size(le32_to_cpu(bhdr
->size
));
2019 printf("BIN Img Addr: %08x\n", le32_to_cpu(bhdr
->destaddr
));
2020 printf("BIN Img Entr: %08x\n", le32_to_cpu(bhdr
->execaddr
));
2023 printf("Data Size: ");
2024 genimg_print_size(le32_to_cpu(mhdr
->blocksize
) - sizeof(uint32_t));
2025 printf("Data Offset: ");
2026 if (mhdr
->blockid
== IBR_HDR_SATA_ID
)
2027 printf("%u Sector%s (LBA) = ", le32_to_cpu(mhdr
->srcaddr
),
2028 le32_to_cpu(mhdr
->srcaddr
) != 1 ? "s" : "");
2029 genimg_print_size(le32_to_cpu(mhdr
->srcaddr
) * params
->bl_len
);
2030 if (mhdr
->blockid
== IBR_HDR_SATA_ID
)
2031 printf("Sector Size: %u Bytes\n", params
->bl_len
);
2032 if (mhdr
->blockid
== IBR_HDR_SPI_ID
&& le32_to_cpu(mhdr
->destaddr
) == 0xFFFFFFFF) {
2033 printf("Load Address: XIP\n");
2034 printf("Execute Offs: %08x\n", le32_to_cpu(mhdr
->execaddr
));
2036 printf("Load Address: %08x\n", le32_to_cpu(mhdr
->destaddr
));
2037 printf("Entry Point: %08x\n", le32_to_cpu(mhdr
->execaddr
));
2041 static int kwbimage_check_image_types(uint8_t type
)
2043 if (type
== IH_TYPE_KWBIMAGE
)
2044 return EXIT_SUCCESS
;
2046 return EXIT_FAILURE
;
2049 static int kwbimage_verify_header(unsigned char *ptr
, int image_size
,
2050 struct image_tool_params
*params
)
2052 size_t header_size
= kwbheader_size(ptr
);
2059 if (header_size
> 192*1024)
2060 return -FDT_ERR_BADSTRUCTURE
;
2062 if (header_size
> image_size
)
2063 return -FDT_ERR_BADSTRUCTURE
;
2065 if (!main_hdr_checksum_ok(ptr
))
2066 return -FDT_ERR_BADSTRUCTURE
;
2068 /* Only version 0 extended header has checksum */
2069 if (kwbimage_version(ptr
) == 0) {
2070 struct main_hdr_v0
*mhdr
= (struct main_hdr_v0
*)ptr
;
2071 struct ext_hdr_v0
*ext_hdr
;
2072 struct bin_hdr_v0
*bhdr
;
2074 for_each_ext_hdr_v0(ext_hdr
, ptr
) {
2075 csum
= image_checksum8(ext_hdr
, sizeof(*ext_hdr
) - 1);
2076 if (csum
!= ext_hdr
->checksum
)
2077 return -FDT_ERR_BADSTRUCTURE
;
2080 for_each_bin_hdr_v0(bhdr
, ptr
) {
2081 csum
= image_checksum8(bhdr
, (uint8_t *)&bhdr
->checksum
- (uint8_t *)bhdr
- 1);
2082 if (csum
!= bhdr
->checksum
)
2083 return -FDT_ERR_BADSTRUCTURE
;
2085 if (bhdr
->offset
> sizeof(*bhdr
) || bhdr
->offset
% 4 != 0)
2086 return -FDT_ERR_BADSTRUCTURE
;
2088 if (bhdr
->offset
+ bhdr
->size
+ 4 > sizeof(*bhdr
) || bhdr
->size
% 4 != 0)
2089 return -FDT_ERR_BADSTRUCTURE
;
2091 if (image_checksum32((uint8_t *)bhdr
+ bhdr
->offset
, bhdr
->size
) !=
2092 *(uint32_t *)((uint8_t *)bhdr
+ bhdr
->offset
+ bhdr
->size
))
2093 return -FDT_ERR_BADSTRUCTURE
;
2096 blockid
= mhdr
->blockid
;
2097 offset
= le32_to_cpu(mhdr
->srcaddr
);
2098 size
= le32_to_cpu(mhdr
->blocksize
);
2099 } else if (kwbimage_version(ptr
) == 1) {
2100 struct main_hdr_v1
*mhdr
= (struct main_hdr_v1
*)ptr
;
2101 const uint8_t *mhdr_end
;
2102 struct opt_hdr_v1
*ohdr
;
2104 mhdr_end
= (uint8_t *)mhdr
+ header_size
;
2105 for_each_opt_hdr_v1 (ohdr
, ptr
)
2106 if (!opt_hdr_v1_valid_size(ohdr
, mhdr_end
))
2107 return -FDT_ERR_BADSTRUCTURE
;
2109 blockid
= mhdr
->blockid
;
2110 offset
= le32_to_cpu(mhdr
->srcaddr
);
2111 size
= le32_to_cpu(mhdr
->blocksize
);
2113 return -FDT_ERR_BADSTRUCTURE
;
2116 if (size
< 4 || size
% 4 != 0)
2117 return -FDT_ERR_BADSTRUCTURE
;
2120 * For SATA srcaddr is specified in number of sectors.
2121 * Try all possible sector sizes which are power of two,
2122 * at least 512 bytes and up to the 32 kB.
2124 if (blockid
== IBR_HDR_SATA_ID
) {
2125 for (blksz
= 512; blksz
< 0x10000; blksz
*= 2) {
2126 if (offset
* blksz
> image_size
|| offset
* blksz
+ size
> image_size
)
2129 if (image_checksum32(ptr
+ offset
* blksz
, size
- 4) ==
2130 *(uint32_t *)(ptr
+ offset
* blksz
+ size
- 4)) {
2131 params
->bl_len
= blksz
;
2136 return -FDT_ERR_BADSTRUCTURE
;
2140 * For PCIe srcaddr is always set to 0xFFFFFFFF.
2141 * This expects that data starts after all headers.
2143 if (blockid
== IBR_HDR_PEX_ID
&& offset
== 0xFFFFFFFF)
2144 offset
= header_size
;
2146 if (offset
% 4 != 0 || offset
> image_size
|| offset
+ size
> image_size
)
2147 return -FDT_ERR_BADSTRUCTURE
;
2149 if (image_checksum32(ptr
+ offset
, size
- 4) !=
2150 *(uint32_t *)(ptr
+ offset
+ size
- 4))
2151 return -FDT_ERR_BADSTRUCTURE
;
2157 static int kwbimage_generate(struct image_tool_params
*params
,
2158 struct image_type_params
*tparams
)
2168 unsigned int satablksz
;
2170 fcfg
= fopen(params
->imagename
, "r");
2172 fprintf(stderr
, "Could not open input file %s\n",
2177 if (params
->skipcpy
) {
2179 } else if (stat(params
->datafile
, &s
)) {
2180 fprintf(stderr
, "Could not stat data file %s: %s\n",
2181 params
->datafile
, strerror(errno
));
2185 image_cfg
= malloc(IMAGE_CFG_ELEMENT_MAX
*
2186 sizeof(struct image_cfg_element
));
2188 fprintf(stderr
, "Cannot allocate memory\n");
2193 memset(image_cfg
, 0,
2194 IMAGE_CFG_ELEMENT_MAX
* sizeof(struct image_cfg_element
));
2197 ret
= image_create_config_parse(fcfg
);
2204 bootfrom
= image_get_bootfrom();
2205 version
= image_get_version();
2206 satablksz
= image_get_satablksz();
2209 * Fallback to version 0 if no version is provided in the
2214 alloc_len
= image_headersz_v0(NULL
);
2218 alloc_len
= image_headersz_v1(NULL
);
2223 if (alloc_len
> 192*1024) {
2224 fprintf(stderr
, "Header is too big (%u bytes), maximal kwbimage header size is %u bytes\n", alloc_len
, 192*1024);
2231 fprintf(stderr
, "Unsupported version %d\n", version
);
2236 alloc_len
= image_headersz_align(alloc_len
, image_get_bootfrom());
2240 hdr
= malloc(alloc_len
);
2242 fprintf(stderr
, "%s: malloc return failure: %s\n",
2243 params
->cmdname
, strerror(errno
));
2247 memset(hdr
, 0, alloc_len
);
2248 tparams
->header_size
= alloc_len
;
2252 * Final SATA images must be aligned to disk block size.
2253 * Final SDIO images must be aligned to 512 bytes.
2254 * Final SPI and NAND images must be aligned to 256 bytes.
2255 * Final UART image must be aligned to 128 bytes.
2257 if (bootfrom
== IBR_HDR_SATA_ID
)
2259 else if (bootfrom
== IBR_HDR_SDIO_ID
)
2261 else if (bootfrom
== IBR_HDR_SPI_ID
|| bootfrom
== IBR_HDR_NAND_ID
)
2263 else if (bootfrom
== IBR_HDR_UART_ID
)
2269 * The resulting image needs to be 4-byte aligned. At least
2270 * the Marvell hdrparser tool complains if its unaligned.
2271 * After the image data is stored 4-byte checksum.
2273 size
= 4 + (align
- (alloc_len
+ s
.st_size
+ 4) % align
) % align
;
2276 * This function should return aligned size of the datafile.
2277 * When skipcpy is set (datafile is skipped) then return value of this
2278 * function is ignored, so we have to put required kwbimage aligning
2279 * into the preallocated header size.
2281 if (params
->skipcpy
) {
2282 tparams
->header_size
+= size
;
2289 static int kwbimage_generate_config(void *ptr
, struct image_tool_params
*params
)
2291 struct main_hdr_v0
*mhdr0
= (struct main_hdr_v0
*)ptr
;
2292 struct main_hdr_v1
*mhdr
= (struct main_hdr_v1
*)ptr
;
2293 size_t header_size
= kwbheader_size(ptr
);
2294 struct register_set_hdr_v1
*regset_hdr
;
2295 struct ext_hdr_v0_reg
*regdata
;
2296 struct ext_hdr_v0
*ehdr0
;
2297 struct bin_hdr_v0
*bhdr0
;
2298 struct opt_hdr_v1
*ohdr
;
2308 f
= fopen(params
->outfile
, "w");
2310 fprintf(stderr
, "Can't open \"%s\": %s\n", params
->outfile
, strerror(errno
));
2314 version
= kwbimage_version(ptr
);
2318 if (mhdr0
->ext
> 1 || mhdr0
->bin
||
2319 ((ehdr0
= ext_hdr_v0_first(ptr
)) &&
2320 (ehdr0
->match_addr
|| ehdr0
->match_mask
|| ehdr0
->match_value
)))
2325 fprintf(f
, "VERSION %d\n", version
);
2327 fprintf(f
, "BOOT_FROM %s\n", image_boot_mode_name(mhdr
->blockid
) ?: "<unknown>");
2329 if (version
== 0 && mhdr
->blockid
== IBR_HDR_NAND_ID
)
2330 fprintf(f
, "NAND_ECC_MODE %s\n", image_nand_ecc_mode_name(mhdr0
->nandeccmode
));
2332 if (mhdr
->blockid
== IBR_HDR_NAND_ID
)
2333 fprintf(f
, "NAND_PAGE_SIZE 0x%x\n", (unsigned)le16_to_cpu(mhdr
->nandpagesize
));
2335 if (mhdr
->blockid
== IBR_HDR_NAND_ID
&& (version
!= 0 || is_v0_ext
|| mhdr
->nandblocksize
!= 0)) {
2336 if (mhdr
->nandblocksize
!= 0) /* block size explicitly set in 64 kB unit */
2337 fprintf(f
, "NAND_BLKSZ 0x%x\n", (unsigned)mhdr
->nandblocksize
* 64*1024);
2338 else if (le16_to_cpu(mhdr
->nandpagesize
) > 512)
2339 fprintf(f
, "NAND_BLKSZ 0x10000\n"); /* large page NAND flash = 64 kB block size */
2341 fprintf(f
, "NAND_BLKSZ 0x4000\n"); /* small page NAND flash = 16 kB block size */
2344 if (mhdr
->blockid
== IBR_HDR_NAND_ID
&& (version
!= 0 || is_v0_ext
))
2345 fprintf(f
, "NAND_BADBLK_LOCATION 0x%x\n", (unsigned)mhdr
->nandbadblklocation
);
2347 if (version
== 0 && mhdr
->blockid
== IBR_HDR_SATA_ID
)
2348 fprintf(f
, "SATA_PIO_MODE %u\n", (unsigned)mhdr0
->satapiomode
);
2350 if (mhdr
->blockid
== IBR_HDR_SATA_ID
)
2351 fprintf(f
, "SATA_BLKSZ %u\n", params
->bl_len
);
2354 * Addresses and sizes which are specified by mkimage command line
2355 * arguments and not in kwbimage config file
2359 fprintf(f
, "#HEADER_SIZE 0x%x\n",
2360 ((unsigned)mhdr
->headersz_msb
<< 8) | le16_to_cpu(mhdr
->headersz_lsb
));
2362 fprintf(f
, "#SRC_ADDRESS 0x%x\n", le32_to_cpu(mhdr
->srcaddr
));
2363 fprintf(f
, "#BLOCK_SIZE 0x%x\n", le32_to_cpu(mhdr
->blocksize
));
2364 fprintf(f
, "#DEST_ADDRESS 0x%08x\n", le32_to_cpu(mhdr
->destaddr
));
2365 fprintf(f
, "#EXEC_ADDRESS 0x%08x\n", le32_to_cpu(mhdr
->execaddr
));
2368 if (options_to_baudrate(mhdr
->options
))
2369 fprintf(f
, "BAUDRATE %u\n", options_to_baudrate(mhdr
->options
));
2370 if (options_to_baudrate(mhdr
->options
) ||
2371 ((mhdr
->options
>> 3) & 0x3) || ((mhdr
->options
>> 5) & 0x7)) {
2372 fprintf(f
, "UART_PORT %u\n", (unsigned)((mhdr
->options
>> 3) & 0x3));
2373 fprintf(f
, "UART_MPP 0x%x\n", (unsigned)((mhdr
->options
>> 5) & 0x7));
2375 if (mhdr
->flags
& 0x1)
2376 fprintf(f
, "DEBUG 1\n");
2380 for_each_opt_hdr_v1(ohdr
, ptr
) {
2381 if (ohdr
->headertype
== OPT_HDR_V1_SECURE_TYPE
) {
2382 fprintf(f
, "#SECURE_HEADER\n");
2383 } else if (ohdr
->headertype
== OPT_HDR_V1_BINARY_TYPE
) {
2384 fprintf(f
, "BINARY binary%d.bin", cur_idx
);
2385 for (i
= 0; i
< ohdr
->data
[0]; i
++)
2386 fprintf(f
, " 0x%x", le32_to_cpu(((uint32_t *)ohdr
->data
)[i
+ 1]));
2387 offset
= (unsigned)((uint8_t *)ohdr
- (uint8_t *)mhdr
) + 8 + 4 * ohdr
->data
[0];
2388 fprintf(f
, " LOAD_ADDRESS 0x%08x\n", 0x40000000 + offset
);
2389 fprintf(f
, " # for CPU SHEEVA: LOAD_ADDRESS 0x%08x\n", 0x40004000 + offset
);
2391 } else if (ohdr
->headertype
== OPT_HDR_V1_REGISTER_TYPE
) {
2392 regset_hdr
= (struct register_set_hdr_v1
*)ohdr
;
2393 if (opt_hdr_v1_size(ohdr
) > sizeof(*ohdr
))
2394 regset_count
= (opt_hdr_v1_size(ohdr
) - sizeof(*ohdr
)) /
2395 sizeof(regset_hdr
->data
[0].entry
);
2398 for (i
= 0; i
< regset_count
; i
++)
2399 fprintf(f
, "DATA 0x%08x 0x%08x\n",
2400 le32_to_cpu(regset_hdr
->data
[i
].entry
.address
),
2401 le32_to_cpu(regset_hdr
->data
[i
].entry
.value
));
2402 if (regset_count
> 0) {
2403 if (regset_hdr
->data
[regset_count
-1].last_entry
.delay
!=
2404 REGISTER_SET_HDR_OPT_DELAY_SDRAM_SETUP
)
2405 fprintf(f
, "DATA_DELAY %u\n",
2406 (unsigned)regset_hdr
->data
[regset_count
-1].last_entry
.delay
);
2408 fprintf(f
, "DATA_DELAY SDRAM_SETUP\n");
2413 if (version
== 0 && !is_v0_ext
&& le16_to_cpu(mhdr0
->ddrinitdelay
))
2414 fprintf(f
, "DDR_INIT_DELAY %u\n", (unsigned)le16_to_cpu(mhdr0
->ddrinitdelay
));
2416 for_each_ext_hdr_v0(ehdr0
, ptr
) {
2418 fprintf(f
, "\nMATCH ADDRESS 0x%08x MASK 0x%08x VALUE 0x%08x\n",
2419 le32_to_cpu(ehdr0
->match_addr
),
2420 le32_to_cpu(ehdr0
->match_mask
),
2421 le32_to_cpu(ehdr0
->match_value
));
2422 if (ehdr0
->rsvd1
[0] || ehdr0
->rsvd1
[1] || ehdr0
->rsvd1
[2] ||
2423 ehdr0
->rsvd1
[3] || ehdr0
->rsvd1
[4] || ehdr0
->rsvd1
[5] ||
2424 ehdr0
->rsvd1
[6] || ehdr0
->rsvd1
[7])
2425 fprintf(f
, "#DDR_RSVD1 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
2426 ehdr0
->rsvd1
[0], ehdr0
->rsvd1
[1], ehdr0
->rsvd1
[2],
2427 ehdr0
->rsvd1
[3], ehdr0
->rsvd1
[4], ehdr0
->rsvd1
[5],
2428 ehdr0
->rsvd1
[6], ehdr0
->rsvd1
[7]);
2429 if (ehdr0
->rsvd2
[0] || ehdr0
->rsvd2
[1] || ehdr0
->rsvd2
[2] ||
2430 ehdr0
->rsvd2
[3] || ehdr0
->rsvd2
[4] || ehdr0
->rsvd2
[5] ||
2432 fprintf(f
, "#DDR_RSVD2 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
2433 ehdr0
->rsvd2
[0], ehdr0
->rsvd2
[1], ehdr0
->rsvd2
[2],
2434 ehdr0
->rsvd2
[3], ehdr0
->rsvd2
[4], ehdr0
->rsvd2
[5],
2436 if (ehdr0
->ddrwritetype
)
2437 fprintf(f
, "DDR_WRITE_TYPE %u\n", (unsigned)ehdr0
->ddrwritetype
);
2438 if (ehdr0
->ddrresetmpp
)
2439 fprintf(f
, "DDR_RESET_MPP 0x%x\n", (unsigned)ehdr0
->ddrresetmpp
);
2440 if (ehdr0
->ddrclkenmpp
)
2441 fprintf(f
, "DDR_CLKEN_MPP 0x%x\n", (unsigned)ehdr0
->ddrclkenmpp
);
2442 if (ehdr0
->ddrinitdelay
)
2443 fprintf(f
, "DDR_INIT_DELAY %u\n", (unsigned)ehdr0
->ddrinitdelay
);
2446 if (ehdr0
->offset
) {
2447 for (regdata
= (struct ext_hdr_v0_reg
*)((uint8_t *)ptr
+ ehdr0
->offset
);
2448 (uint8_t *)regdata
< (uint8_t *)ptr
+ header_size
&&
2449 (regdata
->raddr
|| regdata
->rdata
);
2451 fprintf(f
, "DATA 0x%08x 0x%08x\n", le32_to_cpu(regdata
->raddr
),
2452 le32_to_cpu(regdata
->rdata
));
2453 if ((uint8_t *)regdata
!= (uint8_t *)ptr
+ ehdr0
->offset
)
2454 fprintf(f
, "DATA 0x0 0x0\n");
2457 if (le32_to_cpu(ehdr0
->enddelay
))
2458 fprintf(f
, "DATA_DELAY %u\n", le32_to_cpu(ehdr0
->enddelay
));
2460 fprintf(f
, "DATA_DELAY SDRAM_SETUP\n");
2464 for_each_bin_hdr_v0(bhdr0
, ptr
) {
2465 fprintf(f
, "\nMATCH ADDRESS 0x%08x MASK 0x%08x VALUE 0x%08x\n",
2466 le32_to_cpu(bhdr0
->match_addr
),
2467 le32_to_cpu(bhdr0
->match_mask
),
2468 le32_to_cpu(bhdr0
->match_value
));
2470 fprintf(f
, "BINARY binary%d.bin", cur_idx
);
2471 params_count
= fls4(bhdr0
->params_flags
& 0xF);
2472 for (i
= 0; i
< params_count
; i
++)
2473 fprintf(f
, " 0x%x", (bhdr0
->params
[i
] & (1 << i
)) ? bhdr0
->params
[i
] : 0);
2474 fprintf(f
, " LOAD_ADDRESS 0x%08x", le32_to_cpu(bhdr0
->destaddr
));
2475 fprintf(f
, " EXEC_ADDRESS 0x%08x", le32_to_cpu(bhdr0
->execaddr
));
2478 fprintf(f
, "#BINARY_OFFSET 0x%x\n", le32_to_cpu(bhdr0
->offset
));
2479 fprintf(f
, "#BINARY_SIZE 0x%x\n", le32_to_cpu(bhdr0
->size
));
2482 fprintf(f
, "#BINARY_RSVD1 0x%x\n", (unsigned)bhdr0
->rsvd1
);
2484 fprintf(f
, "#BINARY_RSVD2 0x%x\n", (unsigned)bhdr0
->rsvd2
);
2489 /* Undocumented reserved fields */
2491 if (version
== 0 && (mhdr0
->rsvd1
[0] || mhdr0
->rsvd1
[1] || mhdr0
->rsvd1
[2]))
2492 fprintf(f
, "#RSVD1 0x%x 0x%x 0x%x\n", (unsigned)mhdr0
->rsvd1
[0],
2493 (unsigned)mhdr0
->rsvd1
[1], (unsigned)mhdr0
->rsvd1
[2]);
2495 if (version
== 0 && le16_to_cpu(mhdr0
->rsvd2
))
2496 fprintf(f
, "#RSVD2 0x%x\n", (unsigned)le16_to_cpu(mhdr0
->rsvd2
));
2498 if (version
!= 0 && mhdr
->reserved4
)
2499 fprintf(f
, "#RESERVED4 0x%x\n", (unsigned)mhdr
->reserved4
);
2501 if (version
!= 0 && mhdr
->reserved5
)
2502 fprintf(f
, "#RESERVED5 0x%x\n", (unsigned)le16_to_cpu(mhdr
->reserved5
));
2509 static int kwbimage_extract_subimage(void *ptr
, struct image_tool_params
*params
)
2511 struct main_hdr_v1
*mhdr
= (struct main_hdr_v1
*)ptr
;
2512 size_t header_size
= kwbheader_size(ptr
);
2513 struct bin_hdr_v0
*bhdr
;
2514 struct opt_hdr_v1
*ohdr
;
2515 int idx
= params
->pflag
;
2521 /* Generate kwbimage config file when '-p -1' is specified */
2523 return kwbimage_generate_config(ptr
, params
);
2529 /* Extract data image when -p is not specified or when '-p 0' is specified */
2530 offset
= le32_to_cpu(mhdr
->srcaddr
);
2532 if (mhdr
->blockid
== IBR_HDR_SATA_ID
)
2533 offset
*= params
->bl_len
;
2535 if (mhdr
->blockid
== IBR_HDR_PEX_ID
&& offset
== 0xFFFFFFFF)
2536 offset
= header_size
;
2538 image
= (ulong
)((uint8_t *)ptr
+ offset
);
2539 size
= le32_to_cpu(mhdr
->blocksize
) - 4;
2541 /* Extract N-th binary header executabe image when other '-p N' is specified */
2543 for_each_opt_hdr_v1(ohdr
, ptr
) {
2544 if (ohdr
->headertype
!= OPT_HDR_V1_BINARY_TYPE
)
2547 if (idx
== cur_idx
) {
2548 image
= (ulong
)&ohdr
->data
[4 + 4 * ohdr
->data
[0]];
2549 size
= opt_hdr_v1_size(ohdr
) - 12 - 4 * ohdr
->data
[0];
2555 for_each_bin_hdr_v0(bhdr
, ptr
) {
2556 if (idx
== cur_idx
) {
2557 image
= (ulong
)bhdr
+ bhdr
->offset
;
2565 fprintf(stderr
, "Argument -p %d is invalid\n", idx
);
2566 fprintf(stderr
, "Available subimages:\n");
2567 fprintf(stderr
, " -p -1 - kwbimage config file\n");
2568 fprintf(stderr
, " -p 0 - data image\n");
2569 if (cur_idx
- 1 > 0)
2570 fprintf(stderr
, " -p N - Nth binary header image (totally: %d)\n",
2576 return imagetool_save_subimage(params
->outfile
, image
, size
);
2579 static int kwbimage_check_params(struct image_tool_params
*params
)
2581 if (!params
->lflag
&& !params
->iflag
&& !params
->pflag
&&
2582 (!params
->imagename
|| !strlen(params
->imagename
))) {
2583 char *msg
= "Configuration file for kwbimage creation omitted";
2585 fprintf(stderr
, "Error:%s - %s\n", params
->cmdname
, msg
);
2589 return (params
->dflag
&& (params
->fflag
|| params
->lflag
|| params
->skipcpy
)) ||
2591 (params
->lflag
&& (params
->dflag
|| params
->fflag
));
2595 * kwbimage type parameters definition
2599 "Marvell MVEBU Boot Image support",
2602 kwbimage_check_params
,
2603 kwbimage_verify_header
,
2604 kwbimage_print_header
,
2605 kwbimage_set_header
,
2606 kwbimage_extract_subimage
,
2607 kwbimage_check_image_types
,