diff options
author | davidcunado-arm <david.cunado@arm.com> | 2018-02-06 05:12:28 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-06 05:12:28 +0000 |
commit | 9fd2f13bd608832260300640970f73c62357c684 (patch) | |
tree | 149d13158075ab08cccff2710ee8bedd0406d2c1 /plat/socionext | |
parent | 10787b0519afce1e887a935789b2d624849856a9 (diff) | |
parent | 8951b058fce077dab7afcd86c532ec0fc0200352 (diff) |
Merge pull request #1224 from masahir0y/gzip
Support GZIP-compressed images for faster loading and verification
Diffstat (limited to 'plat/socionext')
-rw-r--r-- | plat/socionext/uniphier/platform.mk | 17 | ||||
-rw-r--r-- | plat/socionext/uniphier/uniphier.h | 12 | ||||
-rw-r--r-- | plat/socionext/uniphier/uniphier_bl2_setup.c | 42 | ||||
-rw-r--r-- | plat/socionext/uniphier/uniphier_image_desc.c | 11 |
4 files changed, 71 insertions, 11 deletions
diff --git a/plat/socionext/uniphier/platform.mk b/plat/socionext/uniphier/platform.mk index 18b56a0b..6de51646 100644 --- a/plat/socionext/uniphier/platform.mk +++ b/plat/socionext/uniphier/platform.mk @@ -103,6 +103,23 @@ $(ROTPK_HASH): $(ROT_KEY) endif +ifeq (${FIP_GZIP},1) + +include lib/zlib/zlib.mk + +BL2_SOURCES += common/image_decompress.c \ + $(ZLIB_SOURCES) + +$(eval $(call add_define,UNIPHIER_DECOMPRESS_GZIP)) + +# compress all images loaded by BL2 +SCP_BL2_PRE_TOOL_FILTER := GZIP +BL31_PRE_TOOL_FILTER := GZIP +BL32_PRE_TOOL_FILTER := GZIP +BL33_PRE_TOOL_FILTER := GZIP + +endif + .PHONY: bl2_gzip bl2_gzip: $(BUILD_PLAT)/bl2.bin.gz %.gz: % diff --git a/plat/socionext/uniphier/uniphier.h b/plat/socionext/uniphier/uniphier.h index 2af30dff..1768e3be 100644 --- a/plat/socionext/uniphier/uniphier.h +++ b/plat/socionext/uniphier/uniphier.h @@ -42,7 +42,9 @@ int uniphier_usb_init(unsigned int soc, uintptr_t *block_dev_spec); int uniphier_io_setup(unsigned int soc); int uniphier_check_image(unsigned int image_id); -void uniphier_image_descs_fixup(void); + +struct image_info; +struct image_info *uniphier_get_image_info(unsigned int image_id); int uniphier_scp_is_running(void); void uniphier_scp_start(void); @@ -80,7 +82,11 @@ unsigned int uniphier_calc_core_pos(u_register_t mpidr); #define UNIPHIER_BLOCK_BUF_BASE ((UNIPHIER_SCP_BASE) + \ (UNIPHIER_SCP_MAX_SIZE)) -#define UNIPHIER_BLOCK_BUF_SIZE ((UNIPHIER_NS_DRAM_LIMIT) - \ - (UNIPHIER_BLOCK_BUF_BASE)) +#define UNIPHIER_BLOCK_BUF_SIZE 0x00100000 + +#define UNIPHIER_IMAGE_BUF_BASE ((UNIPHIER_BLOCK_BUF_BASE) + \ + (UNIPHIER_BLOCK_BUF_SIZE)) +#define UNIPHIER_IMAGE_BUF_SIZE ((UNIPHIER_NS_DRAM_LIMIT) - \ + (UNIPHIER_IMAGE_BUF_BASE)) #endif /* __UNIPHIER_H__ */ diff --git a/plat/socionext/uniphier/uniphier_bl2_setup.c b/plat/socionext/uniphier/uniphier_bl2_setup.c index 29108c0b..54b30e5b 100644 --- a/plat/socionext/uniphier/uniphier_bl2_setup.c +++ b/plat/socionext/uniphier/uniphier_bl2_setup.c @@ -9,8 +9,12 @@ #include <desc_image_load.h> #include <errno.h> #include <io/io_storage.h> +#include <image_decompress.h> #include <platform.h> #include <platform_def.h> +#ifdef UNIPHIER_DECOMPRESS_GZIP +#include <tf_gunzip.h> +#endif #include <xlat_tables_v2.h> #include "uniphier.h" @@ -93,8 +97,12 @@ void bl2_el3_plat_arch_setup(void) } } - if (skip_scp) - uniphier_image_descs_fixup(); + if (skip_scp) { + struct image_info *image_info; + + image_info = uniphier_get_image_info(SCP_BL2_IMAGE_ID); + image_info->h.attr |= IMAGE_ATTRIB_SKIP_LOADING; + } } void bl2_platform_setup(void) @@ -116,8 +124,38 @@ bl_params_t *plat_get_next_bl_params(void) return get_next_bl_params_from_mem_params_desc(); } +void bl2_plat_preload_setup(void) +{ +#ifdef UNIPHIER_DECOMPRESS_GZIP + image_decompress_init(UNIPHIER_IMAGE_BUF_BASE, + UNIPHIER_IMAGE_BUF_SIZE, + gunzip); +#endif +} + +int bl2_plat_handle_pre_image_load(unsigned int image_id) +{ +#ifdef UNIPHIER_DECOMPRESS_GZIP + image_decompress_prepare(uniphier_get_image_info(image_id)); +#endif + return 0; +} + int bl2_plat_handle_post_image_load(unsigned int image_id) { +#ifdef UNIPHIER_DECOMPRESS_GZIP + struct image_info *image_info; + int ret; + + image_info = uniphier_get_image_info(image_id); + + if (!(image_info->h.attr & IMAGE_ATTRIB_SKIP_LOADING)) { + ret = image_decompress(uniphier_get_image_info(image_id)); + if (ret) + return ret; + } +#endif + if (image_id == SCP_BL2_IMAGE_ID && uniphier_bl2_kick_scp) uniphier_scp_start(); diff --git a/plat/socionext/uniphier/uniphier_image_desc.c b/plat/socionext/uniphier/uniphier_image_desc.c index 1e474c53..f4651db0 100644 --- a/plat/socionext/uniphier/uniphier_image_desc.c +++ b/plat/socionext/uniphier/uniphier_image_desc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -86,12 +86,11 @@ static struct bl_mem_params_node uniphier_image_descs[] = { }; REGISTER_BL_IMAGE_DESCS(uniphier_image_descs) -/* SCP is optional. Allow run-time fixup of the descriptor array. */ -void uniphier_image_descs_fixup(void) +struct image_info *uniphier_get_image_info(unsigned int image_id) { struct bl_mem_params_node *desc; - desc = get_bl_mem_params_node(SCP_BL2_IMAGE_ID); - assert(desc != NULL); - desc->image_info.h.attr |= IMAGE_ATTRIB_SKIP_LOADING; + desc = get_bl_mem_params_node(image_id); + assert(desc); + return &desc->image_info; } |