summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile1
-rw-r--r--arch/arm/cpu/armv8/common/firmware/common/fip.c59
-rw-r--r--arch/arm/cpu/armv8/common/firmware/include/common/fip.h64
-rw-r--r--arch/arm/cpu/armv8/common/firmware/plat/gxb/include/mailbox.h4
-rw-r--r--arch/arm/cpu/armv8/common/firmware/plat/gxb/mailbox.c14
-rwxr-xr-xfip/fip_createbin13849 -> 13897 bytes
6 files changed, 88 insertions, 54 deletions
diff --git a/Makefile b/Makefile
index 4f1a322a10..d2307b73a8 100644
--- a/Makefile
+++ b/Makefile
@@ -849,6 +849,7 @@ u-boot-comp.bin:u-boot.bin
FIP_FOLDER := $(srctree)/fip
FIP_ARGS += --bl30 $(FIP_FOLDER)/bl30.bin
+FIP_ARGS += --bl301 $(FIP_FOLDER)/bl301.bin
FIP_ARGS += --bl31 $(FIP_FOLDER)/bl31.bin
ifeq ($(CONFIG_NEED_BL32), y)
FIP_ARGS += --bl32 $(FIP_FOLDER)/bl32.bin
diff --git a/arch/arm/cpu/armv8/common/firmware/common/fip.c b/arch/arm/cpu/armv8/common/firmware/common/fip.c
index 91e73344b9..0ace39b382 100644
--- a/arch/arm/cpu/armv8/common/firmware/common/fip.c
+++ b/arch/arm/cpu/armv8/common/firmware/common/fip.c
@@ -41,20 +41,32 @@ void bl2_load_image(void){
/*load and process bl30*/
image_info_t bl30_image_info;
entry_point_info_t bl30_ep_info;
- storage_load(BL2_SIZE + (fip_header->bl30_offset), FM_BL30_LOAD_ADDR, (fip_header->bl30_size), "bl30");
- parse_blx(&bl30_image_info, &bl30_ep_info, FM_BL30_LOAD_ADDR, (fip_header->bl30_size));
+ storage_load(BL2_SIZE + (fip_header->bl30_entry.offset), FM_BL30_LOAD_ADDR, (fip_header->bl30_entry.size), "bl30");
+ parse_blx(&bl30_image_info, &bl30_ep_info, FM_BL30_LOAD_ADDR, (fip_header->bl30_entry.size));
/*process bl30*/
- process_bl30(&bl30_image_info, &bl30_ep_info);
+ process_bl30x(&bl30_image_info, &bl30_ep_info, "bl30");
printf("BL30 addr: 0x%8x\n", bl30_image_info.image_base);
printf("BL30 size: 0x%8x\n", bl30_image_info.image_size);
+#if 0
+ /*load and process bl301*/
+ image_info_t bl301_image_info;
+ entry_point_info_t bl301_ep_info;
+ storage_load(BL2_SIZE + (fip_header->bl301_entry.offset), FM_BL301_LOAD_ADDR, (fip_header->bl301_entry.size), "bl301");
+ parse_blx(&bl301_image_info, &bl301_ep_info, FM_BL301_LOAD_ADDR, (fip_header->bl301_entry.size));
+ /*process bl301*/
+ process_bl30x(&bl301_image_info, &bl301_ep_info, "bl301");
+ printf("BL301 addr: 0x%8x\n", bl301_image_info.image_base);
+ printf("BL301 size: 0x%8x\n", bl301_image_info.image_size);
+#endif
+
/*load and process bl31*/
bl2_to_bl31_params = bl2_plat_get_bl31_params();
bl31_ep_info = bl2_plat_get_bl31_ep_info();
/* Set the X0 parameter to bl31 */
bl31_ep_info->args.arg0 = (unsigned long)bl2_to_bl31_params;
- storage_load(BL2_SIZE + (fip_header->bl31_offset), FM_BL31_LOAD_ADDR, (fip_header->bl31_size), "bl31");
- parse_blx(bl2_to_bl31_params->bl31_image_info, bl31_ep_info, FM_BL31_LOAD_ADDR, (fip_header->bl31_size));
+ storage_load(BL2_SIZE + (fip_header->bl31_entry.offset), FM_BL31_LOAD_ADDR, (fip_header->bl31_entry.size), "bl31");
+ parse_blx(bl2_to_bl31_params->bl31_image_info, bl31_ep_info, FM_BL31_LOAD_ADDR, (fip_header->bl31_entry.size));
bl2_plat_set_bl31_ep_info(bl2_to_bl31_params->bl31_image_info, bl31_ep_info);
printf("BL31 addr: 0x%8x\n", bl2_to_bl31_params->bl31_image_info->image_base);
printf("BL31 size: 0x%8x\n", bl2_to_bl31_params->bl31_image_info->image_size);
@@ -71,18 +83,18 @@ void bl2_load_image(void){
*/
meminfo_t bl32_mem_info;
bl2_plat_get_bl32_meminfo(&bl32_mem_info);
- storage_load(BL2_SIZE + fip_header->bl32_offset, FM_BL32_LOAD_ADDR, fip_header->bl32_size, "bl32");
+ storage_load(BL2_SIZE + fip_header->bl32_entry.offset, FM_BL32_LOAD_ADDR, fip_header->bl32_entry.size, "bl32");
parse_blx(bl2_to_bl31_params->bl32_image_info, bl2_to_bl31_params->bl32_ep_info,
- FM_BL32_LOAD_ADDR, fip_header->bl32_size);
+ FM_BL32_LOAD_ADDR, fip_header->bl32_entry.size);
bl2_plat_set_bl32_ep_info(bl2_to_bl31_params->bl32_image_info, bl2_to_bl31_params->bl32_ep_info);
printf("BL32 addr: 0x%8x\n", bl2_to_bl31_params->bl32_image_info->image_base);
printf("BL32 size: 0x%8x\n", bl2_to_bl31_params->bl32_image_info->image_size);
#endif /* NEED_BL32 */
/*load and process bl33*/
- storage_load(BL2_SIZE + fip_header->bl33_offset, FM_BL33_LOAD_ADDR, fip_header->bl33_size, "bl33");
+ storage_load(BL2_SIZE + fip_header->bl33_entry.offset, FM_BL33_LOAD_ADDR, fip_header->bl33_entry.size, "bl33");
parse_blx(bl2_to_bl31_params->bl33_image_info, bl2_to_bl31_params->bl33_ep_info,
- FM_BL33_LOAD_ADDR, fip_header->bl33_size);
+ FM_BL33_LOAD_ADDR, fip_header->bl33_entry.size);
//bl2_plat_get_bl33_meminfo(&bl33_mem_info);
bl2_plat_set_bl33_ep_info(bl2_to_bl31_params->bl33_image_info, bl2_to_bl31_params->bl33_ep_info);
printf("BL33 addr: 0x%8x\n", bl2_to_bl31_params->bl33_image_info->image_base);
@@ -123,28 +135,29 @@ void parse_blx(image_info_t *image_data,
return;
}
-/*process bl30, transfer to m3, etc..*/
-void process_bl30(image_info_t *image_data,
- entry_point_info_t *entry_point_info)
+/*process bl30x, transfer to m3, etc..*/
+void process_bl30x(image_info_t *image_data,
+ entry_point_info_t *entry_point_info, const char * name)
{
- printf("BL30 addr: 0x%8x\n", image_data->image_base);
- printf("BL30 size: 0x%8x\n", image_data->image_size);
-
- //printf("start bl30 sha2\n");
- uint8_t bl30_sha2[32] = {0};
+ //printf("start sha2\n");
+ uint8_t _sha2[32] = {0};
sha2((const uint8_t *)image_data->image_base,
image_data->image_size,
- bl30_sha2,
+ _sha2,
0); /*0 means sha256, else means sha224*/
- //printf("bl30 sha2:");
+
+#if 0
+ //printf("%s sha2:", name);
int print_loop = 0;
for (print_loop=0; print_loop<32; print_loop++) {
if (0 == (print_loop % 16))
printf("\n");
- //printf("0x%2x ", bl30_sha2[print_loop]);
+ printf("0x%2x ", _sha2[print_loop]);
}
- //printf("\n");
- /*add code here*/
- send_bl30(image_data->image_base, image_data->image_size, bl30_sha2, sizeof(bl30_sha2));
+ printf("\n");
+#endif
+
+ send_bl30x(image_data->image_base, image_data->image_size, \
+ _sha2, sizeof(_sha2), name);
return;
}
diff --git a/arch/arm/cpu/armv8/common/firmware/include/common/fip.h b/arch/arm/cpu/armv8/common/firmware/include/common/fip.h
index 1de1b63b89..b03ae48ab0 100644
--- a/arch/arm/cpu/armv8/common/firmware/include/common/fip.h
+++ b/arch/arm/cpu/armv8/common/firmware/include/common/fip.h
@@ -21,34 +21,44 @@
#define NEED_BL32 CONFIG_NEED_BL32
+#define _UUID_NODE_LEN 6
+
+struct uuid {
+ uint32_t time_low;
+ uint16_t time_mid;
+ uint16_t time_hi_and_version;
+ uint8_t clock_seq_hi_and_reserved;
+ uint8_t clock_seq_low;
+ uint8_t node[_UUID_NODE_LEN];
+};
+
+typedef struct uuid uuid_t;
+
+typedef struct fip_toc_header {
+ uint32_t name;
+ uint32_t serial_number;
+ uint64_t flags;
+} fip_toc_header_t;
+
+typedef struct fip_toc_entry {
+ uuid_t uuid;
+ uint64_t offset;
+ uint64_t size;
+ uint64_t flags;
+} fip_toc_entry_t;
+
/*amlogic fip structure: bl30+bl31+(bl32)+bl33*/
typedef struct aml_fip_header {
- unsigned long fip_header1;
- unsigned long fip_header2;
- unsigned long fip_header3;
- unsigned long fip_header4;
- unsigned long bl30_offset;
- unsigned long bl30_size;
- unsigned long bl30_attr1;
- unsigned long bl30_attr2;
- unsigned long bl30_attr3;
- unsigned long bl31_offset;
- unsigned long bl31_size;
- unsigned long bl31_attr1;
- unsigned long bl31_attr2;
- unsigned long bl31_attr3;
+ fip_toc_header_t fip_header; /*16byte*/
+ fip_toc_entry_t bl30_entry; /*40byte*/
+#if 0
+ fip_toc_entry_t bl301_entry; /*40byte*/
+#endif
+ fip_toc_entry_t bl31_entry; /*40byte*/
#if (NEED_BL32)
- unsigned long bl32_offset;
- unsigned long bl32_size;
- unsigned long bl32_attr1;
- unsigned long bl32_attr2;
- unsigned long bl32_attr3;
+ fip_toc_entry_t bl32_entry; /*40byte*/
#endif
- unsigned long bl33_offset;
- unsigned long bl33_size;
- unsigned long bl33_attr1;
- unsigned long bl33_attr2;
- unsigned long bl33_attr3;
+ fip_toc_entry_t bl33_entry; /*40byte*/
} aml_fip_header_t;
/*aml defines*/
@@ -76,6 +86,7 @@ typedef struct aml_fip_header {
#define FM_FIP_HEADER_LOAD_ADDR SIZE_32M
#define FM_BL30_LOAD_ADDR CONFIG_SYS_TEXT_BASE
+#define FM_BL301_LOAD_ADDR CONFIG_SYS_TEXT_BASE
#define FM_BL31_LOAD_ADDR 0x10100000
#define FM_BL32_LOAD_ADDR 0x10200000
#define FM_BL33_LOAD_ADDR CONFIG_SYS_TEXT_BASE
@@ -89,7 +100,8 @@ void parse_blx(image_info_t *image_data,
unsigned int addr,
unsigned int length);
-void process_bl30(image_info_t *image_data,
- entry_point_info_t *entry_point_info);
+void process_bl30x(image_info_t *image_data,
+ entry_point_info_t *entry_point_info,
+ const char * name);
#endif /*__BL2_FIP_H_*/ \ No newline at end of file
diff --git a/arch/arm/cpu/armv8/common/firmware/plat/gxb/include/mailbox.h b/arch/arm/cpu/armv8/common/firmware/plat/gxb/include/mailbox.h
index 1c478e7be5..5416c3de38 100644
--- a/arch/arm/cpu/armv8/common/firmware/plat/gxb/include/mailbox.h
+++ b/arch/arm/cpu/armv8/common/firmware/plat/gxb/include/mailbox.h
@@ -14,7 +14,7 @@ void *memcpy_t(void *dest, const void *src, size_t len);
void mb_send_data(uint32_t val, uint32_t port);
uint32_t mb_read_data(uint32_t port);
void mb_clear_data(uint32_t val, uint32_t port);
-void send_bl30(uint32_t addr, uint32_t size, const uint8_t * sha2, uint32_t sha2_length);
-
+void send_bl30x(uint32_t addr, uint32_t size, const uint8_t * sha2,
+ uint32_t sha2_length, const char * name);
#endif /*__BL2_MAILBOX_H_*/ \ No newline at end of file
diff --git a/arch/arm/cpu/armv8/common/firmware/plat/gxb/mailbox.c b/arch/arm/cpu/armv8/common/firmware/plat/gxb/mailbox.c
index f34e04cdee..39d41680d0 100644
--- a/arch/arm/cpu/armv8/common/firmware/plat/gxb/mailbox.c
+++ b/arch/arm/cpu/armv8/common/firmware/plat/gxb/mailbox.c
@@ -70,14 +70,22 @@ void mb_clear_data(uint32_t val, uint32_t port)
return;
}
-void send_bl30(uint32_t addr, uint32_t size, const uint8_t * sha2, uint32_t sha2_length)
+void send_bl30x(uint32_t addr, uint32_t size, const uint8_t * sha2, \
+ uint32_t sha2_length, const char * name)
{
int i;
*(unsigned int *)MB_SRAM_BASE = size;
- printf("Sending bl30");
+ printf("Sending %s", name);
//printf("time=0x%x size=0x%x\n", readl(0xc1109988),size);
+ if (0 == strcmp("bl301", name)) {
+ /*bl301 must wait bl30 run*/
+ printf("Wait bl30...");
+ while (0x3 != ((readl(AO_SEC_SD_CFG15) >> 20) & 0x3)) {}
+ printf("Done\n");
+ }
+
mb_send_data(CMD_DATA_LEN, 3);
do {} while(mb_read_data(3));
memcpy((void *)MB_SRAM_BASE, (const void *)sha2, sha2_length);
@@ -97,7 +105,7 @@ void send_bl30(uint32_t addr, uint32_t size, const uint8_t * sha2, uint32_t sha2
mb_send_data(CMD_OP_SHA, 3);
do {} while(mb_read_data(3));
- printf("OK. \nRun bl30...\n");
+ printf("OK. \nRun %s...\n", name);
/* The BL31 will run after this command */
mb_send_data(CMD_END,3);//code transfer end.
diff --git a/fip/fip_create b/fip/fip_create
index a3eb181572..2c6518ad32 100755
--- a/fip/fip_create
+++ b/fip/fip_create
Binary files differ