diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | arch/arm/cpu/armv8/common/firmware/common/fip.c | 59 | ||||
-rw-r--r-- | arch/arm/cpu/armv8/common/firmware/include/common/fip.h | 64 | ||||
-rw-r--r-- | arch/arm/cpu/armv8/common/firmware/plat/gxb/include/mailbox.h | 4 | ||||
-rw-r--r-- | arch/arm/cpu/armv8/common/firmware/plat/gxb/mailbox.c | 14 | ||||
-rwxr-xr-x | fip/fip_create | bin | 13849 -> 13897 bytes |
6 files changed, 88 insertions, 54 deletions
@@ -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 Binary files differindex a3eb181572..2c6518ad32 100755 --- a/fip/fip_create +++ b/fip/fip_create |